import sys, os, operator, PyQt4
from PyQt4 import QtGui, QtCore
from CalculResultatsUI import Ui_CalculResultatsDialog
from ScrutinIO import Scrutin, Votes, Registre
from ScrutinCalcul import getAllMethods
class CalculResultatsDialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.ui = Ui_CalculResultatsDialog()
self.ui.setupUi(self)
self.fonctionsCalcul = getAllMethods()
self.scrutin = None
self.files = {}
self.votes = {}
self.votants = []
self.connect(self.ui.chargerBouton, QtCore.SIGNAL("clicked()"),self.chargerVotes)
self.connect(self.ui.calculBouton, QtCore.SIGNAL("clicked()"),self.calcul)
self.connect(self.ui.exportBouton, QtCore.SIGNAL("clicked()"),self.exportHTMLresults)
def closeEvent(self, event):
reply = QtGui.QMessageBox.question(self, 'Message',"Voulez-vous vraiment quitter ?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
def chargerVotes (self):
filenames = QtGui.QFileDialog.getOpenFileNames ( self, u"Charger un ou plusieurs fichiers de votes...", "", "Votes (*.votes)")
print "Filenames : "+repr(filenames)
if filenames is None or filenames == "" or filenames==[]:
return True
for filename in filenames:
print "Chargement des votes de " + unicode(filename)
v = Votes.read(filename)
print " -> OK"
basename, extension = os.path.splitext(unicode(filename))
filenameR = basename + ".registre"
print "Chargement du registre..."
r = Registre.read(filenameR)
print " -> OK"
if r is None or v is None:
self.erreur( u"Erreur de chargement du fichier de vote ou du registre correspondant !" )
return False
print u"Fichier chargé -- ok"
if self.scrutin is not None:
if self.scrutinIdentiques(self.scrutin, r["Scrutin"]) and self.scrutinIdentiques(self.scrutin, v["Scrutin"]):
if self.addVotesRegistre(v,r, filename):
return True
else:
self.erreur( u"Attention, une erreur s'est produite à l'ajout du fichier de votes\n" + unicode(filename)+u"\nFichier ignoré")
return False
else:
self.erreur( u"Le fichier de votes " + unicode(filename)+u" ne correspond pas au même scrutin que les fichiers déjà chargés !")
return False
else:
if self.scrutinIdentiques(v["Scrutin"], r["Scrutin"]):
if self.addVotesRegistre(v,r, filename):
self.scrutin = v["Scrutin"]
return True
else:
self.erreur( u"Attention, une erreur s'est produite à l'ajout du fichier de votes\n" + unicode(filename)+u"\nFichier ignoré")
return False
else:
self.erreur( u"Le fichier de votes " + unicode(filename)+u" ne correspond pas au même scrutin que le fichier registre du même nom !")
return False
def addVotesRegistre(self,v,r, filename):
if reduce (operator.or_, [i in self.votes.keys() for i in v["Votes"].keys()]) == True:
self.erreur( u"Erreur : un vote du fichier en cours de chargement est déjà présent dans les votes chargés !")
return False
if reduce (operator.or_, [i in self.votants for i in r["Votants"]]) == True:
self.erreur (u"Erreur : un électeur déjà comptabilisé a également voté dans le nouveau fichier !")
return False
self.votes.update(v["Votes"])
self.votants.extend(r["Votants"])
self.ui.fichierList.addItem(filename)
self.files[filename]={"Registre":r, "Votes":v}
self.ui.elusList.clear()
self.ui.detailEdit.setText("")
return True
def scrutinIdentiques( self, s1, s2 ):
return s1 == s2
def calcul(self):
if self.scrutin is None or self.votes == []:
return
result = self.fonctionsCalcul[self.scrutin["Type Scrutin"]](self.votes, self.scrutin)
self.ui.elusList.clear()
for elu in result["Elus"]:
self.ui.elusList.addItem(repr(elu))
self.ui.detailEdit.setText(result["Details"])
def exportHTMLresults( self ):
filename = QtGui.QFileDialog.getSaveFileName ( self, u"Enregistrer les résultats détaillés", "", u"Fichier HTML (*.html)")
if filename is None or filename == "":
return
f = open(filename, 'w')
f.write(self.ui.detailEdit.toHtml())
f.close()
def erreur( self, message ):
QtGui.QMessageBox.warning(self, u"Résultat de Scrutin", message)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = CalculResultatsDialog()
window.show()
sys.exit(app.exec_())