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