import sys, os, uuid, PyQt4
from PyQt4 import QtGui, QtCore
from VoteAdminUI import Ui_VoteAdminDialog
from ScrutinIO import Scrutin, Votes, Registre
from VoteAssentimentDialog import VoteAssentimentDialog
from VoteUniqueDialog import VoteUniqueDialog
from VoteUniqueTransferableDialog import VoteUniqueTransferableDialog
class VoteAdminDialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui = Ui_VoteAdminDialog()
self.ui.setupUi(self)
self.etape = 1
self.scrutin = None
self.votewindow = None
self.touslesvotes = {}
self.touslesvotants = []
self.urneFilename = None
self.registreFilename = None
self.datedebut = ""
self.datefin = ""
self.commentaires = ""
self.titreVotes = ""
self.idVotes ="NoID"
self.connexions = {}
self.cles = {}
self.ui.chargeScrutinBouton.setEnabled(True)
self.ui.verificationBouton.setEnabled(False)
self.ui.sauverBouton.setEnabled(False)
self.ui.connexionBouton.setEnabled(False)
self.ui.ouvertureScrutinBouton.setEnabled(False)
self.ui.fermetureScrutinBouton.setEnabled(False)
self.ui.quitterBouton.setEnabled(True)
self.connect(self.ui.chargeScrutinBouton, QtCore.SIGNAL("clicked()"), self.chargeScrutin)
self.connect(self.ui.verificationBouton, QtCore.SIGNAL("clicked()"), self.verification)
self.connect(self.ui.sauverBouton, QtCore.SIGNAL("clicked()"), self.sauverFichiers)
self.connect(self.ui.connexionBouton, QtCore.SIGNAL("clicked()"), self.connexionServeurs)
self.connect(self.ui.ouvertureScrutinBouton, QtCore.SIGNAL("clicked()"), self.ouvrirScrutin)
self.connect(self.ui.fermetureScrutinBouton, QtCore.SIGNAL("clicked()"), self.fermerScrutin)
self.connect(self.ui.quitterBouton, QtCore.SIGNAL("clicked()"), self.quitter)
def chargeScrutin( self ):
filename = QtGui.QFileDialog.getOpenFileName ( self, u"Charger un scrutin existant...", "", "Scrutin (*.scrutin)")
if filename is None or filename == "":
return
self.scrutin = Scrutin.read( filename )
if self.scrutin is None:
self.erreur ( u"Impossible de charger le fichier " + filename)
return
if self.scrutin["Type Scrutin"] == "Vote unique":
self.votewindow = VoteUniqueDialog(self.scrutin)
elif self.scrutin["Type Scrutin"] == "Vote unique transferable":
self.votewindow = VoteUniqueTransferableDialog(self.scrutin)
elif self.scrutin["Type Scrutin"] == "Vote par assentiment":
self.votewindow = VoteAssentimentDialog(self.scrutin)
else:
self.erreur (u"Type de scrutin non reconnu !!")
return
self.connect(self.votewindow.ui.voterBouton, QtCore.SIGNAL("clicked()"), self.addVote)
self.ui.affichageLabel.setText( u"<font color=green>Fichier Scrutin chargé !</font>" )
self.ui.chargeScrutinBouton.setEnabled(False)
self.ui.verificationBouton.setEnabled(True)
self.etape = 2
def verification( self ):
self.ui.affichageLabel.setText( u"<font color=orange>La vérification automatique du programme n'est pas implémentée !</font>" )
self.ui.verificationBouton.setEnabled(False)
self.ui.sauverBouton.setEnabled(True)
self.etape = 3
def sauverFichiers( self ):
self.idVotes = str(uuid.uuid4())
filename = QtGui.QFileDialog.getSaveFileName ( self, u"Enregistrer les votes", "", "Votes (*.votes)")
if filename is None or filename == "":
return
if os.path.exists(filename):
self.erreur (u"Attention, "+unicode(filename)+u" existe : \nil est interdit d'écraser un fichier de vote !\n Choisissez un autre fichier !")
return
if not Votes.write( {"Header":"VOTES FILE version 1.0", "Titre Votes":self.titreVotes, "Commentaires":self.commentaires, "IdVotesFile":self.idVotes,\
"Date Debut":self.datedebut, "Date Fin":self.datefin, "Scrutin":self.scrutin, "Votes":self.touslesvotes }, filename ):
self.erreur ( u"Attention : echec de la sauvegarde du fichier de Votes" )
return
self.urneFilename = filename
os.remove(filename)
print "fichier "+unicode(filename)+"\n"
basename, extension = os.path.splitext(unicode(filename))
filename = basename + ".registre"
if not Registre.write( {"Header":"REGISTRE FILE version 1.0", "Titre Votes":self.titreVotes, "Commentaires":self.commentaires, "IdVotesFile":self.idVotes,\
"Date Debut":self.datedebut, "Date Fin":self.datefin, "Scrutin":self.scrutin, "Votants":self.touslesvotants}, filename):
self.erreur ( u"Attention : echec de la sauvegarde du Registre des électeurs" )
return
self.registreFilename = filename
os.remove(filename)
self.ui.affichageLabel.setText( u"<font color=green>Les fichiers de sauvegarde ont été choisis !</font>" )
self.ui.sauverBouton.setEnabled(False)
self.ui.connexionBouton.setEnabled(True)
self.etape = 4
def connexionServeurs( self ):
self.connexions = {}
self.cles = {"cle1": self.ui.cle1Edit.text(), "cle2": self.ui.cle2Edit.text(), "cle3": self.ui.cle3Edit.text()}
self.ui.affichageLabel.setText( u"<font color=orange>Connexion aux serveurs/authentification externes non implémentée !</font>" )
self.ui.connexionBouton.setEnabled(False)
self.ui.ouvertureScrutinBouton.setEnabled(True)
self.etape = 5
def ouvrirScrutin( self ):
if QtCore.QDateTime.fromString(self.scrutin["Date Debut"], QtCore.Qt.ISODate) > QtCore.QDateTime.currentDateTime ()\
and QtCore.QDateTime.fromString(self.scrutin["Date Fin"], QtCore.Qt.ISODate) < QtCore.QDateTime.currentDateTime ():
QtGui.QMessageBox.information(self, u"Lancement du scrutin", u"Veuillez confirmer le début du scrutin")
else:
rep = QtGui.QMessageBox.question(self, u"Lancement du scrutin", u"Attention\nla date et l'heure courante ne correspondent pas\n aux dates et heures du scrutin.\nConfirmez-vous le lancement du scrutin ?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if rep == QtGui.QMessageBox.No:
return
self.datedebut = QtCore.QDateTime.currentDateTime ().toString(QtCore.Qt.ISODate)
self.ui.cle1Edit.setText("")
self.ui.cle2Edit.setText("")
self.ui.cle3Edit.setText("")
self.votewindow.showFullScreen()
self.ui.affichageLabel.setText( u"<font color=green>Vote en cours !</font>" )
self.ui.ouvertureScrutinBouton.setEnabled(False)
self.ui.fermetureScrutinBouton.setEnabled(True)
self.etape = 6
def fermerScrutin( self ):
if not(self.cles["cle1"] == self.ui.cle1Edit.text() and self.cles["cle2"] == self.ui.cle2Edit.text() and self.cles["cle3"] == self.ui.cle3Edit.text()):
self.erreur (u"Les clefs sont incorrectes : vous devez les entrer à nouveau pour clore le scrutin !")
return
self.datefin = QtCore.QDateTime.currentDateTime ().toString(QtCore.Qt.ISODate)
self.votewindow.hide()
self.ui.affichageLabel.setText( u"<font color=green>Le vote est clos</font>" )
self.ui.fermetureScrutinBouton.setEnabled(False)
self.etape = 7
def quitter ( self ):
if self.etape == 5 or self.etape == 6:
self.erreur(u"Impossible de quitter, il faut d'abord fermer le vote et les connexions !")
return
reply = QtGui.QMessageBox.question(self, 'Message',u"Voulez-vous vraiment quitter ?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
QtGui.qApp.quit()
def addVote( self ):
if not self.votewindow.validateVote(self.scrutin["Electeurs"], self.touslesvotants):
return
self.touslesvotes[str(uuid.uuid4())] = self.votewindow.getVoteHash()
self.touslesvotants.append(self.votewindow.getVotant())
self.saveNewVote()
self.erreur( u"Votre vote a été enregistré !" )
self.votewindow.resetVote()
def saveNewVote( self ):
print "Sauvegarde des fichiers "+unicode(self.urneFilename) + " ou " + unicode(self.urneFilename)
self.datefin = QtCore.QDateTime.currentDateTime ().toString(QtCore.Qt.ISODate)
Votes.write( {"Header":"VOTES FILE version 1.0", "Titre Votes":self.titreVotes, "Commentaires":self.commentaires, "IdVotesFile":self.idVotes,\
"Date Debut":self.datedebut, "Date Fin":self.datefin, "Scrutin":self.scrutin, "Votes":self.touslesvotes }, self.urneFilename )
self.touslesvotants.sort()
Registre.write( {"Header":"REGISTRE FILE version 1.0", "Titre Votes":self.titreVotes, "Commentaires":self.commentaires, "IdVotesFile":self.idVotes,\
"Date Debut":self.datedebut, "Date Fin":self.datefin, "Scrutin":self.scrutin, "Votants":self.touslesvotants}, self.registreFilename )
def closeEvent(self, event):
QtGui.QMessageBox.warning(self, u"Bureau de vote", u"Pour quitter, utilisez le bouton en bas de l'interface !")
event.ignore()
def erreur( self, message ):
QtGui.QMessageBox.warning(self, "Scrutin", message)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = VoteAdminDialog()
window.show()
sys.exit(app.exec_())