diff --git a/LISEZMOI.md b/LISEZMOI.md new file mode 100644 index 0000000..a580829 --- /dev/null +++ b/LISEZMOI.md @@ -0,0 +1,116 @@ +# Libraire de calcul Jugement majoritaire + +Le fonctionnement actuel est de fournir un fichier json contenant la votation. +Ce fichier n'a pas de connaissance des votants, juste de leur vote. + +Parmi les méthodes de vote le jugement majoritaire est très récent. +C'est la description de wikipedia https://fr.wikipedia.org/wiki/Jugement_majoritaire qui a servi de référence. + +(https://en.wikipedia.org/wiki/Majority_judgment) + +L'implémentaion est très basique et miminale : + +|langage|code| +|-----|---------------------| +|python|code/parse_sample.py| +|php|code/parse_sample.php| + +# Formats des votations ( json ) + +Le format d'entrée est un fichier json, des exemple sont sous le répertoire samples. + +Le format de sortie est aussi un fichier json + +## candidats + +les candidats ont des clés textuelles courtes, qui peuvent être numérique ou alpjanumérique et un nom complet de candidat. + +``` + "A":"albert", + "B":"Beatrice", + "C":"Chloé", + "D":"Deborah", + "E":"Eric", + "F":"Francçois", + "G":"Gisèle", + "H":"Hugo" +``` + +## votants + +Une indication du nombre de votants sert à valider que tous les votes sont bien listés. C'est une information redondante avec la liste des votes de la votation. + + "decompte":10 + + +## mentions + +La sémantique des mentions est spécifiquer à chaque vote, un texte descriptif indique. + +Les mentions sont ordonnées de la mention la meilleure numérotée 0 à la plus mauvaise, la dernière. + +|0|Très Bien| +|1|Bien| +|2|Assez Bien| +|3|Passable| +|4|Insuffisant| +|5|A rejeter| + +## votation + +Pour information une date et un lien de vote sont ajoutés. +Leur contenu est textuel et laissé à l'appréciation de l'utilisateur, le champ n'est pas analysé. + +``` +"date":"14 juin 2025", +"lieu":"liffré", +``` + +### votes + +le vote est une liste des vote de chaque participant. + +chaque vote contient une liste de référence des candidats et le rang de leur mention. + +### import + +Import de fichiers csv provenant de l'application de sondage de nextcloud (polls). + +Dans le sondage il est possible d'exporter les votes en csv, le fichier est à fournir au script qui va générer un json. Ce json pourra être utilisé dans le programme de vote pour obtenir le résultat. + +Le programme supprime les informations des votants et ne conserve que leur vote. + +Les mentions par défaut sont : + +|0|yes| +|1|maybe| +|2|(empty)| +|3|no| + + +ATTENTION ceci ne fonctionne qu'avec une version beta de Nextcloud Poll : + +git@github.com:artlog/polls.git majority_judgement_feature + +Avec une confiugration du sondage spécifique où les 'Rank Options' ont été nommées, il est nécessaire de passer les noms des mentions dans l'ordre, du meilleur au plus mauvais. + +voici l'exemple classique des mentions : + +/!\ On remarque la différence entre fr et en. + +|index|fr|en| +|-----|--|--| +|0|Très Bien|Excellent| +|1|Bien|Very Good| +|2|Assez Bien|Good| +|3|Passable|Acceptable| +|4|Insuffisant|Poor| +|5|A Rejeter|Reject| + +ceci donne la commande suivante : + +python3 convert_nextcloud_poll_csv.py ../samples/poll1.csv 'Très Bien' 'Bien' 'Assez Bien' 'Passable' 'Insuffisant' 'A Rejeter' + +/!\ l'ordre des mention est crucial. + + diff --git a/README.md b/README.md index fb21c52..1e10451 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,7 @@ -# Libraire de calcul Jugement majoritaire +# Library to deliver a poll result with majority judgement algorithm -Parmi les méthodes de vote le jugement majoritaire est très récent. -C'est la description de wikipedia https://fr.wikipedia.org/wiki/Jugement_majoritaire qui a servi de référence. +https://en.wikipedia.org/wiki/Majority_judgment -(https://en.wikipedia.org/wiki/Majority_judgment) - -L'implémentaion est très basique et miminale : - -|langage|code| -|-----|---------------------| -|python|code/parse_sample.py| -|php|code/parse_sample.php| - -# Formats des votations ( json ) - -Le format d'entrée est un fichier json, des exemple sont sous le répertoire samples. - -Le format de sortie est aussi un fichier json - -## candidats - -les candidats ont des clés textuelles courtes, qui peuvent être numérique ou alpjanumérique et un nom complet de candidat. - -``` - "A":"albert", - "B":"Beatrice", - "C":"Chloé", - "D":"Deborah", - "E":"Eric", - "F":"Francçois", - "G":"Gisèle", - "H":"Hugo" -``` - -## votants - -Une indication du nombre de votants sert à valider que tous les votes sont bien listés. C'est une information redondante avec la liste des votes de la votation. - - "decompte":10 - - -## mentions - -La sémantique des mentions est spécifiquer à cahque vote, un texte descriptif indique. - -Les mentions sont ordonnées de la mention la meilleure numérotée 0 à la plus mauvaise, la dernière. - -|0|Très Bien| -|1|Bien| -|2|Assez Bien| -|3|Passable| -|4|Insuffisant| -|5|A rejeter| - -## votation - -Pour information une date et un lien de vote sont ajoutés. -Leur contenu est textuel et laissé à l'appréciation de l'utilisateur, le champ n'est pas analysé. - -``` -"date":"14 juin 2025", -"lieu":"liffré", -``` - -### votes - -le vote est une liste des vote de chaque participant. - -chaque vote contient une liste de référence des candidats et le rang de leur mention. +Sorry for inconvenience but currently only french version is available. +LISEZMOI.md \ No newline at end of file diff --git a/code/check_csv.sh b/code/check_csv.sh new file mode 100755 index 0000000..b67851f --- /dev/null +++ b/code/check_csv.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +python3 convert_nextcloud_poll_csv.py ../samples/poll1.csv 'Très Bien' 'Bien' 'Assez Bien' 'Passable' 'Insuffisant' 'A Rejeter' + diff --git a/code/convert_nextcloud_poll_csv.py b/code/convert_nextcloud_poll_csv.py new file mode 100644 index 0000000..3ed4b4e --- /dev/null +++ b/code/convert_nextcloud_poll_csv.py @@ -0,0 +1,67 @@ +import json +import sys +import csv + +# using non modified nextcloud standard text poll +nom_mentions=['yes','maybe','','no'] + +if len(sys.argv) > 1: + csv_file=sys.argv[1] + if len(sys.argv) > 2: + nom_mentions=[] + for i in range(2,len(sys.argv)): + nom_mentions.append(sys.argv[i]) +else: + print('missing file argument') + exit(1) + +def mention_index(mention): + return nom_mentions.index(mention) + +verbose=False + +mentions=len(nom_mentions) +default_mention=mentions-1 + +warnings=[] +candidats={} +candidats_alias=[] +a_vote={} +votes=[] +with open(csv_file,'r') as csv_fd: + vote_reader = csv.reader(csv_fd, delimiter=',') + for row in vote_reader: + if len(candidats_alias) == 0: + for i in range(2,len(row)): + candidat_alias=row[i] + candidats_alias.append(candidat_alias) + # no other name given + if not candidat_alias in candidats: + candidats[candidat_alias]=candidat_alias + else: + # check if not duplicated + participant=row[0] + if participant in a_vote: + warnings.append("Mutliple vote " + participant + " no record") + continue + a_vote[participant]=row[1] + vote={} + for i in range(2,len(row)): + candidat_index=i-2 + candidat_alias=candidats_alias[candidat_index] + mention=row[i] + vote[candidat_alias]=mention_index(mention) + votes.append(vote) + + +default_vote={} + +if verbose: + print(','.join(candidats)) + print(','.join(nom_mentions)) + +result = {'candidats':candidats,'votants':{'decompte':len(a_vote)},'mentions':nom_mentions,'votation':{'votes':votes}} +print(json.dumps(result)) + +sys.exit(0) + diff --git a/code/parse_sample.py b/code/parse_sample.py index f802ae3..6a57d0f 100644 --- a/code/parse_sample.py +++ b/code/parse_sample.py @@ -38,7 +38,7 @@ for candidat in candidats: collect={} for vote in votes: - # missing candidat in vote is the worts one + # missing candidat in vote picks the worse one for candidat in candidats: if not candidat in vote: vote[candidat]=default_mention diff --git a/etude/existant.md b/etude/existant.md index 1f706d2..2d51911 100644 --- a/etude/existant.md +++ b/etude/existant.md @@ -1,13 +1,31 @@ -Recherche des projets de code autours du jugement majoritaire sur githbu +# contexte + +Choix des noms de mentions + + +https://fr.wikipedia.org/wiki/Jugement_majoritaire +vs +https://en.wikipedia.org/wiki/Jugement_majoritaire + +|index|fr|en| +|-----|--|--| +|0|Très Bien|Excellent| +|1|Bien|Very Good| +|2|Assez Bien|Good| +|3|Passable|Acceptable| +|4|Insuffisant|Poor| +|5|A Rejeter|Reject| + + +# Recherche des projets de code autours du jugement majoritaire sur githbu |source|info|interet| |------------------|-----------------------------|-------------| |https://github.com/AlexJade23/JugementMajoritaire|RAS VIDE|1/20| |https://github.com/ostix360/JugementMajoritaire|Où est l'algo ?|2/20| |https://github.com/CitoyensDeDemain/JugementMajoritaire|Il y a un algo, mais pas de format de donnée, données hardcodées / API et pas de procédure d'install|11/20| - - +| # david chavalarias https://github.com/davidchavalarias/jugement-majoritaire diff --git a/samples/poll1.csv b/samples/poll1.csv new file mode 100644 index 0000000..ff82bc9 --- /dev/null +++ b/samples/poll1.csv @@ -0,0 +1,2 @@ +Participants,Adresse e-mail,A,B,C +admin,,Très Bien,Bien,Assez Bien \ No newline at end of file