Nextcloud poll csv import

This commit is contained in:
philippe lhardy
2025-07-02 19:12:02 +02:00
parent 6fab6c70e4
commit ff11eb0a71
7 changed files with 215 additions and 72 deletions

116
LISEZMOI.md Normal file
View 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.

View File

@@ -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

4
code/check_csv.sh Executable file
View 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'

View 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)

View File

@@ -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

View File

@@ -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

2
samples/poll1.csv Normal file
View File

@@ -0,0 +1,2 @@
Participants,Adresse e-mail,A,B,C
admin,,Très Bien,Bien,Assez Bien
1 Participants Adresse e-mail A B C
2 admin Très Bien Bien Assez Bien