Beispiel #1
0
    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()
Beispiel #2
0
    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)
Beispiel #3
0
 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()
Beispiel #6
0
 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)
Beispiel #7
0
    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()
Beispiel #9
0
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()
Beispiel #10
0
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;">&nbsp;</td>
        <td style="width: 273px; text-align: center;">&nbsp;</td>
        <td style="width: 254px; text-align: center;">&nbsp;</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;">&euro;{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()
Beispiel #11
0
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)
Beispiel #12
0
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()
Beispiel #13
0
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)
Beispiel #14
0
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()
Beispiel #15
0
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