예제 #1
0
    def _maak_many_histcomp(self):
        # maak veel histcomp records aan
        # zodat de AG-vaststellen bulk-create limiet van 500 gehaald wordt

        lid_nr = 190000
        records = list()
        sporters = list()

        geboorte_datum = datetime.date(year=1970, month=3, day=4)
        sinds_datum = datetime.date(year=2001, month=11, day=12)

        for lp in range(550):
            sporter = Sporter(lid_nr=lid_nr + lp,
                              geslacht='V',
                              geboorte_datum=geboorte_datum,
                              sinds_datum=sinds_datum)
            sporters.append(sporter)

            rec = HistCompetitieIndividueel(histcompetitie=self.histcomp,
                                            boogtype='R',
                                            rank=lp,
                                            schutter_nr=sporter.lid_nr,
                                            vereniging_nr=1000,
                                            score1=1,
                                            score2=2,
                                            score3=3,
                                            score4=4,
                                            score5=5,
                                            score6=6,
                                            score7=250,
                                            totaal=270,
                                            gemiddelde=5.5)
            records.append(rec)
        # for

        Sporter.objects.bulk_create(sporters)
        HistCompetitieIndividueel.objects.bulk_create(records)
예제 #2
0
    def setUp(self):
        """ initialisatie van de test case """

        self.account_normaal = self.e2e_create_account('normaal', '*****@*****.**', 'Normaal')

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Grote Club"
        ver.ver_nr = "1000"
        ver.regio = NhbRegio.objects.get(pk=111)
        ver.save()
        self.nhbver = ver

        # maak een test lid aan
        sporter = Sporter()
        sporter.lid_nr = 100001
        sporter.geslacht = "M"
        sporter.voornaam = "Ramon"
        sporter.achternaam = "de Tester"
        sporter.geboorte_datum = datetime.date(year=1972, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2010, month=11, day=12)
        sporter.bij_vereniging = ver
        sporter.account = self.account_normaal
        sporter.email = sporter.account.email
        sporter.save()
        self.sporter1 = sporter

        functie_hwl = maak_functie('HWL ver 1000', 'HWL')
        functie_hwl.accounts.add(self.account_normaal)
        functie_hwl.nhb_ver = ver
        functie_hwl.bevestigde_email = '*****@*****.**'
        functie_hwl.save()
        self.functie_hwl = functie_hwl

        functie_sec = maak_functie('SEC ver 1000', 'SEC')
        functie_sec.accounts.add(self.account_normaal)
        functie_sec.bevestigde_email = '*****@*****.**'
        functie_sec.nhb_ver = ver
        functie_sec.save()
        self.functie_sec = functie_sec

        Secretaris(vereniging=ver, sporter=sporter).save()

        # geef dit account een record
        rec = IndivRecord()
        rec.discipline = '18'
        rec.volg_nr = 1
        rec.soort_record = "60p"
        rec.geslacht = sporter.geslacht
        rec.leeftijdscategorie = 'J'
        rec.materiaalklasse = "R"
        rec.sporter = sporter
        rec.naam = "Ramon de Tester"
        rec.datum = parse_date('2011-11-11')
        rec.plaats = "Top stad"
        rec.score = 293
        rec.max_score = 300
        rec.save()

        rec = IndivRecord()
        rec.discipline = '18'
        rec.volg_nr = 2
        rec.soort_record = "60p"
        rec.geslacht = sporter.geslacht
        rec.leeftijdscategorie = 'J'
        rec.materiaalklasse = "C"
        rec.sporter = sporter
        rec.naam = "Ramon de Tester"
        rec.datum = parse_date('2012-12-12')
        rec.plaats = "Top stad"
        rec.land = 'Verwegistan'
        rec.score = 290
        rec.max_score = 300
        rec.save()

        rec = IndivRecord()
        rec.discipline = '18'
        rec.volg_nr = 3
        rec.soort_record = "60p"
        rec.geslacht = sporter.geslacht
        rec.leeftijdscategorie = 'C'
        rec.materiaalklasse = "C"
        rec.sporter = sporter
        rec.naam = "Ramon de Tester"
        rec.datum = parse_date('1991-12-12')
        rec.plaats = ""     # typisch voor oudere records
        rec.score = 290
        rec.max_score = 300
        rec.save()

        # geef dit account een goede en een slechte HistComp record
        histcomp = HistCompetitie()
        histcomp.seizoen = "2009/2010"
        histcomp.comp_type = "18"
        histcomp.klasse = "don't care"
        histcomp.save()

        indiv = HistCompetitieIndividueel()
        indiv.histcompetitie = histcomp
        indiv.rank = 1
        indiv.schutter_nr = 100001
        indiv.schutter_naam = "Ramon de Tester"
        indiv.boogtype = "R"
        indiv.vereniging_nr = 1000
        indiv.vereniging_naam = "don't care"
        indiv.score1 = 123
        indiv.score2 = 234
        indiv.score3 = 345
        indiv.score4 = 456
        indiv.score5 = 0
        indiv.score6 = 666
        indiv.score7 = 7
        indiv.laagste_score_nr = 7
        indiv.totaal = 1234
        indiv.gemiddelde = 9.123
        indiv.save()

        indiv.pk = None
        indiv.boogtype = "??"   # bestaat niet, on purpose
        indiv.save()

        self.boog_R = BoogType.objects.get(afkorting='R')
