From e135d413382f7feb2c8f3076df2f7fb383fade57 Mon Sep 17 00:00:00 2001 From: Charlie Mathey Date: Wed, 22 May 2024 14:25:30 +0200 Subject: [PATCH] =?UTF-8?q?Version=20brouillon=20qui=20marche=20=C3=A0=20p?= =?UTF-8?q?eu=20pr=C3=A8s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++- delete.html | 17 +++++++++++++ edit.html | 37 ++++++++++++++++++++++++++++ icon.svg | 1 + index.html | 35 ++++++++++++++++++++++++++ module.ini | 8 ++++++ result.html | 60 +++++++++++++++++++++++++++++++++++++++++++++ scrutin.schema.json | 27 ++++++++++++++++++++ vote.html | 48 ++++++++++++++++++++++++++++++++++++ 9 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 delete.html create mode 100644 edit.html create mode 100644 icon.svg create mode 100644 index.html create mode 100644 module.ini create mode 100644 result.html create mode 100644 scrutin.schema.json create mode 100644 vote.html diff --git a/README.md b/README.md index aec913f..5ca0729 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ # paheko-module-votes -Module pour le logiciel Paheko permettant de faire voter les utilisateurs. \ No newline at end of file +Module pour le logiciel Paheko permettant de faire voter les utilisateurs. + + +## To Do List + +[x] Permettre et comptabiliser les votes +[ ] Régler les droits d'accès +[ ] Permettre plusieurs questions par scrutin +[ ] Vérifier qu'un utilisateur ne puisse pas voter s'il arrive sur la page de vote en trichant (pour le moment, la page est juste cachée) +[ ] Afficher les résultats de façon moins moche diff --git a/delete.html b/delete.html new file mode 100644 index 0000000..4be8361 --- /dev/null +++ b/delete.html @@ -0,0 +1,17 @@ +{{#restrict section="accounting" level="write" block=true}}{{/restrict}} + +{{#load assign="scrutin" id=$_GET.id|intval}} +{{else}} + {{:error message="Aucun modèle trouvé"}} +{{/load}} + +{{#form on="delete"}} + {{:delete id=$scrutin.id}} + {{:redirect to="./"}} +{{/form}} + +{{:admin_header title="Supprimer scrutin"}} + +{{:delete_form legend="Supprimer un scrutin" warning="Supprimer le scrutin '%s' ?"|args:$scrutin.name}} + +{{:admin_footer}} \ No newline at end of file diff --git a/edit.html b/edit.html new file mode 100644 index 0000000..6438c5d --- /dev/null +++ b/edit.html @@ -0,0 +1,37 @@ +{{#restrict section="accounting" level="write" block=true}}{{/restrict}} +{{:admin_header title="Nouveau scrutin"}} + +{{if $_GET.id}} + {{#load assign="scrutin" id=$_GET.id|intval}}{{/load}} +{{/if}} + +{{if $_POST.save}} + {{:save id=$scrutin.id + validate_schema="./scrutin.schema.json" + name=$_POST.name|strval|trim + desc=$_POST.desc|strval|or:null + activity_see=$_POST.activity_see|intval|or:null + question=$_POST.question|strval|trim + votes=$_POST.votes + }} + {{:redirect to="./"}} +{{/if}} + +
+
+ {{if !$scrutin}}Nouveau scrutin{{else}}Modifier le scrutin{{/if}} +
+ {{:input type="text" required=true name="name" label="Nom du scrutin" source=$scrutin}} + {{:input type="text" name="desc" label="Description" source=$scrutin}} + {{:input type="text" name="activity_see" label="ID de l'activité requise pour voir le scrutin" help="Laisser vide si tout le monde doit pouvoir voir le scrutin." target="!services/selector.php" source=$scrutin}} + {{:input type="text" required=true name="question" label="Question posée" source=$scrutin}} +
+
+ + +

+ {{:button type="submit" shape="right" label="Enregistrer" name="save" class="main"}} +

