Compare commits
No commits in common. "master" and "e4ebd01164016f65f9ce0693aab5110b41fd1bfd" have entirely different histories.
master
...
e4ebd01164
38
.drone.yml
38
.drone.yml
|
@ -1,38 +0,0 @@
|
||||||
---
|
|
||||||
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,61 +1,14 @@
|
||||||
# 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
|
||||||
|
|
||||||
Hay una serie de comandos auxiliares para gestionar el contenido de la web de
|
Por ejemplo, para crear un nodo que se llame `nodo1` para el 2019:
|
||||||
manera sencilla.
|
|
||||||
|
|
||||||
Todos estos comandos aceptan un parámetro opcional: el año en el que estamos
|
hugo new 2019/nodos/nodo1.md -k nodo
|
||||||
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:
|
||||||
|
|
||||||
bin/nuevo_hackmeeting
|
hugo new 2022 -k hm
|
||||||
|
|
||||||
|
|
||||||
## Mini intro a Hugo
|
## Mini intro a Hugo
|
||||||
|
@ -80,39 +33,3 @@ 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,7 +1,6 @@
|
||||||
---
|
---
|
||||||
title: "{{ replace .Name "-" " " | title }}"
|
title: "{{ replace .Name "-" " " | title }}"
|
||||||
date: {{ .Date }}
|
date: {{ .Date }}
|
||||||
type: "yearhome"
|
|
||||||
draft: true
|
draft: true
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
"Nombre","Entrada","Salida","Dieta","Camiseta","Material","Dormir","Comer","Necesidades"
|
|
|
|
@ -1,11 +0,0 @@
|
||||||
---
|
|
||||||
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" >}}
|
|
|
@ -1 +0,0 @@
|
||||||
Necesidad,Cantidad necesaria,Cantidad actual
|
|
|
|
@ -1,7 +0,0 @@
|
||||||
---
|
|
||||||
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: "nodos"
|
type: nodo
|
||||||
quien: "organizadoras"
|
quien: "organizadoras"
|
||||||
madrina: "madrina"
|
madrina: "madrina"
|
||||||
duracion: "1 hora"
|
duracion: "1 hora"
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
YEAR=${1:-$(date "+%Y")}
|
|
||||||
|
|
||||||
utils/csveditor.py content/${YEAR}/asistencia.csv
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
YEAR=${1:-$(date "+%Y")}
|
|
||||||
|
|
||||||
utils/csveditor.py content/${YEAR}/necesidades.csv
|
|
|
@ -1,9 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
YEAR=${1:-$(date "+%Y")}
|
|
||||||
|
|
||||||
echo -n "Titulo: "
|
|
||||||
read TITLE
|
|
||||||
SLUG=$(bin/slugify ${TITLE})
|
|
||||||
|
|
||||||
hugo new ${YEAR}/${SLUG}.md
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
YEAR=${1:-$(date "+%Y")}
|
|
||||||
|
|
||||||
hugo new ${YEAR} -k hm
|
|
|
@ -1,9 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
YEAR=${1:-$(date "+%Y")}
|
|
||||||
|
|
||||||
echo -n "Titulo: "
|
|
||||||
read TITLE
|
|
||||||
SLUG=$(bin/slugify ${TITLE})
|
|
||||||
|
|
||||||
hugo new ${YEAR}/nodos/${SLUG}.md -k nodo
|
|
41
bin/slugify
41
bin/slugify
|
@ -1,41 +0,0 @@
|
||||||
#!/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,7 +1,6 @@
|
||||||
---
|
---
|
||||||
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
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
"Nombre","Entrada","Salida","Dieta","Camiseta","Material","Dormir","Comer","Necesidades"
|
|
||||||
"Shagi","2019-09-19","2010-09-22","omnivora","L","","sí (en furgo)","sí",""
|
|
|
|
@ -1,11 +0,0 @@
|
||||||
---
|
|
||||||
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" >}}
|
|
|
@ -1,3 +0,0 @@
|
||||||
Necesidad,Cantidad necesaria,Cantidad actual
|
|
||||||
Micros,3,3
|
|
||||||
Proyectores,3,3
|
|
|
|
@ -1,25 +0,0 @@
|
||||||
---
|
|
||||||
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: false
|
draft: true
|
||||||
---
|
---
|
||||||
|
|
||||||
# Nodos
|
# Nodos
|
||||||
|
@ -14,14 +14,264 @@ listas.
|
||||||
[Materiales necesarios](/2019/MaterialesNecesarios)
|
[Materiales necesarios](/2019/MaterialesNecesarios)
|
||||||
|
|
||||||
|
|
||||||
## Viernes 20
|
## Viernes
|
||||||
|
|
||||||
{{< csvTable file="/content/2019/nodos/parrilla_viernes.csv" class="parrilla" >}}
|
<table class="wikitable">
|
||||||
|
<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
|
|
||||||
|
|
||||||
{{< csvTable file="/content/2019/nodos/parrilla_sabado.csv" class="parrilla" >}}
|
## Sábado
|
||||||
|
|
||||||
## Domingo 22
|
<table class="wikitable">
|
||||||
|
<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>
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
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: "nodos"
|
type: nodo
|
||||||
quien: "Siroco"
|
quien: "Siroco"
|
||||||
madrina: ""
|
madrina: ""
|
||||||
duracion: "1 hora"
|
duracion: "1 hora"
|
||||||
|
@ -21,6 +21,6 @@ funkwhale y mirar hasta que punto podemos usar su API para desarrollar un
|
||||||
sistema de podcasting. El resultado de la investigación será presentado en este
|
sistema de podcasting. El resultado de la investigación será presentado en este
|
||||||
nodo.
|
nodo.
|
||||||
|
|
||||||
## Archivos
|
##Archivos
|
||||||
|
|
||||||
http://funkwhale.audio/
|
http://funkwhale.audio/
|
||||||
|
|
|
@ -15,5 +15,4 @@ 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/
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
,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,,,
|
|
|
|
@ -1,17 +0,0 @@
|
||||||
,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,
|
|
|
|
@ -1,17 +0,0 @@
|
||||||
,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"|absURL }}">
|
<link rel="stylesheet" href="/css/base.css">
|
||||||
<link rel="icon" href="{{ "imgs/hm-favicon.png"|absURL }}" type="image/png">
|
<link rel="icon" href="/imgs/hm-favicon.png" type="image/png">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<a href="{{ ""|absURL }}">
|
<a href="{{ "/" | absURL }}">
|
||||||
<img id="logo" src="{{ "imgs/logo.png"|absURL }}" alt="logo">
|
<img id="logo" src="/imgs/logo.png" 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"|absURL }}">
|
<link rel="stylesheet" href="css/home.css">
|
||||||
<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"|absURL }}" type="image/png">
|
<link rel="icon" href="/imgs/hm-favicon.png" type="image/png">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<img class="imgCenter" src="{{ "imgs/hm-favicon.png"|absURL }}"/>
|
<img class="imgCenter" src="imgs/hm-favicon.png"/>
|
||||||
<h1>{{ .Title }}</h2>
|
<h1>{{ .Title }}</h2>
|
||||||
<h2>{{ .Params.when }}</h2>
|
<h2>{{ .Params.when }}</h2>
|
||||||
<h2>{{ .Params.where }}</h2>
|
<h2>{{ .Params.where }}</h2>
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
{{ .TableOfContents }}
|
{{ .TableOfContents }}
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
|
|
||||||
{{ range where .Pages "Params.type" "nodos" }}
|
{{ range .Pages }}
|
||||||
{{ partial "nodo" . }}
|
{{ partial "nodo" . }}
|
||||||
|
{{ .Render "li" }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
|
@ -35,12 +35,4 @@
|
||||||
<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}}
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
{{ $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>
|
|
|
@ -1 +0,0 @@
|
||||||
{{ .Inner }}
|
|
|
@ -1,20 +0,0 @@
|
||||||
{{ 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,7 +3,6 @@ body {
|
||||||
gap: 0 1em;
|
gap: 0 1em;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
header {
|
header {
|
||||||
|
@ -45,53 +44,6 @@ 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
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,169 +0,0 @@
|
||||||
#!/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()
|
|
|
@ -1,15 +0,0 @@
|
||||||
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