예제 #3
0
    def _create_histcomp(self):
        # (strategisch gekozen) historische data om klassengrenzen uit te bepalen
        histcomp = HistCompetitie()
        histcomp.seizoen = '2018/2019'
        histcomp.comp_type = '18'
        histcomp.klasse = 'Testcurve1'
        histcomp.is_team = False
        histcomp.save()

        # record voor het volwassen lid
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 1
        rec.schutter_nr = self.sporter_100001.lid_nr
        rec.schutter_naam = self.sporter_100001.volledige_naam()
        rec.vereniging_nr = self.nhbver1.ver_nr
        rec.vereniging_naam = self.nhbver1.naam
        rec.boogtype = 'R'
        rec.score1 = 10
        rec.score2 = 20
        rec.score3 = 30
        rec.score4 = 40
        rec.score5 = 50
        rec.score6 = 60
        rec.score7 = 70
        rec.totaal = 80
        rec.gemiddelde = 5.321
        rec.save()

        # record voor het jeugdlid
        # record voor het volwassen lid
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 1
        rec.schutter_nr = self.sporter_100002.lid_nr
        rec.schutter_naam = self.sporter_100002.volledige_naam()
        rec.vereniging_nr = self.nhbver1.ver_nr
        rec.vereniging_naam = self.nhbver1.naam
        rec.boogtype = 'BB'
        rec.score1 = 10
        rec.score2 = 20
        rec.score3 = 30
        rec.score4 = 40
        rec.score5 = 50
        rec.score6 = 60
        rec.score7 = 70
        rec.totaal = 80
        rec.gemiddelde = 5.321
        rec.save()
