def _maak_uitslag(self, sporterboog): # maak 2x wedstrijd + uitslag + score voor deze schutterboog, met geschiedenis uur_00 = datetime.time(hour=0) uur_18 = datetime.time(hour=18) uur_19 = datetime.time(hour=19) uur_22 = datetime.time(hour=22) uitslag18 = CompetitieWedstrijdUitslag(max_score=300, afstand_meter=18) uitslag18.save() uitslag25 = CompetitieWedstrijdUitslag(max_score=250, afstand_meter=25) uitslag25.save() CompetitieWedstrijd(beschrijving='Test wedstrijdje 18m', datum_wanneer=datetime.date(year=2020, month=10, day=10), tijd_begin_aanmelden=uur_18, tijd_begin_wedstrijd=uur_19, tijd_einde_wedstrijd=uur_22, uitslag=uitslag18, vereniging=self.nhbver1).save() CompetitieWedstrijd(beschrijving='Test wedstrijdje 25m', datum_wanneer=datetime.date(year=2020, month=10, day=11), tijd_begin_aanmelden=uur_00, tijd_begin_wedstrijd=uur_00, tijd_einde_wedstrijd=uur_00, uitslag=uitslag25).save() score = Score(sporterboog=sporterboog, afstand_meter=18, waarde=260) score.save() ScoreHist(score=score, oude_waarde=0, nieuwe_waarde=290, door_account=self.account_hwl).save() ScoreHist(score=score, oude_waarde=290, nieuwe_waarde=260, door_account=self.account_hwl).save() uitslag18.scores.add(score) score = Score(sporterboog=sporterboog, afstand_meter=25, waarde=234) score.save() ScoreHist(score=score, oude_waarde=SCORE_WAARDE_VERWIJDERD, nieuwe_waarde=234, door_account=self.account_hwl).save() ScoreHist(score=score, oude_waarde=0, nieuwe_waarde=SCORE_WAARDE_VERWIJDERD, door_account=self.account_hwl).save() ScoreHist(score=score, oude_waarde=0, nieuwe_waarde=1, door_account=self.account_hwl).save() uitslag25.scores.add(score)
def _score_opslaan(uitslag, sporterboog, waarde): score = Score(afstand_meter=18, sporterboog=sporterboog, waarde=waarde) score.save() hist = ScoreHist(score=score, oude_waarde=0, nieuwe_waarde=waarde) hist.save() uitslag.scores.add(score)
def maak_sporterboog_aanvangsgemiddelden(afstand, ver_nr): """ Maak voor de helft van de SporterBoog een AG aan in voorgaand seizoen deze kunnen gebruikt worden voor de klassengrenzen en inschrijven. """ ag = 6000 # 6.0 ag += ver_nr bulk = list() for sporterboog in (SporterBoog.objects.filter( sporter__bij_vereniging__ver_nr=ver_nr, voor_wedstrijd=True)): # even pk get an AG if sporterboog.pk % 1 == 0: ag = 6000 if ag > 9800 else ag + 25 score = Score(type=SCORE_TYPE_INDIV_AG, sporterboog=sporterboog, waarde=ag, afstand_meter=afstand) bulk.append(score) if len(bulk) > 500: # pragma: no cover Score.objects.bulk_create(bulk) bulk2 = list() for score in bulk: hist = ScoreHist( score=score, oude_waarde=0, nieuwe_waarde=score.waarde, # when = auto-set # door_account=None, notitie='Testdata') bulk2.append(hist) # for ScoreHist.objects.bulk_create(bulk2) del bulk2 bulk = list() # for if len(bulk): # pragma: no branch Score.objects.bulk_create(bulk) bulk2 = list() for score in bulk: hist = ScoreHist( score=score, oude_waarde=0, nieuwe_waarde=score.waarde, # when = auto-set # door_account=None, notitie='Testdata') bulk2.append(hist) # for ScoreHist.objects.bulk_create(bulk2) del bulk2
def update_uitslag_teamcompetitie(): # regiocomp_tussenstand moet gekieteld worden # maak daarvoor een ScoreHist record aan ScoreHist(score=None, oude_waarde=0, nieuwe_waarde=0, notitie="Trigger background task").save()
def bijgewerkte_score(bulk, score_obj, waarde, when, door_account): if score_obj.waarde != waarde: # print('bijgewerkte score: %s --> %s' % (score_obj, waarde)) hist = ScoreHist(score=score_obj, oude_waarde=score_obj.waarde, nieuwe_waarde=waarde, when=when, door_account=door_account, notitie="Invoer uitslag wedstrijd") bulk.append(hist) score_obj.waarde = waarde score_obj.save()
def _score_ag_opslaan(score_type, sporterboog, afstand, gemiddelde, door_account, notitie): """ slaan het aanvangsgemiddelde op voor sporterboog Return value: True = opslagen False = niet opgeslagen / dupe """ waarde = int(gemiddelde * 1000) try: score = Score.objects.get(sporterboog=sporterboog, type=score_type, afstand_meter=afstand) except Score.DoesNotExist: # eerste aanvangsgemiddelde voor deze afstand score = Score(sporterboog=sporterboog, type=score_type, waarde=waarde, afstand_meter=afstand) score.save() hist = ScoreHist(score=score, oude_waarde=0, nieuwe_waarde=waarde, door_account=door_account, notitie=notitie) hist.save() return True if score.waarde != waarde: # nieuwe score voor deze afstand hist = ScoreHist(score=score, oude_waarde=score.waarde, nieuwe_waarde=waarde, door_account=door_account, notitie=notitie) hist.save() score.waarde = waarde score.save() return True # dezelfde score als voorheen --> voorlopig niet opslaan # (ook al is de datum en/of notitie anders) return False
def nieuwe_score(bulk, uitslag, sporterboog_pk, waarde, when, door_account): # print('nieuwe score: %s = %s' % (sporterboog_pk, waarde)) try: sporterboog = SporterBoog.objects.get(pk=sporterboog_pk) except SporterBoog.DoesNotExist: # garbage --> ignore return score_obj = Score(sporterboog=sporterboog, waarde=waarde, afstand_meter=uitslag.afstand_meter) score_obj.save() uitslag.scores.add(score_obj) hist = ScoreHist(score=score_obj, oude_waarde=0, nieuwe_waarde=waarde, when=when, door_account=door_account, notitie="Invoer uitslag wedstrijd") bulk.append(hist)
def aanvangsgemiddelden_vaststellen_voor_afstand(afstand: int): """ deze functie gooit de huidige aanvangsgemiddelden van alle sporters voor gegeven afstand weg en bepaalt daarna de nieuwe AG's aan de hand van de meest recente historische competitie uitslag """ # zoek uit wat de meest recente HistComp is histcomps = (HistCompetitie .objects .filter(comp_type=afstand) .order_by('-seizoen')) if len(histcomps) == 0: schrijf_in_logboek(None, 'Competitie', 'Geen historisch uitslag om aanvangsgemiddelden vast te stellen voor %sm' % afstand) return seizoen = histcomps[0].seizoen schrijf_in_logboek(None, 'Competitie', 'Aanvangsgemiddelden vaststellen voor de %sm met uitslag seizoen %s' % (afstand, seizoen)) histcomps = histcomps.filter(seizoen=seizoen) # het eindjaar van de competitie was bepalend voor de klasse # daarmee kunnen we bepalen of de sporter aspirant was eindjaar = int(seizoen.split('/')[1]) # maak een cache aan van boogtype boogtype_dict = dict() # [afkorting] = BoogType for obj in BoogType.objects.all(): boogtype_dict[obj.afkorting] = obj # for # maak een cache aan van nhb leden # we filteren hier niet op inactieve leden sporter_dict = dict() # [lid_nr] = Sporter for obj in Sporter.objects.all(): sporter_dict[obj.lid_nr] = obj # for # maak een cache aan van sporter-boog sporterboog_cache = dict() # [lid_nr, boogtype_afkorting] = SporterBoog for sporterboog in SporterBoog.objects.select_related('sporter', 'boogtype'): tup = (sporterboog.sporter.lid_nr, sporterboog.boogtype.afkorting) sporterboog_cache[tup] = sporterboog # for # verwijder alle bestaande aanvangsgemiddelden Score.objects.filter(type=SCORE_TYPE_INDIV_AG, afstand_meter=afstand).all().delete() minimum_aantal_scores = {18: settings.COMPETITIE_18M_MINIMUM_SCORES_VOOR_AG, 25: settings.COMPETITIE_25M_MINIMUM_SCORES_VOOR_AG} # doorloop alle individuele histcomp records die bij dit seizoen horen bulk_score = list() for histcomp in histcomps: for obj in (HistCompetitieIndividueel .objects .select_related('histcompetitie') .filter(histcompetitie=histcomp)): if (obj.gemiddelde > AG_NUL and obj.boogtype in boogtype_dict and obj.tel_aantal_scores() >= minimum_aantal_scores[afstand]): # haal het sporterboog record op, of maak een nieuwe aan try: tup = (obj.schutter_nr, obj.boogtype) sporterboog = sporterboog_cache[tup] except KeyError: # nieuw record nodig sporterboog = SporterBoog() sporterboog.boogtype = boogtype_dict[obj.boogtype] sporterboog.voor_wedstrijd = True try: sporterboog.sporter = sporter_dict[obj.schutter_nr] except KeyError: # geen lid meer - skip sporterboog = None else: sporterboog.save() # zet het nieuwe record in de cache, anders krijgen we dupes tup = (sporterboog.sporter.lid_nr, sporterboog.boogtype.afkorting) sporterboog_cache[tup] = sporterboog else: if not sporterboog.voor_wedstrijd: sporterboog.voor_wedstrijd = True sporterboog.save(update_fields=['voor_wedstrijd']) if sporterboog: # aspiranten schieten op een grotere kaart en altijd op 18m # daarom AG van aspirant niet overnemen als deze cadet wordt # aangezien er maar 1 klasse is, is het AG niet nodig # voorbeeld: eindjaar = 2019 # geboortejaar = 2006 --> leeftijd was 13, dus aspirant # geboortejaar = 2005 --> leeftijd was 14, dus cadet was_aspirant = (eindjaar - sporterboog.sporter.geboorte_datum.year) <= MAXIMALE_WEDSTRIJDLEEFTIJD_ASPIRANT # zoek het score record erbij if not was_aspirant: # aanvangsgemiddelde voor deze afstand waarde = int(obj.gemiddelde * 1000) score = Score(sporterboog=sporterboog, type=SCORE_TYPE_INDIV_AG, waarde=waarde, afstand_meter=afstand) bulk_score.append(score) if len(bulk_score) >= 500: Score.objects.bulk_create(bulk_score) bulk_score = list() # for # for if len(bulk_score) > 0: # pragma: no branch Score.objects.bulk_create(bulk_score) del bulk_score # maak nu alle ScoreHist entries in 1x aan # (dit kost de meeste tijd) # hiervoor hebben we Score.pk nodig en die kregen we niet uit bovenstaande Score.objects.bulk_create bulk_scorehist = list() notitie = "Uitslag competitie seizoen %s" % histcomp.seizoen for score in (Score .objects .filter(type=SCORE_TYPE_INDIV_AG, afstand_meter=afstand)): scorehist = ScoreHist(score=score, oude_waarde=0, nieuwe_waarde=score.waarde, door_account=None, notitie=notitie) bulk_scorehist.append(scorehist) if len(bulk_scorehist) > 250: ScoreHist.objects.bulk_create(bulk_scorehist) bulk_scorehist = list() # for if len(bulk_scorehist) > 0: # pragma: no branch ScoreHist.objects.bulk_create(bulk_scorehist)
def test_zeven(self): # maak een paar score + scorehist self._score_opslaan(self.uitslagen[0], self.sporterboog_100001, 123) self._score_opslaan(self.uitslagen[1], self.sporterboog_100001, 124) self._score_opslaan(self.uitslagen[2], self.sporterboog_100001, 125) self._score_opslaan(self.uitslagen[3], self.sporterboog_100001, 126) self._score_opslaan(self.uitslagen[4], self.sporterboog_100001, 127) self._score_opslaan(self.uitslagen[5], self.sporterboog_100001, 128) self._score_opslaan(self.uitslagen[6], self.sporterboog_100001, 129) f1 = io.StringIO() f2 = io.StringIO() with self.assert_max_queries(170): management.call_command('regiocomp_tussenstand', '2', '--quick', stderr=f1, stdout=f2) # print("f1: %s" % f1.getvalue()) # print("f2: %s" % f2.getvalue()) self.assertTrue( 'Scores voor 1 schuttersboog bijgewerkt' in f2.getvalue()) deelnemer = RegioCompetitieSchutterBoog.objects.get( sporterboog=self.sporterboog_100001) # print('scores: %s %s %s %s %s %s %s, laagste_nr=%s, totaal=%s, gem=%s' % (deelnemer.score1, deelnemer.score2, deelnemer.score3, deelnemer.score4, deelnemer.score5, deelnemer.score6, deelnemer.score7, deelnemer.laagste_score_nr, deelnemer.totaal, deelnemer.gemiddelde)) self.assertEqual(deelnemer.score1, 123) self.assertEqual(deelnemer.score7, 129) self.assertEqual(deelnemer.totaal, 759) self.assertEqual(deelnemer.aantal_scores, 7) self.assertEqual(deelnemer.laagste_score_nr, 1) self.assertEqual(str(deelnemer.gemiddelde), '4.217') # verwijder een schutter uit een uitslag door de score op VERWIJDERD te zetten score = ScoreHist.objects.latest('pk').score hist = ScoreHist(score=score, oude_waarde=score.waarde, nieuwe_waarde=SCORE_WAARDE_VERWIJDERD, notitie="Foutje, bedankt!") hist.save() score.waarde = SCORE_WAARDE_VERWIJDERD score.save() f1 = io.StringIO() f2 = io.StringIO() with self.assert_max_queries(164): management.call_command('regiocomp_tussenstand', '2', '--quick', stderr=f1, stdout=f2) # print("f1: %s" % f1.getvalue()) # print("f2: %s" % f2.getvalue()) self.assertTrue( 'Scores voor 1 schuttersboog bijgewerkt' in f2.getvalue()) deelnemer = RegioCompetitieSchutterBoog.objects.get( sporterboog=self.sporterboog_100001) # print('scores: %s %s %s %s %s %s %s, laagste_nr=%s, totaal=%s, gem=%s' % (deelnemer.score1, deelnemer.score2, deelnemer.score3, deelnemer.score4, deelnemer.score5, deelnemer.score6, deelnemer.score7, deelnemer.laagste_score_nr, deelnemer.totaal, deelnemer.gemiddelde)) self.assertEqual(deelnemer.score1, 123) self.assertEqual(deelnemer.score6, 128) self.assertEqual(deelnemer.score7, 0) self.assertEqual(deelnemer.totaal, 753) self.assertEqual(deelnemer.aantal_scores, 6) self.assertEqual(deelnemer.laagste_score_nr, 0) self.assertEqual(str(deelnemer.gemiddelde), '4.183')