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)
Beispiel #2
0
    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)
Beispiel #3
0
    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
Beispiel #4
0
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()
Beispiel #5
0
    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()
Beispiel #6
0
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
Beispiel #7
0
    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)
Beispiel #9
0
    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')