예제 #4
0
    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        # deze test is afhankelijk van de standaard regio's
        self.regio_101 = regio = NhbRegio.objects.get(regio_nr=101)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Grote Club"
        ver.ver_nr = 1000
        ver.regio = regio
        # secretaris kan nog niet ingevuld worden
        ver.save()

        # maak een volwassen test lid aan (komt in groep met klasse onbekend)
        sporter = Sporter()
        sporter.lid_nr = 100001
        sporter.geslacht = "M"
        sporter.voornaam = "Ramon"
        sporter.achternaam = "de Tester"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=1972, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2010, month=11, day=12)
        sporter.bij_vereniging = ver
        self.account_lid = self.e2e_create_account(sporter.lid_nr,
                                                   sporter.email,
                                                   sporter.voornaam)
        sporter.account = self.account_lid
        sporter.save()
        self.sporter_100001 = sporter

        self.functie_hwl = maak_functie('HWL test', 'HWL')
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()
        self.functie_hwl.accounts.add(self.account_lid)

        # maak een jeugdlid aan (komt in BB jeugd zonder klasse onbekend)
        sporter = Sporter()
        sporter.lid_nr = 100002
        sporter.geslacht = "M"
        sporter.voornaam = "Ramon"
        sporter.achternaam = "het Testertje"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=2008, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2015, month=11, day=12)
        sporter.bij_vereniging = ver
        self.account_jeugdlid = self.e2e_create_account(
            sporter.lid_nr, sporter.email, sporter.voornaam)
        sporter.account = self.account_jeugdlid
        sporter.save()
        self.sporter_100002 = sporter

        boog_bb = BoogType.objects.get(afkorting='BB')
        boog_ib = BoogType.objects.get(afkorting='IB')

        # maak een sporterboog aan voor het jeugdlid (nodig om aan te melden)
        sporterboog = SporterBoog(sporter=self.sporter_100002,
                                  boogtype=boog_bb,
                                  voor_wedstrijd=False)
        sporterboog.save()
        self.sporterboog_100002 = sporterboog

        sporter = Sporter()
        sporter.lid_nr = 100003
        sporter.geslacht = "V"
        sporter.voornaam = "Zus"
        sporter.achternaam = "de Testerin"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=2008, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2015, month=11, day=12)
        sporter.bij_vereniging = ver
        sporter.save()
        self.sporter_100003 = sporter

        # maak een sporterboog aan voor het lid (nodig om aan te melden)
        sporterboog = SporterBoog(sporter=self.sporter_100003,
                                  boogtype=boog_bb,
                                  voor_wedstrijd=True)
        sporterboog.save()
        self.sporterboog_100003 = sporterboog

        # maak een sporterboog aan voor het lid (nodig om aan te melden)
        sporterboog = SporterBoog(sporter=self.sporter_100001,
                                  boogtype=boog_ib,
                                  voor_wedstrijd=True)
        sporterboog.save()

        # (strategisch gekozen) historische data om klassengrenzen uit te bepalen
        histcomp = HistCompetitie()
        histcomp.seizoen = '2018/2019'
        histcomp.comp_type = '18'
        histcomp.klasse = 'Testcurve1'  # TODO: kan de klasse een spatie bevatten?
        histcomp.is_team = False
        histcomp.save()
        self.histcomp = histcomp

        # een ouder seizoen dat niet gebruikt moet worden
        histcomp2 = HistCompetitie()
        histcomp2.seizoen = '2017/2018'
        histcomp2.comp_type = '18'
        histcomp2.klasse = 'Testcurve2'
        histcomp2.is_team = False
        histcomp2.save()

        # record voor het volwassen lid
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 1
        rec.schutter_nr = self.sporter_100001.lid_nr
        rec.schutter_naam = self.sporter_100001.volledige_naam()
        rec.vereniging_nr = ver.ver_nr
        rec.vereniging_naam = ver.naam
        rec.boogtype = 'R'
        rec.score1 = 10
        rec.score2 = 20
        rec.score3 = 30
        rec.score4 = 40
        rec.score5 = 50
        rec.score6 = 60
        rec.score7 = 70
        rec.totaal = 80
        rec.gemiddelde = 5.321
        rec.save()

        # nog een record voor het volwassen lid
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp2
        rec.rank = 1
        rec.schutter_nr = self.sporter_100001.lid_nr
        rec.schutter_naam = self.sporter_100001.volledige_naam()
        rec.vereniging_nr = ver.ver_nr
        rec.vereniging_naam = ver.naam
        rec.boogtype = 'R'
        rec.score1 = 11
        rec.score2 = 21
        rec.score3 = 31
        rec.score4 = 41
        rec.score5 = 51
        rec.score6 = 61
        rec.score7 = 71
        rec.totaal = 81
        rec.gemiddelde = 6.12
        rec.save()

        # nog een record voor het volwassen lid
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 100
        rec.schutter_nr = self.sporter_100001.lid_nr
        rec.schutter_naam = self.sporter_100001.volledige_naam()
        rec.vereniging_nr = ver.ver_nr
        rec.vereniging_naam = ver.naam
        rec.boogtype = 'IB'
        rec.score1 = 11
        rec.score2 = 21
        rec.score3 = 31
        rec.score4 = 41
        rec.score5 = 51
        rec.score6 = 61
        rec.score7 = 71
        rec.totaal = 81
        rec.gemiddelde = 6.12
        rec.save()

        # maak een record aan zonder eindgemiddelde
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 1
        rec.schutter_nr = self.sporter_100002.lid_nr
        rec.schutter_naam = self.sporter_100002.volledige_naam()
        rec.vereniging_nr = ver.ver_nr
        rec.vereniging_naam = ver.naam
        rec.boogtype = 'C'
        rec.score1 = 0
        rec.score2 = 0
        rec.score3 = 0
        rec.score4 = 0
        rec.score5 = 0
        rec.score6 = 0
        rec.score7 = 0
        rec.totaal = 0
        rec.gemiddelde = 0.0
        rec.save()

        # record voor het jeugdlid
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 1
        rec.schutter_nr = self.sporter_100002.lid_nr
        rec.schutter_naam = self.sporter_100002.volledige_naam()
        rec.vereniging_nr = ver.ver_nr
        rec.vereniging_naam = ver.naam
        rec.boogtype = 'BB'
        rec.score1 = 10
        rec.score2 = 20
        rec.score3 = 30
        rec.score4 = 40
        rec.score5 = 50
        rec.score6 = 60
        rec.score7 = 70
        rec.totaal = 80
        rec.gemiddelde = 5.321
        rec.save()

        # maak een record aan voor iemand die geen lid meer is
        rec = HistCompetitieIndividueel()
        rec.histcompetitie = histcomp
        rec.rank = 1
        rec.schutter_nr = 991111
        rec.schutter_naam = "Die is weg"
        rec.vereniging_nr = ver.ver_nr
        rec.vereniging_naam = ver.naam
        rec.boogtype = 'BB'
        rec.score1 = 10
        rec.score2 = 20
        rec.score3 = 30
        rec.score4 = 40
        rec.score5 = 50
        rec.score6 = 60
        rec.score7 = 70
        rec.totaal = 80
        rec.gemiddelde = 5.321
        rec.save()
