diff --git a/content/pages/asociacion.md b/content/pages/corporacion.md similarity index 98% rename from content/pages/asociacion.md rename to content/pages/corporacion.md index e5ea0a7..9dc8f31 100644 --- a/content/pages/asociacion.md +++ b/content/pages/corporacion.md @@ -1,4 +1,4 @@ -Title: Asociación +Title: Corporación Date: 2026-07-04 10:00 La **Asociación Python Software Chile** es la entidad legal que respalda a la diff --git a/content/pages/estatutos.md b/content/pages/estatutos.md index 5e8a89d..6b6bc48 100644 --- a/content/pages/estatutos.md +++ b/content/pages/estatutos.md @@ -7,7 +7,7 @@ los estatutos originales de la constitución de la asociación, otorgados el 29 de julio de 2022. Para más información sobre la asociación, visita la página de -[Asociación]({filename}/pages/asociacion.md). +[Corporación]({filename}/pages/corporacion.md). ## Título I: Del nombre, domicilio, objeto, duración diff --git a/content/pages/eventos.md b/content/pages/eventos.md deleted file mode 100644 index ab0867f..0000000 --- a/content/pages/eventos.md +++ /dev/null @@ -1,86 +0,0 @@ -Title: Eventos -Date: 2024-02-14 10:00 - ---- - -### Eventos Finalizados - -#### [Meetups](https://meetup.com/es/pythonchile) anteriores -Siempre estamos buscando nuevos temas de charlas o talleres. Ahora estamos organizando Meetups presenciales y online. ¿Te animas a facilitarnos un espacio físico? ¿Te gustaría hacer una charla o taller? ¡Escríbenos!: meetup@pythonchile.cl. - -Únete a nuestro [grupo de Meetup](https://meetup.com/es/pythonchile) para recibir notificaciones de los eventos programados. - -- [Meetup Fin de Año 2024](https://www.youtube.com/watch?v=7NYzEu86bLU): Encuentro de cierre de año con la comunidad. -- [Meetup Julio 2024](https://www.youtube.com/watch?v=U3yoV1-Quws): Aplicaciones Multiagente con Azure OpenIA + Langchain. -- [Meetup Mayo 2024](https://www.youtube.com/watch?v=vgkOTFfJvPc): Charla sobre Python y Data Storytelling. -- [Meetup Abril 2024](https://www.youtube.com/watch?v=4Glkip6TTbs): Introducción a Machine Learning con Hugging Face. -- [Meetup Marzo 2024](https://www.youtube.com/watch?v=kQenJMoZ06Y): Modelos Predictivos de Machine Learning con Python. -- [Meetup Diciembre 2023](https://www.youtube.com/watch?v=CWHV-tyqxs4): Web APIs con Django. -- [Meetup Diciembre 2023](https://www.youtube.com/watch?v=lGKRPUtGfE8): Django de Cero a Producción. - -Revisa en [YouTube](https://www.youtube.com/playlist?list=PLUJnp-JI9H_yCrLT2-6Ze_cSMGsLcGloh) los videos de las reuniones anteriores. - ---- - -#### [PyCon](https://pycon.cl) - -##### [PyCon2024](https://pycon.cl/2024) - - - [PyCon2024 Online Track 2](https://www.youtube.com/watch?v=DI89ALX0dbA): PyCon Chile Online 2024. - - [PyCon2024 Online Track 1](https://www.youtube.com/watch?v=mdpfYPBdn1A): Evento transmitido en vivo. - -##### [PyCon2023](https://pycon.cl/2023) - - - [PyCon2023 Track Web](https://www.youtube.com/watch?v=4mBdhoVD6oQ): Charlas en línea. - - [PyCon2023 Track Datos](https://www.youtube.com/watch?v=l3B9eetX3mc): Charlas en línea. - - [PyCon2023 Valparaíso](https://www.youtube.com/watch?v=X1xcyY9Y0Pc): Evento presencial transmitido en vivo. - - Talleres: - - [Cómo resumir documentos (y medir la calidad del resultado) usando open AI](https://www.youtube.com/watch?v=NyQA02i7TX0): Nivel básico, charlista Sergio Ferro, tópico Ciencia de datos. - - [Taller Telegram Bots en Python](https://www.youtube.com/watch?v=5qV1DPFS0x4): Nivel básico, charlista Juan Cuellar, tópico Automatización. - - [Web APIs en Django](https://www.youtube.com/watch?v=CWHV-tyqxs4): Nivel intermedio, charlista Flavio Espeche, tópico Web. - - [Django de Cero a Producción](https://www.youtube.com/watch?v=lGKRPUtGfE8&t=14s): Nivel intermedio, charlista Marcelo Herrera, tópico Web. - - [MyOJ: Una plataforma para resolver problemas de programación en Python](https://www.youtube.com/watch?v=hnwLGr_qHD4): Nivel básico, charlista Hugo Leyton, tópico Web. - - -##### [PyCon2022](https://pycon.cl/2022) - La segunda PyCon Chilena se llevó a cabo del 2 al 4 de diciembre de 2022, con 3 eventos presenciales en Copiapó, Valparaíso y Santiago, además de un evento online con participantes de varios países. - - - Evento en Copiapó: [PyCon Chile 2022 Copiapó](https://www.youtube.com/watch?v=A0eTkm6v68o). - - Evento en Santiago: [PyCon Chile 2022 Sábado](https://www.youtube.com/watch?v=fjkQ0xNt2B4). - - Evento transmitido en vivo: [PyCon Chile 2022 Domingo Bloque A](https://www.youtube.com/watch?v=L0HFy2yZsck). - - Evento transmitido en vivo: [PyCon Chile 2022 Domingo Bloque B](https://www.youtube.com/watch?v=76cIw_G0bAA). - -##### [PyCon2021](https://pycon.cl/2021) - El primer evento PyCon Chile, realizado del 5 al 7 de noviembre de 2021. - Revisa el [sitio oficial](https://pycon.cl/2021) o las charlas en el canal de [YouTube](https://www.youtube.com/playlist?list=PLUJnp-JI9H_wrHCpMPDdYcqSNF6EVISUW). - - - Charlas domingo: [Bloque A](https://www.youtube.com/watch?v=_-2erPEYbjk&list=PLUJnp-JI9H_yY0h78Qd9LyXZPloa2WHEB). - - Charlas domingo: [Bloque B](https://www.youtube.com/watch?v=VLyEJoQhuD4&list=PLUJnp-JI9H_y8WIzTbTbQ8fA-8fJN7b3P). - - Charlas sábado: [Bloque A](https://www.youtube.com/watch?v=L9NGtc61W0Q&list=PLUJnp-JI9H_xCL5Cfs5t_HYGFujdVVTDC). - - Charlas sábado: [Bloque B](https://www.youtube.com/watch?v=rC5KCVC0CuU&list=PLUJnp-JI9H_yedKvveSZlNp5wJ0UwJEyo). - ---- - -#### [PyDay](https://pyday.cl) - -##### [PyDay2024](https://pyday.cl) - La cuarta PyDay se llevó a cabo con 2 eventos presenciales en Copiapó y Valparaíso. - - - [PyDay Valparaíso 2024](https://www.youtube.com/watch?v=6AWDEZY_iZI): Evento presencial en Valparaíso. - - [PyDay Copiapó 2024](https://www.youtube.com/watch?v=4t-z5oVGIAA): Evento presencial en Copiapó. - -##### [PyDay2023](https://pyday.cl/2023) - La tercera PyDay se llevó a cabo con 2 eventos presenciales en Puerto Montt y Valparaíso, además de un evento online. - - - [PyDay2023 Online](https://www.youtube.com/watch?v=FB-VCA9sjio): Evento transmitido en vivo. - - [PyDay Puerto Montt 2023](https://www.youtube.com/watch?v=xjwkJzBTdNI): Evento en la ciudad de Puerto Montt. - - [PyDay Valparaíso 2023](https://www.youtube.com/watch?v=m3v8Ah5NOSQ): Evento en la ciudad de Valparaíso. - -##### [PyDay2022](https://pyday.cl/2022) - ¡PyDay Chile se fue a regiones! - Jornadas presenciales en Valparaíso y La Serena el 15 de julio y 5 de agosto del 2022, respectivamente. Jornada virtual el 16 de julio del 2022. - Revisa la grabación de las charlas en el canal de [YouTube](https://www.youtube.com/watch?v=Dy0SSE8uk-Y). - -##### [PyDay2020](https://pyday.cl/2020) - El primer evento de la comunidad, PyDay Chile, llevado a cabo el 5 de diciembre de 2020. - Revisa la información en el [sitio oficial](https://pyday.cl/2020/) o las charlas en el canal de [YouTube](https://www.youtube.com/watch?v=x6U4ocP1k2Q&list=PLUJnp-JI9H_xUe5Jur1MqwdODwtOQs09p). diff --git a/objects/events/_2020.py b/objects/events/_2020.py new file mode 100644 index 0000000..c52a82f --- /dev/null +++ b/objects/events/_2020.py @@ -0,0 +1,12 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'PyDay', + 'track': 'Chile 2020', + 'date': date(2020, 12, 5), + 'youtube': 'fhsNoZaT940', + 'viewers': 4424, + 'talks': 28 + } +] diff --git a/objects/events/_2021.py b/objects/events/_2021.py new file mode 100644 index 0000000..2bd50ed --- /dev/null +++ b/objects/events/_2021.py @@ -0,0 +1,43 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'PyCon Chile', + 'track': '2021 Talleres', + 'date': date(2021, 11, 5), + 'talks': 1, + 'workshops': 10 + }, + { + 'type': 'PyCon Chile', + 'date': date(2021, 11, 6), + 'track': '2021 Sábado A', + 'youtube': '18VvatmT8Qs', + 'viewers': 3333, + 'talks': 11 + }, + { + 'type': 'PyCon Chile', + 'date': date(2021, 11, 6), + 'track': '2021 Sábado B', + 'youtube': 'prV2vqwTDfo', + 'viewers': 1592, + 'talks': 11 + }, + { + 'type': 'PyCon Chile', + 'date': date(2021, 11, 7), + 'track': '2021 Domingo A', + 'youtube': '2zJ0pA8Z6jk', + 'viewers': 2292, + 'talks': 11 + }, + { + 'type': 'PyCon Chile', + 'date': date(2021, 11, 7), + 'track': '2021 Domingo B', + 'youtube': 'qSn8in4QJYI', + 'viewers': 1998, + 'talks': 11 + }, +] diff --git a/objects/events/_2022.py b/objects/events/_2022.py new file mode 100644 index 0000000..81f742b --- /dev/null +++ b/objects/events/_2022.py @@ -0,0 +1,153 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'Meetup', + 'track': 'Enero 2022', + 'date': date(2022, 1, 27), + 'youtube': 'fm2-PQFrwpE', + 'viewers': 884, + 'talks': 2, + 'meetup': 283338972 + }, + { + 'type': 'Meetup', + 'track': 'Febrero 2022', + 'date': date(2022, 2, 24), + 'youtube': 'YTsq2owOzyo', + 'viewers': 346, + 'talks': 2, + 'meetup': 283780910 + }, + { + 'type': 'Meetup', + 'track': 'Marzo 2022', + 'date': date(2022, 3, 31), + 'youtube': '9iiH4TnCFUE', + 'viewers': 505, + 'talks': 2, + 'meetup': 284778039 + }, + { + 'type': 'Meetup', + 'track': 'Abril 2022', + 'date': date(2022, 4, 28), + 'youtube': 'UxYg0ira1g8', + 'viewers': 295, + 'talks': 2, + 'meetup': 285298110 + }, + { + 'type': 'Meetup', + 'track': 'Mayo 2022', + 'date': date(2022, 5, 26), + 'youtube': 'mSAhkcSRdNY', + 'viewers': 493, + 'talks': 2, + 'meetup': 285911020 + }, + { + 'type': 'Meetup', + 'track': 'Junio 2022', + 'date': date(2022, 6, 30), + 'youtube': 'CBJrQOWGxeU', + 'viewers': 235, + 'talks': 2, + 'meetup': 286694260 + }, + { + 'type': 'PyDay', + 'track': 'Valparaíso 2022', + 'date': date(2022, 7, 15), + 'city': 'Valparaíso', + 'workshops': 2 + }, + { + 'type': 'PyDay', + 'track': 'Online 2022', + 'date': date(2022, 7, 16), + 'youtube': 'Dy0SSE8uk-Y', + 'viewers': 2508, + 'talks': 17 + }, + { + 'type': 'PyDay', + 'track': 'La Serena 2022', + 'date': date(2022, 8, 5), + 'city': 'La Serena', + 'talks': 1, + 'workshops': 3 + }, + { + 'type': 'Meetup', + 'track': 'Agosto 2022', + 'date': date(2022, 8, 25), + 'youtube': 'FPOQmLB7zE8', + 'viewers': 241, + 'talks': 2, + 'meetup': 287838742 + }, + { + 'type': 'Meetup', + 'track': 'Septiembre 2022', + 'date': date(2022, 9, 29), + 'youtube': 'ztCLbcYQcjs', + 'viewers': 230, + 'talks': 2, + 'meetup': 288677224 + }, + { + 'type': 'Meetup', + 'track': 'Octubre 2022', + 'date': date(2022, 10, 27), + 'youtube': 'artZ149FvH0', + 'viewers': 260, + 'talks': 2, + 'meetup': 289137955 + }, + { + 'type': 'PyCon Chile', + 'track': '2022 Copiapó', + 'city': 'Copiapó', + 'date': date(2022, 12, 2), + 'youtube': 'A0eTkm6v68o', + 'viewers': 823, + 'talks': 11, + 'workshops': 2 + }, + { + 'type': 'PyCon Chile', + 'track': '2022 Valparaíso', + 'city': 'Valparaíso', + 'date': date(2022, 12, 2), + 'talks': 4 + }, + { + 'type': 'PyCon Chile', + 'track': '2022 Santiago ', + 'city': 'Santiago', + 'date': date(2022, 12, 3), + 'youtube': 'fjkQ0xNt2B4', + 'viewers': 1287, + 'talks': 11, + 'attendees': 21 + }, + { + 'type': 'PyCon Chile', + 'track': '2022 Online A', + 'city': 'Santiago', + 'date': date(2022, 12, 4), + 'youtube': 'L0HFy2yZsck', + 'viewers': 1088, + 'talks': 10 + }, + { + 'type': 'PyCon Chile', + 'track': '2022 Online B', + 'city': 'Santiago', + 'date': date(2022, 12, 4), + 'youtube': '76cIw_G0bAA', + 'viewers': 598, + 'talks': 10 + } +] diff --git a/objects/events/_2023.py b/objects/events/_2023.py new file mode 100644 index 0000000..9a26ac2 --- /dev/null +++ b/objects/events/_2023.py @@ -0,0 +1,161 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'Meetup', + 'track': 'Enero 2023', + 'date': date(2023, 1, 26), + 'youtube': 'H1V6SAkJCyk', + 'viewers': 203, + 'talks': 1, + 'meetup': 290873444 + }, + { + 'type': 'Meetup', + 'track': 'Online Febrero 2023', + 'date': date(2023, 2, 23), + 'youtube': 'iZmh-UVaQt8', + 'viewers': 246, + 'talks': 2, + 'meetup': 291672027 + }, + { + 'type': 'Meetup', + 'track': 'Presencial Febrero 2023', + 'city': 'Santiago', + 'date': date(2023, 2, 28), + 'youtube': '6h6V02LxIBc', + 'viewers': 329, + 'talks': 2, + 'meetup': 291674610 + }, + { + 'type': 'Meetup', + 'track': 'Día de la Mujer 2023', + 'date': date(2023, 3, 25), + 'youtube': 'ZLWpIz7KW3M', + 'viewers': 254, + 'talks': 1, + 'meetup': 292370154 + }, + { + 'type': 'Meetup', + 'track': 'Marzo 2023', + 'date': date(2023, 3, 30), + 'youtube': '1Coha3qXWMU', + 'viewers': 1907, + 'talks': 1, + 'meetup': 292300557 + }, + { + 'type': 'Meetup', + 'track': 'Presencial Mayo 2023', + 'date': date(2023, 5, 17), + 'city': 'Santiago', + 'youtube': 'R-SChWd-c-Y', + 'viewers': 251, + 'talks': 2, + 'meetup': 293427587 + }, + { + 'type': 'Meetup', + 'track': 'Online Mayo 2023', + 'date': date(2023, 5, 25), + 'youtube': 'JOZqHRlKvGM', + 'viewers': 177, + 'talks': 1, + 'meetup': 293300725 + }, + { + 'type': 'PyDay', + 'track': 'Valparaíso 2023', + 'date': date(2023, 6, 16), + 'city': 'Valparaíso', + 'talks': 7, + 'youtube': 'm3v8Ah5NOSQ', + 'viewers': 484 + }, + { + 'type': 'PyDay', + 'track': 'Puerto Montt 2023', + 'date': date(2023, 6, 17), + 'talks': 6, + 'youtube': 'xjwkJzBTdNI', + 'viewers': 853, + }, + { + 'type': 'PyDay', + 'track': 'Online 2023', + 'date': date(2023, 6, 18), + 'talks': 10, + 'youtube': 'FB-VCA9sjio', + 'viewers': 1253 + }, + { + 'type': 'Hackaton', + 'track': 'EY', + 'date': date(2023, 7, 1), + 'city': 'Santiago', + 'challenges': 1 + }, + { + 'type': 'Meetup', + 'track': 'Julio 2023', + 'date': date(2023, 7, 26), + 'city': 'Santiago', + 'youtube': 'BwQgb1kOHYM', + 'viewers': 647, + 'talks': 2, + 'meetup': 294675536 + }, + { + 'type': 'Meetup', + 'track': 'Septiembre 2023', + 'date': date(2023, 9, 28), + 'youtube': 'IQqPr7e3zic', + 'viewers': 328, + 'talks': 2, + 'meetup': 296123669 + }, + { + 'type': 'Meetup', + 'track': 'Noviembre 2023', + 'date': date(2023, 11, 9), + 'talks': 1, + 'meetup': 297124086 + }, + { + 'type': 'PyCon Chile', + 'track': '2023 Talleres', + 'date': date(2023, 11, 24), + 'youtube': 'hnwLGr_qHD4', + 'viewers': 411, + 'workshops': 5, + }, + { + 'type': 'PyCon Chile', + 'track': '2023 Auditorio', + 'city': 'Valparaíso', + 'date': date(2023, 11, 25), + 'youtube': 'X1xcyY9Y0Pc', + 'viewers': 1133, + 'talks': 7, + 'attendees': 84 + }, + { + 'type': 'PyCon Chile', + 'track': '2023 Online Datos', + 'date': date(2023, 11, 26), + 'youtube': 'l3B9eetX3mc', + 'viewers': 1352, + 'talks': 9, + }, + { + 'type': 'PyCon Chile', + 'track': '2023 Online Web', + 'date': date(2023, 11, 26), + 'youtube': '4mBdhoVD6oQ', + 'viewers': 876, + 'talks': 9, + } +] diff --git a/objects/events/_2024.py b/objects/events/_2024.py new file mode 100644 index 0000000..109ccf8 --- /dev/null +++ b/objects/events/_2024.py @@ -0,0 +1,97 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'Meetup', + 'track': 'Marzo 2024', + 'date': date(2024, 3, 28), + 'youtube': 'kQenJMoZ06Y', + 'viewers': 875, + 'talks': 1, + 'meetup': 299632046 + }, + { + 'type': 'Meetup', + 'track': 'Abril 2024', + 'date': date(2024, 4, 25), + 'youtube': '4Glkip6TTbs', + 'viewers': 430, + 'talks': 1, + 'meetup': 300166717 + }, + { + 'type': 'Meetup', + 'track': 'Mayo 2024', + 'date': date(2024, 5, 29), + 'youtube': 'vgkOTFfJvPc', + 'viewers': 803, + 'talks': 2, + 'meetup': 301197738 + }, + { + 'type': 'PyDay', + 'track': 'Copiapó 2024', + 'city': 'Copiapó', + 'date': date(2024, 6, 12), + 'youtube': '4t-z5oVGIAA', + 'viewers': 373, + 'talks': 17, + 'workshops': 1 + }, + { + 'type': 'PyDay', + 'track': 'Valparaíso 2024', + 'city': 'Valparaíso', + 'date': date(2024, 6, 28), + 'youtube': '6AWDEZY_iZI', + 'viewers': 523, + 'talks': 6, + }, + { + 'type': 'Hackaton', + 'track': 'PyChallenger Duoc UC 2024', + 'city': 'Santiago', + 'date': date(2024, 6, 28), + 'challenges': 2 + }, + { + 'type': 'Meetup', + 'track': 'Julio 2024', + 'date': date(2024, 7, 31), + 'youtube': 'U3yoV1-Quws', + 'viewers': 308, + 'talks': 1, + 'meetup': 302394505 + }, + { + 'type': 'PyCon Chile', + 'track': '2024 Auditorio', + 'date': date(2024, 11, 30), + 'youtube': 'c1aCTyExabM', + 'viewers': 603, + 'talks': 10, + 'attendees': 122 + }, + { + 'type': 'PyCon Chile', + 'track': '2024 Laboratorios', + 'date': date(2024, 11, 30), + 'workshops': 8 + }, + { + 'type': 'PyCon Chile', + 'track': '2024 Online 1', + 'date': date(2024, 12, 1), + 'youtube': 'mdpfYPBdn1A', + 'viewers': 982, + 'talks': 14, + }, + { + 'type': 'PyCon Chile', + 'track': '2024 Online 2', + 'date': date(2024, 12, 1), + 'youtube': 'DI89ALX0dbA', + 'viewers': 1201, + 'talks': 14 + } +] diff --git a/objects/events/_2025.py b/objects/events/_2025.py new file mode 100644 index 0000000..069b700 --- /dev/null +++ b/objects/events/_2025.py @@ -0,0 +1,91 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'Meetup', + 'track': 'Mayo 2025', + 'date': date(2025, 5, 6), + 'youtube': 'vSAz68kHCM4', + 'city': 'Santiago', + 'viewers': 240, + 'talks': 1, + 'meetup': 306960065 + }, + { + 'type': 'PyDay', + 'track': 'Santiago 2025', + 'date': date(2025, 6, 6), + 'city': 'Santiago', + 'talks': 8, + 'workshops': 2 + }, + { + 'type': 'PyDay', + 'track': 'Valparaíso 2025', + 'date': date(2025, 6, 13), + 'city': 'Valparaíso', + 'talks': 6, + 'workshops': 2, + 'attendees': 49 + }, + { + 'type': 'PyDay', + 'track': 'Copiapó 2025', + 'date': date(2025, 6, 25), + 'youtube': 'jvo6Y0DV514', + 'city': 'Copiapó', + 'viewers': 505, + 'talks': 23, + }, + { + 'type': 'Meetup', + 'track': 'Agosto 2025', + 'date': date(2025, 8, 26), + 'youtube': 'OXghExeqToc', + 'viewers': 308, + 'talks': 1, + 'meetup': 310462090 + }, + { + 'type': 'Meetup', + 'track': 'Septiembre 2025', + 'date': date(2025, 9, 30), + 'youtube': 'nXfNgrUE_ZE', + 'viewers': 126, + 'talks': 1, + 'meetup': 310899974 + }, + { + 'type': 'PyCon Chile', + 'track': '2025 Viña del Mar', + 'city': 'Viña del Mar', + 'date': date(2025, 11, 8), + 'youtube': 'qCe_SSpnSno', + 'viewers': 874, + 'talks': 9, + 'workshops': 7, + 'attendees': 132 + }, + { + 'type': 'PyCon Chile', + 'track': '2025 Online', + 'date': date(2025, 11, 9), + 'youtube': 'mT1tC5IkABY', + 'viewers': 1187, + 'talks': 13, + }, + { + 'type': 'Meetup', + 'track': 'Noviembre 2025', + 'date': date(2025, 11, 11), + 'talks': 2, + 'meetup': 311855939 + }, + { + 'type': 'Meetup', + 'track': 'Diciembre 2025', + 'date': date(2025, 12, 11), + 'youtube': 'WS4bz9jBjfw', + 'viewers': 120 + } +] diff --git a/objects/events/_2026.py b/objects/events/_2026.py new file mode 100644 index 0000000..30bf00f --- /dev/null +++ b/objects/events/_2026.py @@ -0,0 +1,54 @@ +from datetime import date + +EVENTS = [ + { + 'type': 'Meetup', + 'track': 'Marzo 2026', + 'date': date(2026, 3, 24), + 'youtube': '1Zhl8-vm0No', + 'viewers': 61, + 'talks': 1, + 'meetup': 313805047 + }, + { + 'type': 'PyDay', + 'track': 'Valparaíso 2026', + 'city': 'Valparaíso', + 'date': date(2026, 6, 5), + 'youtube': 'TAmiiDvMN64', + 'viewers': 420, + 'talks': 6, + 'workshops': 1, + 'attendees': 49 + }, + { + 'type': 'PyDay', + 'track': 'Santiago 2026', + 'city': 'Santiago', + 'date': date(2026, 6, 6), + 'youtube': 'lvkmOwbji90', + 'viewers': 562, + 'talks': 6, + 'workshops': 3, + 'attendees': 92 + }, + { + 'type': 'PyDay', + 'track': 'Rancagua 2026', + 'city': 'Rancagua', + 'date': date(2026, 8, 19), + 'talks': 4 + }, + { + 'type': 'Meetup', + 'track': 'Agosto 2026', + 'date': date(2026, 8, 26), + 'talks': 1 + }, + { + 'type': 'PyCon Chile', + 'track': '2026 Santiago', + 'city': 'Santiago', + 'date': date(2026, 11, 7) + }, +] diff --git a/objects/events/__init__.py b/objects/events/__init__.py new file mode 100644 index 0000000..7da4f71 --- /dev/null +++ b/objects/events/__init__.py @@ -0,0 +1,62 @@ +from datetime import date +from ._2020 import EVENTS as EVENTS_2020 +from ._2021 import EVENTS as EVENTS_2021 +from ._2022 import EVENTS as EVENTS_2022 +from ._2023 import EVENTS as EVENTS_2023 +from ._2024 import EVENTS as EVENTS_2024 +from ._2025 import EVENTS as EVENTS_2025 +from ._2026 import EVENTS as EVENTS_2026 + +EVENTS = [ + *EVENTS_2020, + *EVENTS_2021, + *EVENTS_2022, + *EVENTS_2023, + *EVENTS_2024, + *EVENTS_2025, + *EVENTS_2026 +] +for event in EVENTS: + if 'city' not in event: + event['city'] = 'Online' + +today = date.today() +EVENTS_TYPES = list({event.get('type') for event in EVENTS}) +CITIES = list({event.get('city') for event in EVENTS}) +YEARS = list({event.get('date').year for event in EVENTS}) +UPCOMING_EVENTS = [event for event in EVENTS if event['date'] >= today] +PAST_EVENTS = {} +for event in reversed(EVENTS): + if event['date'] >= today: + continue + year = event['date'].year + if year not in PAST_EVENTS: + PAST_EVENTS[year] = [] + PAST_EVENTS[year].append(event) + +events_counts = {} +sessions_counts = {} +attendees_counts = {} +for event in EVENTS: + year = event['date'].year + if year not in events_counts: + events_counts[year] = {event_type: 0 for event_type in EVENTS_TYPES} + sessions_counts[year] = {'Charlas': 0, 'Talleres': 0, 'Desafíos': 0} + attendees_counts[year] = 0 + sessions_counts[year]['Charlas'] += event.get('talks', 0) + sessions_counts[year]['Talleres'] += event.get('workshops', 0) + sessions_counts[year]['Desafíos'] += event.get('challenges', 0) + event_type = event['type'] + events_counts[year][event_type] += 1 + attendees_counts[year] += event.get('attendees', 0) + +EVENTS_COUNTS = [] +for year, items in events_counts.items(): + for label, count in items.items(): + EVENTS_COUNTS.append({'year': year, 'label': label, 'count': count}) +SESSIONS_COUNTS = [] +for year, items in sessions_counts.items(): + for label, count in items.items(): + SESSIONS_COUNTS.append({'year': year, 'label': label, 'count': count}) +ATTENDEES_COUNTS = [{'year': year, 'label': 'asistentes', 'count': count} for year, count in attendees_counts.items()] + diff --git a/pelicanconf.py b/pelicanconf.py index add7ed8..d746e54 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -4,6 +4,16 @@ import sys sys.path.append(".") from integrantes import INTEGRANTES +from objects.events import ( + PAST_EVENTS, + UPCOMING_EVENTS, + CITIES, + YEARS, + EVENTS_TYPES, + EVENTS_COUNTS, + SESSIONS_COUNTS, + ATTENDEES_COUNTS + ) AUTHOR = "Python Chile" SITENAME = "Comunidad Chilena de Python" @@ -37,12 +47,17 @@ "url": "pages/codigo-de-conducta.html", "children": None, }, - "coordinación": {"title": "Coordinación", "url": "pages/coordinacion.html"}, - "asociación": {"title": "Asociación", "url": "pages/asociacion.html", "children": None}, + "organización": { + "title": "Organización", + "children": { + "corporación": {"title": "Corporación", "url": "pages/corporacion.html"}, + "coordinación": {"title": "Coordinación", "url": "pages/coordinacion.html"}, + } + }, "grupos": {"title": "Grupos", "url": "pages/grupos.html"}, "eventos": { "title": "Eventos", - "url": "pages/eventos.html", + "url": "eventos.html", "children": None, }, "recursos": { @@ -131,5 +146,12 @@ DEFAULT_PAGINATION = 6 +# Source - https://stackoverflow.com/a/53474144 +# Posted by Sébastien Lavoie, modified by community. See post 'Timeline' for change history +# Retrieved 2026-08-13, License - CC BY-SA 4.0 + +DIRECT_TEMPLATES = ['index', 'categories', 'authors', 'archives', 'eventos'] + + # Uncomment following line if you want document-relative URLs when developing # RELATIVE_URLS = True diff --git a/pycltheme/static/css/cl.css b/pycltheme/static/css/cl.css index a0e2115..63738fd 100644 --- a/pycltheme/static/css/cl.css +++ b/pycltheme/static/css/cl.css @@ -558,4 +558,29 @@ ul.navbar-nav { max-height: 75vh; object-fit: cover; } - +#eventos { + text-align: center; +} +#eventos ul { + text-align: left; +} +.lista-eventos { + display: flex; + flex-wrap: wrap; +} +.evento { + border: solid 1px black; + margin: 4px; + width: 256px; +} +.evento p { + margin: 0px; +} +.etiqueta-eventos { + cursor: pointer; +} +#events-charts { + display: flex; + margin: 0 8px; + flex-wrap: balance; +} diff --git a/pycltheme/static/js/eventos-charts.js b/pycltheme/static/js/eventos-charts.js new file mode 100644 index 0000000..56fc533 --- /dev/null +++ b/pycltheme/static/js/eventos-charts.js @@ -0,0 +1,213 @@ +function legend(color, { + title, + tickSize = 6, + width = 300, + height = 44 + tickSize, + marginTop = 18, + marginRight = 16, + marginBottom = 16 + tickSize, + marginLeft = 16, + ticks = width / 64, + tickFormat, + tickValues +} = {}) { + + function ramp(color, n = 256) { + const canvas = document.createElement("canvas"); + canvas.width = n; + canvas.height = 1; + const context = canvas.getContext("2d"); + for (let i = 0; i < n; ++i) { + context.fillStyle = color(i / (n - 1)); + context.fillRect(i, 0, 1, 1); + } + return canvas; + } + + const svg = d3.create("svg") + .attr("width", width) + .attr("height", height) + .attr("viewBox", [0, 0, width, height]) + .style("overflow", "visible") + .style("display", "block"); + + let tickAdjust = g => g.selectAll(".tick line").attr("y1", marginTop + marginBottom - height); + let x; + + // Continuous + if (color.interpolate) { + const n = Math.min(color.domain().length, color.range().length); + + x = color.copy().rangeRound(d3.quantize(d3.interpolate(marginLeft, width - marginRight), n)); + + svg.append("image") + .attr("x", marginLeft) + .attr("y", marginTop) + .attr("width", width - marginLeft - marginRight) + .attr("height", height - marginTop - marginBottom) + .attr("preserveAspectRatio", "none") + .attr("xlink:href", ramp(color.copy().domain(d3.quantize(d3.interpolate(0, 1), n))).toDataURL()); + } + + // Sequential + else if (color.interpolator) { + x = Object.assign(color.copy() + .interpolator(d3.interpolateRound(marginLeft, width - marginRight)), + {range() { return [marginLeft, width - marginRight]; }}); + + svg.append("image") + .attr("x", marginLeft) + .attr("y", marginTop) + .attr("width", width - marginLeft - marginRight) + .attr("height", height - marginTop - marginBottom) + .attr("preserveAspectRatio", "none") + .attr("xlink:href", ramp(color.interpolator()).toDataURL()); + + // scaleSequentialQuantile doesn’t implement ticks or tickFormat. + if (!x.ticks) { + if (tickValues === undefined) { + const n = Math.round(ticks + 1); + tickValues = d3.range(n).map(i => d3.quantile(color.domain(), i / (n - 1))); + } + if (typeof tickFormat !== "function") { + tickFormat = d3.format(tickFormat === undefined ? ",f" : tickFormat); + } + } + } + + // Threshold + else if (color.invertExtent) { + const thresholds + = color.thresholds ? color.thresholds() // scaleQuantize + : color.quantiles ? color.quantiles() // scaleQuantile + : color.domain(); // scaleThreshold + + const thresholdFormat + = tickFormat === undefined ? d => d + : typeof tickFormat === "string" ? d3.format(tickFormat) + : tickFormat; + + x = d3.scaleLinear() + .domain([-1, color.range().length - 1]) + .rangeRound([marginLeft, width - marginRight]); + + svg.append("g") + .selectAll("rect") + .data(color.range()) + .join("rect") + .attr("x", (d, i) => x(i - 1)) + .attr("y", marginTop) + .attr("width", (d, i) => x(i) - x(i - 1)) + .attr("height", height - marginTop - marginBottom) + .attr("fill", d => d); + + tickValues = d3.range(thresholds.length); + tickFormat = i => thresholdFormat(thresholds[i], i); + } + + // Ordinal + else { + x = d3.scaleBand() + .domain(color.domain()) + .rangeRound([marginLeft, width - marginRight]); + + svg.append("g") + .selectAll("rect") + .data(color.domain()) + .join("rect") + .attr("x", x) + .attr("y", marginTop) + .attr("width", Math.max(0, x.bandwidth() - 1)) + .attr("height", height - marginTop - marginBottom) + .attr("fill", color); + + tickAdjust = () => {}; + } + + svg.append("g") + .attr("transform", `translate(0,${height - marginBottom})`) + .call(d3.axisBottom(x) + .ticks(ticks, typeof tickFormat === "string" ? tickFormat : undefined) + .tickFormat(typeof tickFormat === "function" ? tickFormat : undefined) + .tickSize(tickSize) + .tickValues(tickValues)) + .call(tickAdjust) + .call(g => g.select(".domain").remove()) + .call(g => g.append("text") + .attr("x", marginLeft) + .attr("y", marginTop + marginBottom - height - 6) + .attr("fill", "currentColor") + .attr("text-anchor", "start") + .attr("font-weight", "bold") + .attr("class", "title") + .text(title)); + + return svg.node(); +} + +function plot(containerTag, data){ + const width = 300; + const height = 200; + const marginTop = 0; + const marginRight = 16; + const marginBottom = 16; + const marginLeft = 16; + + const series = d3.stack() + .keys(d3.union(data.map(d => d.label))) + .value(([, D], key) => D.get(key).count) + (d3.index(data, d => d.year, d => d.label)); + + const x = d3.scaleBand() + .domain(years) + .range([marginLeft, width - marginRight]) + .padding(0.1); + + const y = d3.scaleLinear() + .domain([0, d3.max(series, d => d3.max(d, d => d[1]))]) + .rangeRound([height - marginBottom, marginTop]); + + const colors = series.length > 2 ? d3.schemeSpectral[series.length] : d3.schemeCategory10 + const color = d3.scaleOrdinal() + .domain(series.map(d => d.key)) + .range(colors) + .unknown("#ccc"); + + const svg = d3.create("svg") + .attr("width", width) + .attr("height", height) + .attr("viewBox", [0, 0, width, height]) + .attr("style", "max-width: 100%; height: auto;"); + + svg.append("g") + .selectAll() + .data(series) + .join("g") + .attr("fill", d => color(d.key)) + .selectAll("rect") + .data(D => D.map(d => (d.key = D.key, d))) + .join("rect") + .attr("x", d => x(d.data[0])) + .attr("y", d => y(d[1])) + .attr("height", d => y(d[0]) - y(d[1])) + .attr("width", x.bandwidth()) + .append("title") + .text(d => `${d.key}: ${d.data[1].get(d.key).count}`); + + svg.append("g") + .attr("transform", `translate(0,${height - marginBottom})`) + .call(d3.axisBottom(x).tickSizeOuter(0)) + .call(g => g.selectAll(".domain").remove()); + + svg.append("g") + .attr("transform", `translate(${marginLeft},0)`) + .call(d3.axisLeft(y).ticks(null, "s")) + .call(g => g.selectAll(".domain").remove()); + const obj = Object.assign(svg.node(), {scales: {color}}); + document.getElementById(`${containerTag}-chart`).append(obj) + const legendObj = legend(color, colors) + document.getElementById(`${containerTag}-legend`)?.append(legendObj) +} +plot('events-count', eventsCounts); +plot('sessions-count', sessionsCounts); +plot('attendees-count', attendeesCounts); diff --git a/pycltheme/static/js/eventos.js b/pycltheme/static/js/eventos.js new file mode 100644 index 0000000..bdcc777 --- /dev/null +++ b/pycltheme/static/js/eventos.js @@ -0,0 +1,35 @@ +let cityFilter = 'all'; +let typeFilter = 'all'; + +function toggleYearEvents(target) { + const eventsContainer = document.getElementById(target.id.slice(9)); + if(target.innerHTML == '-') { + target.innerHTML = '+'; + eventsContainer.style.display = 'none'; + } else { + target.innerHTML = '-'; + eventsContainer.style.display = 'flex'; + } +} +function filter(){ + for (event of document.getElementById('past-events').getElementsByClassName('evento')){ + let showByCity = cityFilter == 'all' || event.dataset.city == cityFilter; + let showByType = typeFilter == 'all' || event.dataset.type == typeFilter; + event.style.display = showByCity && showByType ? 'block' : 'none'; + } +} + +function filterByCity(city){ + console.log(`etiqueta-city-${cityFilter}`) + document.getElementById(`etiqueta-ciudad-${cityFilter}`).style.background = 'white'; + document.getElementById(`etiqueta-ciudad-${city}`).style.background = 'lightblue'; + cityFilter = city; + filter(); +} + +function filterByType(type){ + document.getElementById(`etiqueta-tipo-${typeFilter}`).style.background = 'white'; + document.getElementById(`etiqueta-tipo-${type}`).style.background = 'lightblue'; + typeFilter = type; + filter(); +} diff --git a/pycltheme/templates/evento.html b/pycltheme/templates/evento.html new file mode 100644 index 0000000..a2ff581 --- /dev/null +++ b/pycltheme/templates/evento.html @@ -0,0 +1,37 @@ +
{{ event.date }}
+{{ event.city }}
+ +Ciudades:
+ {%for city in CITIES%} + + {%endfor%} + +Tipo evento:
+ {%for event_type in EVENTS_TYPES%} + + {%endfor%} + +