def setup(self): from score_handler import Class_Scores from ronde_handler import Class_Rondes from inschrijving_handler import Class_Inschrijvingen self.SH = Class_Scores() self.RH = Class_Rondes() self.PH = Class_Inschrijvingen() self.AllScanData = self.SH.getAllScanResults() if len(self.AllScanData) > 0: self.ScanDataIndex = 0 self.currentRondeSettings = None self.checkboxes = [] self.checkTafelnummer = False self.hideQLayout(self.basicScores) self.updateFile() self.updateLayout() self.setImageLbl() else: msg = QtWidgets.QMessageBox() msg.setText( "Alle beschikbare scans zijn gecontroleerd dus je kan hier niets mee doen..." ) msg.setWindowTitle("Klaar!") msg.exec()
def setup(self): from inschrijving_handler import Class_Inschrijvingen from ronde_handler import Class_Rondes from score_handler import Class_Scores from email_handler import Class_Emails self.EH = Class_Emails() self.PH = Class_Inschrijvingen() self.RH = Class_Rondes() self.SH = Class_Scores() self.fillComboBoxes() self.fillInfoFields() self.updateOverzicht() self.origineelPBox.currentIndexChanged.connect(self.fillInfoFields) self.origineelRBox.currentIndexChanged.connect(self.fillInfoFields) self.origineelWachtlijstPBox.currentIndexChanged.connect( self.fillInfoFields) self.rondeloting1.currentIndexChanged.connect(self.fillAntwoorden1) self.rondeloting2.currentIndexChanged.connect(self.fillAntwoorden2) self.rondeloting3.currentIndexChanged.connect(self.fillAntwoorden3) self.juistloting1.setChecked(1) self.juistloting2.setChecked(1) self.juistloting3.setChecked(1) self.lotingGenereer.clicked.connect(self.maakLoting) self.lotingZenden.clicked.connect(self.maakAndSendLoting) self.PAanpassenBtn.clicked.connect(self.updatePloeg) self.UitschrijvenBtn.clicked.connect(self.verwijderPloeg) self.updatenPBtn.clicked.connect(self.updateAllPloegen) self.betalingMailBtn.clicked.connect(self.sendBetalingEmailPloeg) self.RNieuwBtn.clicked.connect(self.nieuweRonde) self.RAanpassenBtn.clicked.connect(self.updateRonde) self.verwijderRBtn.clicked.connect(self.verwijderRonde) self.BevestigDeelnameButton.clicked.connect(self.verplaatsPloeg) self.VraagDeelnameBtn.clicked.connect(self.uitnodigenPloeg) self.RAanmeldenBtn.clicked.connect(self.resetAanmelden) self.RPloegenBtn.clicked.connect(self.resetPloegen) self.RRondesBtn.clicked.connect(self.resetRondes) self.RAllBtn.clicked.connect(self.totalReset) self.BetalingBtn.clicked.connect(self.betalingToevoegen) self.BetalingQRBtn.clicked.connect(self.emailBetalingQR) self.QRBtn.clicked.connect(self.emailQRLastDay) self.BetalingReminderBrn.clicked.connect(self.emailBetalingReminder) self.EindstandBtn.clicked.connect(self.emailEindstand) self.Uitnodiging2Btn.clicked.connect(self.emailUitnodigingReminder) self.UitnodigingBtn.clicked.connect(self.emailUitnodiging) self.updateOverzichtBtn.clicked.connect(self.saveOverzicht) self.uploadOnlineBtn.clicked.connect(self.uploadLive)
def setup(self): #fill Combobox from inschrijving_handler import Class_Inschrijvingen self.PH = Class_Inschrijvingen() for ploegnaam in self.PH.getPloegNamen(): self.ploegnaamTxt.addItem(ploegnaam) self.ploegnaamTxt.setCurrentIndex(-1) self.ploegnaamTxt.setFocus() self.updateLabel()
def __init__(self): read_Settings() from ronde_handler import Class_Rondes from inschrijving_handler import Class_Inschrijvingen self.RH = Class_Rondes() self.PH = Class_Inschrijvingen() global SUPERNR SUPERNR = self.RH.numberSuperRonde()
def __init__(self): read_Settings() from email_sender import Class_EmailSender from inschrijving_handler import Class_Inschrijvingen from score_handler import Class_Scores from ronde_handler import Class_Rondes self.EH = Class_EmailSender() self.PH = Class_Inschrijvingen() self.RH = Class_Rondes() self.SH = Class_Scores()
def __init__(self, parent=None): super(Inschrijving, self).__init__(parent) uic.loadUi('code/ui/NieuwePloeg.ui', self) self.setWindowTitle('Nieuwe Ploeg') self.show() from inschrijving_handler import Class_Inschrijvingen from email_handler import Class_Emails self.EH = Class_Emails() self.PH = Class_Inschrijvingen() self.InschrijvenBtn.clicked.connect(self.inschrijving)
def setup(self): from score_handler import Class_Scores from ronde_handler import Class_Rondes from inschrijving_handler import Class_Inschrijvingen self.RH = Class_Rondes() self.PH = Class_Inschrijvingen() self.SH = Class_Scores() self.fillComboBox() self.shortcut = '' self.schiftingfocus = False self.ronde = 0 self.beschikbaar = False self.imageDir = self.SH.getImagesDir() self.currentRondeSettings = 99 aanwezig, _ = self.PH.aanwezigePloegen() self.AanwezigePloegen = [] for ploeg in aanwezig: self.AanwezigePloegen.append(int(ploeg[0])) self.AantalPloegen = len(self.AanwezigePloegen) self.TNIndex = 0 self.updateRonde()
class Class_Scores(): def __init__(self): read_Settings() from ronde_handler import Class_Rondes from inschrijving_handler import Class_Inschrijvingen self.RH = Class_Rondes() self.PH = Class_Inschrijvingen() global SUPERNR SUPERNR = self.RH.numberSuperRonde() def getImagesDir(self): return IMAGESDIR def getScanResults(self): try: with open(RONDEFILES + SCANRAW, 'rt') as fr: reader = csv.reader(fr) for row in reader: yield row, IMAGESDIR + '{}_{}.jpg'.format(row[0], row[1]) except: yield [] def getAllScanResults(self): data = [] for X, a in enumerate(self.getScanResults()): data.append(a) return data def validateScanResult(self, row): writer = csv.writer(open(RONDEFILES + SCANCONTROL, 'a+')) writer.writerow(row) del writer def clearImagesDir(self): files = os.listdir(IMAGESDIR) for filename in files: os.remove(IMAGESDIR + '/' + filename) def clearScoresDir(self): files = os.listdir(RONDEFILES) for filename in files: os.remove(RONDEFILES + '/' + filename) def cleanScanRaw(self): tmp = RONDEFILES + 'tmp.csv' with open(RONDEFILES + SCANCONTROL, 'rt') as fr, open(RONDEFILES + SCANRAW, 'rt') as fr2, open(tmp, 'w') as fw: reader1 = csv.reader(fr) reader2 = csv.reader(fr2) writer = csv.writer(fw) checkcombo = [] for row in reader1: if '999' in row[1]: row[1] = '999' checkcombo.append('{}_{}'.format(row[0], row[1])) for row in reader2: combo = '{}_{}'.format(row[0], row[1]) if not combo in checkcombo: writer.writerow(row) else: checkcombo.remove(combo) shutil.move(tmp, RONDEFILES + SCANRAW) def getUserRondes(self): files = os.listdir(RONDEFILES) result = [] for RN, ronde in enumerate(self.RH.getRondeNames()): for file in files: if USERPREFIX in file and ronde in file: result.append( str(RN + 1) + '_' + file.replace('.csv', '').replace(USERPREFIX, '')) break return result def getScore(self, ronde, ploeg, scanner=0): if scanner == 1: filename = RONDEFILES + SCANRAW else: filename = RONDEFILES + USERPREFIX + self.RH.getRondenaam( ronde) + '.csv' with open(filename, 'rt') as fr: reader = csv.reader(fr) next(reader) for i, row in enumerate(reader): if int(row[1]) == int(ploeg) and int(row[0]) == int(ronde): return row[2:] return [] def getScoreRondeFinal(self, ronde, ploeg): filename = RONDEFILES + FINALPREFIX + self.RH.getRondenaam( ronde) + '.csv' with open(filename, 'rt') as fr: reader = csv.reader(fr) next(reader) for i, row in enumerate(reader): if int(row[1]) == int(ploeg) and int(row[0]) == int(ronde): return row[2:] return [] def setScore(self, ronde, ploeg, nieuweScore, scanner=0): if '999' in str(ploeg): ploeg = int(str(ploeg).replace('999', '')) if ronde > 0: tmp = RONDEFILES + 'tmp.csv' weggeschreven = False if scanner == 1: filename = RONDEFILES + SCANRAW else: filename = RONDEFILES + USERPREFIX + self.RH.getRondenaam( ronde) + '.csv' with open(filename, 'rt') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(next(reader)) for i, row in enumerate(reader): if int(row[1]) == int(ploeg) and int(row[0]) == int(ronde): writer.writerow(row[0:2] + nieuweScore) weggeschreven = True else: writer.writerow(row) if not weggeschreven: self.insertScore(ronde, ploeg, nieuweScore, USERPREFIX) else: shutil.move(tmp, filename) else: if len(nieuweScore) > 1: self.PH.setSchiftingBonus(ploeg, nieuweScore[0], nieuweScore[1]) else: self.PH.setSchiftingBonus(ploeg, nieuweScore[0]) def insertScore(self, ronde, ploeg, score, prefix): tmp = RONDEFILES + 'tmp.csv' filename = RONDEFILES + prefix + self.RH.getRondenaam(ronde) + '.csv' with open(filename, 'rt') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(next(reader)) ingevoegd = 0 for i, row in enumerate(reader): if not 'Max/Gem' in row: if ingevoegd == 0 and int(row[1]) > int(ploeg): writer.writerow([ronde] + [ploeg] + score) ingevoegd = 1 elif ingevoegd == 0: writer.writerow([ronde] + [ploeg] + score) ingevoegd = 1 writer.writerow(row) if ingevoegd == 0 and prefix == USERPREFIX: writer.writerow([ronde] + [ploeg] + score) ingevoegd = 1 shutil.move(tmp, filename) def deleteScore(self, ronde, ploeg, prefix): tmp = RONDEFILES + 'tmp.csv' filename = RONDEFILES + prefix + self.RH.getRondenaam(ronde) + '.csv' with open(filename, 'rt') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(next(reader)) for i, row in enumerate(reader): if not 'Max/Gem' in row: if not int(row[1]) == int(ploeg): writer.writerow(row) else: writer.writerow(row) shutil.move(tmp, filename) def getFinalScore(self, ploegnaamPositie): with open(SCOREBORD, 'rt') as fr: reader = csv.DictReader(fr) next(reader) for row in reader: if row['Ploegnaam'] == ploegnaamPositie or row['Pos'] == str( ploegnaamPositie): return row return '' def getFinalScores(self, positie, aantaldeelnemers, plusmin): result = [] posities = list( map( str, range(max(1, int(positie) - int(plusmin)), min(aantaldeelnemers, int(positie) + int(plusmin)) + 1))) with open(SCOREBORD, 'rt') as fr: reader = csv.reader(fr) for row in reader: if row[0] in posities: result.append(row) return result def generateBonusOverview(self): #Bereken Score met originele thema #Bereken score voor al de andere thema's zet hiervoor al de thema's steeds eens op het zelfde voor alle ploegen en bereken opnieuw de score #Bekijk wat het beste resultaat was en schrijf dat in BONUSOVERVIEW #Zet de origineleBonusThemas terug in PLOEGINFO en maak opnieuw Final bestanden aan alsof er niets gebeurd is headers = [ 'TN', 'Ploegnaam', 'Origineel', 'OrigineelScore', 'Beste', 'BesteScore', 'Maximum' ] origineleBonusThemas = [] aantalPloegen = 0 for ploeginfo in self.PH.getPloegenDict(): origineleBonusThemas.append(ploeginfo['Bonus']) aantalPloegen = aantalPloegen + 1 bonusScore = [] for i in range(0, len(BONUSTHEMAS)): self.PH.setBonusses([i + 1] * len(origineleBonusThemas)) self.makeFinal() score, maximum = self.calculateBonusScore(aantalPloegen) bonusScore.append(score) self.PH.setBonusses(origineleBonusThemas) self.makeFinal() eigenScore, maximum = self.calculateBonusScore(aantalPloegen) with open(BONUSOVERVIEW, 'w') as fw: writer = csv.writer(fw) writer.writerow(headers) for i, ploeginfo in enumerate(self.PH.getPloegenDict()): if ploeginfo['Aangemeld'] == '1': start = [ ploeginfo['TN'], ploeginfo['Ploegnaam'], ploeginfo['Bonus'], eigenScore[i] ] besteScore = eigenScore[i] beste = ploeginfo['Bonus'] for index in range(0, len(BONUSTHEMAS)): if bonusScore[index][i] > besteScore: besteScore = bonusScore[index][i] beste = index + 1 else: start = [ ploeginfo['TN'], ploeginfo['Ploegnaam'], ploeginfo['Bonus'], 0 ] besteScore = 0 beste = 0 writer.writerow(start + [beste] + [besteScore] + [maximum]) def calculateBonusScore(self, aantalPloegen): bonusscore = [0] * aantalPloegen maximum = 0 filenames = os.listdir(RONDEFILES) with open(SCOREBORDINFO, 'rt') as fr: readerInfo = csv.DictReader(fr) for row in readerInfo: filename = FINALPREFIX + row['Ronde'] + '.csv' if filename in filenames and bool( self.RH.isBonusRonde(row['Ronde'])): with open(RONDEFILES + filename) as fr2: reader = csv.DictReader(fr2) for index, row in enumerate(reader): if not '.' in row['TN']: bonusscore[int(row['TN']) - 1] = bonusscore[int(row['TN']) - 1] + int( row['Bonus']) maximum = maximum + 1 return bonusscore, maximum def fromScannerToUser(self): #De SCANCONTROL sorteren volgens rondenummer #alles in SCANCONTORL omvromen naar rondefiles met userprefix #goed controleren op dubbele entries en ook toevoegen aan de rondefiles, niet overschrijven stel bijvoorbeeld dat een ronde in drie scanverwerkings wordt gedaan! #Scan CSV file wordt gewoon verwijderd!!! if SCANCONTROL in os.listdir(RONDEFILES): file = RONDEFILES + SCANCONTROL self.sorteer(file) with open(file, 'rt') as fr: reader = csv.reader(fr) currentRound = 9999 mode = 'a' writer = None filename = '' for index, row in enumerate(reader): row = list(map(int, row)) ronde = row[0] ploeg = row[1] score = row[2:] if '999' in str(ploeg): ploeg = int(str(ploeg).replace('999', '')) row = [ronde] + [ploeg] + score if not ronde == currentRound and ronde > 0: #nieuweronde dus nieuwe file opendoen! del writer self.sorteerVerwijderDubbels(filename) rondeNaam = self.RH.getRondenaam(ronde) nieuw = not any( fname.endswith(rondeNaam + '.csv') for fname in os.listdir(RONDEFILES)) filename = RONDEFILES + USERPREFIX + rondeNaam + '.csv' writer = csv.writer(open(filename, 'a')) if nieuw: header = ['RN', 'TN'] for i in range(0, len(score)): header.append(i + 1) writer.writerow(header) if ronde > 0: #rondefile verder aanvullen writer.writerow(row) else: #schifting en bonus if len(score) > 1: self.PH.setSchiftingBonus(ploeg, score[0], score[1]) else: self.PH.setSchiftingBonus(ploeg, score[0]) currentRound = ronde del writer self.sorteerVerwijderDubbels(filename) self.cleanScanRaw() try: os.remove(file) except: print('{} , niet kunnen verwijderen'.format(file)) def sorteerVerwijderDubbels(self, filename): if filename.endswith('.csv'): tmp = RONDEFILES + 'tmp.csv' with open(filename, mode='rt') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(next(reader)) sorted2 = sorted(reader, key=lambda row: (int(row[1]))) for count, row in enumerate(sorted2): writer.writerow(row) shutil.move(tmp, filename) with open(filename, mode='rt') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) data = list(csv.reader(fr)) writer.writerow(data[0]) for X in range(1, len(data) - 1): if not data[X][1] == data[X + 1][1]: #geen dubbele entry voor deze ploeg in deze ronde writer.writerow(data[X]) writer.writerow(data[len(data) - 1]) shutil.move(tmp, filename) def checkAanwezigheden(self): aanwezig, afwezig = self.PH.aanwezigePloegen() nummers = [] for ploeg in aanwezig: nummers.append(ploeg[0]) originalNumbers = nummers ontbrekendeBestanden = [] nietAanwezigeInvoer = [] filenames = os.listdir(RONDEFILES) for count, filename in enumerate(filenames): if FINALPREFIX in filename: with open(RONDEFILES + filename, 'r') as fr: data = list(csv.reader(fr)) ronde = data[1][0] for X in range(1, len(data) - 1): try: index = nummers.index(int(data[X][1])) del nummers[index] except: nietAanwezigeInvoer.append('{}_{}'.format( ronde, data[X][1])) pass for i in nummers: ontbrekendeBestanden.append('{}_{}'.format(ronde, i)) aanwezig, afwezig = self.PH.aanwezigePloegen() nummers = [] for ploeg in aanwezig: nummers.append(ploeg[0]) #Verwijder de (foutieve) entry van ploegen die niet aanwezig zijn! for bestand in nietAanwezigeInvoer: ronde = list(map(int, bestand.split('_'))) self.deleteScore(ronde[0], ronde[1], FINALPREFIX) #Voeg 0 toe bij de ontbrekende bestanden! for bestand in ontbrekendeBestanden: ronde = list(map(int, bestand.split('_'))) NOQ, SUPER = self.RH.getVragenSuper(ronde[0]) bonus = self.RH.isBonusRonde(ronde[0]) self.insertScore(ronde[0], ronde[1], [0] * (NOQ * (1 + 2 * SUPER) + bonus), FINALPREFIX) return ontbrekendeBestanden, nietAanwezigeInvoer def makeFinal(self): #remove all files with FINALPREFIX #Check op aanwezigheden #voeg de bonusthema's toe! #Analyse van elke ronde op het einde (gemiddelde, aantalJuist per vraag) filenames = os.listdir(RONDEFILES) tmp = RONDEFILES + 'tmp.csv' for count, filename in enumerate(filenames): if FINALPREFIX in filename: os.remove(RONDEFILES + filename) geenBonus = [] filenames = os.listdir(RONDEFILES) for count, filename in enumerate(filenames): if USERPREFIX in filename: with open(RONDEFILES + filename, 'r') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) header = next(reader) currentRound = 0 bonusRonde = 0 superRonde = 0 totaalScore = [] JuisteAntwoorden = [0] * (len(header) - 2) for index, row in enumerate(reader): ronde = int(row[0]) if not currentRound == ronde: bonusRonde = self.RH.isBonusRonde(ronde) superRonde = self.RH.isSuperRonde(ronde) if bonusRonde == 1: header.append('Bonus') JuisteAntwoorden.append(0) writer.writerow(header) if bonusRonde == 1: schifting, bonus = self.PH.getSchiftingBonus( int(row[1])) if not bonus == 999: if bonus > 0: row.append(row[bonus + 1]) else: if not int(row[1]) in geenBonus: geenBonus.append(int(row[1])) row.append(0) else: row.append( 0 ) #de ploeg is niet aanwezig maar die wordt pas in checkAanwezigheden verwijderd for i, score in enumerate(row[2:]): JuisteAntwoorden[i] = JuisteAntwoorden[i] + int( score) writer.writerow(row) if superRonde == 1: tmpscore = list(map(int, row[2:])) totaalScore.append( sum(tmpscore[0:len(tmpscore):3]) + 2 * sum(tmpscore[1:len(tmpscore):3]) + 3 * sum(tmpscore[2:len(tmpscore):3])) else: totaalScore.append(sum(map(int, row[2:]))) currentRound = ronde writer.writerow([len(JuisteAntwoorden)] + [round(statistics.mean(totaalScore), 2)] + JuisteAntwoorden + ['Max/Gem']) shutil.move( tmp, RONDEFILES + filename.replace(USERPREFIX, FINALPREFIX)) aanwezig, _ = self.PH.aanwezigePloegen() geenSchifting = [] for ploeg in aanwezig: schifting, bonus = self.PH.getSchiftingBonus(ploeg[0]) if float(schifting) == 0: geenSchifting.append(ploeg[0]) ontbreekt, fout = self.checkAanwezigheden() geenBonus = sorted(geenBonus) ontbreekt = sorted(ontbreekt) fout = sorted(fout) return geenBonus, geenSchifting, ontbreekt, fout def sorteer(self, filename): tmp = 'tmp.csv' with open(filename, 'rt') as fr, open(tmp, 'w+') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(next(reader)) #header sorted2 = sorted(reader, key=lambda row: (int(row[0]), int(row[1]))) for count, row in enumerate(sorted2): writer.writerow(row) os.rename(tmp, filename) def collectAllInfo(self): #Zet de verschillende csv files per ronde samen in een groot bestand en sorteert dit dan zodat alles per ploeg en dan per ronde staat gerangschikt tmp = 'tmp.csv' with open(tmp, 'w') as fw: writer = csv.writer(fw) filenames = os.listdir(RONDEFILES) for file in filenames: if file.endswith('.csv') and file.startswith(FINALPREFIX): with open(RONDEFILES + file, mode='rt') as fr: reader = csv.reader(fr) next(reader) for row in reader: if not 'Max/Gem' in row: row = list(map(int, row)) if row[0] == SUPERNR: score = sum(row[2:len(row):3]) + 2 * sum( row[3:len(row):3]) + 3 * sum( row[4:len(row):3]) else: score = sum(row[2::]) writer.writerow([row[1], row[0], score]) #sorteer volgens tafelnummer en dan volgens rondenummer with open(tmp, mode='rt') as fr, open(SCOREBORD, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(['TN', 'RN', 'Score']) sorted2 = sorted(reader, key=lambda row: (int(row[0]), int(row[1]))) for row in sorted2: writer.writerow(row) def makeScorebordInfo(self): #Dit werkt enkel op basis van CollectAllInfo with open(SCOREBORD, mode='rt') as fr, open(SCOREBORDINFO, 'w') as fw: fields = ['RN', 'Ronde', 'Afkorting', 'Maximum'] writer = csv.DictWriter(fw, fields) reader = csv.DictReader(fr) writer.writeheader() vorigePloeg = 0 for i, row in enumerate(reader): if i > 0 and not int(row['TN']) == vorigePloeg: break else: rn = row['RN'] try: info = self.RH.getRondeInfoDict( rn ) #Rondenr, rondenaam, Afkorting, NOQ, superronde, bonusronde, sheet except NameError: print(rn) raise maximum = int( info['Aantal']) * (1 + 2 * int(info['Super'])) + int( info['Bonus']) #bonusronde + 1, superronde * 3 writer.writerow({ 'RN': rn, 'Ronde': info['Ronde'], 'Afkorting': info['Afkorting'], 'Maximum': maximum }) vorigePloeg = int(row['TN']) def setHeaders(self): global FIELDNAMES global ROW1 FIELDNAMES = ['Pos', 'TN', 'Ploegnaam', 'Score', '%'] ROW1 = ['0', '0', 'Maximum', '', '100'] with open(SCOREBORDINFO, 'rt') as fr: readerInfo = csv.DictReader(fr) for row in readerInfo: FIELDNAMES.append(row['Afkorting']) ROW1.append(int(row['Maximum'])) ROW1[3] = sum(ROW1[5:]) FIELDNAMES.append('Schifting') ROW1.append(SCHIFTING) FIELDNAMES.append('NormSchifting') ROW1.append('') def generateScorebord(self, bonusGeneration): a = time.time() geenBonus, geenSchifting, ontbreekt, fout = self.makeFinal() print('makeFinal:', time.time() - a) self.collectAllInfo() self.makeScorebordInfo() self.setHeaders() geenScoresBeschikbaar = True tmp = 'tmp.csv' with open(SCOREBORD, mode='rt') as fr, open(tmp, 'w') as fw: writer = csv.writer(fw) reader = csv.DictReader(fr) writer.writerow(FIELDNAMES) writer.writerow(ROW1) vorigePloeg = 0 ploegdata = [''] for i, row in enumerate(reader): if not int(row['TN']) == vorigePloeg and not 'Max/Gem' in row: #nieuwe ploeg if i > 0: ploegdata[3] = sum(map(int, ploegdata[5:])) ploegdata[4] = round( ploegdata[3] / ROW1[FIELDNAMES.index('Score')] * 100, 2) schiftingantwoord, Bonus = self.PH.getSchiftingBonus( vorigePloeg) schiftingnorm = round( SCHIFTING / (abs(float(schiftingantwoord) - SCHIFTING) + 0.0001), 3) ploegdata.append(schiftingantwoord) ploegdata.append(schiftingnorm) writer.writerow(ploegdata) try: ploegnaam = self.PH.getPloegnaam(row['TN']) ploegdata = ['', row['TN'], ploegnaam, '', ''] ploegdata.append(row['Score']) except NameError: print(row['TN']) else: #zelfde ploeg ploegdata.append(row['Score']) vorigePloeg = int(row['TN']) #moet dat hier staan? if len(ploegdata) > 1: ploegdata[3] = sum(map(int, ploegdata[5:])) ploegdata[4] = round( ploegdata[3] / ROW1[FIELDNAMES.index('Score')] * 100, 2) schiftingantwoord, Bonus = self.PH.getSchiftingBonus( vorigePloeg) schiftingnorm = round( SCHIFTING / (abs(float(schiftingantwoord) - SCHIFTING) + 0.0001), 3) ploegdata.append(schiftingantwoord) ploegdata.append(schiftingnorm) writer.writerow(ploegdata) geenScoresBeschikbaar = False maximumScore = 0 gemiddeldeScore = 0 gemiddeldes = [] with open(SCOREBORDINFO, 'rt') as fr1: reader = csv.DictReader(fr1) for usedRound in reader: rondeNaam = usedRound['Ronde'] maximumRondeScore = 0 gemiddeldeRondeScore = 0 eigenRondeScore = 0 with open(RONDEFILES + FINALPREFIX + rondeNaam + '.csv', 'rt') as fr: reader = csv.reader(fr) for row in reader: if 'Max/Gem' in row: maximumRondeScore = row[0] gemiddeldeRondeScore = round(float(row[1]), 1) gemiddeldes.append(gemiddeldeRondeScore) maximumScore = int(maximumRondeScore) + maximumScore gemiddeldeScore = float(gemiddeldeRondeScore) + gemiddeldeScore try: newRow = [ '0', '0', 'Gemiddelde', round(float(gemiddeldeScore), 2), round(float(gemiddeldeScore / maximumScore * 100), 2) ] except: newRow = [ '0', '0', 'Gemiddelde', round(float(gemiddeldeScore), 2), round(float(0), 2) ] newRow = newRow + gemiddeldes newRow.append('') #schifting newRow.append('') #normschifting #sorteren if not geenScoresBeschikbaar: with open(tmp, mode='rt') as fr, open(SCOREBORD, 'w') as fw: writer = csv.writer(fw) reader = csv.reader(fr) writer.writerow(FIELDNAMES) writer.writerow(newRow) writer.writerow(ROW1) next(reader) next(reader) sorted2 = sorted( reader, key=lambda row: (float(row[FIELDNAMES.index('Score')]), float(row[FIELDNAMES.index('NormSchifting')])), reverse=True) for positie, row in enumerate(sorted2): writer.writerow([positie + 1] + row[1:]) print('makeScorebord:', time.time() - a) if bonusGeneration: self.generateBonusOverview() print('generate BonusOverview:', time.time() - a) try: os.remove(tmp) except OSError: pass self.visualizeScorebord() return geenBonus, geenSchifting, ontbreekt, fout, SCOREHTMLFULL def getStatistics(self): mean = 0 median = 0 maximum = 0 with open(SCOREBORD, mode='rt') as fr: reader = csv.reader(fr) row1 = next(reader) row1 = next(reader) row1 = next(reader) maximum = int(row1[3]) row1 = next(reader) totalscores = [int(row1[3])] for i, row in enumerate(reader): totalscores.append(int(row[3])) mean = statistics.mean(totalscores) median = statistics.median(totalscores) return maximum, mean, median def visualizeScorebord(self): headers = '' body = '' with open(SCOREBORD, mode='rt') as fr, open(RONDEFILES + FTPSCOREBORDPUBLIC, 'w') as fw: reader = csv.reader(fr) writer = csv.writer(fw) row1 = next(reader) headerCSV = ['Pos'] headerCSV.append('Ploegnaam') headerCSV.append('Tot') headers = headers + '"Pos"' headers = headers + ', "Ploegnaam"' headers = headers + ', "Tot"' for i in range(4, len(row1) - 1): headers = headers + ', "{}"'.format(row1[i]) headerCSV.append(row1[i]) writer.writerow(headerCSV) maximal = '' for i, row in enumerate(reader): newCSVRow = [row[0]] newRow = '"{}"'.format(row[0]) ploegnaam = row[2] if len(ploegnaam) > 25: ploegnaam = ploegnaam[:24] + '..' newRow = newRow + ', "{}"'.format(ploegnaam) newCSVRow.append(ploegnaam) newRow = newRow + ', "{}"'.format(row[3]) newRow = newRow + ', "{}"'.format(row[4]) newCSVRow.append(row[3]) newCSVRow.append(row[4]) for j in range(5, len(row) - 1): #norm schifting moet er niet in newRow = newRow + ',' + row[j] newCSVRow.append(row[j]) if i == 1: #maximum rij onderaan tabel steken (als footer) maximal = newCSVRow else: writer.writerow(newCSVRow) body = body + '[' + newRow + '],' writer.writerow(maximal) template = open(SCORETEMPLATEHTML).read() fullHTML = open(SCOREHTMLFULL, "w") template = template.replace('{BODY}', body) template = template.replace('{HEADERS}', headers) fullHTML.write(template) fullHTML.close() self.uploadScorebordLive() self.uploadScorebordPublic() def uploadScorebordPublic(self): ftp = ftplib.FTP(FTPSERVER) ftp.login(FTPUSER, FTPPASSWORD) #remote_path = "/htdocs/ScorebordFiles" ftp.cwd(FTPPATH) fh = open(RONDEFILES + FTPSCOREBORDPUBLIC, 'rb') ftp.storbinary('STOR ' + FTPSCOREBORDPUBLIC, fh) fh.close() def uploadScorebordLive(self): ftp = ftplib.FTP(FTPSERVER) ftp.login(FTPUSER, FTPPASSWORD) #remote_path = "/htdocs/ScorebordFiles" ftp.cwd(FTPPATH) fh = open(SCOREHTMLFULL, 'rb') ftp.storbinary('STOR ' + FTPSCOREBORDTIM, fh) fh.close() def uploadEvaluatieLive(self): ftp = ftplib.FTP(FTPSERVER) ftp.login(FTPUSER, FTPPASSWORD) ftp.cwd(FTPPATH) fh = open(EVALUATIE, 'rb') ftp.storbinary('STOR ' + FTPEVALUATIE, fh) fh.close() def generateEvaluatie(self): heleTekst = '' filenames = [] rondenaam = [] rondenummer = [] aantalDeelnemers, _, _, _ = self.PH.aantalPloegen() with open(SCOREBORDINFO, 'rt') as fr: reader = csv.DictReader(fr) for row in reader: filenames.append(RONDEFILES + FINALPREFIX + row['Ronde'] + '.csv') rondenaam.append(row['Ronde']) rondenummer.append(int(row['RN'])) antwoordLimiet = int(math.ceil(aantalDeelnemers * MOEILIJKTRESHOLD)) with open(ANTWOORDEN, 'rt') as fr: reader = csv.reader(fr) antwoorden = list(reader) for index, file in enumerate(filenames): try: RNaam = rondenaam[index] RN = rondenummer[index] with open(file, 'rt') as fr: reader = csv.reader(fr) if 'Bonus' in next(reader): compensatieBonus = 1 else: compensatieBonus = 0 if self.RH.isSuperRonde(RN) == 1: superronde = True else: superronde = False eindstandPloeg = self.getFinalScore(1) TN = int(eindstandPloeg['TN']) scoreWinnaar = self.getScoreRondeFinal(RN, TN) for row in reader: if 'Max/Gem' in row: aantalJuist = row[2:len(row) - 1] aantalJuist = list(map(int, aantalJuist)) gemiddelde = row[1] maximum = row[0] rondeTekst = '<h2>' + RNaam + '</h2>' rondeTekst = rondeTekst + '<h4>' + 'Gemiddelde score: ' + str( gemiddelde) + '/' + str(maximum) + '</h4>' #rondeTekst = rondeTekst + '<p>' + TABLELAYOUTOVERZICHT + '<thead>' + '<tr>' + HEADEROVERZICHTLEFT.format(HEADER = 'Nr.') + HEADEROVERZICHTCENTER.format(HEADER = 'Antwoord') + HEADEROVERZICHTLEFT.format(HEADER = '#Juist') + '</tr>' +'</thead>' + '<tbody>' #rondeTekst = rondeTekst + TABLELAYOUTOVERZICHT.format(HEADER1 = 'Nr.', HEADER2 = 'Antwoord', HEADER3 = '#juist') rondeTekst = rondeTekst + """<table border="0" align="center" width="70%"> <thead><tr><th width="10%"> Nr. </th><th width="80%">Antwoord</th><th width="10%">#Juist</th></tr></thead><tbody>""" for i in range(0, len(aantalJuist) - compensatieBonus): moeilijk = False winnaarsfout = False VN = i + 1 VNstr = str(VN) if superronde: VNstr1 = str(int(i / 3) + 1) if i % 3 == 2: VNstr = VNstr1 + "c" elif i % 3 == 1: VNstr = VNstr1 + "b" else: VNstr = VNstr1 + "a" if aantalJuist[i] <= antwoordLimiet: moeilijk = True if int(scoreWinnaar[i]) == 0: winnaarsfout = True if moeilijk: nieuwelijn = """<td align="center">""" + '<B>' + VNstr + '</B>' + """</td><td align="center">""" + '<B>' + str( antwoorden[RN - 1][VN] ) + '</B>' + """</td><td align="center">""" + '<B>' + str( aantalJuist[i]) + '</B>' + """</td>""" #nieuwelijn = '' + DATAOVERZICHTCENTER.format(DATA = '<B>' + VNstr + '</B>') + DATAOVERZICHTCENTER.format(DATA = '<B>' + str(antwoorden[RN-1][VN]) + '</B>') + DATAOVERZICHTCENTER.format(DATA = '<B>' + str(aantalJuist[i]) + '</B>') else: #nieuwelijn = '' + DATAOVERZICHTCENTER.format(DATA = VNstr) + DATAOVERZICHTCENTER.format(DATA = antwoorden[RN-1][VN]) + DATAOVERZICHTCENTER.format(DATA = str(aantalJuist[i])) nieuwelijn = """<td align="center">""" + VNstr + """</td><td align="center">""" + str( antwoorden[RN - 1][VN] ) + """</td><td align="center">""" + str( aantalJuist[i]) + """</td>""" if winnaarsfout: rondeTekst = rondeTekst + """<tr bgcolor="#FFCACA">""" + nieuwelijn + "</tr>" else: rondeTekst = rondeTekst + "<tr>" + nieuwelijn + "</tr>" heleTekst = heleTekst + rondeTekst + "</tbody>" + "</table>" except: print('Fout!') print(index, rondenaam, rondenummer) print(RNaam, RN, VN) pass maximum, gemiddelde, mediaan = self.getStatistics() atekst = """<table border="0" align="center" width="45%"> <thead><tr><th width="40%"> Totaal </th><th width="30%"> """ + str( maximum) + """</th><th width="30%"> """ + str( round(maximum / maximum * 100, 2)) + """ % </th></tr></thead> <tbody> <tr><td align="center">gemiddelde</td><td align="center">""" + str( round(gemiddelde, 2) ) + """</td><td align="center">""" + str( round(gemiddelde / maximum * 100, 2)) + """ % </td></tr> <tr><td align="center">mediaan</td><td align="center">""" + str( mediaan) + """</td><td align="center">""" + str( round(mediaan / maximum * 100, 2)) + """ % </td></tr> </tbody> </table> """ template = open(EVALUATIETEMPLATE).read() text = template.format(TITEL=TITEL, PERCENTAGE=MOEILIJKTRESHOLD * 100, AANTAL=aantalDeelnemers, TOTAAL_OVERZICHT=atekst, RONDE_OVERZICHT=heleTekst) pdf = HTML2PDF() pdf.add_page() pdf.write_html(text) pdf.output(EVALUATIE) self.uploadEvaluatieLive()
class Control(QtWidgets.QMainWindow): def __init__(self, parent=None): super(Control, self).__init__(parent) uic.loadUi('code/ui/Controleren.ui', self) self.setWindowTitle('Scans controleren') self.setup() self.show() self.nextBtn.clicked.connect(self.nextFile) self.updateScoreBtn.clicked.connect(self.updateScore) self.allesJustBtn.clicked.connect(self.allesOverzetten) self.discardBtn.hide() def closeEvent(self, event): self.SH.fromScannerToUser() if len(self.SH.getAllScanResults()) > 0: msg = QtWidgets.QMessageBox() msg.setText("Nog niet alle scans werden gecontroleerd") msg.setWindowTitle("Opgelet") msg.exec() event.accept() def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: if event.key() == QtCore.Qt.Key_Escape: self.close() elif event.key() == QtCore.Qt.Key_Right or event.key( ) == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return: self.nextFile() event.accept() else: event.ignore() def setup(self): from score_handler import Class_Scores from ronde_handler import Class_Rondes from inschrijving_handler import Class_Inschrijvingen self.SH = Class_Scores() self.RH = Class_Rondes() self.PH = Class_Inschrijvingen() self.AllScanData = self.SH.getAllScanResults() if len(self.AllScanData) > 0: self.ScanDataIndex = 0 self.currentRondeSettings = None self.checkboxes = [] self.checkTafelnummer = False self.hideQLayout(self.basicScores) self.updateFile() self.updateLayout() self.setImageLbl() else: msg = QtWidgets.QMessageBox() msg.setText( "Alle beschikbare scans zijn gecontroleerd dus je kan hier niets mee doen..." ) msg.setWindowTitle("Klaar!") msg.exec() def allesOverzetten(self): #Laatste Aanpassing bereik = range(self.ScanDataIndex, len(self.AllScanData)) self.toCheck = [] for i in bereik: row = self.AllScanData[i] row = row[0] if int(row[2]) == 0: self.ScanDataIndex = i self.iterateAll() if self.checkTafelnummer: self.toCheck.append(row) else: self.toCheck.append(row) if len(self.toCheck) == 0: self.allChecked(True) else: self.SH.fromScannerToUser() self.msgBox( 'Bijna klaar', 'Er zijn nog een paar scans die manueel nagekeken moeten worden.' ) self.setup() def iterateAll(self): self.updateFile() if not self.checkTafelnummer: newRow = [self.ronde] + [self.ploeg] + self.score self.SH.validateScanResult(newRow) def nextFile(self): if self.updateScore(): newRow = [self.ronde] + [self.ploeg] + self.score self.SH.validateScanResult(newRow) self.ScanDataIndex = self.ScanDataIndex + 1 if self.ScanDataIndex < len(self.AllScanData): self.updateFile() self.setImageLbl() self.updateLayout() else: self.allChecked(True) return True else: if not self.scoresOk: text = 'Deze score kan niet kloppen, kijk het nog eens na!' elif not self.bonusOk: text = 'Er is iets mis met het bonusthema, kijk het nog eens na!' elif not self.tafelOk: text = 'Dit tafelnummer bestaat niet of is niet aanwezig, kijk het nog eens na!' self.ploegTxt.setFocus() elif not self.schiftingOk: text = 'Geen geldig antwoord voor de schiftingsvraag, kijk het nog eens na!' self.schiftingTxt.setFocus() else: text = 'Geen geldige input, kijk het nog eens na!' self.msgBox('Ongeldig', text) return False def updateFile(self): data = self.AllScanData[self.ScanDataIndex] self.filename = data[1] self.row = data[0] self.ploeg = int(self.row[1]) self.ronde = int(self.row[0]) self.score = self.row[3:] def setImageLbl(self): try: pixmap = QtGui.QPixmap(self.filename) pixmap = pixmap.scaled(self.imagesLbl.width(), self.imagesLbl.height(), QtCore.Qt.KeepAspectRatio) self.imagesLbl.setPixmap(pixmap) self.imagesLbl.setAlignment(QtCore.Qt.AlignCenter) except: msg = QtWidgets.QMessageBox() msg.setText("Geen afbeelding gevonden maar wel de data???") msg.setWindowTitle("Vreemd") msg.exec() def updateScore(self): score = [] nieuwescore = [] checked = False update = False changed = False self.schiftingOk = True self.bonusOk = True self.tafelOk = True self.scoresOk = True if self.ronde > 0 and self.superronde == 1: for box in self.checkboxes: score.append(int(box.isChecked())) checked = True update = True for i in range(int(len(score) / 3)): if sum(score[i * 3:i * 3 + 3]) > 1: update = False self.scoresOk = False break if update: nieuwescore = score changed = not list(map(int, self.score)) == nieuwescore elif self.ronde == 0: checked = True try: schifting = int(self.schiftingTxt.text()) nieuwescore.append(schifting) update = True changed = not int(self.score[0]) == nieuwescore[0] except: update = False self.schiftingOk = False if len(self.checkboxes) > 1 and update: bonusThema = 0 update = False for i, box in enumerate(self.checkboxes): if box.isChecked(): score.append(1) bonusThema = i + 1 else: score.append(0) if sum(score) == 1: nieuwescore.append(bonusThema) update = True if not changed and not int(self.score[1]) == bonusThema: changed = True else: self.bonusOk = False else: for i, box in enumerate(self.checkboxes): if box.isChecked(): nieuwescore.append(1) else: nieuwescore.append(0) update = True checked = False changed = not list(map(int, self.score)) == nieuwescore if self.checkTafelnummer: try: self.ploeg = int(self.ploegTxt.text()) aanwezig = self.PH.isAanwezig(self.ploeg) if not aanwezig: #de nieuwe tafel is niet aanwezig dus is sowieso foute ingave checked = True update = False self.tafelOk = False else: self.ploeg = int(str('999') + str(self.ploeg)) except: checked = True update = False self.tafelOk = False if checked and not update: return False if update and changed: self.score = nieuwescore filename = self.AllScanData[self.ScanDataIndex][1] image = cv2.imread(self.filename) heigth, width, channels = image.shape cv2.rectangle(image, (int(width * 0.1), int(heigth)), (0, int(heigth * 0.9)), (0, 166, 255), -1) cv2.imwrite(self.filename, image) self.setImageLbl() return True def updateBoxes(self): if self.ronde > 0: for i, box in enumerate(self.checkboxes): box.setChecked(int(self.score[i])) else: self.schiftingTxt.setText(self.score[0]) if self.NOQ == 2: bonusthema = int(self.score[1]) for i, box in enumerate(self.checkboxes): box.setChecked(i + 1 == bonusthema) def updateLayout(self): self.checkTafelnummer = False if not self.ronde == self.currentRondeSettings: #updatelayout self.checkboxes = [] self.NOQ = len(self.score) try: self.superronde = self.RH.isSuperRonde(self.ronde) except: self.superronde = 0 pass for box in self.checkboxes: box.hide() box.setChecked(0) self.hideQLayout(self.schiftingsvraag) self.hideQLayout(self.tafelnummer) if self.superronde == 1: index = 0 for i in range(self.basicScores.count()): box1 = self.basicScores.itemAt(i).widget() box2 = self.superronde2.itemAt(i).widget() box3 = self.superronde3.itemAt(i).widget() if i < self.NOQ / 3: box1.setText('{}a.'.format(i + 1)) box2.setText('{}b.'.format(i + 1)) box3.setText('{}c.'.format(i + 1)) self.checkboxes.append(box1) self.checkboxes.append(box2) self.checkboxes.append(box3) box1.show() box2.show() box3.show() else: box1.hide() box2.hide() box3.hide() else: self.hideQLayout(self.superronde2) self.hideQLayout(self.superronde3) if self.NOQ < 3: self.showQLayout(self.schiftingsvraag) if self.NOQ == 2: aantalThemas = 9 boxes = (self.basicScores.itemAt(i).widget() for i in range(self.basicScores.count())) for i, box in enumerate(boxes): if i < aantalThemas: box.setText('{}.'.format(i + 1)) self.checkboxes.append(box) box.show() else: box.hide() else: self.hideQLayout(self.basicScores) self.schiftingTxt.setText(self.score[0]) else: boxes = (self.basicScores.itemAt(i).widget() for i in range(self.basicScores.count())) for i, box in enumerate(boxes): if i < self.NOQ: box.setText('{}.'.format(i + 1)) self.checkboxes.append(box) box.show() else: box.hide() self.currentRondeSettings = self.ronde if '999' in str(self.ploeg): self.showQLayout(self.tafelnummer) self.checkTafelnummer = True self.ploegTxt.setText('') self.updateBoxes() #check or unchek def hideQLayout(self, layout): items = (layout.itemAt(i).widget() for i in range(layout.count())) for i, item in enumerate(items): try: item.hide() except: pass def showQLayout(self, layout): items = (layout.itemAt(i).widget() for i in range(layout.count())) for i, item in enumerate(items): try: item.show() except: pass def msgBox(self, titel, text): msg = QtWidgets.QMessageBox() msg.setText(text) msg.setWindowTitle(titel) msg.exec() def allChecked(self, doeiets): #sluit deze GUI af en verwerk SCANCONTROL self.msgBox('Klaar!', "Alle beschikbare scans zijn gecontroleerd!") if doeiets: self.SH.fromScannerToUser() self.close()
class Aanmelden(QtWidgets.QDialog): def __init__(self, parent=None): super(Aanmelden, self).__init__(parent) uic.loadUi('code/ui/Aanmelden.ui', self) self.setWindowTitle('Aanmelden') self.setup() self.show() def setup(self): #fill Combobox from inschrijving_handler import Class_Inschrijvingen self.PH = Class_Inschrijvingen() for ploegnaam in self.PH.getPloegNamen(): self.ploegnaamTxt.addItem(ploegnaam) self.ploegnaamTxt.setCurrentIndex(-1) self.ploegnaamTxt.setFocus() self.updateLabel() def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: # print ("type(event) = ",type(event), 'Event Key=', event.key()) if event.key() == QtCore.Qt.Key_Return or event.key( ) == QtCore.Qt.Key_Enter: self.aanmelding() elif event.key() == QtCore.Qt.Key_Escape: self.close() elif event.key() == QtCore.Qt.Key_Control: self.afwezigOverzicht() event.accept() else: event.ignore() def aanmelding(self): ploegnaam = self.ploegnaamTxt.currentText() index = self.ploegnaamTxt.currentIndex() if not ploegnaam == ' ' and index > -1: aanmeldResult = self.PH.aanmelden(ploegnaam) if len(aanmeldResult) > 1: tekst = "<p align='center'>Ploeg: {}</p>".format( aanmeldResult['Ploegnaam']) tekst = tekst + "<p align='center'>Tafelnummer: {}</p>".format( aanmeldResult['TN']) if aanmeldResult['Aanwezig']: tekst = tekst + "<p align='left'> Vorige aanmelding: {}<br>".format( aanmeldResult['Uur']) tekst = tekst + 'Terug afmelden?</p>' qm = QtWidgets.QMessageBox() answer = qm.question(QtWidgets.QDialog(), 'Terug afmelden?', tekst, qm.Yes | qm.No) if answer == qm.Yes: self.PH.resetAanmelding(ploegnaam) else: if not aanmeldResult['Email']: self.msgBoxAanmelden(aanmeldResult['Ploegnaam'], aanmeldResult['TN'], aanmeldResult['Bedrag'], aanmeldResult['Drankkaarten'], '!!!') email, ok = QtWidgets.QInputDialog.getText( self, 'Emailadres', 'Emailadres voor ploeg {}'.format(ploegnaam)) if '@' in email and ok: self.PH.veranderEmail(ploegnaam, email) else: self.msgBoxAanmelden(aanmeldResult['Ploegnaam'], aanmeldResult['TN'], aanmeldResult['Bedrag'], aanmeldResult['Drankkaarten'], 'OK') self.updateLabel() else: self.msgBox('Ploeg niet gevonden', 'Ongeldig') self.ploegnaamTxt.setCurrentIndex(-1) self.ploegnaamTxt.setFocus() def afwezigOverzicht(self): aanwezig, afwezig = self.PH.aanwezigePloegen() tekst = '' for ploeg in afwezig: tekst = tekst + '{}.\t{}\n'.format(ploeg[0], ploeg[1]) if len(tekst) > 0: self.msgBox(tekst, 'Afwezige ploegen') else: self.msgBox('Iedereen is aanwezig, je kan starten!', 'Afwezige ploegen') def updateLabel(self): numbers = self.PH.aantalPloegen() self.aangemeldTxt.setText('{}/{}'.format(numbers[0], numbers[1])) if numbers[0] == numbers[1]: self.msgBox( 'Alle {} ploegen zijn aanwezig, de quiz kan starten!'.format( numbers[1]), 'Joepie!') self.close() def msgBox(self, text, titel): msg = QtWidgets.QMessageBox() #msg.setIcon(QtWidgets.QMessageBox.Information) msg.setText(text) msg.setWindowTitle(titel) msg.exec() def msgBoxAanmelden(self, ploegnaam, tafelnummer, betaald, drankkaarten, email): if float(betaald) < 1: bedrag = '!! 0 !!' else: bedrag = betaald text = ''' <table style="height: 321px;" width="857"> <tbody> <tr> <td style="width: 587px; text-align: center;" colspan="2">Ploegnaam</td> <td style="width: 254px; text-align: center;">Tafelnummer</td> </tr> <tr> <td style="text-align: center; width: 587px;" colspan="2"> <p><span style="font-size: 30pt;"><strong>{PLOEGNAAM}</strong></span></p> </td> <td style="text-align: center; width: 254px;"> <p><strong><span style="font-size: 36pt;">{TN}</span></strong></p> </td> </tr> <tr> <td style="width: 308px; text-align: center;"> </td> <td style="width: 273px; text-align: center;"> </td> <td style="width: 254px; text-align: center;"> </td> </tr> <tr> <td style="width: 308px; text-align: center;">Al betaald</td> <td style="width: 273px; text-align: center;">#Drankkaarten</td> <td style="width: 254px; text-align: center;">Email</td> </tr> <tr> <td style="text-align: center; width: 308px;"> <p><strong><span style="font-size: 36pt;">€{BEDRAG}</span></strong></p> </td> <td style="text-align: center; width: 273px;"> <p><strong><span style="font-size: 36pt;">{DRANK}</span></strong></p> </td> <td style="text-align: center; width: 254px;"> <p><strong><span style="font-size: 36pt;">{EMAIL}</span></strong></p> </td> </tr> </tbody> </table> ''' text = text.format(PLOEGNAAM=ploegnaam, TN=tafelnummer, BEDRAG=bedrag, DRANK=drankkaarten, EMAIL=email) msg = QtWidgets.QMessageBox() #msg.setIcon(QtWidgets.QMessageBox.Information) msg.setText(text) msg.setWindowTitle('Aanmelden') msg.setStyleSheet("QLabel{min-width: 850px;}") msg.exec() def questionBox(self, text, titel): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Question) msg.setText(text) msg.setWindowTitle(titel) msg.exec()
def main(): read_Settings() from inschrijving_handler import Class_Inschrijvingen from ronde_handler import Class_Rondes from score_handler import Class_Scores PH = Class_Inschrijvingen() RH = Class_Rondes() SH = Class_Scores() SH.clearScoresDir() SH.clearImagesDir() PH.verwijderAllePloegen() RH.verwijderAlleRondes() aantalPloegen = 58 for i in range(0, aantalPloegen): PH.nieuwePloeg([ 'Ploegske{}'.format(i + 1), 'Tim', 'Thielemans', '*****@*****.**' ]) PH.aanmelden('Ploegske{}'.format(i + 1)) PH.setSchiftingBonus('Ploegske{}'.format(i + 1), round(SCHIFTING * random.uniform(0.5, 1.5)), random.randint(1, 9)) # RH.nieuweRonde(['Ronde1', 'R1', 11, 0, 0]) # RH.nieuweRonde(['Ronde2', 'R2', 11, 0, 0]) # RH.nieuweRonde(['Tafelronde1', 'Taf1', 20, 0, 0]) # RH.nieuweRonde(['Ronde3', 'R3', 11, 0, 0]) # RH.nieuweRonde(['Ronde4', 'R4', 11, 0, 0]) # RH.nieuweRonde(['Ronde5', 'R5', 11, 0, 0]) # RH.nieuweRonde(['Ronde6', 'R6', 11, 0, 0]) # RH.nieuweRonde(['Tafelronde2', 'Taf2', 20, 0, 0]) # RH.nieuweRonde(['Ronde7', 'R7', 11, 0, 0]) # RH.nieuweRonde(['Ronde8', 'R8', 11, 0, 0]) # RH.nieuweRonde(['Finale', 'Finale', 16, 0, 0]) RH.nieuweRonde(['Mollen en kruisen', 'Muziek', 15, 0, 0]) RH.nieuweRonde(['Tour de France', 'Tour', 26, 0, 0]) RH.nieuweRonde(['Kettingronde', 'Ketting', 16, 0, 0]) RH.nieuweRonde(['Tafelronde 1', 'Tafel1', 20, 0, 0]) RH.nieuweRonde(['Poëzieronde', 'Poëzie', 15, 0, 0]) RH.nieuweRonde(['Scrabbleronde', 'Scrabble', 15, 0, 0]) RH.nieuweRonde(['Fotolinkronde', 'Foto', 16, 0, 0]) RH.nieuweRonde(['Tafelronde 2', 'Tafel2', 20, 0, 0]) RH.nieuweRonde(['Superronde', 'Super', 10, 1, 0]) with open(DEFAULT_OUTPUTDIR + SCANRAW, 'w') as fw: writer = csv.writer(fw) check = 0 for i, ronde in enumerate(RH.getRondes()): NOQ, SUPER = RH.getVragenSuper(ronde[0]) for j, ploeg in enumerate(PH.getPloegen()): data = [ronde[0], ploeg[1], check] for k in range(0, int(NOQ)): if not SUPER: data.append(random.randint(0, 1)) writer.writerow(data)
class Aanpassen(QtWidgets.QDialog): def __init__(self, parent=None): super(Aanpassen, self).__init__(parent) uic.loadUi('code/ui/Aanpassen.ui', self) self.setWindowTitle('Scores aanpassen') self.show() self.setup() self.setFocus() self.qrcodeText.hide() self.rondeBox.currentIndexChanged.connect(self.nieuweRondeBox) self.NextBtn.clicked.connect(self.nextTafel) self.PreviousBtn.clicked.connect(self.previousTafel) self.qrcodeText.returnPressed.connect(self.qrGo) self.schiftingTxt.installEventFilter(self) def setup(self): from score_handler import Class_Scores from ronde_handler import Class_Rondes from inschrijving_handler import Class_Inschrijvingen self.RH = Class_Rondes() self.PH = Class_Inschrijvingen() self.SH = Class_Scores() self.fillComboBox() self.shortcut = '' self.schiftingfocus = False self.ronde = 0 self.beschikbaar = False self.imageDir = self.SH.getImagesDir() self.currentRondeSettings = 99 aanwezig, _ = self.PH.aanwezigePloegen() self.AanwezigePloegen = [] for ploeg in aanwezig: self.AanwezigePloegen.append(int(ploeg[0])) self.AantalPloegen = len(self.AanwezigePloegen) self.TNIndex = 0 self.updateRonde() def eventFilter(self, obj, event): if event.type() == QtCore.QEvent.FocusIn: if obj == self.schiftingTxt: self.schiftingfocus = True self.schiftingTxt.setFocusPolicy(QtCore.Qt.StrongFocus) elif not obj == self: self.setFocus() elif event.type() == QtCore.QEvent.FocusOut: if obj == self.schiftingTxt: self.schiftingfocus = False self.setFocus() return False def closeEvent(self, event): if not self.saveScore(): msg = QtWidgets.QMessageBox() msg.setText( "Deze laatste score is niet geldig en werd niet opgeslagen!") msg.setWindowTitle("Opgelet") msg.exec() event.accept() def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: if event.key() == QtCore.Qt.Key_Escape: self.close() elif event.key() == QtCore.Qt.Key_Return or event.key( ) == QtCore.Qt.Key_Enter: if not self.schiftingfocus and len(self.shortcut) > 1: self.qrGo() else: self.setFocus() self.shortcut = '' elif event.key() == QtCore.Qt.Key_Left: self.previousTafel() elif event.key() == QtCore.Qt.Key_Right: self.nextTafel() elif event.key() == QtCore.Qt.Key_Down: a = self.rondeBox.currentIndex() if a < len(self.comborondes) - 1: self.rondeBox.setCurrentIndex(a + 1) elif event.key() == QtCore.Qt.Key_Up: a = self.rondeBox.currentIndex() if a > 0: self.rondeBox.setCurrentIndex(a - 1) else: if event.text().isdigit() or event.text() == '_': self.shortcut = self.shortcut + event.text() event.accept() else: event.ignore() def fillComboBox(self): self.rondeBox.addItem('0_Schifting&Bonus') self.comborondes = [] self.comborondes.append(0) for ronde in self.SH.getUserRondes(): self.rondeBox.addItem(ronde) a = ronde.split('_') self.comborondes.append(int(a[0])) self.rondeBox.setCurrentIndex(0) self.ronde = 0 def nextTafel(self): if self.saveScore(): if self.TNIndex < self.AantalPloegen - 1: self.TNIndex = self.TNIndex + 1 self.updatePloeg() else: self.msgBox('Laatste ploeg', 'Dit is de laatste aanwezige ploeg') def previousTafel(self): if self.saveScore(): if self.TNIndex > 0: self.TNIndex = self.TNIndex - 1 self.updatePloeg() else: self.msgBox('Eerste ploeg', 'Dit is de eerste aanwezige ploeg') def qrGo(self): if self.saveScore(): try: ronde, tafelnummer = map(int, self.shortcut.split('_')) try: self.rondeBox.setCurrentIndex( self.comborondes.index(ronde)) self.updateRonde() try: self.TNIndex = self.AanwezigePloegen.index(tafelnummer) self.updatePloeg() except: self.msgBox('Error', 'Deze ploeg is niet aanwezig') except: self.msgBox('Error', 'Deze ronde werd nog niet ingegeven') except: self.msgBox('Error', 'Geen geldige QR-code') self.qrcodeText.setText('') def nieuweRondeBox(self): if self.saveScore(): self.updateRonde() self.setFocus() def updateRonde(self): dictronde = self.RH.getRondeInfoDict( self.comborondes[self.rondeBox.currentIndex()]) if dictronde == '': self.ronde = 0 if self.RH.numberBonusRondes() > 0: self.NOQ = 2 else: self.NOQ = 1 else: self.ronde = int(dictronde['RN']) self.NOQ = int(dictronde['Aantal']) * ( 1 + 2 * int(dictronde['Super']) ) #wordt enkel gebruikt indien er geen self.score beschikbaar is dus belangrijk voor superronde indien geen scan beschikbaar self.updatePloeg() def updatePloeg(self): self.Tafelnummer = int(self.AanwezigePloegen[self.TNIndex]) self.tafelnummerTxt.setText(str(self.Tafelnummer)) if self.ronde > 0: self.score = self.SH.getScore(self.ronde, self.Tafelnummer) if not len(self.score) > 0: self.score = [0] * self.NOQ else: self.score = self.PH.getSchiftingBonus(self.Tafelnummer) self.filename = self.imageDir + '{}_{}.jpg'.format( self.ronde, self.Tafelnummer) self.updateLayout() def saveScore(self): nieuwescore = [] update = True if self.ronde > 0: for box in self.checkboxes: nieuwescore.append(int(box.isChecked())) if self.RH.isSuperRonde(self.ronde): for i in range(int(len(nieuwescore) / 3)): if sum(nieuwescore[i * 3:i * 3 + 3]) > 1: text = 'Geen geldige invoer voor een superronde: vraag {}'.format( i + 1) update = False else: nieuwescore.append(self.schiftingTxt.text()) try: float(nieuwescore[0]) except: text = 'Geen geldige schiftingsvraag!' update = False if len(self.checkboxes) > 0 and self.RH.numberBonusRondes() > 0: aantal = 0 bonus = 0 for i, box in enumerate(self.checkboxes): if box.isChecked(): aantal = aantal + 1 bonus = i + 1 nieuwescore.append(bonus) if not aantal == 1: text = 'Geen geldig bonusthema!' update = False if update: if not list(map(str, nieuwescore)) == list(map(str, self.score)): self.SH.setScore(self.ronde, self.Tafelnummer, nieuwescore) else: if self.beschikbaar or not list(map(str, nieuwescore)) == list( map(str, self.score)): self.msgBox('Ongeldige score', text) else: return True return update def setImageLbl(self): try: pixmap = QtGui.QPixmap(self.filename) if not pixmap.isNull(): pixmap = pixmap.scaled(self.imagesLbl.width(), self.imagesLbl.height(), QtCore.Qt.KeepAspectRatio) self.imagesLbl.setPixmap(pixmap) self.bescikbaar = True else: text = "Geen scan beschikbaar" font = QtGui.QFont("Arial", 20) metrics = QtGui.QFontMetricsF(font) rect = metrics.boundingRect(text) width = self.imagesLbl.width() heigth = self.imagesLbl.height() pos = QtCore.QPointF((width - rect.width()) / 2, (heigth - rect.height()) / 2) pixmap = QtGui.QPixmap(width, heigth) pixmap.fill(QtCore.Qt.white) painter = QtGui.QPainter() painter.begin(pixmap) painter.setPen(QtCore.Qt.black) painter.setFont(font) painter.drawText(pos, text) painter.end() self.imagesLbl.setPixmap(pixmap) self.beschikbaar = False self.imagesLbl.setAlignment(QtCore.Qt.AlignCenter) except: raise pass def updateBoxes(self): if self.ronde > 0: for i, box in enumerate(self.checkboxes): box.setChecked(int(self.score[i])) else: self.schiftingTxt.setText(str(self.score[0])) if self.NOQ == 2: bonusthema = int(self.score[1]) for i, box in enumerate(self.checkboxes): box.setChecked(i + 1 == bonusthema) def updateLayout(self): if not self.ronde == self.currentRondeSettings: #updatelayout self.checkboxes = [] self.NOQ = len(self.score) try: self.superronde = self.RH.isSuperRonde(self.ronde) except: self.superronde = 0 pass for box in self.checkboxes: box.hide() box.setChecked(0) self.hideQLayout(self.schiftingsvraag) if self.superronde == 1: index = 0 for i in range(self.basicScores.count()): box1 = self.basicScores.itemAt(i).widget() box2 = self.superronde2.itemAt(i).widget() box3 = self.superronde3.itemAt(i).widget() if i < self.NOQ / 3: box1.setText('{}a.'.format(i + 1)) box2.setText('{}b.'.format(i + 1)) box3.setText('{}c.'.format(i + 1)) self.checkboxes.append(box1) self.checkboxes.append(box2) self.checkboxes.append(box3) box1.show() box2.show() box3.show() else: box1.hide() box2.hide() box3.hide() else: self.hideQLayout(self.superronde2) self.hideQLayout(self.superronde3) if self.NOQ < 3: self.showQLayout(self.schiftingsvraag) if self.NOQ == 2: aantalThemas = 9 boxes = (self.basicScores.itemAt(i).widget() for i in range(self.basicScores.count())) for i, box in enumerate(boxes): if i < aantalThemas: box.setText('{}.'.format(i + 1)) self.checkboxes.append(box) box.show() else: box.hide() self.hideQLayout(self.basicScores) self.schiftingTxt.setText(str(self.score[0])) else: boxes = (self.basicScores.itemAt(i).widget() for i in range(self.basicScores.count())) for i, box in enumerate(boxes): if i < self.NOQ: box.setText('{}.'.format(i + 1)) self.checkboxes.append(box) box.show() else: box.hide() self.currentRondeSettings = self.ronde self.updateBoxes() #check or uncheck self.setImageLbl() def hideQLayout(self, layout): items = (layout.itemAt(i).widget() for i in range(layout.count())) for i, item in enumerate(items): try: item.hide() except: pass def showQLayout(self, layout): items = (layout.itemAt(i).widget() for i in range(layout.count())) for i, item in enumerate(items): try: item.show() except: pass def msgBox(self, titel, tekst): msg = QtWidgets.QMessageBox() msg.setText(tekst) msg.setWindowTitle(titel) msg.exec() def allChecked(self, doeiets): #sluit deze GUI af en verwerk SCANCONTROL msg = QtWidgets.QMessageBox() msg.setText("Alle beschikbare scans zijn gecontroleerd!") msg.setWindowTitle("Klaar!") msg.exec() if doeiets: self.SH.fromScannerToUser() self.close()
class AdminUI(QtWidgets.QDialog): def __init__(self, parent=None): super(AdminUI, self).__init__(parent) uic.loadUi('code/ui/Admin.ui', self) self.setup() self.show() def setup(self): from inschrijving_handler import Class_Inschrijvingen from ronde_handler import Class_Rondes from score_handler import Class_Scores from email_handler import Class_Emails self.EH = Class_Emails() self.PH = Class_Inschrijvingen() self.RH = Class_Rondes() self.SH = Class_Scores() self.fillComboBoxes() self.fillInfoFields() self.updateOverzicht() self.origineelPBox.currentIndexChanged.connect(self.fillInfoFields) self.origineelRBox.currentIndexChanged.connect(self.fillInfoFields) self.origineelWachtlijstPBox.currentIndexChanged.connect( self.fillInfoFields) self.rondeloting1.currentIndexChanged.connect(self.fillAntwoorden1) self.rondeloting2.currentIndexChanged.connect(self.fillAntwoorden2) self.rondeloting3.currentIndexChanged.connect(self.fillAntwoorden3) self.juistloting1.setChecked(1) self.juistloting2.setChecked(1) self.juistloting3.setChecked(1) self.lotingGenereer.clicked.connect(self.maakLoting) self.lotingZenden.clicked.connect(self.maakAndSendLoting) self.PAanpassenBtn.clicked.connect(self.updatePloeg) self.UitschrijvenBtn.clicked.connect(self.verwijderPloeg) self.updatenPBtn.clicked.connect(self.updateAllPloegen) self.betalingMailBtn.clicked.connect(self.sendBetalingEmailPloeg) self.RNieuwBtn.clicked.connect(self.nieuweRonde) self.RAanpassenBtn.clicked.connect(self.updateRonde) self.verwijderRBtn.clicked.connect(self.verwijderRonde) self.BevestigDeelnameButton.clicked.connect(self.verplaatsPloeg) self.VraagDeelnameBtn.clicked.connect(self.uitnodigenPloeg) self.RAanmeldenBtn.clicked.connect(self.resetAanmelden) self.RPloegenBtn.clicked.connect(self.resetPloegen) self.RRondesBtn.clicked.connect(self.resetRondes) self.RAllBtn.clicked.connect(self.totalReset) self.BetalingBtn.clicked.connect(self.betalingToevoegen) self.BetalingQRBtn.clicked.connect(self.emailBetalingQR) self.QRBtn.clicked.connect(self.emailQRLastDay) self.BetalingReminderBrn.clicked.connect(self.emailBetalingReminder) self.EindstandBtn.clicked.connect(self.emailEindstand) self.Uitnodiging2Btn.clicked.connect(self.emailUitnodigingReminder) self.UitnodigingBtn.clicked.connect(self.emailUitnodiging) self.updateOverzichtBtn.clicked.connect(self.saveOverzicht) self.uploadOnlineBtn.clicked.connect(self.uploadLive) def uploadLive(self): if self.questionBox( 'Zeker?', 'Zeker dat je de (voorlopige) tussenstand online wil zwieren zodat iedereen hem kan zien?' ): self.SH.uploadScorebordPublic() def fillComboBoxes(self): self.origineelPBox.clear() self.tafelnummerBox.clear() self.rondeNummerBox.clear() self.origineelRBox.clear() self.rondeloting1.clear() self.rondeloting2.clear() self.rondeloting3.clear() self.antwoordloting1.clear() self.antwoordloting2.clear() self.antwoordloting3.clear() self.origineelWachtlijstPBox.clear() for index, ploegnaam in enumerate(self.PH.getPloegNamen()): self.origineelPBox.addItem(ploegnaam) self.tafelnummerBox.addItem(str(index + 1) + ': ' + ploegnaam) for index, ploegnaam in enumerate(self.PH.getPloegNamenWachtlijst()): self.origineelWachtlijstPBox.addItem(ploegnaam) for index, rondenaam in enumerate(self.RH.getRondeNames()): self.origineelRBox.addItem(rondenaam) self.rondeloting1.addItem(rondenaam) self.rondeloting2.addItem(rondenaam) self.rondeloting3.addItem(rondenaam) self.rondeNummerBox.addItem(str(index + 1) + ': ' + rondenaam) self.origineelPBox.setCurrentIndex(-1) self.rondeloting1.setCurrentIndex(-1) self.rondeloting2.setCurrentIndex(-1) self.rondeloting3.setCurrentIndex(-1) self.tafelnummerBox.setCurrentIndex(-1) self.origineelRBox.setCurrentIndex(-1) self.rondeNummerBox.setCurrentIndex(-1) self.origineelWachtlijstPBox.setCurrentIndex(-1) def fillInfoFields(self): Pindex = self.origineelPBox.currentIndex() Ptext = self.origineelPBox.currentText() Rindex = self.origineelRBox.currentIndex() Rtext = self.origineelRBox.currentText() Wtext = self.origineelWachtlijstPBox.currentText() Windex = self.origineelWachtlijstPBox.currentIndex() if Rindex > -1 and len(Rtext) > 1: info = self.RH.getRondeInfo(Rtext) self.RondenaamTxt.setText(info[1]) self.AfkortingTxt.setText(info[2]) self.superCheck.setChecked(int(info[4])) self.bonusCheck.setChecked(int(info[5])) self.NOQBOX.setValue(int(info[3])) self.rondeNummerBox.setCurrentIndex(Rindex) else: self.RondenaamTxt.setText('') self.AfkortingTxt.setText('') self.superCheck.setChecked(int(0)) self.bonusCheck.setChecked(int(0)) self.NOQBOX.setValue(int('0')) if Pindex > -1 and len(Ptext) > 1: info = self.PH.getPloegInfo(Ptext) self.PloegnaamTxt.setText(info[2]) self.VoornaamTxt.setText(info[3]) self.AchternaamTxt.setText(info[4]) self.EmailTxt.setText(info[5]) self.tafelnummerBox.setCurrentIndex(Pindex) else: self.PloegnaamTxt.setText('') self.VoornaamTxt.setText('') self.AchternaamTxt.setText('') self.EmailTxt.setText('') if Windex > -1 and len(Wtext) > 1: info = self.PH.getPloegInfoWachtlijst(Wtext) self.PloegTxt.setText(info[1]) self.VoornmTxt.setText(info[2]) self.AchternmTxt.setText(info[3]) self.MailTxt.setText(info[4]) else: self.PloegTxt.setText('') self.VoornmTxt.setText('') self.AchternmTxt.setText('') self.MailTxt.setText('') def fillAntwoorden1(self): self.antwoordloting1.clear() if self.rondeloting1.currentIndex() >= 0: antwoorden = self.RH.getAntwoorden( self.rondeloting1.currentIndex()) for i in range(1, len(antwoorden)): self.antwoordloting1.addItem(antwoorden[i]) def fillAntwoorden2(self): self.antwoordloting2.clear() if self.rondeloting2.currentIndex() >= 0: antwoorden = self.RH.getAntwoorden( self.rondeloting2.currentIndex()) for i in range(1, len(antwoorden)): self.antwoordloting2.addItem(antwoorden[i]) def fillAntwoorden3(self): self.antwoordloting3.clear() if self.rondeloting3.currentIndex() >= 0: antwoorden = self.RH.getAntwoorden( self.rondeloting3.currentIndex()) for i in range(1, len(antwoorden)): self.antwoordloting3.addItem(antwoorden[i]) def emailUitnodiging(self): if self.questionBox( 'Zeker?', 'Zeker dat je al de uitnodigingen wil versturen. Kijk zeker na in email_handler wat de volgorde is van belangrijkheid van quiz!' ): answer, ok = QtWidgets.QInputDialog.getInt( self, 'Start index', 'Wat is de laatst verzonden index?') if ok: self.EH.sendUitnodigingen(int(answer)) def emailUitnodigingReminder(self): if self.questionBox( 'Zeker?', 'Zeker dat je herinneringen wil versturen? Kijk zeker na in email_handler wat de volgorde is van belangrijkheid van quiz, normaal naar de laatste 2 edities van deze en de meest recente quiz' ): answer, ok = QtWidgets.QInputDialog.getInt( self, 'Start index', 'Wat is de laatst verzonden index?') if ok: self.EH.sendUitnodigingenReminder(int(answer)) def emailBetalingQR(self): if self.questionBox( 'Zeker?', 'Zeker dat je vraag tot betaling wil versturen naar iedereen? Kijk zeker na in email_handler wat het onderwerp is van de mail' ): a = 1 for ploeginfo in self.PH.getPloegenDict(): self.EH.sendBetalingQR(ploeginfo) a = a + 1 def emailBetalingReminder(self): if self.questionBox( 'Zeker?', 'Zeker dat je de betalingsreminder wil versturen naar iedereen die nog niet betaald heeft? Kijk zeker na in email_handler wat het onderwerp is van de mail' ): for ploeginfo in self.PH.getPloegenDict(): if not bool(int(ploeginfo['Betaald'])): self.EH.sendBetalingReminder(ploeginfo) def emailQRLastDay(self): if self.questionBox( 'Zeker?', 'Zeker dat je echt de laatste info wil versturen naar iedereen? Kijk zeker na in email_handler wat het onderwerp is van de mail' ): for ploeginfo in self.PH.getPloegenDict(): self.EH.sendWrapUp(ploeginfo) def emailEindstand(self): if self.questionBox( 'Zeker?', 'Zeker dat je de eindstand wil versturen naar iedereen? Kijk zeker na in email_handler wat het onderwerp is van de mail' ): self.EH.sendEindstand() def betalingToevoegen(self): dialog = QtWidgets.QFileDialog() dialog.setViewMode(QtWidgets.QFileDialog.Detail) if (dialog.exec()): filenames = dialog.selectedFiles() self.PH.setBetalingen(filenames[0]) def resetAanmelden(self): if self.questionBox( 'Zeker?', 'Zeker dat je al de aanmeldingen, en dus ook de scores, wilt resetten?' ): self.PH.resetAlleAanmeldingen() self.SH.clearScoresDir() self.SH.clearImagesDir() def resetPloegen(self): if self.questionBox( 'Zeker?', 'Zeker dat je al de aanmeldingen, en dus ook de scores, wilt verwijderen?' ): self.PH.verwijderAllePloegen() self.SH.clearScoresDir() self.SH.clearImagesDir() self.fillComboBoxes() def resetRondes(self): if self.questionBox('Zeker?', 'Zeker dat je al de rondes wilt verwijderen?'): self.RH.verwijderAlleRondes() self.SH.clearScoresDir() self.SH.clearImagesDir() self.fillComboBoxes() def totalReset(self): if self.questionBox( 'Zeker?', 'Zeker dat je alles van deze quiz wil verwijderen?'): self.RH.verwijderAlleRondes() self.PH.verwijderAllePloegen() self.SH.clearScoresDir() self.SH.clearImagesDir() self.fillComboBoxes() def nieuweRonde(self): index1 = self.origineelRBox.currentIndex() index2 = self.rondeNummerBox.currentIndex() Ronde1 = self.origineelRBox.currentText() rondeInfo = self.getRondeSettings() self.RH.nieuweRonde(rondeInfo) if not index1 == index2 and index2 > -1: if self.questionBox( 'Ronde invoegen?', 'Zeker dat je {} als ronde {} wilt plaatsen?'.format( rondeInfo[0], index2 + 1)): self.RH.insertRondeBefore(rondeInfo[0], index2 + 1) self.fillComboBoxes() def updateRonde(self): index1 = self.origineelRBox.currentIndex() index2 = self.rondeNummerBox.currentIndex() Ronde1 = self.origineelRBox.currentText() rondeInfo = self.getRondeSettings() self.RH.updateRondeInfo(Ronde1, rondeInfo) if not index1 == index2 and index2 > -1: if self.questionBox( 'Ronde invoegen?', 'Zeker dat je {} als ronde {} wilt plaatsen?'.format( rondeInfo[0], index2 + 1)): self.RH.insertRondeBefore(rondeInfo[0], index2 + 1) self.fillComboBoxes() def getRondeSettings(self): rondeInfo = [] rondeInfo.append(self.RondenaamTxt.text()) rondeInfo.append(self.AfkortingTxt.text()) rondeInfo.append(self.NOQBOX.value()) rondeInfo.append(int(self.superCheck.isChecked())) rondeInfo.append(int(self.bonusCheck.isChecked())) return rondeInfo def verwijderRonde(self): index1 = self.origineelRBox.currentIndex() Ronde1 = self.origineelRBox.currentText() self.RH.verwijderRonde(Ronde1) def updatePloeg(self): index1 = self.origineelPBox.currentIndex() index2 = self.tafelnummerBox.currentIndex() ploeg1 = self.origineelPBox.currentText() ploegInfo = [] ploegInfo.append(self.PloegnaamTxt.text()) ploegInfo.append(self.VoornaamTxt.text()) ploegInfo.append(self.AchternaamTxt.text()) ploegInfo.append(self.EmailTxt.text()) self.PH.updatePloegInfo(ploeg1, ploegInfo) if not index1 == index2 and index2 > -1: if self.questionBox( 'Tafelnummers wisselen?', 'Zeker dat je {} wilt wisselen met tafelnummer {} wilt wisselen?' .format(ploeg1, index2 + 1)): self.PH.wisselTafelnummers(ploeg1, index2 + 1) self.fillComboBoxes() def verwijderPloeg(self): Pindex = self.origineelPBox.currentIndex() Ptext = self.origineelPBox.currentText() if Pindex > -1 and len(Ptext) > 1: if self.questionBox( 'Ploeg verwijderen?', 'Zeker dat je {} wilt uitschrijven?'.format(Ptext)): self.PH.verwijderPloeg(Ptext) self.fillComboBoxes() def sendBetalingEmailPloeg(self): Ptext = self.origineelPBox.currentText() info = self.PH.getPloegInfo(Ptext) if self.questionBox( 'Zeker?', 'Zeker dat je de betaling wil versturen naar deze ploeg? Kijk zeker na in email_handler wat het onderwerp is van de mail' ): self.EH.sendBetalingQRSimpel(info) def verplaatsPloeg(self): info = self.PH.getPloegInfoWachtlijst( self.origineelWachtlijstPBox.currentText()) self.PH.ploegToevoegenWachtlijst(info) self.fillComboBoxes() if self.questionBox('Zeker?', 'Wil je ook een inschrijivngsmail versturen?'): self.EH.bevestigingInschrijving( [info[1], info[2], info[3], info[4]]) def uitnodigenPloeg(self): info = self.PH.getPloegInfoWachtlijst( self.origineelWachtlijstPBox.currentText()) self.EH.sendWachtlijstUitnogiding(info) def updateAllPloegen(self): self.PH.updatePloegGeneral() self.PH.autoUpdate() #self.PH.sorteerPloegGeneral() print( 'DEBUG mode: Ploeg General is niet gesorteerd om overzicht te behouden, enkel uncomment na de quiz best' ) def updateOverzicht(self): aantalAangemeld, aantalHuidigeInschrijvingen, aantalInschrijvingen, aantalBetaald = self.PH.aantalPloegen( ) bedrag = self.PH.getBetalingen() self.actieveTxt.setText(str(aantalHuidigeInschrijvingen)) self.totaalTxt.setText(str(aantalInschrijvingen)) self.betaaldTxt.setText(str(aantalBetaald)) self.bedragTxt.setText('€' + str(bedrag)) self.geenEmailTxt.setText(str(self.PH.aantalZonder())) try: config = configparser.ConfigParser() config.read('settings.ini') self.tresholdTxt.setText(config.get('COMMON', 'TRESHOLD')) self.percentageTxt.setText(config.get('COMMON', 'BOXPERCENT')) self.moeilijkTxt.setText(config.get('COMMON', 'MOEILIJKTRESHOLD')) except Exception as error_msg: print("Error while trying to read Settings.") print({"Error": str(error_msg)}) def saveOverzicht(self): filename = 'settings.ini' parser = configparser.ConfigParser() parser.read(filename) parser.set('COMMON', 'TRESHOLD', self.tresholdTxt.text()) parser.set('COMMON', 'BOXPERCENT', self.percentageTxt.text()) parser.set('COMMON', 'MOEILIJKTRESHOLD', self.moeilijkTxt.text()) with open(filename, 'w') as configfile: parser.write(configfile) def msgBox(self, text, titel): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setText(text) msg.setWindowTitle(titel) msg.exec() def questionBox(self, titel, message): qm = QtWidgets.QMessageBox() answer = qm.question(QtWidgets.QDialog(), titel, message, qm.Yes | qm.No) if answer == qm.Yes: return True return False def maakAndSendLoting(self): self.maakLoting() self.EH.sendLoting() def maakLoting(self): juistloting1 = [] juistloting2 = [] juistloting3 = [] ploegnamen = self.PH.getPloegNamen() RN1 = self.rondeloting1.currentIndex() + 1 VN1 = self.antwoordloting1.currentIndex() + 1 RN2 = self.rondeloting2.currentIndex() + 1 VN2 = self.antwoordloting2.currentIndex() + 1 RN3 = self.rondeloting3.currentIndex() + 1 VN3 = self.antwoordloting3.currentIndex() + 1 for i, ploeg in enumerate(ploegnamen): if self.PH.isAanwezig(i + 1): score1 = self.SH.getScore(RN1, i + 1) score2 = self.SH.getScore(RN2, i + 1) score3 = self.SH.getScore(RN3, i + 1) if int(score1[VN1 - 1]) == int(self.juistloting1.isChecked()): juistloting1.append(ploeg) if int(score2[VN2 - 1]) == int(self.juistloting2.isChecked()): juistloting2.append(ploeg) if int(score3[VN2 - 1]) == int(self.juistloting3.isChecked()): juistloting3.append(ploeg) else: i = i - 1 answers = [] answers.append(self.antwoordloting1.currentText()) answers.append(self.antwoordloting2.currentText()) answers.append(self.antwoordloting3.currentText()) self.EH.saveLoting(answers, juistloting1, juistloting2, juistloting3)
class Inschrijving(QtWidgets.QDialog): def __init__(self, parent=None): super(Inschrijving, self).__init__(parent) uic.loadUi('code/ui/NieuwePloeg.ui', self) self.setWindowTitle('Nieuwe Ploeg') self.show() from inschrijving_handler import Class_Inschrijvingen from email_handler import Class_Emails self.EH = Class_Emails() self.PH = Class_Inschrijvingen() self.InschrijvenBtn.clicked.connect(self.inschrijving) def keyPressEvent(self, event): if type(event)==QtGui.QKeyEvent: # print ("type(event) = ",type(event), 'Event Key=', event.key()) if event.key()==QtCore.Qt.Key_Return or event.key()==QtCore.Qt.Key_Enter: self.inschrijving() elif event.key()==QtCore.Qt.Key_Escape: self.close() event.accept() else: event.ignore() def inschrijving(self): ploegnaam = self.PloegnaamTxt.toPlainText() voornaam = self.VoornaamTxt.toPlainText() achternaam = self.AchternaamTxt.toPlainText() email = self.EmailTxt.toPlainText() subscription = [ploegnaam, voornaam, achternaam, email] try: self.PH.nieuwePloeg(subscription) if '@' in email: qm = QtWidgets.QMessageBox() answer = qm.question(QtWidgets.QDialog(), 'Email verzenden?', 'Bevestigingsmail verzenden naar {}'.format(email), qm.Yes | qm.No) if answer == qm.Yes: self.EH.bevestigingInschrijving(subscription) self.PloegnaamTxt.setText('') self.VoornaamTxt.setText('') self.AchternaamTxt.setText('') self.EmailTxt.setText('') except NameError: qm = QtWidgets.QMessageBox() answer = qm.question(QtWidgets.QDialog(), 'Email verzenden?', 'De quiz is momenteel volzet en de ploeg werd toevoegd aan de wachtlijst. Standaard wachtlijst email sturen naar {}'.format(email), qm.Yes | qm.No) if answer == qm.Yes: aantalAangemeld, aantalHuidigeInschrijvingen, aantalInschrijvingen, aantalBetaald = self.PH.aantalPloegen() self.EH.wachtlijst(subscription,aantalInschrijvingen) self.PloegnaamTxt.setText('') self.VoornaamTxt.setText('') self.AchternaamTxt.setText('') self.EmailTxt.setText('') except ValueError as e: msg = QtWidgets.QMessageBox() print(e) msg.setIcon(QtWidgets.QMessageBox.Warning) msg.setText("Deze ploegnaam is al ingebruikt, inschrijving dus niet verwerkt!") msg.setWindowTitle("Geen geldige ploegnaam!") msg.exec() self.PloegnaamTxt.setFocus()
def readSettings(): global NOQ global SUPERRONDE global RONDESETTINGS global ANSWERSHEET global BOX_SIZE global BOX_OFFSETY global BOX_SPACINGY global BOX_OFFSETX global BOX_SPACINGX global WIDTH global HEIGTH global BOX_OFFSETYBONUS global BOX_SPACINGYBONUS global BOX_OFFSETXBONUS global BOX_OFFSETXMISTAKE global BOX_OFFSETYMISTAKE global HR global HP global EMPTYSCANRAW EMPTYSCANRAW = True NOQ = 0 SUPERRONDE = 0 RONDESETTINGS = 99 ANSWERSHEET = 99 BOX_SIZE = 0 BOX_OFFSETY = 0 BOX_OFFSETX = 0 BOX_SPACINGY = 0 BOX_SPACINGX = 0 BOX_OFFSETYBONUS = 0 BOX_OFFSETXBONUS = 0 BOX_SPACINGYBONUS = 0 BOX_OFFSETYMISTAKE = 0 BOX_OFFSETXMISTAKE = 0 WIDTH = 0 HEIGTH = 0 HR = Class_Rondes() HP = Class_Inschrijvingen() try: config = configparser.ConfigParser() config.read('settings.ini') global RONDEINFO global BOXPERCENT global DEFAULT_OUTPUTDIR global DEFAULT_INPUTDIR global SCANRAW global JPGPREFIX global PROCESSEDDIR global OUTPUTIMAGES global MARKED_TRESHOLD global SHEETINFO global UPSIZING global QUIZFOLDER global SCHIFTINGDIGITS QUIZFOLDER = config.get('PATHS', 'QUIZFOLDER') BOXPERCENT = float(config.get('COMMON', 'BOXPERCENT')) SCHIFTINGDIGITS = int(config.get('COMMON', 'SCHIFTINGDIGITS')) SCANRAW = config.get("COMMON","SCANRAW") DEFAULT_OUTPUTDIR = QUIZFOLDER + config.get("PATHS", "RONDEFILES") OUTPUTIMAGES = QUIZFOLDER + config.get('PATHS', 'OUTPUTIMAGES') DEFAULT_INPUTDIR = config.get("PATHS", "FTP") JPGPREFIX = config.get('COMMON', 'JPGPREFIX') PROCESSEDDIR = config.get("PATHS", "PROCESSEDFILES") MARKED_TRESHOLD = float(config.get('COMMON', 'TRESHOLD')) SHEETINFO = QUIZFOLDER + config.get('PATHS', 'SHEETINFO') UPSIZING = int(config.get('COMMON', 'UPSIZE')) except Exception as error_msg: print("Error while trying to read Settings.") print({"Error" : str(error_msg)})
class Class_Emails(): def __init__(self): read_Settings() from email_sender import Class_EmailSender from inschrijving_handler import Class_Inschrijvingen from score_handler import Class_Scores from ronde_handler import Class_Rondes self.EH = Class_EmailSender() self.PH = Class_Inschrijvingen() self.RH = Class_Rondes() self.SH = Class_Scores() def bevestigingInschrijving(self, ploeginfo): template = open(EMAILINSCHRIJVING).read() text = template.format(VOORNAAM = ploeginfo[1], PLOEGNAAM = ploeginfo[0]) to_email = ploeginfo[3].replace('\n', '').replace(' ', '') self.EH.send_HTML_Mail(to_email, 'Bevestiging Inschrijving ' + TITEL, text) def wachtlijst(self, ploeginfo, nummer): template = open(EMAILWACHTLIJST).read() text = template.format(VOORNAAM = ploeginfo[1], PLOEGNAAM = ploeginfo[0], NUMMERWACHTLIJST = str(nummer-MAXIMAALDEELNEMERS)) to_email = ploeginfo[3].replace('\n', '').replace(' ', '') self.EH.send_HTML_Mail(to_email, 'Inschrijving ' + TITEL + ': wachtlijst + misschien zaterdag?', text) def sendBetalingQR(self, ploeginfo): ploegnaam = ploeginfo['Ploegnaam'] mededeling = ploeginfo['Mededeling'] email = ploeginfo['Email'] onderwerp = 'Betaling ' + TITEL filename = 'Betaling_{}.png'.format(ploegnaam.replace('ë', 'e').replace('é','e').replace('ç','c')) betalingqr = 'BCD\n001\n1\nSCT\nKREDBEBB\nTimTquiz\nBE15735054557030\nEUR' + BEDRAGOVERSCHRIJVEN + '\n\n{}'.format(mededeling) pyqrcode.create(betalingqr, error='L', version=4).png(QRCODES + filename, scale=10, quiet_zone = 4) qrcode = self.makePDFfromPNG(QRCODES+filename) template = open(EMAILBETALINGSVRAAG).read() tekst = template.format(VOORNAAM = ploeginfo['Voornaam'], PLOEGNAAM = ploegnaam, MEDEDELING = mededeling, INSCHRIJVINGSGELD = INSCHRIJVINGSGELD, DRANKKAART = DRANKKAART , REKENINGNUMMER = REKENINGNUMMER) self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, qrcode, filename.replace('.png', '.pdf')) print(email) time.sleep(1) def sendBetalingQRSimpel(self, ploeginfo): ploegnaam = ploeginfo[2] mededeling = ploeginfo[11] email = ploeginfo[5] onderwerp = 'Betaling ' + TITEL filename = 'Betaling_{}.png'.format(ploegnaam.replace('ë', 'e').replace('é','e').replace('ç','c')) betalingqr = 'BCD\n001\n1\nSCT\nKREDBEBB\nTimTQuiz\nBE15735054557030\nEUR' + BEDRAGOVERSCHRIJVEN + '\n\n{}'.format(mededeling) pyqrcode.create(betalingqr, error='M', version=6).png(QRCODES + filename, scale=10, quiet_zone = 4) qrcode = self.makePDFfromPNG(QRCODES+filename) template = open(EMAILBETALINGSVRAAG).read() tekst = template.format(VOORNAAM = ploeginfo[3], PLOEGNAAM = ploegnaam, MEDEDELING = mededeling, INSCHRIJVINGSGELD = INSCHRIJVINGSGELD, DRANKKAART = DRANKKAART , REKENINGNUMMER = REKENINGNUMMER) self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, qrcode, filename.replace('.png', '.pdf')) print(email) def sendBetalingReminder(self, ploeginfo): ploegnaam = ploeginfo['Ploegnaam'] mededeling = ploeginfo['Mededeling'] email = ploeginfo['Email'] onderwerp = 'Herinnering betaling ' + TITEL filename = 'Betaling_{}.png'.format(ploegnaam.replace('ë', 'e').replace('é','e').replace('ç','c')) betalingqr = 'BCD\n001\n1\nSCT\nKREDBEBB\nTimTQuiz\nBE15735054557030\nEUR' + BEDRAGOVERSCHRIJVEN + '\n\n{}'.format(mededeling) pyqrcode.create(betalingqr, error='M', version=6).png(QRCODES + filename, scale=10, quiet_zone = 4) qrcode = self.makePDFfromPNG(QRCODES+filename) template = open(EMAILBETALINGSHERINNERING).read() tekst = template.format(VOORNAAM = ploeginfo['Voornaam'], PLOEGNAAM = ploegnaam, MEDEDELING = mededeling, INSCHRIJVINGSGELD = INSCHRIJVINGSGELD, DRANKKAART = DRANKKAART , REKENINGNUMMER = REKENINGNUMMER ) self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, qrcode, filename.replace('.png', '.pdf')) print(email) def sendWachtlijstUitnogiding(self, ploeginfo): ploegnaam = ploeginfo[1] email = ploeginfo[4] onderwerp = 'Plaats vrijgekomen ' + TITEL template = open(EMAILVRIJEPLAATS).read() tekst = template.format(VOORNAAM = ploeginfo[2], PLOEGNAAM = ploegnaam ) self.EH.send_HTML_Mail(email, onderwerp, tekst) print(email) def sendWrapUp(self, ploeginfo): ploegnaam = ploeginfo['Ploegnaam'] email = ploeginfo['Email'] onderwerp = 'Laatste informatie ' + TITEL filename = 'NeemMijMee_{}.png'.format(ploegnaam.replace('ë', 'e').replace('é','e').replace('ç','c')) pyqrcode.create(ploegnaam, error='M', version=5).png(QRCODES + filename, scale=10, quiet_zone = 4) qrcode = self.makePDFfromPNG(QRCODES+filename) if bool(int(ploeginfo['Betaald'])): mededeling = 'We hebben uw betaling van €{} goed ontvangen'.format(ploeginfo['Bedrag']) else: mededeling = 'We hebben nog geen overschrijving ontvangen van jullie. Geen probleem, maar hou dan alvast €' + INSCHRIJVINGSGELD + ' klaar bij het aanmelden. Indien je gisteren, vandaag of komende dagen nog overschrijft (graag), ik verwerk de ochtend van de quiz nog al de betalingen op de rekening!' template = open(EMAILLASTINFO).read() tekst = template.format(VOORNAAM = ploeginfo['Voornaam'], PLOEGNAAM = ploegnaam, BETALINGTEKST = mededeling) self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, qrcode, filename.replace('.png', '.pdf')) print(email) print(onderwerp) print(qrcode) print(filename) def sendUitnodigingen(self, minimum): SCRindex = [] BOWindex = [] Kwistetindex = [] with open(PLOEGGENERAL, 'rt') as fr: reader = csv.reader(fr) header = next(reader) for index, name in enumerate(header): if 'SCR' in name: SCRindex.append(index) elif 'BOW' in name: BOWindex.append(index) elif 'Kwistet' in name: Kwistetindex.append(index) for index, row in enumerate(reader): SCRsum = 0 BOWsum = 0 Kwistetsum = 0 for i in SCRindex: if not row[i] == 'x': SCRsum = SCRsum + int(row[i]) for i in BOWindex: if not row[i] == 'x': BOWsum = BOWsum + int(row[i]) for i in Kwistetindex: if not row[i] == 'x': Kwistetsum = Kwistetsum + int(row[i]) noMail = False ##Dit aanpassen afhankelijk welke quiz het is, de volgorde aanpassen. if not int(row[SCRindex[len(SCRindex)-1]]) == 1 and index>int(minimum) and index<int(minimum)+80: #de quizindex van huidige quiz zetten en maximaal 80 per 'batch' Controleert dat de ingeschrevenen geen mail meer krijgen #nog niet ingeschreven if SCRsum+Kwistetsum+BOWsum>6: template = open(UITNODIGINGFAN).read() genre = "FAN" # Eerste elif moet van huidige quiz zijn! elif SCRsum>0: genre = "SCR" template = open(UITNODIGINGSCR).read() elif Kwistetsum > 0: genre = "Kwistet" template = open(UITNODIGINGKWISTET).read() elif BOWsum>0: genre = "BOW" noMail = True template = open(UITNODIGINGBOW).read() else: #quizliefhebber, ooit ingeschreven maar terug uitgeschreven ook template = open(UITNODIGINGLIEFHEBBER).read() genre = "liefhebber" try: text = template.format(VOORNAAM=row[0]) except KeyError: text = template.format(VOORNAAM=row[0], DEELNAMES = SCRsum+Kwistetsum+BOWsum) pass if noMail: print(index, row[1], genre, 'Hoeft geen mail te ontvangen') else: onderwerp = 'Uitnodiging ' + TITEL + ' ' + GEMEENTE + ' ' + DATUM adres = row[1] self.EH.send_HTML_Mail(adres, onderwerp, text) print(index, adres, genre) time.sleep(5) else: print(index, row[1], 'is al ingeschreven of kreeg al een mail') print('Alles is verstuurd') def sendUitnodigingenReminder(self, minimum): SCRindex = [] BOWindex = [] Kwistetindex = [] with open(PLOEGGENERAL, 'rt') as fr: reader = csv.reader(fr) header = next(reader) for index, name in enumerate(header): if 'SCR' in name: SCRindex.append(index) elif 'BOW' in name: BOWindex.append(index) elif 'Kwistet' in name: Kwistetindex.append(index) for index, row in enumerate(reader): SCRsum = 0 BOWsum = 0 Kwistetsum = 0 for i in SCRindex: if not row[i] == 'x': SCRsum = SCRsum + int(row[i]) for i in BOWindex: if not row[i] == 'x': BOWsum = BOWsum + int(row[i]) for i in Kwistetindex: if not row[i] == 'x': Kwistetsum = Kwistetsum + int(row[i]) ##Dit aanpassen afhankelijk welke quiz het is, de volgorde aanpassen. Dit is voor Kwistet. Stuurt uitnodiging naar Fans, en de laatste 3 huidige en laatste 2 andere quizdeelnemers if not int(row[SCRindex[len(SCRindex)-1]]) == 1 and index>int(minimum) and index<int(minimum)+80: if SCRsum+Kwistetsum+BOWsum>4 or row[SCRindex[len(SCRindex)-2]]=='1' or row[SCRindex[len(SCRindex)-3]]=='1' or row[SCRindex[len(SCRindex)-4]]=='1' or row[Kwistetindex[len(Kwistetindex)-1]]=='1'or row[Kwistetindex[len(Kwistetindex)-2]]=='1': template = open(UITNODIGINGHERINNERING).read() text = template.format(VOORNAAM=row[0]) #onderwerp = 'Herinnering ' + TITEL + ' ' + GEMEENTE + ' ' + DATUM onderwerp = 'Herinnering ' + TITEL + ' ' + GEMEENTE + ' EXTRA EDITIE op zaterdag 07/12/2019' adres = row[1] self.EH.send_HTML_Mail(adres, onderwerp, text) time.sleep(2) print(index, adres) else: print(index, row[1], 'Is niet recent naar een quiz geweest') else: print(index, row[1], 'is al ingeschreven of kreeg al een mail') print('Alles is verstuurd') def sendEindstand(self): aantalDeelnemers,_,_,_ = self.PH.aantalPloegen() for i in range(0, aantalDeelnemers): pos = i+1 eindstandPloeg = self.SH.getFinalScore(pos) ploegnaam = eindstandPloeg['Ploegnaam'] tafelnummer = eindstandPloeg['TN'] email = self.PH.getEmail(ploegnaam) onderwerp = 'Evaluatie ' + TITEL #AANPASSEN naar gelang wat de schiftingsvraag was schifting = str(SCHIFTING) + ' kcal' positie = str(pos) + 'e' bonusTekst = '' if self.RH.numberBonusRondes()>0: bonusTekst = self.generateBonusTekst(ploegnaam) rondescores = self.generateEigenOverzicht(tafelnummer) eindstand = self.generateNabijeOverzicht(pos, aantalDeelnemers, len(bonusTekst)>1) winnaars = self.generateNabijeOverzicht(1,1,len(bonusTekst)>1) template = open(EMAILEINDSTAND).read() tekst = template.format(PLOEGNAAM = ploegnaam, EINDPOSITIE = positie, AANTALDEELNEMERS = aantalDeelnemers, MOEILIJK = MOEILIJKTRESHOLD*100, BONUSTEKST = bonusTekst, SCHIFTINGSANTWOORD = schifting, EIGENOVERZICHT = rondescores, EINDSTANDNABIJ = eindstand, SCOREWINNAARS = winnaars) tmp = EVALUATIE.split('/') filename = tmp[len(tmp)-1] print(pos, email) self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, EVALUATIE, filename) time.sleep(1) def sendTussenstandToTim(self): email = '*****@*****.**' onderwerp = 'Score: Projectie' tekst = 'Goedenavond mezelf, hierbij de tussen- of eindstand. Groetjes van de jury' tmp = SCOREHTMLFULL.split('/') filename2 = tmp[len(tmp)-1] self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, SCOREHTMLFULL, filename2) def generateBonusTekst(self, ploegnaam): with open(BONUSOVERVIEW, 'rt') as fr: reader = csv.DictReader(fr) for row in reader: if row['Ploegnaam'] == ploegnaam: tekst = 'Jullie kozen {} als bonusthema ({}/{})'.format(BONUSTHEMAS[int(row['Origineel'])-1], row['OrigineelScore'], row['Maximum']) if int(row['BesteScore'])>int(row['OrigineelScore']): tekst = tekst + ', dat is niet slecht maar op {} heb je beter gescoord ({}/{})! '.format(BONUSTHEMAS[int(row['Beste'])-1], row['BesteScore'], row['Maximum']) else: tekst = tekst + ', goed ingeschat dus want het was jullie beste thema! ' return tekst return '' def getBonusScore(self, ploegnaam): with open(BONUSOVERVIEW, 'rt') as fr: reader = csv.DictReader(fr) for row in reader: if row['Ploegnaam'] == ploegnaam: tekst = BONUSTHEMAS[int(row['Origineel'])-1] + ' ({}/{})'.format(row['OrigineelScore'], row['Maximum']) return tekst return '' def generateEigenOverzicht(self, tafelnummer): tekst = TABLELAYOUT + '<tr>' + HEADERLEFT.format(HEADER = 'Ronde') + HEADERCENTER.format(HEADER = 'Eigen Score') + HEADERCENTER.format(HEADER = 'Maximum Score') + HEADERCENTER.format(HEADER = 'Gemiddelde score') + '</tr>' totaalScore = 0 maximumScore = 0 gemiddeldeScore = 0 with open(SCOREBORDINFO, 'rt') as fr1: reader = csv.DictReader(fr1) for usedRound in reader: rondeNaam= usedRound['Ronde'] maximumRondeScore = 0 gemiddeldeRondeScore = 0 eigenRondeScore = 0 with open(RONDEFILES + FINALPREFIX + rondeNaam + '.csv', 'rt') as fr: reader = csv.reader(fr) for row in reader: if row[1] == str(tafelnummer): eigenRondeScore = sum(map(int, row[2:])) elif 'Max/Gem' in row: maximumRondeScore = row[0] gemiddeldeRondeScore = round(float(row[1]),1) totaalScore = eigenRondeScore + totaalScore tekst = tekst + '<tr>' + DATALEFT.format(DATA = rondeNaam) + DATACENTER.format(DATA = eigenRondeScore) + DATACENTER.format(DATA = maximumRondeScore) + DATACENTER.format(DATA = gemiddeldeRondeScore) + '</tr>' maximum, gemiddelde, median = self.SH.getStatistics() tekst = tekst + '<tr>' + DATALEFT.format(DATA = 'Totaal') + DATACENTER.format(DATA = str(totaalScore) + ' ({}%)'.format(round(totaalScore/maximum*100,2))) + DATACENTER.format(DATA = maximum) + DATACENTER.format(DATA = str(round(float(gemiddelde),2)) + ' ({}%)'.format(round(gemiddelde/maximum*100,2))) + '</tr>' tekst = tekst + '</table></div>' return tekst def generateNabijeOverzicht(self, positie, aantalPloegen, bonus): aantalPlusMin = 5 aantalRondes = 0 tekst = TABLELAYOUT + '<tr>' + HEADERLEFT.format(HEADER = 'Nr.') + HEADERLEFT.format(HEADER = 'Ploegnaam') + HEADERCENTER.format(HEADER = 'Totaal') with open(SCOREBORDINFO, 'rt') as fr: reader = csv.DictReader(fr) for row in reader: tekst = tekst + HEADERCENTER.format(HEADER = row['Afkorting']) aantalRondes = aantalRondes +1 if bool(bonus): tekst = tekst + HEADERCENTER.format(HEADER = 'Bonus') tekst = tekst + HEADERCENTER.format(HEADER='Schiting') + '</tr>' nabijescores = self.SH.getFinalScores(positie, aantalPloegen, aantalPlusMin) for scores in nabijescores: ploegnaamOrig = scores[2] if len(ploegnaamOrig) > 25: ploegnaam = (ploegnaamOrig[:25] + '..') else: ploegnaam = ploegnaamOrig; tekst = tekst + '<tr>' + DATALEFT.format(DATA = scores[0]) + DATACENTER.format(DATA = ploegnaam) + DATACENTER.format(DATA = scores[3]) for i in range(0, aantalRondes): tekst = tekst + DATACENTER.format(DATA = scores[5+i]) if bool(bonus): tekst = tekst + DATACENTER.format(DATA = self.getBonusScore(ploegnaamOrig)) schifting = float(scores[len(scores)-2]) if schifting.is_integer(): schifting = int(schifting) tekst = tekst + DATACENTER.format(DATA = round(float(scores[len(scores)-2]),2)) + '</tr>' return tekst def worstAnsweredQuestions(self, aantalDeelnemers): filenames = [] rondenaam = [] rondenummer = [] with open(SCOREBORDINFO, 'rt') as fr: reader = csv.DictReader(fr) for row in reader: filenames.append(RONDEFILES + FINALPREFIX + row['Ronde'] + '.csv') rondenaam.append(row['Afkorting']) rondenummer.append(int(row['RN'])) antwoordLimiet = int(math.ceil(aantalDeelnemers*MOEILIJKTRESHOLD)) moeilijkeVragen = [] antwoorden = self.getAntwoorden() for index, file in enumerate(filenames): try: RNaam =rondenaam[index] RN = rondenummer[index] with open(file, 'rt') as fr: reader =csv.reader(fr) if 'Bonus' in next(reader): compensatieBonus = 1 else: compensatieBonus = 0 if self.RH.isSuperRonde(RN) == 1: superronde = True else: superronde = False for row in reader: if 'Max/Gem' in row: aantalJuist = row[2:len(row)-1] aantalJuist = list(map(int, aantalJuist)) for i in range(0, len(aantalJuist)-compensatieBonus): if aantalJuist[i]<=antwoordLimiet: if not superronde: VN = i+1 moeilijkeVragen.append([RNaam, VN, aantalJuist[i], antwoorden[RN-1][VN]]) elif i%3 == 2: VN = int((i+1)/3) moeilijkeVragen.append([RNaam, str(VN)+'c', aantalJuist[i], antwoorden[RN-1][i+1]]) except: print('Fout!') print(index, rondenaam, rondenummer) print(RNaam, RN, VN) pass moeilijkeVragen = sorted(moeilijkeVragen,key=lambda x: (x[2], x[0])) with open(MOEILIJK, "w") as fw: fw.write('#Juist' + '\t' + 'Ronde'+ '\t' + 'Vraag' + '\t' +'Antwoord' + '\n') for i in range(len(moeilijkeVragen)): fw.write(str(moeilijkeVragen[i][2]) + '\t' + str(moeilijkeVragen[i][0]) + '\t' + str(moeilijkeVragen[i][1]) + '\t' + str(moeilijkeVragen[i][3])+ '\n') def getAntwoorden(self): with open(ANTWOORDEN, 'rt')as fr: reader = csv.reader(fr) return list(reader) def sendLoting(self): email = '*****@*****.**' onderwerp = 'Loting ' + TITEL filename = LOTING tekst = ' In bijlage vind je de resultaten voor de loting op het einde van de quiz' self.EH.send_HTML_Attachment_Mail(email, onderwerp, tekst, filename, filename) print(email) def saveLoting(self,antwoorden,loting1,loting2,loting3): with open(LOTING, "w") as fw: fw.write(antwoorden[0] + ' ' + str(len(loting1))) fw.write('\n') fw.write('\n') for i in range(len(loting1)): fw.write(loting1[i] + '\n') fw.write('\n') fw.write('\n') fw.write(antwoorden[1] + ' ' + str(len(loting2))) fw.write('\n') fw.write('\n') for i in range(len(loting2)): fw.write(loting2[i] + '\n') fw.write('\n') fw.write('\n') fw.write(antwoorden[2] + ' ' + str(len(loting3))) fw.write('\n') fw.write('\n') for i in range(len(loting3)): fw.write(loting3[i] + '\n') def makePDFfromPNG(self,original): # storing pdf path pdf_path = original.replace('.png', '.pdf') # opening image image = Image.open(original) # converting into chunks using img2pdf pdf_bytes = img2pdf.convert(image.filename) # opening or creating pdf file file = open(pdf_path, "wb") # writing pdf files with chunks file.write(pdf_bytes) # closing image file image.close() # closing pdf file file.close() return pdf_path