Nextcloud poll csv import
This commit is contained in:
116
LISEZMOI.md
Normal file
116
LISEZMOI.md
Normal file
@@ -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.
|
||||||
|
|
||||||
|
|
||||||
72
README.md
72
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.
|
https://en.wikipedia.org/wiki/Majority_judgment
|
||||||
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)
|
Sorry for inconvenience but currently only french version is available.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
LISEZMOI.md
|
||||||
4
code/check_csv.sh
Executable file
4
code/check_csv.sh
Executable file
@@ -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'
|
||||||
|
|
||||||
67
code/convert_nextcloud_poll_csv.py
Normal file
67
code/convert_nextcloud_poll_csv.py
Normal file
@@ -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)
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ for candidat in candidats:
|
|||||||
collect={}
|
collect={}
|
||||||
for vote in votes:
|
for vote in votes:
|
||||||
|
|
||||||
# missing candidat in vote is the worts one
|
# missing candidat in vote picks the worse one
|
||||||
for candidat in candidats:
|
for candidat in candidats:
|
||||||
if not candidat in vote:
|
if not candidat in vote:
|
||||||
vote[candidat]=default_mention
|
vote[candidat]=default_mention
|
||||||
|
|||||||
@@ -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|
|
|source|info|interet|
|
||||||
|------------------|-----------------------------|-------------|
|
|------------------|-----------------------------|-------------|
|
||||||
|https://github.com/AlexJade23/JugementMajoritaire|RAS VIDE|1/20|
|
|https://github.com/AlexJade23/JugementMajoritaire|RAS VIDE|1/20|
|
||||||
|https://github.com/ostix360/JugementMajoritaire|Où est l'algo ?|2/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|
|
|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
|
# david chavalarias
|
||||||
|
|
||||||
https://github.com/davidchavalarias/jugement-majoritaire
|
https://github.com/davidchavalarias/jugement-majoritaire
|
||||||
|
|||||||
2
samples/poll1.csv
Normal file
2
samples/poll1.csv
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Participants,Adresse e-mail,A,B,C
|
||||||
|
admin,,Très Bien,Bien,Assez Bien
|
||||||
|
Reference in New Issue
Block a user