From b3725ac2ac548a99e4e70c4ee39ab9d05205a62a Mon Sep 17 00:00:00 2001 From: Aeddis Desauw Date: Tue, 7 May 2024 19:56:27 +0200 Subject: [PATCH] add script to generate ascii calendar --- script/README.md | 7 + script/calendar_generator.py | 20 - script/calendar_generator/.gitignore | 71 ++ script/calendar_generator/Cargo.lock | 290 +++++ script/calendar_generator/Cargo.toml | 9 + script/calendar_generator/src/main.rs | 129 +++ static/index.html | 1400 +------------------------ 7 files changed, 507 insertions(+), 1419 deletions(-) delete mode 100644 script/calendar_generator.py create mode 100644 script/calendar_generator/.gitignore create mode 100644 script/calendar_generator/Cargo.lock create mode 100644 script/calendar_generator/Cargo.toml create mode 100644 script/calendar_generator/src/main.rs diff --git a/script/README.md b/script/README.md index e69de29..f178d62 100644 --- a/script/README.md +++ b/script/README.md @@ -0,0 +1,7 @@ +# Scripts + +## Calendar Generator + +A rust module to generate calendar in ascii +Usage : +`cargo run MM-YYYY` diff --git a/script/calendar_generator.py b/script/calendar_generator.py deleted file mode 100644 index 1f8e11c..0000000 --- a/script/calendar_generator.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Module to generate the Ascii art version of a calendar -""" -import sys - -class Calendar: - __name = "" - __first_day= "" - __nb_day= 0 - - def get_day(day : int): - pass - - def generate_ascii_calendar(cal): - pass - -if __name__ == "__main__": - # get the month with format MM-YYYY from argv - # print the ascii of thus month - pass diff --git a/script/calendar_generator/.gitignore b/script/calendar_generator/.gitignore new file mode 100644 index 0000000..aa324bd --- /dev/null +++ b/script/calendar_generator/.gitignore @@ -0,0 +1,71 @@ +# Created by https://www.toptal.com/developers/gitignore/api/rust,emacs +# Edit at https://www.toptal.com/developers/gitignore?templates=rust,emacs + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +# network security +/network-security.data + + +### Rust ### +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# End of https://www.toptal.com/developers/gitignore/api/rust,emacs diff --git a/script/calendar_generator/Cargo.lock b/script/calendar_generator/Cargo.lock new file mode 100644 index 0000000..199693b --- /dev/null +++ b/script/calendar_generator/Cargo.lock @@ -0,0 +1,290 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "calendar_generator" +version = "0.1.0" +dependencies = [ + "chrono", +] + +[[package]] +name = "cc" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/script/calendar_generator/Cargo.toml b/script/calendar_generator/Cargo.toml new file mode 100644 index 0000000..3665816 --- /dev/null +++ b/script/calendar_generator/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "calendar_generator" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +chrono = "0.4.38" diff --git a/script/calendar_generator/src/main.rs b/script/calendar_generator/src/main.rs new file mode 100644 index 0000000..4acb2c6 --- /dev/null +++ b/script/calendar_generator/src/main.rs @@ -0,0 +1,129 @@ +use chrono::prelude::*; +use std::env; +use chrono::NaiveDate; + +fn get_month( num :i8) -> & 'static str { + match num { + 1 => return "JANVIER", + 2 => return "FEVRIER", + 3 => return "MARS", + 4 => return "AVRIL", + 5 => return "MAI", + 6 => return "JUIN", + 7 => return "JUILLET", + 8 => return "AOUT", + 9 => return "SEPTEMBRE", + 10 => return "OCTOBRE", + 11 => return "NOVEMBRE", + 12 => return "DECEMBRE", + _=> return "", + } +} + +fn nb_empty_space_before(day : Weekday) -> i8{ + match day { + Weekday::Mon => return 0, + Weekday::Tue => return 1, + Weekday::Wed => return 2, + Weekday::Thu => return 3, + Weekday::Fri => return 4, + Weekday::Sat => return 5, + Weekday::Sun => return 6, + } +} + + +fn get_pretty_day(day_nb : i8) -> String { + if day_nb < 10 { + return "0".to_owned() + &day_nb.to_string(); + } + return day_nb.to_string(); +} + + +fn get_ascii_calendar(date : NaiveDate) -> String { + + let binding = date.to_string(); + let split_date = binding.split("-").collect::>(); + let month = split_date[1]; + let year = split_date[0]; + let month_name = get_month(month.parse::().expect("REASON")); + let space = 38 - "CALENDRIER".len() - 1 - month_name.len() - 1 - 4; + + let mut calendar = String::from(".——————————————————————————————————————.\n"); + calendar += "|"; + for _ in 0..(space/2){ + calendar += " "; + } + calendar += &("CALENDRIER".to_owned() + " " + month_name + " " + year); + for _ in 0..(space/2 + (space % 2)){ + calendar = calendar.to_string() + " "; + } + calendar += "|\n"; + calendar += "|——————————————————————————————————————|\n"; + + + + let mut top_line = String::from("| "); + let mut middle_line = String::from("| |"); + + let base_date = NaiveDate::from_ymd_opt(year.parse::().expect("REASON"), + 1 + month.parse::().expect("REASON"), + 1).unwrap(); + + // fill empty spaces + let nb_space = nb_empty_space_before(base_date.weekday()); + + for _ in 0..nb_space{ + top_line += "———— "; + middle_line += " |" + } + + let mut day_nb = 1; + for day in base_date.iter_days().take(50){ + if day.month() != base_date.month(){ + // complete to the end of the week + top_line += "———— "; + middle_line += " |"; + if day.weekday() == Weekday::Sun { + calendar += &(top_line.clone() + " |\n"); + calendar += &(middle_line .clone() + &(" |\n")); + calendar += &(top_line.clone() + " |\n"); + break; + } + } + else { + if day.weekday() == Weekday::Sun { + calendar += &(top_line.clone() + "———— |\n"); + calendar += &(middle_line .clone() + &(" ".to_owned() + &get_pretty_day(day_nb) + " | |\n")); + top_line = String::from("| "); + middle_line = String::from("| |"); + } + else { + top_line += "———— "; + middle_line += &(" ".to_owned() + &get_pretty_day(day_nb) + " |"); + } + } + day_nb += 1 + } + calendar += "|______________________________________|\n"; + return calendar; +} + + + +fn main() { + let args: Vec<_> = env::args().collect(); + if args.len() <= 1 + { + println!("At least one month must be specified"); + return; + } + + for month in env::args(){ + match NaiveDate::parse_from_str(&("01-".to_owned() + &month), "%d-%m-%Y") { + Ok(date) => println!("{}", get_ascii_calendar(date)), + Err(error) => println!("could not parse .{}. due to: {}", month, error), + } + } +} diff --git a/static/index.html b/static/index.html index 3726ec3..f8d7dc9 100644 --- a/static/index.html +++ b/static/index.html @@ -1,1399 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Deuxfleurs : fabriquons un internet convivial - - - - - - - - - - - -
- -
-

