PyVotons!

Documentation pour les développeurs - documentation technique
  1. Présentation générale

    PyVotons! est un logiciel libre (licence GPL) en phase alpha/beta de développement : il fonctionne pour les cas simples qui ont été testés, mais il reste sans doute un certain nombre de bugs.
    Des fonctions supplémentaires doivent être implémentées, notamment l'enregistrement des votes par des serveurs externes pour limiter au maximum le risque de fraude et une interface web pour permettre le vote par internet.

  2. Choix technologiques

    PyVotons! est un logiciel développé sous Linux dans le langage Python.
    L'interface graphique et les fonctions réseaux sont implémentées grâce à la librairie Qt 4 et aux bindings Python de cette librairie (PyQt4), ce qui devrait garantir la portabilité du code sur les trois principales plateformes cibles (Windows, Mac Os X et Linux).
    PyQt permet un développement rapide et simple des interfaces graphiques et c'est l'outil avec lequel je suis le plus familier pour les interfaces graphiques en Python.
  3. Structure du code

    La séparation entre les algos et l'interface elle-même n'est pas parfaite...

    Le code est composé : Trois logiciels composent PyVotons! : CreeScrutin.py (pour définir les paramètres d'un scrutin), Vote.py (pour enregistrer les votes dans un bureau de vote) et CalculResultats.py (comme son nom l'indique).
    Le code est très commenté donc je vous invite à le regarder directement (vous pouvez cliquer sur les noms de fichier ci-dessous).

    Interfaces graphiques

    CreerScrutin.ui
    Interface pour créer un scrutin
    VoteAdmin.ui
    Interface pour lancer un vote
    VoteUnique.ui
    Interface pour le vote unique
    VoteUniqueTransferable.ui
    Interface pour le vote unique tranférable
    candidatNoteWidget.ui
    Widget contenant le nom du candidat et une SpinBox pour le noter
    VoteAssentiment.ui
    Interface pour le vote par assentiment
    calculResultats.ui
    Interface pour lancer le calcul des résultats d'un scrutin et afficher les résultats détaillés
    Ces fichiers permettent de générer automatiquement des fichiers python qui contruisent ces interfaces (les fichiers nommés *UI.py, comme CreerScrutinUI.py

    Classes dérivées des interfaces graphiques

    Les classes citées ici utilisent les programmes Python générés automatiquement par pyuic4 (PyQt4) pour obtenir des interfaces fonctionnelles.
    CreerScrutin.py : fonctions de création d'un scrutin et classe QDialog correspondante
    VoteAdminDialog.py : fonctions de gestion d'un vote et classe QDialog correspondante
    VoteUniqueDialog.py : fonctions pour effectuer un vote unique et classe QDialog correspondante
    VoteUniqueTransferableDialog.py : fonctions pour effectuer un vote unique transférable et classe QDialog correspondante
    VoteAssentimentDialog.py : fonctions pour effectuer un vote par assentiment et classe QDialog correspondante
    CalculResultatsDialog.py : fonctions pour lancer le calcul des résultats d'un scrutin et classe QDialog correspondante

    Logiciels

    Ces fichiers sont les programmes lancés par l'utilisateur:
    CreerScrutin.py : pour définir les paramètres d'un scrutin
    Vote.py : pour lancer un vote et enregistrer les votes dans un bureau
    CalculResultats.py: calcule les résultats et les affiche.

    Libraries de fonctions


    ScrutinIO.py : entrées-sorties (sauvegarde et lecture des trois formats de fichier)
    ScrutinCalcul.py : fonctions de calcul des résultats pour chaque type de scrutin.
  4. Format des fichiers

    Les formats de fichiers ont été définis le plus simplement possible : ce sont des représentations en texte des structures Python correspondantes.
    Il existe trois formats : le format Scrutin (*.scrutin) définit le stockage des informations liées à un scrutin, le format Votes (*.votes) permet de stocker les votes liés à un scrutin de façon anonyme, et le format Registre (*.registre) stocke le registre des votants lié à un fichier Votes.

    Pour comprendre les formats, allez voir le code source du fichier ScrutinIO.py.

    Futur
    Il est possible d'envisager des méthodes de stockage différentes (document XML, stockage en base de données SQL...). Les formats actuels sont sans doute incomplets, il évolueront au fur et à mesure des besoins pour stocker d'autres informations.
  5. Stratégies pour limiter les problèmes de fraude

    Les idées ci-dessous n'existent pas dans le code mais présentent un idéal pour le futur... Une interface de vote par internet : l'interface de vote (technologies type AJAX) devra se connecter à un ensemble de serveurs pour valider le vote auprès de tous ces serveurs (le risque est l'absence d'anonymat). La page de confirmation de l'utilisateur sera composée d'une frame par serveur avec la confirmation d'enregistrement du vote par chaque serveur.
  6. FAQ développeurs

    - Si vous souhaitez réorganiser une interface sans changer le fonctionnement du logiciel, il vous suffit d'éditer le fichier .ui avec Qt Designer sans changer le nom ou le type des widgets, puis de le compiler avec le Makefile (valable sous Linux).

    - Si vous souhaitez ajouter un nouveau type de scrutin, c'est plus compliqué. Il faudra modifier CreeScrutin (Interface .ui et code python), modifier VoteAdminDialog.py et peut-être créer une nouvelle interface pour votre type de vote, et enfin ajouter dans ScrutinCalcul.py votre fonction de calcul des résultats (sans oublier de l'ajouter à la fonction getAllMethods du même fichier)
  7. Perspectives et fonctionnalités

Ces logiciels sont toujours en développement

N'hésitez pas à éditer le code et à m'envoyer vos modifications