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()
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')
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()
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()