💮💮 deuxfleurs

-
- -
-
- -

Fabriquons un internet convivial ⤵

-
-

Avec nos propres infrastructures

- - -

Nous fournissons des services numériques garantis "sans datacenter". À la place, nous utilisons moins d'une dizaine de vieux ordinateurs reconditionnés à nos domiciles qui peuvent fournir des services numériques à plusieurs dizaines de milliers de personnes. Actuellement ces ordinateurs sont situés à Orsay, Lille et Bruxelles. Nous avons également des machines à Suresnes pour les sauvegardes. En savoir plus.

Cette infrastructure atypique nous mène à développer de nouveaux logiciels libres. Si vous êtes dans la technique, vous pourriez être intéressé·e par Garage, Bottin, Tricot, Diplonat et nos autres projets.

-

Avec nos services sobres

-
- -
-
- - - - - - - - - - - - - - - - - - -
-
-

Remplacez WhatsApp, Slack, Gmail, Zoom ou encore Google Drive par des outils Deuxfleurs. Nous proposons des alternatives sobres et non-marchandes à ces services, pour que vous restiez en contact avec votre entourage, votre association ou votre collectif.

-

Envie de faire entendre votre voix sur Internet ? Nous mettons à disposition plusieurs outils de publication sur le web allant de la plateforme de blog partagée à la publication de sites web en autonomie.

-

Prenez contact avec nous, nous vous aiderons à identifier les outils dont vous avez besoin et nous vous accompagnerons dans votre transition. ⤵

-
-

Avec des valeurs fortes

-
- Deux personnages qui regardent et s'avancent vers une maison cabane perchée dans un arbre, illustrant notre envie d'un internet plus éthique. -
-
-

La coopération - eg. promouvoir l'intéropérabilité, les communs, le libre, et les formats de données ouverts

-

L'autonomie - eg. gérer nos propres moyens de communications, prendre nos propres décisions

-

La solidarité - eg. partager le savoir, partager les ressources informatiques, s'entraider pour la gestion des services

-

La liberté - eg. permettre à toutes et tous de s'exprimer, respecter la vie privée

-

Suivez notre actualité, réflexions et analyses sur notre blog Plume

-
-

Faisons connaissance

-
-

L'accès à nos services est à prix libre. Nous estimons leur coût à 15€/an/compte pour leur maintien en fonctionnement et recommandons le double pour permettre à l'association de se développer. Il est conditionné par les ressources disponibles, à la fois matérielles et humaines.

-