+
+ +{{:admin_footer}} \ No newline at end of file diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..5f3dcd7 --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/index.html b/index.html new file mode 100644 index 0000000..852734d --- /dev/null +++ b/index.html @@ -0,0 +1,35 @@ +{{#restrict section="accounting" level="write" block=true}}{{/restrict}} +{{:admin_header title="Liste des scrutins"}} + + + +{{#list select="$$.name AS 'Scrutin'" order=1 desc=true}} + {{:assign var="qs" name=$name desc=$desc question=$question activity_see=$activity_see}} + {{:assign qs=$qs|http_build_query}} + {{:assign url="!voter/results.php?%s"|args:$qs}} + {{*Forbid visibility if not member of activity*}} + {{if $activity_see}} + {{#sql select="*" tables="services_users" where="id_service = :id_act AND id_user = :id_user" :id_act=$activity_see :id_user=$logged_user.id count="TRUE"}} + {{if !$count}} + {{:continue 2}} + {{/if}} + {{/sql}} + {{/if}} + + {{$name}} + + {{:linkbutton href="result.html?id=%d"|args:$id label="Voir les résultats" shape="eye"}} + {{:linkbutton href="vote.html?id=%d"|args:$id label="Voter" shape="check"}} + {{:linkbutton href="edit.html?id=%d"|args:$id label="Modifier" shape="edit"}} + {{:linkbutton target="_dialog" href="delete.html?id=%d"|args:$id label="Supprimer" shape="delete"}} + + +{{else}} +

+ Aucun scrutin. +

+{{/list}} \ No newline at end of file diff --git a/module.ini b/module.ini new file mode 100644 index 0000000..7a55859 --- /dev/null +++ b/module.ini @@ -0,0 +1,8 @@ +name = "Voter" +description = null +author = "Charlie, Mines de Rayons" +author_url = "https://www.minesderayons.fr" +restrict_section = null +restrict_level = "none" +menu = true +web = false diff --git a/result.html b/result.html new file mode 100644 index 0000000..b3d010d --- /dev/null +++ b/result.html @@ -0,0 +1,60 @@ +{{:admin_header title="Résultats du vote"}} + +{{if $_GET.id}} + {{#load assign="scrutin" id=$_GET.id|intval}}{{/load}} + +
+ Question +

{{$scrutin.question}}

+ + {{:assign var=ids_oui value=[]}} + {{:assign var=ids_non value=[]}} + {{:assign var=ids_blancs value=[]}} + {{#users id=$scrutin.votes|keys}} + {{* On teste la condition de vote*}} + + + {{:assign var=vote from="scrutin.votes.%s"|args:$id}} + {{if $vote==-1}} + {{:assign var="ids_non." value=$id}} + {{elseif $vote==0}} + {{:assign var="ids_blanc." value=$id}} + {{elseif $vote==1}} + {{:assign var="ids_oui." value=$id}} + {{else}} +

+ Vote invalide détecté. +

+ {{/if}} + {{/users}} + + {{:assign var="nb_oui" value=$ids_oui|count}} + {{:assign var="nb_non" value=$ids_non|count}} + {{:assign var="nb_blanc" value=$ids_blanc|count|or:null}} + + + + + + + + + + + + + + + + +
Oui {{if $nb_oui}} {{$nb_oui}} {{else}} 0 {{/if}} {{if $nb_oui}} (n° {{$ids_oui|implode:' ,'}}) {{/if}}
Non {{if $nb_non}} {{$nb_non}} {{else}} 0 {{/if}} {{if $nb_non}} (n° {{$ids_non|implode:' ,'}}) {{/if}}
Blanc {{if $nb_blanc}} {{$nb_blanc}} {{else}} 0 {{/if}} {{if $nb_blanc}} (n° {{$ids_blanc|implode:' ,'}}) {{/if}}
+ {{:assign var=result value="round( 100*(%f-%f)/(%f+%f+%f), 2)"|math:$nb_oui:$nb_non:$nb_oui:$nb_non:$nb_blanc}} +

Résultat : {{$result}}%

+
+ {{:linkbutton href="./" label="Retour" shape="left"}} + +{{else}} +

+ Aucun scrutin sélectionné. Il ne devrait y avoir aucune raison d'atterir sur cette page. +

+{{/if}} \ No newline at end of file diff --git a/scrutin.schema.json b/scrutin.schema.json new file mode 100644 index 0000000..4871eca --- /dev/null +++ b/scrutin.schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "name": { + "description": "Nom du scrutin", + "type": "string" + }, + "desc": { + "description": "Description", + "type": ["string", "null"] + }, + "activity_see": { + "description": "Activité à laquelle il faut être inscrit pour voir le scrutin", + "type": ["integer", "null"] + }, + "question": { + "description": "Question", + "type": "string" + }, + "votes": { + "description": "Votes", + "type": ["array", "null"] + } + }, + "required": ["name", "question"] +} \ No newline at end of file diff --git a/vote.html b/vote.html new file mode 100644 index 0000000..83baf4d --- /dev/null +++ b/vote.html @@ -0,0 +1,48 @@ +{{:admin_header title="Voter"}} + +{{if $_GET.id}} + {{#load assign="scrutin" id=$_GET.id|intval}}{{/load}} + + {{:assign var="reponses" -1="Non" 0="" 1="Oui" }} + + + {{:assign user_id=$logged_user.id }} + Bonjour {{$logged_user.nom}}. + + {{if $_POST.save}} + {{:assign var="scrutin.votes.%s"|args:$user_id value=$_POST.vote|intval}} + {{:save id=$scrutin.id + validate_schema="./scrutin.schema.json" + votes=$scrutin.votes + }} + + {{:redirect to="./"}} + {{/if}} + +
+
+ Question +

{{$scrutin.question}}

+ {{if $scrutin.votes|has_key:$user_id}} + {{:assign var="prev" from="scrutin.votes.%s"|args:$user_id}} + {{else}} + {{:assign var="prev" value=0}} + {{/if}} + +
+ {{:input type="select" required="false" shape="right" name="vote" label="Je vote :" options=$reponses default=$prev help=$scrutin.desc}} +
+
+ + +

+ {{:button type="submit" shape="right" label="Valider mon vote" name="save" class="main"}} +

+
+ + +{{else}} +

+ Aucun scrutin sélectionné. Il ne devrait y avoir aucune raison d'atterir sur cette page. +

+{{/if}} \ No newline at end of file