Compare commits
13 Commits
e4ebd01164
...
master
Author | SHA1 | Date |
---|---|---|
Ales (Shagi) Zabala Alava | c0d460de1d | |
Ales (Shagi) Zabala Alava | 6915f7e0b4 | |
Ales (Shagi) Zabala Alava | 226021a203 | |
Ales (Shagi) Zabala Alava | aa5a159df1 | |
Ales (Shagi) Zabala Alava | d8a47abf1d | |
Ales (Shagi) Zabala Alava | 54cd73f31d | |
Ales (Shagi) Zabala Alava | fd958653fe | |
Ales (Shagi) Zabala Alava | 406793b613 | |
Ales (Shagi) Zabala Alava | 94871720db | |
Ales (Shagi) Zabala Alava | 1591b16245 | |
Ales (Shagi) Zabala Alava | 9cf888dc38 | |
Ales (Shagi) Zabala Alava | 67add2e383 | |
Ales (Shagi) Zabala Alava | 2bd8c46431 |
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
name: default
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: plugins/hugo
|
||||||
|
settings:
|
||||||
|
hugo_version: 0.88.1
|
||||||
|
url: https://negromate.rocks/hmdemo/
|
||||||
|
validate: true
|
||||||
|
when:
|
||||||
|
branch:
|
||||||
|
- master
|
||||||
|
|
||||||
|
- name: deploy
|
||||||
|
image: drillster/drone-rsync
|
||||||
|
settings:
|
||||||
|
hosts:
|
||||||
|
- 192.168.20.2
|
||||||
|
key:
|
||||||
|
from_secret: rsync_ssh_key
|
||||||
|
source: public/
|
||||||
|
target: /var/www/html/hmdemo
|
||||||
|
user: hm
|
||||||
|
when:
|
||||||
|
branch:
|
||||||
|
- master
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: signature
|
||||||
|
hmac: eedaf25fc6dd13b10beb6533dd58eda860b7b8b6a5af7df2169bcc4e9c711c5e
|
||||||
|
|
||||||
|
...
|
89
README.md
89
README.md
|
@ -1,14 +1,61 @@
|
||||||
# Página web del hackmeeting
|
# Página web del hackmeeting
|
||||||
|
|
||||||
|
La principal ventaja de esta web con respecto a la que hay actualmente es que
|
||||||
|
no necesita mantenimiento, mantiene la posibilidad de editar contenido por
|
||||||
|
varias personas y simplifica el backup.
|
||||||
|
|
||||||
|
El flujo de trabajo típico para añadir contenido a la web sería este:
|
||||||
|
|
||||||
|
1. Crear o editar un fichero en la carpeta `content`
|
||||||
|
2. Comprobar en local que la modificación es correcta
|
||||||
|
3. Hacer un commit con las modificaciones
|
||||||
|
4. Subir el commit al repositorio de git
|
||||||
|
5. Compilar la web
|
||||||
|
6. Enviar los ficheros al servidor web.
|
||||||
|
|
||||||
|
Los pasos 5 y 6 se pueden automatizar con alguna herramienta de integración
|
||||||
|
continua. En este ejemplo se usa drone.io. Para simplificar el resto de los
|
||||||
|
pasos la idea es preparar scripts u otro tipo de programas, que ayuden a
|
||||||
|
generar el contenido de manera más interactiva.
|
||||||
|
|
||||||
|
Este proceso puede ser demasiado complicado para personas sin experiencia en
|
||||||
|
git o markdown, sobre todo las integrantes del grupo local, que además no
|
||||||
|
conocen el funcionamiento de esta herramienta. Propongo instaurar el rol de
|
||||||
|
"madrina(s) de grupo local", gente que se encargue de asistir al grupo local y
|
||||||
|
en caso necesario de encargarse de subir los contenidos a la web.
|
||||||
|
|
||||||
|
Los datos que son más útiles para el grupo local se guardan en ficheros csv,
|
||||||
|
que es fácil de modificar en una hoja de cálculo, y permite un postpropceso
|
||||||
|
sencillo para obtener datos interesantes. Por ejemplo la cantidad de asistentes
|
||||||
|
que hay apuntados para cenar el sábado.
|
||||||
|
|
||||||
## Crear contenido
|
## Crear contenido
|
||||||
|
|
||||||
Por ejemplo, para crear un nodo que se llame `nodo1` para el 2019:
|
Hay una serie de comandos auxiliares para gestionar el contenido de la web de
|
||||||
|
manera sencilla.
|
||||||
|
|
||||||
hugo new 2019/nodos/nodo1.md -k nodo
|
Todos estos comandos aceptan un parámetro opcional: el año en el que estamos
|
||||||
|
trabajando. Si no se indica año se asume el actual.
|
||||||
|
|
||||||
|
Para crear un nodo:
|
||||||
|
|
||||||
|
bin/nuevo_nodo
|
||||||
|
|
||||||
|
Para gestionar la asistencia:
|
||||||
|
|
||||||
|
bin/asistencia
|
||||||
|
|
||||||
|
Para gestionar las necesidades:
|
||||||
|
|
||||||
|
bin/necesidades
|
||||||
|
|
||||||
|
Para crear una página corriente:
|
||||||
|
|
||||||
|
bin/nueva_pagina
|
||||||
|
|
||||||
Para empezar un nuevo hackmeeting:
|
Para empezar un nuevo hackmeeting:
|
||||||
|
|
||||||
hugo new 2022 -k hm
|
bin/nuevo_hackmeeting
|
||||||
|
|
||||||
|
|
||||||
## Mini intro a Hugo
|
## Mini intro a Hugo
|
||||||
|
@ -33,3 +80,39 @@ Los ficheros estáticos están en la carpeta `static`, se copian tal cual a la
|
||||||
carpeta `public`.
|
carpeta `public`.
|
||||||
|
|
||||||
Más información: https://gohugo.io/documentation/
|
Más información: https://gohugo.io/documentation/
|
||||||
|
|
||||||
|
|
||||||
|
## Estructura básica del contenido
|
||||||
|
|
||||||
|
Cada año creamos una carpeta nueva dentro de `content`, usando el archetypes `hm`.
|
||||||
|
Esta carpeta tiene la página inicial, el manifiesto, el listado de nodos y la
|
||||||
|
página de asistencia.
|
||||||
|
|
||||||
|
|
||||||
|
## Shortcodes
|
||||||
|
|
||||||
|
Estos son los shortcodes definidos para el hackmeeting:
|
||||||
|
|
||||||
|
### rawHTML
|
||||||
|
|
||||||
|
Renderiza el contenido del shortcode sin procesar, por lo que se puede meter html arbitrario.
|
||||||
|
|
||||||
|
Ejemplo:
|
||||||
|
|
||||||
|
{{< rawHTML >}}
|
||||||
|
<table>
|
||||||
|
<tr><td>Una tabla</td></tr>
|
||||||
|
</table>
|
||||||
|
{{< /rawHTML >}}
|
||||||
|
|
||||||
|
### csvTable
|
||||||
|
|
||||||
|
Renderiza un csv como una tabla HTML. Hay que pasarle dos parámetros, el path
|
||||||
|
del csv relativo a la raíz del proyecto y la clase css que se le asignará a la
|
||||||
|
tabla.
|
||||||
|
|
||||||
|
Hay que generar un fichero csv separado por comas.
|
||||||
|
|
||||||
|
Ejemplo, para un fichero `content/2019/nodos/parrilla_viernes.csv':
|
||||||
|
|
||||||
|
{{< csvTable file="/content/2019/nodos/parrilla_viernes.csv" class="parrilla" >}}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "{{ replace .Name "-" " " | title }}"
|
title: "{{ replace .Name "-" " " | title }}"
|
||||||
date: {{ .Date }}
|
date: {{ .Date }}
|
||||||
|
type: "yearhome"
|
||||||
draft: true
|
draft: true
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
"Nombre","Entrada","Salida","Dieta","Camiseta","Material","Dormir","Comer","Necesidades"
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
title: "Asistencia"
|
||||||
|
date: {{ .Date }}
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Esta es la plantilla para inscribirse y que sepamos de antemano cuanta gente va
|
||||||
|
a venir, para poder preparar el espacio y lo que haga falta. Avisa en matrix o
|
||||||
|
en la lista, o envía un pull request al repositorio de esta web.
|
||||||
|
|
||||||
|
{{< csvTable file="/content/2019/asistencia.csv" class="asistencia" >}}
|
|
@ -0,0 +1 @@
|
||||||
|
Necesidad,Cantidad necesaria,Cantidad actual
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
title: "Necesidades"
|
||||||
|
date: {{ .Date }}
|
||||||
|
draft: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< csvTable file="/content/{{ .Name }}/necesidades.csv" class="necesidades" >}}
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "{{ replace .Name "-" " " | title }}"
|
title: "{{ replace .Name "-" " " | title }}"
|
||||||
date: {{ .Date }}
|
date: {{ .Date }}
|
||||||
type: nodo
|
type: "nodos"
|
||||||
quien: "organizadoras"
|
quien: "organizadoras"
|
||||||
madrina: "madrina"
|
madrina: "madrina"
|
||||||
duracion: "1 hora"
|
duracion: "1 hora"
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
YEAR=${1:-$(date "+%Y")}
|
||||||
|
|
||||||
|
utils/csveditor.py content/${YEAR}/asistencia.csv
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
YEAR=${1:-$(date "+%Y")}
|
||||||
|
|
||||||
|
utils/csveditor.py content/${YEAR}/necesidades.csv
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
YEAR=${1:-$(date "+%Y")}
|
||||||
|
|
||||||
|
echo -n "Titulo: "
|
||||||
|
read TITLE
|
||||||
|
SLUG=$(bin/slugify ${TITLE})
|
||||||
|
|
||||||
|
hugo new ${YEAR}/${SLUG}.md
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
YEAR=${1:-$(date "+%Y")}
|
||||||
|
|
||||||
|
hugo new ${YEAR} -k hm
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
YEAR=${1:-$(date "+%Y")}
|
||||||
|
|
||||||
|
echo -n "Titulo: "
|
||||||
|
read TITLE
|
||||||
|
SLUG=$(bin/slugify ${TITLE})
|
||||||
|
|
||||||
|
hugo new ${YEAR}/nodos/${SLUG}.md -k nodo
|
|
@ -0,0 +1,41 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Versión simplificada y adaptada de bash-slugify
|
||||||
|
# https://github.com/brutus/bash-slugify
|
||||||
|
slugify () {
|
||||||
|
local name="$@"
|
||||||
|
local gluechars='-_. '
|
||||||
|
local safechars="${gluechars}a-zA-Z0-9"
|
||||||
|
|
||||||
|
# convert to lowercase
|
||||||
|
name=$(echo "${name}" | tr A-ZÄÖÜ a-zäöü)
|
||||||
|
|
||||||
|
# remove special chars
|
||||||
|
name=$(echo "${name//[^${safechars}]/}")
|
||||||
|
|
||||||
|
# consolidate spaces
|
||||||
|
name=$(echo "${name}" | tr -s '[:space:]')
|
||||||
|
|
||||||
|
# replace spaces with dashes
|
||||||
|
name=$(echo "${name}" | tr ' ' '-')
|
||||||
|
|
||||||
|
# remove spaces around dashes and underscores
|
||||||
|
name=$(echo "${name// -/-}")
|
||||||
|
name=$(echo "${name//- /-}")
|
||||||
|
name=$(echo "${name// _/_}")
|
||||||
|
name=$(echo "${name//_ /_}")
|
||||||
|
|
||||||
|
# trim spaces
|
||||||
|
name=$(echo "${name}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
||||||
|
|
||||||
|
# replace special chars
|
||||||
|
name=$(echo "${name//[^${safechars}]/$REPLACEMENT_CHAR}")
|
||||||
|
|
||||||
|
## REPLACE SPACES
|
||||||
|
name=$(echo "${name// /$SPACE_CHAR}")
|
||||||
|
|
||||||
|
# return slug
|
||||||
|
echo "${name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $(slugify "$@")
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "2019"
|
title: "2019"
|
||||||
date: 2021-09-14T11:29:27+02:00
|
date: 2021-09-14T11:29:27+02:00
|
||||||
|
type: "yearhome"
|
||||||
draft: false
|
draft: false
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
"Nombre","Entrada","Salida","Dieta","Camiseta","Material","Dormir","Comer","Necesidades"
|
||||||
|
"Shagi","2019-09-19","2010-09-22","omnivora","L","","sí (en furgo)","sí",""
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
title: "Asistencia"
|
||||||
|
date: 2021-09-14T11:29:27+02:00
|
||||||
|
draft: false
|
||||||
|
---
|
||||||
|
|
||||||
|
Esta es la plantilla para inscribirse y que sepamos de antemano cuanta gente va
|
||||||
|
a venir, para poder preparar el espacio y lo que haga falta. Avisa en matrix o
|
||||||
|
en la lista, o envía un pull request al repositorio de esta web.
|
||||||
|
|
||||||
|
{{< csvTable file="/content/2019/asistencia.csv" class="asistencia" >}}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Necesidad,Cantidad necesaria,Cantidad actual
|
||||||
|
Micros,3,3
|
||||||
|
Proyectores,3,3
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
title: "Necesidades"
|
||||||
|
date: 2021-09-14T10:56:09+02:00
|
||||||
|
draft: false
|
||||||
|
---
|
||||||
|
|
||||||
|
Entendemos que habría 3 salas de charlas y en cada sala deberíamos tener:
|
||||||
|
|
||||||
|
- Un micro
|
||||||
|
- Un cable de micro
|
||||||
|
- Un altavoz autoamplificado (o en su caso una etapa de potencia +
|
||||||
|
altavoz)
|
||||||
|
- Opcional : Mixer para conectar otras cosas
|
||||||
|
- Cables minijack-rca o minijack-jacks para conectar el laptop al mixer
|
||||||
|
- Cable minijack-rca para pasar la señal a la rpi
|
||||||
|
- Una toma de red
|
||||||
|
- Una raspberriPi o trasato similar para hacer de cliente de streaming
|
||||||
|
para grabar las charlas.
|
||||||
|
|
||||||
|
## MATERIALES PARA LA REALIZACIÓN DE LOS NODOS
|
||||||
|
|
||||||
|
- Proyector
|
||||||
|
- Equipo de sonido
|
||||||
|
|
||||||
|
{{< csvTable file="/content/2019/necesidades.csv" class="necesidades" >}}
|
|
@ -2,7 +2,7 @@
|
||||||
title: "Nodos"
|
title: "Nodos"
|
||||||
date: 2021-09-14T10:56:09+02:00
|
date: 2021-09-14T10:56:09+02:00
|
||||||
type: nodos
|
type: nodos
|
||||||
draft: true
|
draft: false
|
||||||
---
|
---
|
||||||
|
|
||||||
# Nodos
|
# Nodos
|
||||||
|
@ -14,264 +14,14 @@ listas.
|
||||||
[Materiales necesarios](/2019/MaterialesNecesarios)
|
[Materiales necesarios](/2019/MaterialesNecesarios)
|
||||||
|
|
||||||
|
|
||||||
## Viernes
|
## Viernes 20
|
||||||
|
|
||||||
<table class="wikitable">
|
{{< csvTable file="/content/2019/nodos/parrilla_viernes.csv" class="parrilla" >}}
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th scope="row" colspan="4"> VIERNES 20 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col"></th>
|
|
||||||
<th scope="col"> ____Gizartetxe____ </th>
|
|
||||||
<th scope="col"> ____Gaztetxe__ </th>
|
|
||||||
<th scope="col"> ____Cine___________ </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 09:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="2"> DESAYUNO / BREAKFAST </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 10:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 11:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="2"> ASAMBLEA PREPARATORIA HACKMEETING </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 12:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 13:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 14:00 </th>
|
|
||||||
<th scope="row" rowspan="2" colspan="3"> COMIDA </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 15:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th> 16:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="2"> ASAMBLEA GENERAL HACKMEETING </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 17:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 18:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> Audio en el fediverso: Introducción a Funkwhale [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Audio_en_el_fediverso:_Introducci.C3.B3n_a_Funkwhale">[1]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 19:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> Cómo funciona internet [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#C.C3.B3mo_funciona_internet">[2]</a>] </th>
|
|
||||||
<th scope="row" rowspan="2"> Mesa redonda. Características del software para que empodere nuestras comunidades [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Mesa_redonda._Caracter.C3.ADsticas_del_software_para_que_empodere_nuestras_comunidades">[3]</a>] </th>
|
|
||||||
<th scope="row" rowspan="2"> Ruidismo DIY | Live Coding: Generación de música a través de algoritmos [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Ruidismo_DIY_.7C_Live_Coding:_Generaci.C3.B3n_de_m.C3.BAsica_a_trav.C3.A9s_de_algoritmos">[4]</a>] </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 20:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 21:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="1"> CENA </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 22:30 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> 10 minutes Talks:
|
|
||||||
<p>Host a radical wordpress MU, tech stuffs of noblogs.org [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Host_a_radical_wordpress_MU.2C_tech_stuffs_of_noblogs.org">[5]</a>]
|
|
||||||
</p>
|
|
||||||
</th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 23:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 24:00 </th>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
|
## Sábado 21
|
||||||
|
|
||||||
## Sábado
|
{{< csvTable file="/content/2019/nodos/parrilla_sabado.csv" class="parrilla" >}}
|
||||||
|
|
||||||
<table class="wikitable">
|
## Domingo 22
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th scope="row" colspan="4"> SABADO 21 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col"> </th>
|
|
||||||
<th scope="col"> ____Gizartetxe____ </th>
|
|
||||||
<th scope="col"> ____Gaztetxe__ </th>
|
|
||||||
<th scope="col"> ____Cine___________ </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 09:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="1"> DESAYUNO / BREAKFAST </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 10:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> FaceHack [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Facehack">[6]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 11:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="2"> Burujabetza teknologikoa [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Burujabetza_teknologikoa">[7]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> Taller sobre email sin internet [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Taller_sobre_email_sin_internet_y_propuesta_din.C3.A1mica_de_probarlo_durante_este_hackmeeting">[8]</a>] </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 12:00 </th>
|
|
||||||
<th scope="row" rowspan="2"> Instalacion fotovoltaica Errekaleor [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Instalacion_fotovoltaica_Errekaleor">[9]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 13:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 14:00 </th>
|
|
||||||
<th scope="row" rowspan="2" colspan="3"> COMIDA </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 15:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th> 16:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> Taller creativo para Autodefensa Informática [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Taller_creativo_para_Autodefensa_Inform.C3.A1tica">[10]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> Motivades pel Plàstic [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Facehack">[11]</a>] </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 17:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> Subir una web a IPFS [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Subir_una_web_a_IPFS">[12]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 18:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> sindominio: tras 20 años de cyberautonomía [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#sindominio:_tras_20_a.C3.B1os_de_cyberautonom.C3.ADa">[13]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 19:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> Tractor hacking. Software privativo en coches y tractores [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Tractor_hacking">[14]</a>] </th>
|
|
||||||
<th scope="row" rowspan="2">
|
|
||||||
Charla sobre el movimiento AnarcoHacker y Proyeccion del documental "Hack the system" [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Charla_sobre_el_movimiento_AnarcoHacker_y_Proyeccion_del_documental_.22Hack_the_system.22_.28subtitulado.29">[15]</a>]
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 20:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1">Soberania alcoholica y fiestera: desde la resistencia anti-nazi, al movimiento queer[<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Soberania_alcoholica_y_fiestera:_desde_la_resistencia_anti-nazi.2C_al_movimiento_queer">[16]</a>] </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 21:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="1"> CENA </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 22:30 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> 10 minutes Talks: </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 23:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="2"> Negro Mate [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Negro_Mate">[17]</a>] </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 24:00 </th>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
|
{{< csvTable file="/content/2019/nodos/parrilla_domingo.csv" class="parrilla" >}}
|
||||||
## Domingo
|
|
||||||
|
|
||||||
<table class="wikitable">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th scope="row" colspan="4"> DOMINGO 21 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="col"> </th>
|
|
||||||
<th scope="col"> ____Gizartetxe____ </th>
|
|
||||||
<th scope="col"> ____Gaztetxe__ </th>
|
|
||||||
<th scope="col"> ____Cine___________ </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 09:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="2"> DESAYUNO / BREAKFAST </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 10:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 11:00 </th>
|
|
||||||
<th scope="row" colspan="3" rowspan="2"> ASAMBLEA GENERAL HACKMEETING </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 12:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 13:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 14:00 </th>
|
|
||||||
<th scope="row" rowspan="2" colspan="3"> COMIDA </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 15:00 </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th> 16:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 17:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 18:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 19:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"> 20:00 </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
<th scope="row" rowspan="1"> </th>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
title: "Audio en El Fediverso: Workshop Funkwhale"
|
||||||
|
date: 2021-09-19T11:55:32+02:00
|
||||||
|
type: "nodos"
|
||||||
|
quien: "Siroco"
|
||||||
|
madrina: ""
|
||||||
|
duracion: "tarde/noches del preHM"
|
||||||
|
preferencia: "pre-Hackmeeting"
|
||||||
|
necesita: ["Espacio común"]
|
||||||
|
tags: ["radio", "fediverse", "podcasting"]
|
||||||
|
draft: false
|
||||||
|
---
|
||||||
|
|
||||||
|
La idea es usar los días de preHM para configurar un nodo local de Funkwhale y
|
||||||
|
hacer pruebas con sus APIs para luego presentar el resultado en un nodo durante
|
||||||
|
el HM.
|
||||||
|
|
||||||
|
## Archivos
|
||||||
|
|
||||||
|
http://funkwhale.audio/
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Audio en El Fediverso: Introducción a Funkwhale"
|
title: "Audio en El Fediverso: Introducción a Funkwhale"
|
||||||
date: 2021-09-15T11:12:59+02:00
|
date: 2021-09-15T11:12:59+02:00
|
||||||
type: nodo
|
type: "nodos"
|
||||||
quien: "Siroco"
|
quien: "Siroco"
|
||||||
madrina: ""
|
madrina: ""
|
||||||
duracion: "1 hora"
|
duracion: "1 hora"
|
||||||
|
|
|
@ -15,4 +15,5 @@ Cantaremos entre todos varias canciones a las que les hemos cambiado la letra
|
||||||
con temas relacionados con el hacktivismo y el software libre.
|
con temas relacionados con el hacktivismo y el software libre.
|
||||||
|
|
||||||
## Archivos
|
## Archivos
|
||||||
|
|
||||||
https://negromate.ddns.net o http://fyqxyftczmxv3nmb.onion/
|
https://negromate.ddns.net o http://fyqxyftczmxv3nmb.onion/
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
,Gizartetxe,Gaztetxe,Cine
|
||||||
|
09:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
|
||||||
|
10:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
|
||||||
|
11:00:00,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING
|
||||||
|
12:00:00,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING
|
||||||
|
13:00:00,,,
|
||||||
|
14:00:00,COMIDA,COMIDA,COMIDA
|
||||||
|
15:00:00,COMIDA,COMIDA,COMIDA
|
||||||
|
16:00:00,,,
|
||||||
|
17:00:00,,,
|
||||||
|
18:00:00,,,
|
||||||
|
19:00:00,,,
|
||||||
|
20:00:00,,,
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
,Gizartetxe,Gaztetxe,Cine
|
||||||
|
09:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
|
||||||
|
10:00:00,FaceHack,,
|
||||||
|
11:00:00,,Burujabetza teknologikoa,Taller sobre email sin internet
|
||||||
|
12:00:00,Instalacion fotovoltaica Errekaleor,Burujabetza teknologikoa,
|
||||||
|
13:00:00,Instalacion fotovoltaica Errekaleor,,
|
||||||
|
14:00:00,COMIDA,COMIDA,COMIDA
|
||||||
|
15:00:00,COMIDA,COMIDA,COMIDA
|
||||||
|
16:00:00,,Taller creativo para Autodefensa Informática,Motivades pel Plàstic
|
||||||
|
17:00:00,Subir una web a IPFS,,
|
||||||
|
18:00:00,,sindominio: tras 20 años de cyberautonomía,
|
||||||
|
19:00:00,,Tractor hacking. Software privativo en coches y tractores,"Charla sobre el movimiento AnarcoHacker y Proyeccion del documental ""Hack the system"""
|
||||||
|
20:00:00,,"Soberania alcoholica y fiestera: desde la resistencia anti-nazi, al movimiento queer","Charla sobre el movimiento AnarcoHacker y Proyeccion del documental ""Hack the system"""
|
||||||
|
21:00:00,CENA,CENA,CENA
|
||||||
|
22:30:00,,10 minutes Talks,
|
||||||
|
23:00:00,,Negro Mate,
|
||||||
|
24:00:00,,Negro Mate,
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
,Gizartetxe,Gaztetxe,Cine
|
||||||
|
09:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
|
||||||
|
10:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
|
||||||
|
11:00:00,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING
|
||||||
|
12:00:00,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING
|
||||||
|
13:00:00,,,
|
||||||
|
14:00:00,COMIDA,COMIDA,COMIDA
|
||||||
|
15:00:00,COMIDA,COMIDA,COMIDA
|
||||||
|
16:00:00,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING
|
||||||
|
17:00:00,,,
|
||||||
|
18:00:00,Audio en el fediverso: Introducción a Funkwhale ,,
|
||||||
|
19:00:00,Cómo funciona internet ,Mesa redonda. Características del software para que empodere nuestras comunidades ,Ruidismo DIY | Live Coding: Generación de música a través de algoritmos
|
||||||
|
20:00:00,,Mesa redonda. Características del software para que empodere nuestras comunidades ,Ruidismo DIY | Live Coding: Generación de música a través de algoritmos
|
||||||
|
21:00:00,CENA,CENA,CENA
|
||||||
|
22:30:00,,"10 minutes Talks",
|
||||||
|
23:00:00,,,
|
||||||
|
24:00:00,,,
|
|
|
@ -5,13 +5,13 @@
|
||||||
<title>{{ block "title" . }}
|
<title>{{ block "title" . }}
|
||||||
{{ .Site.Title }}
|
{{ .Site.Title }}
|
||||||
{{ end }}</title>
|
{{ end }}</title>
|
||||||
<link rel="stylesheet" href="/css/base.css">
|
<link rel="stylesheet" href="{{ "css/base.css"|absURL }}">
|
||||||
<link rel="icon" href="/imgs/hm-favicon.png" type="image/png">
|
<link rel="icon" href="{{ "imgs/hm-favicon.png"|absURL }}" type="image/png">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<a href="{{ "/" | absURL }}">
|
<a href="{{ ""|absURL }}">
|
||||||
<img id="logo" src="/imgs/logo.png" alt="logo">
|
<img id="logo" src="{{ "imgs/logo.png"|absURL }}" alt="logo">
|
||||||
</a>
|
</a>
|
||||||
{{ .Site.Title }}
|
{{ .Site.Title }}
|
||||||
|
|
||||||
|
|
|
@ -3,18 +3,18 @@
|
||||||
<head>
|
<head>
|
||||||
<title>Hackmeeting 2019</title>
|
<title>Hackmeeting 2019</title>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<link rel="stylesheet" href="css/home.css">
|
<link rel="stylesheet" href="{{ "css/home.css"|absURL }}">
|
||||||
<meta name="viewport" content="width=device-width">
|
<meta name="viewport" content="width=device-width">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="canonical" href="http://es.hackmeeting.org/index.html">
|
<link rel="canonical" href="http://es.hackmeeting.org/index.html">
|
||||||
<meta name="author" content="Hackmeeting">
|
<meta name="author" content="Hackmeeting">
|
||||||
<meta name="description" content="Autogestión, Hacktivismo, CryptoAnarquismo, Hackmeeting">
|
<meta name="description" content="Autogestión, Hacktivismo, CryptoAnarquismo, Hackmeeting">
|
||||||
<link rel="icon" href="/imgs/hm-favicon.png" type="image/png">
|
<link rel="icon" href="{{ "imgs/hm-favicon.png"|absURL }}" type="image/png">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<img class="imgCenter" src="imgs/hm-favicon.png"/>
|
<img class="imgCenter" src="{{ "imgs/hm-favicon.png"|absURL }}"/>
|
||||||
<h1>{{ .Title }}</h2>
|
<h1>{{ .Title }}</h2>
|
||||||
<h2>{{ .Params.when }}</h2>
|
<h2>{{ .Params.when }}</h2>
|
||||||
<h2>{{ .Params.where }}</h2>
|
<h2>{{ .Params.where }}</h2>
|
||||||
|
|
|
@ -2,9 +2,8 @@
|
||||||
{{ .TableOfContents }}
|
{{ .TableOfContents }}
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
|
|
||||||
{{ range .Pages }}
|
{{ range where .Pages "Params.type" "nodos" }}
|
||||||
{{ partial "nodo" . }}
|
{{ partial "nodo" . }}
|
||||||
{{ .Render "li" }}
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
|
@ -35,4 +35,12 @@
|
||||||
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
|
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{{ range .Parent.Parent.Pages }}
|
||||||
|
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
{{ end}}
|
{{ end}}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
{{ $class := .Get "class" }}
|
||||||
|
{{ $file := .Get "file" }}
|
||||||
|
{{ $data := getCSV "," $file }}
|
||||||
|
<table class="{{ $class }}">
|
||||||
|
{{ range $row, $columns := $data }}
|
||||||
|
<tr>
|
||||||
|
{{ range $columns }}
|
||||||
|
{{ if eq $row 0 }}
|
||||||
|
<th> {{ . }}</th>
|
||||||
|
{{ else }}
|
||||||
|
<td> {{ . }}</td>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</tr>
|
||||||
|
{{ end }}
|
||||||
|
</table>
|
|
@ -0,0 +1 @@
|
||||||
|
{{ .Inner }}
|
|
@ -0,0 +1,20 @@
|
||||||
|
{{ define "main" }}
|
||||||
|
{{ .TableOfContents }}
|
||||||
|
{{ .Content }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ define "sidebar_menu" }}
|
||||||
|
<ul>
|
||||||
|
{{ range .Pages }}
|
||||||
|
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{{ range .Parent.Pages }}
|
||||||
|
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
{{ end}}
|
|
@ -3,6 +3,7 @@ body {
|
||||||
gap: 0 1em;
|
gap: 0 1em;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
header {
|
header {
|
||||||
|
@ -44,6 +45,53 @@ aside a {
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
aside ul {
|
||||||
|
list-style-type: none;
|
||||||
|
padding: 0.5em;
|
||||||
|
background-color: #333;
|
||||||
|
border-radius: 0.5em;
|
||||||
|
margin: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside li {
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
table th, table td {
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.parrilla {
|
||||||
|
width: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
table.parrilla td {
|
||||||
|
width: 29%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.parrilla td:first-child {
|
||||||
|
font-weight: bold;
|
||||||
|
width: 9%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.parrilla td:nth-child(2) {
|
||||||
|
background-color: #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.parrilla td:nth-child(3) {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.parrilla td:nth-child(4) {
|
||||||
|
background-color: #eee
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,169 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
import atexit
|
||||||
|
import csv
|
||||||
|
import os
|
||||||
|
import readline
|
||||||
|
import sys
|
||||||
|
from cmd import Cmd
|
||||||
|
|
||||||
|
def init_readline():
|
||||||
|
histfile = os.path.join(os.path.expanduser("~"), ".hmwebot_history")
|
||||||
|
|
||||||
|
try:
|
||||||
|
readline.read_history_file(histfile)
|
||||||
|
h_len = readline.get_current_history_length()
|
||||||
|
except FileNotFoundError:
|
||||||
|
open(histfile, 'wb').close()
|
||||||
|
h_len = 0
|
||||||
|
|
||||||
|
def save(prev_h_len, histfile):
|
||||||
|
new_h_len = readline.get_current_history_length()
|
||||||
|
readline.set_history_length(1000)
|
||||||
|
readline.append_history_file(new_h_len - prev_h_len, histfile)
|
||||||
|
atexit.register(save, h_len, histfile)
|
||||||
|
|
||||||
|
|
||||||
|
def rlinput(prompt, prefill=''):
|
||||||
|
readline.set_startup_hook(lambda: readline.insert_text(prefill))
|
||||||
|
try:
|
||||||
|
return input(prompt) # or raw_input in Python 2
|
||||||
|
finally:
|
||||||
|
readline.set_startup_hook()
|
||||||
|
|
||||||
|
|
||||||
|
class CSVEditor:
|
||||||
|
def __init__(self, filename):
|
||||||
|
self.filename = filename
|
||||||
|
with open(filename, 'r') as f:
|
||||||
|
reader = csv.DictReader(f)
|
||||||
|
self.fieldnames = reader.fieldnames
|
||||||
|
self.data = [data for data in reader]
|
||||||
|
|
||||||
|
def get_list(self, title_field):
|
||||||
|
return [(idx, data[title_field]) for idx, data in enumerate(self.data)]
|
||||||
|
|
||||||
|
def get(self, idx):
|
||||||
|
try:
|
||||||
|
return self.data[idx]
|
||||||
|
except IndexError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def show(self, idx):
|
||||||
|
line = self.get(idx)
|
||||||
|
if line is None:
|
||||||
|
return "Índice fuera de rango"
|
||||||
|
output = [
|
||||||
|
f"{field}: {value}"
|
||||||
|
for field, value in line.items()
|
||||||
|
]
|
||||||
|
return "\n".join(output)
|
||||||
|
|
||||||
|
def edit(self, idx, item):
|
||||||
|
self.data[idx] = item
|
||||||
|
|
||||||
|
def delete(self, idx):
|
||||||
|
if idx in self.data:
|
||||||
|
del self.data[idx]
|
||||||
|
|
||||||
|
def _edit(self, item):
|
||||||
|
editing = True
|
||||||
|
while editing:
|
||||||
|
for fieldname in self.fieldnames:
|
||||||
|
item[fieldname] = rlinput(f"{fieldname}: ", prefill=item.get(fieldname, ''))
|
||||||
|
|
||||||
|
editing = rlinput('Terminado (s/N)?').lower() == 'n'
|
||||||
|
|
||||||
|
def edit(self, idx):
|
||||||
|
item = self.get(idx)
|
||||||
|
if item is None:
|
||||||
|
return
|
||||||
|
self._edit(item)
|
||||||
|
self.data[idx] = item
|
||||||
|
|
||||||
|
def add(self):
|
||||||
|
item = {}
|
||||||
|
self._edit(item)
|
||||||
|
self.data.append(item)
|
||||||
|
|
||||||
|
def write(self):
|
||||||
|
with open(self.filename, 'w') as f:
|
||||||
|
writer = csv.DictWriter(f, fieldnames=self.fieldnames)
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(self.data)
|
||||||
|
|
||||||
|
|
||||||
|
class CSVEditorCmd(Cmd):
|
||||||
|
"Editor interactivo de ficheros csv"
|
||||||
|
|
||||||
|
def __init__(self, filename, title_field=None):
|
||||||
|
super().__init__()
|
||||||
|
self.csveditor = CSVEditor(filename)
|
||||||
|
self.title_field = title_field
|
||||||
|
if title_field is None:
|
||||||
|
self.title_field = self.csveditor.fieldnames[0]
|
||||||
|
self.do_help('')
|
||||||
|
|
||||||
|
def do_list(self, arg):
|
||||||
|
"Listar el contenido del csv"
|
||||||
|
for idx, item in self.csveditor.get_list(self.title_field):
|
||||||
|
print(f"{idx}) {item}")
|
||||||
|
|
||||||
|
def do_show(self, arg):
|
||||||
|
"Mostrar la línea con el índice indicado"
|
||||||
|
try:
|
||||||
|
idx = int(arg)
|
||||||
|
except ValueError:
|
||||||
|
print("Tienes que indicar un número")
|
||||||
|
return
|
||||||
|
print(self.csveditor.show(idx))
|
||||||
|
|
||||||
|
def do_add(self, arg):
|
||||||
|
"Añadir una nueva entrada"
|
||||||
|
self.csveditor.add()
|
||||||
|
|
||||||
|
def do_edit(self, arg):
|
||||||
|
"Editar la entrada con el índice indicado"
|
||||||
|
try:
|
||||||
|
idx = int(arg)
|
||||||
|
except ValueError:
|
||||||
|
print("Tienes que indicar un número")
|
||||||
|
return
|
||||||
|
self.csveditor.edit(idx)
|
||||||
|
|
||||||
|
def do_delete(self, arg):
|
||||||
|
"Quitar la entrada con el índice indicado"
|
||||||
|
try:
|
||||||
|
idx = int(arg)
|
||||||
|
except ValueError:
|
||||||
|
print("Tienes que indicar un número")
|
||||||
|
return
|
||||||
|
self.csveditor.delete(idx)
|
||||||
|
|
||||||
|
def do_save(self, arg):
|
||||||
|
"Guardar la lista actualizada"
|
||||||
|
self.csveditor.write()
|
||||||
|
|
||||||
|
def do_quit(self, arg):
|
||||||
|
"Terminar"
|
||||||
|
return True
|
||||||
|
|
||||||
|
do_EOF = do_quit
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(
|
||||||
|
description='Editor sencillo de ficheros CSV')
|
||||||
|
|
||||||
|
parser.add_argument('csvfile', help='Fichero que hay que editar.')
|
||||||
|
parser.add_argument('-t', '--title', help='Columna principal del CSV, por defecto la primera.')
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
init_readline()
|
||||||
|
# bot = Bot()
|
||||||
|
args = parser.parse_args()
|
||||||
|
cmd = CSVEditorCmd(args.csvfile, args.title)
|
||||||
|
cmd.cmdloop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,15 @@
|
||||||
|
Tareas que hay que facilitar:
|
||||||
|
|
||||||
|
- nuevo nodo
|
||||||
|
- nueva asistencia
|
||||||
|
igual cambiar el sistema actual para que sea también un csv, así podemos
|
||||||
|
cambiar las columnas necesarias para cada año
|
||||||
|
|
||||||
|
el programa pregunta y añade, o busca en la lista para quitar a alguien
|
||||||
|
- necesidades
|
||||||
|
poder pedir proyectores, material de limpieza, gente, etc.
|
||||||
|
|
||||||
|
un csv con tres columnas: texto, cantidad necesaria, cantidad actual
|
||||||
|
|
||||||
|
el programa pregunta por una de las líneas del csv para borrar, editar, cambiar la cantidad,
|
||||||
|
también se pueden añadir nuevas líneas
|
Loading…
Reference in New Issue