예제 #5
0
    def _import(self, lines, seizoen, comptype):
        # sanity-check voor de hele file
        linenr = 0
        for line in lines:
            linenr += 1
            spl = line.split(';')
            if len(spl) != 11:
                self.stderr.write(
                    "[ERROR] Fout in regel %s: niet 11 kolommen" % linenr)
                self._count_error += 1

            if linenr > 1 and spl[2] not in TOEGESTANE_KLASSEN:
                self.stderr.write('[ERROR] Regel %s: onbekende klasse %s' %
                                  (linenr, repr(spl[1])))
                self._count_error += 1
        # for

        if lines[0].split(";")[0] != "bondsnummer":
            self.stderr.write("[ERROR] Eerste regels bevat geen headers: %s" %
                              repr(lines[0]))
            self._count_error += 1
        del lines[0]

        if self._count_error > 0:
            return

        histcomps = dict()  # ['klasse'] = HistCompetitie()
        indiv_scores = list()  # (gem, scores, HistCompetitieIndividueel)

        bulk = list()
        line_nr = 0
        for line in lines:
            line_nr += 1
            spl = line.strip().split(";")
            # spl = [lid_nr, klasse, score1..7, gemiddelde]

            lid_nr = spl[0]

            ver_nr = spl[1]

            klasse = spl[2]  # boogtype
            try:
                histcompetitie = histcomps[klasse]
            except KeyError:
                # nieuwe klasse
                histcomps[
                    klasse] = histcompetitie = self.make_or_find_histcompetitie(
                        seizoen, comptype, klasse)

            # fantaseer een redelijk boogtype voor elke klasse
            if "Recurve" in klasse:
                boogtype = "R"
            elif "Compound" in klasse:
                boogtype = "C"
            elif "Barebow" in klasse:
                boogtype = "BB"
            elif "Longbow" in klasse:
                boogtype = "LB"
            elif "Instinctive" in klasse:
                boogtype = "IB"
            else:
                self.stdout.write(
                    '[WARNING] Onzeker welk boogtype voor klasse %s' %
                    repr(klasse))
                self._count_skip += 1
                continue

            self._boogtype2histcomp[boogtype] = histcompetitie

            # overslaan als er niet ten minste 6 scores zijn
            scores, _, totaal = self._convert_scores(spl[3:3 + 7])

            # naam van het lid erbij zoeken (spelling in CRM is leidend)
            try:
                sporter = Sporter.objects.get(lid_nr=lid_nr)
            except Sporter.DoesNotExist:
                # kan naam nu niet vonden - toch importeren en later aanvullen
                print("[WARNING] Kan naam niet vinden bij NHB nummer %s" %
                      repr(lid_nr))
                sporter = None
                self._count_noname += 1

            # naam van de vereniging opzoeken en opslaan
            try:
                ver = NhbVereniging.objects.get(ver_nr=ver_nr)
                ver_naam = ver.naam
            except NhbVereniging.DoesNotExist:
                # fall-back voor recent verwijderde verenigingen
                if ver_nr == '1026':
                    ver_naam = 'Victoria'
                elif ver_nr == '1058':
                    ver_naam = 'Willem Tell'
                elif ver_nr == '1093':
                    ver_naam = 'De Bosjagers'
                elif ver_nr == '1147':
                    ver_naam = 'Diana'
                elif ver_nr == '1152':
                    ver_naam = 'Ons Genoegen'
                elif ver_nr == '1170':
                    ver_naam = 'Batavieren Treffers'
                elif ver_nr == '1191':
                    ver_naam = 'Eendracht St Sebast'
                elif ver_nr == '1226':
                    ver_naam = 'Centaur Asten'
                else:
                    ver_naam = '?'
                    self.stdout.write(
                        '[WARNING] Kan geen naam opzoeken voor verwijderde vereniging %s'
                        % ver_nr)

            gemiddelde = float(spl[10].replace(',', '.'))  # 9,123 --> 9.123

            hist = HistCompetitieIndividueel()
            hist.histcompetitie = histcompetitie
            hist.rank = 0
            hist.schutter_nr = lid_nr
            if sporter:
                hist.schutter_naam = " ".join(
                    [sporter.voornaam, sporter.achternaam])
            hist.boogtype = boogtype
            hist.vereniging_nr = ver_nr
            hist.vereniging_naam = ver_naam
            hist.score1 = scores[0]
            hist.score2 = scores[1]
            hist.score3 = scores[2]
            hist.score4 = scores[3]
            hist.score5 = scores[4]
            hist.score6 = scores[5]
            hist.score7 = scores[6]

            scores.sort(reverse=True)
            lowest = scores[-1]
            if hist.score7 == lowest:
                hist.laagste_score_nr = 7
            elif hist.score6 == lowest:
                hist.laagste_score_nr = 6
            elif hist.score5 == lowest:
                hist.laagste_score_nr = 5
            elif hist.score4 == lowest:
                hist.laagste_score_nr = 4
            elif hist.score3 == lowest:
                hist.laagste_score_nr = 3
            elif hist.score2 == lowest:
                hist.laagste_score_nr = 2
            else:
                hist.laagste_score_nr = 1

            hist.gemiddelde = gemiddelde
            hist.totaal = totaal - lowest

            # check if the record already exists
            dupe = HistCompetitieIndividueel.objects.filter(
                histcompetitie=hist.histcompetitie,
                schutter_nr=hist.schutter_nr,
                vereniging_nr=hist.vereniging_nr)
            if len(dupe) > 0:
                tup = (gemiddelde, scores, len(indiv_scores), dupe[0])
                indiv_scores.append(tup)
                self._count_dupe += 1
            else:
                tup = (gemiddelde, scores, len(indiv_scores), hist)
                indiv_scores.append(tup)
                bulk.append(hist)
                self._count_added += 1
                if len(bulk) >= 100:
                    HistCompetitieIndividueel.objects.bulk_create(bulk)
                    bulk = list()

        # for

        if len(bulk):
            HistCompetitieIndividueel.objects.bulk_create(bulk)

        # deel de rank nummers opnieuw uit
        ranks = dict()  # ['boogtype'] = int

        indiv_scores.sort(reverse=True)
        for gem, scores, nr, hist in indiv_scores:
            try:
                ranks[hist.boogtype] += 1
                hist.rank = ranks[hist.boogtype]
            except KeyError:
                hist.rank = 1
                ranks[hist.boogtype] = hist.rank

            hist.save()