Pour accéder à nos services ou simplement discuter avec nous, écrivez à coucou[@]deuxfleurs.fr, rejoignez-nous sur le salon Matrix #deuxfleurs:deuxfleurs.fr ou rencontrez-nous à :

-
    - - -
  • Réunion mensuelle «au coin du feu» en ligne, le 5 mars 2024 à 19h00.
    Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.
  • -
  • Réunion mensuelle du collectif CHATONS en ligne, le 12 mars 2024 à 20h00.
    Une fois par mois a lieu une réunion entre les membres du collectif CHATONS.
  • -
  • Barcamp Interne au Couvent des Clarisses à Roubaix, le 15, 16 et 17 mars.
    Les membres de Deuxfleurs prennent le temps de se retrouver et de discuter de l'association. N'hésitez pas à nous contacter pour passer nous voir le samedi soir.
  • - -
  • Réunion mensuelle «au coin du feu» en ligne, le 2 avril 2024 à 19h00.
    Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.
  • - -
  • Permanence associative autour du Libre au Café Citoyen à Lille, le 30 avril 2024 à 19h30.
    La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI. -
- -
-
- - - - -
-
- - -
-
- - - - + Deuxfleurs : fabriquons un internet convivial

💮💮 deuxfleurs

Fabriquons un internet convivial ⤵

Avec nos propres infrastructures

Nous fournissons des services numériques garantis "sans datacenter". À la place, nous utilisons moins d'une dizaine de vieux ordinateurs reconditionnés à nos domiciles qui peuvent fournir des services numériques à plusieurs dizaines de milliers de personnes. Actuellement ces ordinateurs sont situés à Orsay, Lille et Bruxelles. Nous avons également des machines à Suresnes pour les sauvegardes. En savoir plus.

Cette infrastructure atypique nous mène à développer de nouveaux logiciels libres. Si vous êtes dans la technique, vous pourriez être intéressé·e par Garage, Bottin, Tricot, Diplonat et nos autres projets.

Avec nos services sobres

Remplacez WhatsApp, Slack, Gmail, Zoom ou encore Google Drive par des outils Deuxfleurs. Nous proposons des alternatives sobres et non-marchandes à ces services, pour que vous restiez en contact avec votre entourage, votre association ou votre collectif.

Envie de faire entendre votre voix sur Internet ? Nous mettons à disposition plusieurs outils de publication sur le web allant de la plateforme de blog partagée à la publication de sites web en autonomie.

Prenez contact avec nous, nous vous aiderons à identifier les outils dont vous avez besoin et nous vous accompagnerons dans votre transition. ⤵

Avec des valeurs fortes

Deux personnages qui regardent et s'avancent vers une maison cabane perchée dans un arbre, illustrant notre envie d'un internet plus éthique.

La coopération - eg. promouvoir l'intéropérabilité, les communs, le libre, et les formats de données ouverts

L'autonomie - eg. gérer nos propres moyens de communications, prendre nos propres décisions

La solidarité - eg. partager le savoir, partager les ressources informatiques, s'entraider pour la gestion des services

La liberté - eg. permettre à toutes et tous de s'exprimer, respecter la vie privée

Suivez notre actualité, réflexions et analyses sur notre blog Plume

Faisons connaissance

L'accès à nos services est à prix libre. Nous estimons leur coût à 15€/an/compte pour leur maintien en fonctionnement et recommandons le double pour permettre à l'association de se développer. Il est conditionné par les ressources disponibles, à la fois matérielles et humaines.

Pour accéder à nos services ou simplement discuter avec nous, écrivez à coucou[@]deuxfleurs.fr, rejoignez-nous sur le salon Matrix #deuxfleurs:deuxfleurs.fr ou rencontrez-nous à :

  • Réunion mensuelle «au coin du feu» en ligne, le 5 mars 2024 à 19h00.
    Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.
  • Réunion mensuelle du collectif CHATONS en ligne, le 12 mars 2024 à 20h00.
    Une fois par mois a lieu une réunion entre les membres du collectif CHATONS.
  • Barcamp Interne au Couvent des Clarisses à Roubaix, le 15, 16 et 17 mars.
    Les membres de Deuxfleurs prennent le temps de se retrouver et de discuter de l'association. N'hésitez pas à nous contacter pour passer nous voir le samedi soir.
  • Réunion mensuelle «au coin du feu» en ligne, le 2 avril 2024 à 19h00.
    Une fois par mois nous organisons une réunion en ligne informelle. C'est le bon moment pour venir faire un coucou si vous voulez parler à des gens de vive voix numérique.
  • Permanence associative autour du Libre au Café Citoyen à Lille, le 30 avril 2024 à 19h30.
    La permanence associative autour du Libre est une manifestation conviviale, ouverte à toutes et tous, organisée le dernier mardi de chaque mois, et regroupant les collectifs Chtinux, Raoull, Deuxfleurs, Mycélium, CLX et Cliss XXI.
\ No newline at end of file