示例#1
0
    def test_verwijder_score_fail(self):
        # maak 100024 aan
        f1 = io.StringIO()
        f2 = io.StringIO()
        with self.assert_max_queries(61):
            management.call_command('import_nhb_crm', './NhbStructuur/management/testfiles/testfile_14.json',
                                    '--sim_now=2020-07-01', stderr=f1, stdout=f2)

        # maak een schutterboog aan
        boog_r = BoogType.objects.get(afkorting='R')
        sporter = Sporter.objects.get(lid_nr="100024")
        sporterboog = SporterBoog(sporter=sporter,
                                  boogtype=boog_r)
        sporterboog.save()
        score_indiv_ag_opslaan(sporterboog, 18, 5.678, None, "")

        # probeer 100024 te verwijderen
        f1 = io.StringIO()
        f2 = io.StringIO()
        with self.assert_max_queries(40):
            management.call_command('import_nhb_crm', './NhbStructuur/management/testfiles/testfile_16.json',
                                    '--sim_now=2020-07-01', stderr=f1, stdout=f2)
        # print("f1: %s" % f1.getvalue())
        # print("f2: %s" % f2.getvalue())
        self.assertTrue("[INFO] Lid 100024 Voornaam van der Achternaam [V, 2000] wordt nu verwijderd" in f2.getvalue())
        self.assertTrue('[ERROR] Onverwachte fout bij het verwijderen van een lid' in f1.getvalue())
    def setUp(self):
        """ initialisatie van de test case """
        self.account_admin = self.e2e_create_account_admin()
        self.account_normaal = self.e2e_create_account('normaal',
                                                       '*****@*****.**',
                                                       'Normaal')
        self.account_hwl = self.e2e_create_account('hwl', '*****@*****.**',
                                                   'Secretaris')
        self.e2e_account_accepteert_vhpg(self.account_hwl)

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

        self.functie_hwl = maak_functie('HWL 1000', 'HWL')
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()
        self.functie_hwl.accounts.add(self.account_hwl)

        # 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.sporter_100001 = sporter

        self.boog_r = BoogType.objects.get(afkorting='R')
        self.boog_c = BoogType.objects.get(afkorting='C')

        # maak 2 schutterboog aan
        sporterboog = SporterBoog(sporter=sporter,
                                  boogtype=self.boog_c,
                                  voor_wedstrijd=True)
        sporterboog.save()
        self.sporterboog_100001c = sporterboog

        sporterboog = SporterBoog(sporter=sporter,
                                  boogtype=self.boog_r,
                                  voor_wedstrijd=True)
        sporterboog.save()
        self.sporterboog_100001r = sporterboog

        # maak een AG aan
        score_indiv_ag_opslaan(sporterboog, 18, 9.123, None, 'test melding')

        score_indiv_ag_opslaan(sporterboog, 25, 9.251, self.account_hwl,
                               'test melding')

        self._maak_uitslag(sporterboog)
示例#3
0
    def setUp(self):
        """ initialisatie van de test case """
        self.account_normaal = self.e2e_create_account('normaal',
                                                       '*****@*****.**',
                                                       'Normaal')

        # maak een test lid aan
        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.save()

        # maak een sporterboog aan
        self.sporterboog = SporterBoog(
            boogtype=BoogType.objects.get(afkorting='R'), sporter=sporter)
        self.sporterboog.save()
示例#4
0
    def _regioschutters_inschrijven(self):

        boog_c = BoogType.objects.get(afkorting='C')

        klasse_r = CompetitieKlasse.objects.filter(indiv__boogtype__afkorting='R',
                                                   indiv__is_onbekend=False,
                                                   indiv__niet_voor_rk_bk=False)[0]

        klasse_c = CompetitieKlasse.objects.filter(indiv__boogtype__afkorting='C',
                                                   indiv__is_onbekend=False,
                                                   indiv__niet_voor_rk_bk=False)[0]

        # recurve, lid 1
        RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_101,
                                    sporterboog=self.sporterboog,
                                    bij_vereniging=self.sporterboog.sporter.bij_vereniging,
                                    klasse=klasse_r,
                                    aantal_scores=7).save()

        # compound, lid 1
        sporterboog = SporterBoog(sporter=self.lid_sporter_1,
                                  boogtype=boog_c,
                                  voor_wedstrijd=True)
        sporterboog.save()

        RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_101,
                                    sporterboog=sporterboog,
                                    bij_vereniging=sporterboog.sporter.bij_vereniging,
                                    klasse=klasse_c,
                                    aantal_scores=6).save()

        # compound, lid2
        sporterboog = SporterBoog(sporter=self.lid_sporter_2,
                                  boogtype=boog_c,
                                  voor_wedstrijd=True)
        sporterboog.save()

        RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_101,
                                    sporterboog=sporterboog,
                                    bij_vereniging=sporterboog.sporter.bij_vereniging,
                                    klasse=klasse_c,
                                    aantal_scores=6).save()
    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self.regio_111 = NhbRegio.objects.get(regio_nr=111)

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

        # maak de SEC functie
        self.functie_sec = maak_functie("SEC test", "SEC")
        self.functie_sec.nhb_ver = ver
        self.functie_sec.save()

        # maak de HWL functie
        self.functie_hwl = maak_functie("HWL test", "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        # maak de WL functie
        self.functie_wl = maak_functie("WL test", "WL")
        self.functie_wl.nhb_ver = ver
        self.functie_wl.save()

        # maak het lid aan dat WL wordt
        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
        sporter.save()

        self.account_wl = self.e2e_create_account(sporter.lid_nr, sporter.email, sporter.voornaam, accepteer_vhpg=True)
        self.functie_wl.accounts.add(self.account_wl)

        sporter.account = self.account_wl
        sporter.save()
        self.sporter_100001 = sporter

        boog_r = BoogType.objects.get(afkorting='R')
        sporterboog = SporterBoog(sporter=sporter,
                                  boogtype=boog_r,
                                  voor_wedstrijd=True)
        sporterboog.save()
        self.sporterboog_100001 = sporterboog

        voorkeuren = SporterVoorkeuren(sporter=self.sporter_100001,
                                       opmerking_para_sporter="test para opmerking")
        voorkeuren.save()

        # maak een jeugdlid aan
        sporter = Sporter()
        sporter.lid_nr = 100002
        sporter.geslacht = "V"
        sporter.voornaam = "Ramona"
        sporter.achternaam = "de Jeugdschutter"
        sporter.email = ""
        sporter.geboorte_datum = datetime.date(year=2010, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2010, month=11, day=12)
        sporter.bij_vereniging = ver
        sporter.save()
        self.sporter_100002 = sporter

        # maak nog een jeugdlid aan, in dezelfde leeftijdsklasse
        sporter = Sporter()
        sporter.lid_nr = 100012
        sporter.geslacht = "V"
        sporter.voornaam = "Andrea"
        sporter.achternaam = "de Jeugdschutter"
        sporter.email = ""
        sporter.geboorte_datum = datetime.date(year=2010, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2010, month=10, day=10)
        sporter.bij_vereniging = ver
        sporter.save()
        self.sporter_100012 = sporter

        # maak het lid aan dat HWL wordt
        sporter = Sporter()
        sporter.lid_nr = 100003
        sporter.geslacht = "V"
        sporter.voornaam = "Ramona"
        sporter.achternaam = "de Testerin"
        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_hwl = self.e2e_create_account(sporter.lid_nr, sporter.email, sporter.voornaam, accepteer_vhpg=True)
        self.functie_hwl.accounts.add(self.account_hwl)

        sporter.account = self.account_hwl
        sporter.save()
        self.sporter_100003 = sporter

        # maak het lid aan dat SEC wordt
        sporter = Sporter()
        sporter.lid_nr = 100004
        sporter.geslacht = "M"
        sporter.voornaam = "Ramon"
        sporter.achternaam = "de Secretaris"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=1971, month=5, day=28)
        sporter.sinds_datum = datetime.date(year=2000, month=1, day=31)
        sporter.bij_vereniging = ver
        sporter.save()

        self.account_sec = self.e2e_create_account(sporter.lid_nr, sporter.email, sporter.voornaam, accepteer_vhpg=True)
        self.functie_sec.accounts.add(self.account_sec)

        sporter.account = self.account_sec
        sporter.save()
        self.lid_100004 = sporter

        # maak een lid aan van een andere vereniging
        # maak een test vereniging
        ver2 = NhbVereniging()
        ver2.naam = "Andere Club"
        ver2.ver_nr = "1222"
        ver2.regio = self.regio_111
        # secretaris kan nog niet ingevuld worden
        ver2.save()
        self.nhbver2 = ver2

        # BB worden
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.e2e_check_rol('BB')

        # maak de competitie aan die nodig is voor deze tests
        self._maak_competitie()
        self._maak_wedstrijden()
        self._maak_inschrijvingen()
示例#6
0
class TestScoreOpslaan(E2EHelpers, TestCase):
    """ tests voor de Score applicatie, functie Opslaan """
    def setUp(self):
        """ initialisatie van de test case """
        self.account_normaal = self.e2e_create_account('normaal',
                                                       '*****@*****.**',
                                                       'Normaal')

        # maak een test lid aan
        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.save()

        # maak een sporterboog aan
        self.sporterboog = SporterBoog(
            boogtype=BoogType.objects.get(afkorting='R'), sporter=sporter)
        self.sporterboog.save()

    def test_opslaan(self):
        self.assertEqual(Score.objects.count(), 0)
        self.assertEqual(ScoreHist.objects.count(), 0)

        afstand = 18
        gemiddelde = 9.876
        waarde = int(gemiddelde * 1000)
        account = self.account_normaal
        notitie = "Dit is een notities"

        # de eerste keer wordt het Score object aangemaakt
        res = score_indiv_ag_opslaan(self.sporterboog, afstand, gemiddelde,
                                     account, notitie)
        self.assertEqual(res, True)

        self.assertEqual(Score.objects.count(), 1)
        score = Score.objects.all()[0]
        self.assertEqual(score.afstand_meter, afstand)
        self.assertEqual(score.waarde, waarde)
        self.assertEqual(score.sporterboog, self.sporterboog)
        self.assertTrue(str(score) != "")

        score.type = SCORE_TYPE_GEEN
        self.assertTrue("(geen score)" in str(score))

        score.type = SCORE_TYPE_INDIV_AG
        self.assertTrue("(indiv AG)" in str(score))

        score.type = SCORE_TYPE_TEAM_AG
        self.assertTrue("(team AG)" in str(score))

        score.type = SCORE_TYPE_SCORE
        self.assertTrue(str(score) != "")

        self.assertEqual(ScoreHist.objects.count(), 1)
        scorehist = ScoreHist.objects.all()[0]
        self.assertEqual(scorehist.oude_waarde, 0)
        self.assertEqual(scorehist.nieuwe_waarde, waarde)
        self.assertEqual(scorehist.door_account, account)
        self.assertEqual(scorehist.notitie, notitie)
        self.assertTrue(str(scorehist) != "")

        # dezelfde score nog een keer opslaan resulteert in een reject
        res = score_indiv_ag_opslaan(self.sporterboog, afstand, gemiddelde,
                                     account, notitie)
        self.assertEqual(res, False)

        # tweede keer wordt er alleen een ScoreHist object aangemaakt
        gemiddelde2 = 8.765
        waarde2 = int(gemiddelde2 * 1000)
        notitie2 = "Dit is de tweede notitie"

        res = score_indiv_ag_opslaan(self.sporterboog, afstand, gemiddelde2,
                                     account, notitie2)
        self.assertEqual(res, True)

        self.assertEqual(Score.objects.count(), 1)
        score = Score.objects.all()[0]
        self.assertEqual(score.afstand_meter, afstand)
        self.assertEqual(score.waarde, waarde2)
        self.assertEqual(score.sporterboog, self.sporterboog)

        self.assertEqual(ScoreHist.objects.count(), 2)
        scorehist = ScoreHist.objects.exclude(pk=scorehist.pk).all()[0]
        self.assertEqual(scorehist.oude_waarde, waarde)
        self.assertEqual(scorehist.nieuwe_waarde, waarde2)
        self.assertEqual(scorehist.door_account, account)
        self.assertEqual(scorehist.notitie, notitie2)

        gemiddelde = 8.345
        res = score_teams_ag_opslaan(self.sporterboog, afstand, gemiddelde,
                                     account, notitie)
        self.assertEqual(res, True)

        self.assertEqual(ScoreHist.objects.count(), 3)
        scorehist = ScoreHist.objects.get(score__waarde=8345)
        score = scorehist.score
        self.assertTrue('(team AG)' in str(score))

        score.sporterboog = None
        self.assertTrue(str(score) != '')

    def test_wanneer(self):
        res = wanneer_ag_vastgesteld(18)
        self.assertIsNone(res)

        score_indiv_ag_opslaan(self.sporterboog, 18, 9.123, None, "test")

        res = wanneer_ag_vastgesteld(18)
        self.assertIsNotNone(res)
示例#7
0
    def _maak_leden(self):
        """
            Maak voor elke vereniging een aantal leden aan: een mix van alle wedstrijdklassen en boogtypen.

            Aspirant <13, Aspirant 13-14, Cadet 15-17, Junior 18-20, Senior 21-49, Master 50-59, Veteraan 60+
        """

        huidige_jaar = timezone.now().year
        lid_sinds_datum = datetime.date(year=huidige_jaar - 1,
                                        month=11,
                                        day=12)

        soorten = [
            # wedstrijdleeftijd, geslacht, voornaam, boogtype, account
            (10, 'M', 'Asp10', 'R', False),
            (10, 'V', 'Asp10', 'R', False),
            (11, 'M', 'Asp11', 'R', False),
            (12, 'V', 'Asp12', 'R', False),
            (13, 'M', 'Asp13', 'R', False),
            (14, 'M', 'Cad14', 'R', False),
            (14, 'M', 'Cad14b', 'C', False),
            (14, 'M', 'Cad15', 'c',
             False),  # kleine letter: geen voorkeur voor de competitie
            (15, 'V', 'Cad15', 'R', False),
            (15, 'M', 'Cad15b', 'BB', False),
            (15, 'V', 'Cad15b', 'C', False),
            (16, 'M', 'Cad16', 'R', False),
            (16, 'M', 'Cad16b', 'C', False),
            (16, 'M', 'Cad16c', 'BB', False),
            (17, 'V', 'Cad17', 'R', True),  # account
            (17, 'V', 'Cad17b', 'C', False),
            (17, 'V', 'Cad17c', 'BB', False),
            (18, 'M', 'Jun18', 'R', False),
            (18, 'M', 'Jun18b', 'C', False),
            (18, 'M', 'Jun18c', 'BB', False),
            (18, 'V', 'Jun18', 'BB', False),
            (19, 'V', 'Jun19', 'R', False),
            (19, 'V', 'Jun19b', 'C', True),  # account
            (20, 'M', 'Jun20', 'R', False),
            (20, 'M', 'Jun20b', 'LB', False),
            (21, 'V', 'Sen21', 'R', False),
            (21, 'V', 'Sen21b', 'C', False),
            (22, 'M', 'Sen22', 'R', False),
            (22, 'M', 'Sen22b', 'C', False),
            (22, 'M', 'Sen23', 'r',
             False),  # kleine letter: geen voorkeur voor de competitie
            (31, 'V', 'Sen31', 'R', False),
            (32, 'M', 'Sen32', 'C', False),
            (32, 'M', 'Sen32b', 'BB', True),  # account
            (33, 'V', 'Sen33', 'R', False),
            (33, 'V', 'Sen33b', 'BB', False),
            (34, 'M', 'Sen34', 'LB', True),  # Sen34 = HWL
            (35, 'V', 'Sen35', 'R', False),
            (36, 'M', 'Sen36', 'C', False),
            (36, 'M', 'Sen36b', 'BB', False),
            (37, 'V', 'Sen37', 'R', False),
            (38, 'M', 'Sen38', 'LB', False),
            (39, 'V', 'Sen39', 'R', True),  # Sen39 = BKO/RKO/RCL
            (40, 'M', 'Sen40', 'C', False),
            (41, 'V', 'Sen41', 'R', False),
            (42, 'M', 'Sen42', 'R', False),
            (42, 'M', 'Sen42b', 'C', False),
            (49, 'V', 'Sen49', 'R', False),
            (49, 'V', 'Sen49b', 'BB', False),
            (50, 'M', 'Mas50', 'R', True),  # Mas50 = SEC
            (51, 'V', 'Mas51', 'R', True),  # account
            (51, 'V', 'Mas51b', 'C', False),
            (51, 'V', 'Mas52', 'r',
             False),  # kleine letter: geen voorkeur voor de competitie
            (59, 'M', 'Mas59', 'R', False),
            (59, 'M', 'Mas59b', 'LB', False),
            (60, 'V', 'Vet60', 'R', False),
            (60, 'V', 'Vet60b', 'C', False),
            (60, 'V', 'Vet60c', 'LB', True),  # account
            (61, 'M', 'Vet61', 'C', False),
            (61, 'M', 'Vet61b', 'C', False),
            (80, 'V', 'Vet80', 'R', False),
        ]

        geslacht_voornaam2boogtype = dict()
        for _, geslacht, voornaam, boogtype, _ in soorten:
            try:
                _ = geslacht_voornaam2boogtype[geslacht + voornaam]
            except KeyError:
                geslacht_voornaam2boogtype[geslacht + voornaam] = boogtype
            else:
                raise IndexError(
                    'TestData: combinatie geslacht %s + voornaam %s komt meerdere keren voor'
                    % (geslacht, voornaam))  # pragma: no cover
        # for

        # maak voor elke vereniging een paar accounts aan
        lid_nr = 300000
        bulk = list()
        for ver in self.vereniging.values():
            self.regio_ver_nrs[ver.regio.regio_nr] = ver.ver_nr

            for _, _, voornaam, _, maak_account in soorten:
                lid_nr += 1

                if maak_account:
                    account = Account(username=str(lid_nr),
                                      otp_code=self.OTP_CODE,
                                      otp_is_actief=True)
                    account.set_password(self.WACHTWOORD)
                    bulk.append(account)

                    if len(bulk) > 100:  # pragma: no branch
                        Account.objects.bulk_create(bulk)

                        # maak e-mails aan
                        bulk2 = list()
                        for account in bulk:
                            # let op: e-mailadres moet overeenkomen met het Sporter.email
                            email = AccountEmail(
                                account=account,
                                email_is_bevestigd=True,
                                bevestigde_email='*****@*****.**' %
                                account.username)
                            bulk2.append(email)
                        # for

                        AccountEmail.objects.bulk_create(bulk2)
                        del bulk2

                        bulk = list()
            # for
        # for

        if len(bulk) > 0:  # pragma: no branch
            Account.objects.bulk_create(bulk)

            # maak e-mails aan
            bulk2 = list()
            for account in bulk:
                email = AccountEmail(account=account,
                                     email_is_bevestigd=True,
                                     bevestigde_email='*****@*****.**' %
                                     account.username)
                bulk2.append(email)
            # for

            AccountEmail.objects.bulk_create(bulk2)
            del bulk2

        del bulk

        # cache de aangemaakte accounts
        lid_nr2account = dict()
        for account in Account.objects.all():
            lid_nr2account[account.username] = account
        # for

        lid_nr = 300000
        bulk = list()
        for ver in self.vereniging.values():

            self.ver_sporters[ver.ver_nr] = list()
            self.ver_sporters_met_account[ver.ver_nr] = list()

            for wleeftijd, geslacht, voornaam, _, _ in soorten:
                lid_nr += 1
                achternaam = "Lid%s van Club%s" % (ver.ver_nr, lid_nr)
                geboortedatum = datetime.date(year=huidige_jaar - wleeftijd,
                                              month=3,
                                              day=24)

                try:
                    account = lid_nr2account[str(lid_nr)]
                except KeyError:
                    account = None

                sporter = Sporter(lid_nr=lid_nr,
                                  voornaam=voornaam,
                                  achternaam=achternaam,
                                  unaccented_naam=voornaam + ' ' + achternaam,
                                  email='*****@*****.**' % lid_nr,
                                  geboorte_datum=geboortedatum,
                                  geslacht=geslacht,
                                  para_classificatie='',
                                  is_actief_lid=True,
                                  sinds_datum=lid_sinds_datum,
                                  bij_vereniging=ver,
                                  account=account,
                                  lid_tot_einde_jaar=huidige_jaar)
                bulk.append(sporter)

                if len(bulk) > 250:  # pragma: no branch
                    Sporter.objects.bulk_create(bulk)
                    bulk = list()
            # for
        # for

        if len(bulk) > 0:  # pragma: no branch
            Sporter.objects.bulk_create(bulk)
        del bulk
        del lid_nr2account

        # maak voor elke Sporter nu de SporterBoog records aan
        boogtypen = self.afkorting2boogtype.values()

        bulk_voorkeuren = list()
        bulk_sporter = list()
        for sporter in (Sporter.objects.select_related(
                'account', 'bij_vereniging').all()):

            ver_nr = sporter.bij_vereniging.ver_nr

            self.ver_sporters[ver_nr].append(sporter)
            if sporter.account:
                self.ver_sporters_met_account[ver_nr].append(sporter)

            gewenst_boogtype = geslacht_voornaam2boogtype[sporter.geslacht +
                                                          sporter.voornaam]

            # voorkeuren
            voorkeuren = SporterVoorkeuren(sporter=sporter)

            if gewenst_boogtype.islower():
                voorkeuren.voorkeur_meedoen_competitie = False
                gewenst_boogtype = gewenst_boogtype.upper()

            # alle junioren willen een eigen blazoen
            if gewenst_boogtype == 'R' and sporter.voornaam.startswith('Jun'):
                voorkeuren.voorkeur_eigen_blazoen = True

            bulk_voorkeuren.append(voorkeuren)
            if len(bulk_voorkeuren) > 100:
                SporterVoorkeuren.objects.bulk_create(bulk_voorkeuren)
                bulk_voorkeuren = list()

            # sporterboog
            for boogtype in boogtypen:
                sporterboog = SporterBoog(
                    sporter=sporter,
                    # heeft_interesse=True
                    # voor_wedstrijd=False
                    boogtype=boogtype)

                if boogtype.afkorting == gewenst_boogtype:
                    sporterboog.voor_wedstrijd = True

                bulk_sporter.append(sporterboog)

                if len(bulk_sporter) > 250:
                    SporterBoog.objects.bulk_create(bulk_sporter)
                    bulk_sporter = list()
            # for
        # for

        if len(bulk_voorkeuren):  # pragma: no branch
            SporterVoorkeuren.objects.bulk_create(bulk_voorkeuren)
        del bulk_voorkeuren

        if len(bulk_sporter):  # pragma: no branch
            SporterBoog.objects.bulk_create(bulk_sporter)
        del bulk_sporter
示例#8
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()
示例#9
0
    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self._next_lid_nr = 100001

        self.rayon_1 = NhbRayon.objects.get(rayon_nr=1)
        self.rayon_2 = NhbRayon.objects.get(rayon_nr=2)
        self.regio_101 = NhbRegio.objects.get(regio_nr=101)
        self.regio_105 = NhbRegio.objects.get(regio_nr=105)
        self.regio_112 = NhbRegio.objects.get(regio_nr=112)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Zuidelijke Club"
        ver.ver_nr = "1111"
        ver.regio = self.regio_112
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.nhbver_112 = ver

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

        loc = WedstrijdLocatie(banen_18m=1,
                               banen_25m=1,
                               adres='De Spanning 1, Houtdorp')
        loc.save()
        loc.verenigingen.add(ver)
        self.loc = loc

        # maak HWL functie aan voor deze vereniging
        self.functie_hwl = maak_functie("HWL Vereniging %s" % ver.ver_nr, "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        # maak test leden aan die we kunnen koppelen aan beheerders functies
        self.account_bko_18 = self._prep_beheerder_lid('BKO')
        self.account_rko1_18 = self._prep_beheerder_lid('RKO1')
        self.account_rko2_18 = self._prep_beheerder_lid('RKO2')
        self.account_rcl101_18 = self._prep_beheerder_lid('RCL101')
        self.account_rcl101_25 = self._prep_beheerder_lid('RCL101-25')
        self.account_rcl112_18 = self._prep_beheerder_lid('RCL112')
        self.account_schutter = self._prep_beheerder_lid('Schutter')
        self.lid_sporter_1 = Sporter.objects.get(lid_nr=self.account_schutter.username)

        self.account_schutter2 = self._prep_beheerder_lid('Schutter2')
        self.lid_sporter_2 = Sporter.objects.get(lid_nr=self.account_schutter2.username)

        self.boog_r = BoogType.objects.get(afkorting='R')

        self.sporterboog = SporterBoog(sporter=self.lid_sporter_1,
                                       boogtype=self.boog_r,
                                       voor_wedstrijd=True)
        self.sporterboog.save()

        # creëer een competitie met deelcompetities
        competities_aanmaken(jaar=2019)

        self.comp_18 = Competitie.objects.get(afstand='18')
        self.comp_25 = Competitie.objects.get(afstand='25')

        # klassengrenzen vaststellen om de competitie voorbij fase A te krijgen
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.url_klassengrenzen_vaststellen_18 = '/bondscompetities/%s/klassengrenzen/vaststellen/' % self.comp_18.pk
        resp = self.client.post(self.url_klassengrenzen_vaststellen_18)
        self.assert_is_redirect_not_plein(resp)  # check for success

        self.deelcomp_bond_18 = DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                              laag=LAAG_BK)[0]
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                                laag=LAAG_RK,
                                                                nhb_rayon=self.rayon_1)[0]
        self.deelcomp_regio_101 = DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                                laag=LAAG_REGIO,
                                                                nhb_regio=self.regio_101)[0]

        self.functie_bko_18 = self.deelcomp_bond_18.functie
        self.functie_bko_18.accounts.add(self.account_bko_18)

        self.functie_rko1_18 = self.deelcomp_rayon1_18.functie
        self.functie_rko1_18.accounts.add(self.account_rko1_18)

        # maak nog een test vereniging, zonder HWL functie
        ver = NhbVereniging()
        ver.naam = "Kleine Club"
        ver.ver_nr = "1100"
        ver.regio = self.regio_101
        # secretaris kan nog niet ingevuld worden
        ver.save()
示例#10
0
class TestCompetitiePlanningBond(E2EHelpers, TestCase):

    """ tests voor de Competitie applicatie, planning voor het BK """

    test_after = ('Competitie.test_fase', 'Competitie.test_beheerders', 'Competitie.test_competitie')

    url_doorzetten_rk = '/bondscompetities/%s/doorzetten/rk/'  # comp_pk
    url_doorzetten_bk = '/bondscompetities/%s/doorzetten/bk/'  # comp_pk

    testdata = None

    @classmethod
    def setUpTestData(cls):
        cls.testdata = testdata.TestData()
        cls.testdata.maak_accounts()

    def _prep_beheerder_lid(self, voornaam):
        lid_nr = self._next_lid_nr
        self._next_lid_nr += 1

        sporter = Sporter(
                    lid_nr=lid_nr,
                    geslacht="M",
                    voornaam=voornaam,
                    achternaam="Tester",
                    email=voornaam.lower() + "@nhb.test",
                    geboorte_datum=datetime.date(year=1972, month=3, day=4),
                    sinds_datum=datetime.date(year=2010, month=11, day=12),
                    bij_vereniging=self.nhbver_101)
        sporter.save()

        return self.e2e_create_account(lid_nr, sporter.email, sporter.voornaam, accepteer_vhpg=True)

    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self._next_lid_nr = 100001

        self.rayon_1 = NhbRayon.objects.get(rayon_nr=1)
        self.rayon_2 = NhbRayon.objects.get(rayon_nr=2)
        self.regio_101 = NhbRegio.objects.get(regio_nr=101)
        self.regio_105 = NhbRegio.objects.get(regio_nr=105)
        self.regio_112 = NhbRegio.objects.get(regio_nr=112)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Zuidelijke Club"
        ver.ver_nr = "1111"
        ver.regio = self.regio_112
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.nhbver_112 = ver

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

        loc = WedstrijdLocatie(banen_18m=1,
                               banen_25m=1,
                               adres='De Spanning 1, Houtdorp')
        loc.save()
        loc.verenigingen.add(ver)
        self.loc = loc

        # maak HWL functie aan voor deze vereniging
        self.functie_hwl = maak_functie("HWL Vereniging %s" % ver.ver_nr, "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        # maak test leden aan die we kunnen koppelen aan beheerders functies
        self.account_bko_18 = self._prep_beheerder_lid('BKO')
        self.account_rko1_18 = self._prep_beheerder_lid('RKO1')
        self.account_rko2_18 = self._prep_beheerder_lid('RKO2')
        self.account_rcl101_18 = self._prep_beheerder_lid('RCL101')
        self.account_rcl101_25 = self._prep_beheerder_lid('RCL101-25')
        self.account_rcl112_18 = self._prep_beheerder_lid('RCL112')
        self.account_schutter = self._prep_beheerder_lid('Schutter')
        self.lid_sporter_1 = Sporter.objects.get(lid_nr=self.account_schutter.username)

        self.account_schutter2 = self._prep_beheerder_lid('Schutter2')
        self.lid_sporter_2 = Sporter.objects.get(lid_nr=self.account_schutter2.username)

        self.boog_r = BoogType.objects.get(afkorting='R')

        self.sporterboog = SporterBoog(sporter=self.lid_sporter_1,
                                       boogtype=self.boog_r,
                                       voor_wedstrijd=True)
        self.sporterboog.save()

        # creëer een competitie met deelcompetities
        competities_aanmaken(jaar=2019)

        self.comp_18 = Competitie.objects.get(afstand='18')
        self.comp_25 = Competitie.objects.get(afstand='25')

        # klassengrenzen vaststellen om de competitie voorbij fase A te krijgen
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.url_klassengrenzen_vaststellen_18 = '/bondscompetities/%s/klassengrenzen/vaststellen/' % self.comp_18.pk
        resp = self.client.post(self.url_klassengrenzen_vaststellen_18)
        self.assert_is_redirect_not_plein(resp)  # check for success

        self.deelcomp_bond_18 = DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                              laag=LAAG_BK)[0]
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                                laag=LAAG_RK,
                                                                nhb_rayon=self.rayon_1)[0]
        self.deelcomp_regio_101 = DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                                laag=LAAG_REGIO,
                                                                nhb_regio=self.regio_101)[0]

        self.functie_bko_18 = self.deelcomp_bond_18.functie
        self.functie_bko_18.accounts.add(self.account_bko_18)

        self.functie_rko1_18 = self.deelcomp_rayon1_18.functie
        self.functie_rko1_18.accounts.add(self.account_rko1_18)

        # maak nog een test vereniging, zonder HWL functie
        ver = NhbVereniging()
        ver.naam = "Kleine Club"
        ver.ver_nr = "1100"
        ver.regio = self.regio_101
        # secretaris kan nog niet ingevuld worden
        ver.save()

    def _regioschutters_inschrijven(self):

        boog_c = BoogType.objects.get(afkorting='C')

        klasse_r = CompetitieKlasse.objects.filter(indiv__boogtype__afkorting='R',
                                                   indiv__is_onbekend=False,
                                                   indiv__niet_voor_rk_bk=False)[0]

        klasse_c = CompetitieKlasse.objects.filter(indiv__boogtype__afkorting='C',
                                                   indiv__is_onbekend=False,
                                                   indiv__niet_voor_rk_bk=False)[0]

        # recurve, lid 1
        RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_101,
                                    sporterboog=self.sporterboog,
                                    bij_vereniging=self.sporterboog.sporter.bij_vereniging,
                                    klasse=klasse_r,
                                    aantal_scores=7).save()

        # compound, lid 1
        sporterboog = SporterBoog(sporter=self.lid_sporter_1,
                                  boogtype=boog_c,
                                  voor_wedstrijd=True)
        sporterboog.save()

        RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_101,
                                    sporterboog=sporterboog,
                                    bij_vereniging=sporterboog.sporter.bij_vereniging,
                                    klasse=klasse_c,
                                    aantal_scores=6).save()

        # compound, lid2
        sporterboog = SporterBoog(sporter=self.lid_sporter_2,
                                  boogtype=boog_c,
                                  voor_wedstrijd=True)
        sporterboog.save()

        RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_101,
                                    sporterboog=sporterboog,
                                    bij_vereniging=sporterboog.sporter.bij_vereniging,
                                    klasse=klasse_c,
                                    aantal_scores=6).save()

    def test_doorzetten_rk(self):
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wissel_naar_functie(self.functie_bko_18)

        url = self.url_doorzetten_rk % self.comp_18.pk

        # fase F: pagina zonder knop 'doorzetten'
        zet_competitie_fase(self.comp_18, 'F')
        self.comp_18.bepaal_fase()
        self.assertEqual(self.comp_18.fase, 'F')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)     # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('competitie/bko-doorzetten-naar-rk.dtl', 'plein/site_layout.dtl'))

        # sluit alle deelcompetitie regio
        for obj in DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                 is_afgesloten=False,
                                                 laag=LAAG_REGIO):
            obj.is_afgesloten = True
            obj.save()
        # for

        # fase G: pagina met knop 'doorzetten'
        zet_competitie_fase(self.comp_18, 'G')
        self.comp_18.bepaal_fase()
        self.assertEqual(self.comp_18.fase, 'G')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)     # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('competitie/bko-doorzetten-naar-rk.dtl', 'plein/site_layout.dtl'))

        # nu echt doorzetten
        self._regioschutters_inschrijven()

        self.assertEqual(3, RegioCompetitieSchutterBoog.objects.count())
        self.assertEqual(0, KampioenschapSchutterBoog.objects.count())

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect(resp, '/bondscompetities/')       # redirect = Success

        # laat de mutatie verwerken
        management.call_command('regiocomp_mutaties', '1', '--quick', stderr=io.StringIO(), stdout=io.StringIO())

        self.assertEqual(3, KampioenschapSchutterBoog.objects.count())

    def test_doorzetten_rk_geen_lid(self):
        # variant van doorzetten_rk met een lid dat niet meer bij een vereniging aangesloten is
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wissel_naar_functie(self.functie_bko_18)

        # fase F: pagina zonder knop 'doorzetten'
        zet_competitie_fase(self.comp_18, 'F')

        # sluit alle deelcompetitie regio
        for obj in DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                 is_afgesloten=False,
                                                 laag=LAAG_REGIO):
            obj.is_afgesloten = True
            obj.save()
        # for

        # fase G: pagina met knop 'doorzetten'
        zet_competitie_fase(self.comp_18, 'G')

        # nu echt doorzetten
        self._regioschutters_inschrijven()

        self.assertEqual(3, RegioCompetitieSchutterBoog.objects.count())
        self.assertEqual(0, KampioenschapSchutterBoog.objects.count())

        self.lid_sporter_2.bij_vereniging = None
        self.lid_sporter_2.save()

        url = self.url_doorzetten_rk % self.comp_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect(resp, '/bondscompetities/')       # redirect = Success

        # laat de mutatie verwerken
        management.call_command('regiocomp_mutaties', '1', '--quick', stderr=io.StringIO(), stdout=io.StringIO())

        # het lid zonder vereniging komt NIET in de RK selectie
        self.assertEqual(2, KampioenschapSchutterBoog.objects.count())

        # verdere tests in test_planning_rayon.test_geen_vereniging check

    def test_doorzetten_bk(self):
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wissel_naar_functie(self.functie_bko_18)

        url = self.url_doorzetten_bk % self.comp_18.pk

        # fase M: pagina zonder knop 'doorzetten'
        zet_competitie_fase(self.comp_18, 'M')
        self.comp_18.bepaal_fase()
        self.assertEqual(self.comp_18.fase, 'M')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)     # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('competitie/bko-doorzetten-naar-bk.dtl', 'plein/site_layout.dtl'))

        # alle rayonkampioenschappen afsluiten
        for obj in DeelCompetitie.objects.filter(competitie=self.comp_18,
                                                 is_afgesloten=False,
                                                 laag=LAAG_RK):
            obj.is_afgesloten = True
            obj.save()
        # for

        # fase N: pagina met knop 'doorzetten'
        zet_competitie_fase(self.comp_18, 'N')
        self.comp_18.bepaal_fase()
        self.assertEqual(self.comp_18.fase, 'N')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)     # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('competitie/bko-doorzetten-naar-bk.dtl', 'plein/site_layout.dtl'))

        # nu echt doorzetten
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect(resp, '/bondscompetities/')       # redirect = Success

        self.assertTrue(str(self.deelcomp_bond_18) != '')

        deelcomp_bk_18 = DeelCompetitie.objects.get(competitie=self.comp_18,
                                                    laag=LAAG_BK)
        objs = KampioenschapSchutterBoog.objects.filter(deelcompetitie=deelcomp_bk_18)
        self.assertEqual(objs.count(), 0)       # worden nog niet gemaakt, dus 0

        team_klasse = CompetitieKlasse.objects.filter(indiv=None)[0]
        deeln_bk = KampioenschapSchutterBoog(deelcompetitie=deelcomp_bk_18,
                                             sporterboog=self.sporterboog,
                                             klasse=team_klasse)
        self.assertTrue(str(deeln_bk) != '')

    def test_doorzetten_bad(self):
        # moet BKO zijn
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()

        with self.assert_max_queries(20):
            resp = self.client.get(self.url_doorzetten_rk % 999999)
        self.assert403(resp)

        with self.assert_max_queries(20):
            resp = self.client.get(self.url_doorzetten_bk % 999999)
        self.assert403(resp)

        # niet bestaande comp_pk
        self.e2e_wissel_naar_functie(self.functie_bko_18)

        with self.assert_max_queries(20):
            resp = self.client.get(self.url_doorzetten_rk % 999999)
        self.assert404(resp)     # 404 = Not found/allowed

        with self.assert_max_queries(20):
            resp = self.client.post(self.url_doorzetten_rk % 999999)
        self.assert404(resp)     # 404 = Not found/allowed

        with self.assert_max_queries(20):
            resp = self.client.get(self.url_doorzetten_bk % 999999)
        self.assert404(resp)     # 404 = Not found/allowed

        with self.assert_max_queries(20):
            resp = self.client.post(self.url_doorzetten_bk % 999999)
        self.assert404(resp)     # 404 = Not found/allowed

        # juiste comp_pk maar verkeerde fase
        zet_competitie_fase(self.comp_18, 'C')
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_doorzetten_rk % self.comp_18.pk)
        self.assert404(resp)     # 404 = Not found/allowed

        with self.assert_max_queries(20):
            resp = self.client.post(self.url_doorzetten_rk % self.comp_18.pk)
        self.assert404(resp)     # 404 = Not found/allowed

        with self.assert_max_queries(20):
            resp = self.client.get(self.url_doorzetten_bk % self.comp_18.pk)
        self.assert404(resp)     # 404 = Not found/allowed

        with self.assert_max_queries(20):
            resp = self.client.post(self.url_doorzetten_bk % self.comp_18.pk)
        self.assert404(resp)     # 404 = Not found/allowed
示例#11
0
class TestCompRayonPlanning(E2EHelpers, TestCase):
    """ tests voor de CompRayon applicatie, Planning functie """

    test_after = ('Competitie.test_fase', 'Competitie.test_beheerders',
                  'Competitie.test_competitie')

    url_planning_rayon = '/bondscompetities/rk/planning/%s/'  # deelcomp_pk
    url_wijzig_rk_wedstrijd = '/bondscompetities/rk/planning/wedstrijd/wijzig/%s/'  # wedstrijd_pk
    url_verwijder_rk_wedstrijd = '/bondscompetities/rk/planning/wedstrijd/verwijder/%s/'  # wedstrijd_pk
    url_lijst_rk = '/bondscompetities/rk/lijst-rayonkampioenschappen/%s/'  # deelcomp_pk
    url_lijst_bestand = '/bondscompetities/rk/lijst-rayonkampioenschappen/%s/bestand/'  # deelcomp_pk
    url_wijzig_status = '/bondscompetities/rk/lijst-rayonkampioenschappen/wijzig-status-rk-deelnemer/%s/'  # deelnemer_pk
    url_wijzig_limiet = '/bondscompetities/rk/planning/%s/limieten/'  # deelcomp_pk
    url_doorzetten_rk = '/bondscompetities/%s/doorzetten/rk/'  # comp_pk

    testdata = None

    @classmethod
    def setUpTestData(cls):
        cls.testdata = testdata.TestData()
        cls.testdata.maak_accounts()

    def _dummy_sleep(self, duration):
        pass

    def _verwerk_mutaties(self, show=False):
        # vraag de achtergrond taak om de mutaties te verwerken
        f1 = io.StringIO()
        f2 = io.StringIO()
        with self.assert_max_queries(20):
            management.call_command('regiocomp_mutaties',
                                    '1',
                                    '--quick',
                                    stderr=f1,
                                    stdout=f2)

        if show:  # pragma: no cover
            print(f1.getvalue())
            print(f2.getvalue())

    def _prep_beheerder_lid(self, voornaam):
        lid_nr = self._next_lid_nr
        self._next_lid_nr += 1

        sporter = Sporter()
        sporter.lid_nr = lid_nr
        sporter.geslacht = "M"
        sporter.voornaam = voornaam
        sporter.achternaam = "Tester"
        sporter.email = voornaam.lower() + "@nhb.test"
        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 = self.nhbver_101
        sporter.save()

        return self.e2e_create_account(lid_nr,
                                       sporter.email,
                                       sporter.voornaam,
                                       accepteer_vhpg=True)

    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self._next_lid_nr = 100001

        self.rayon_1 = NhbRayon.objects.get(rayon_nr=1)
        self.rayon_2 = NhbRayon.objects.get(rayon_nr=2)
        self.regio_101 = NhbRegio.objects.get(regio_nr=101)
        self.regio_105 = NhbRegio.objects.get(regio_nr=105)
        self.regio_112 = NhbRegio.objects.get(regio_nr=112)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Zuidelijke Club"
        ver.ver_nr = "1111"
        ver.regio = self.regio_112
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.nhbver_112 = ver

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

        loc = WedstrijdLocatie(banen_18m=1,
                               banen_25m=1,
                               adres='De Spanning 1, Houtdorp')
        loc.save()
        loc.verenigingen.add(ver)
        self.loc = loc

        # maak HWL functie aan voor deze vereniging
        self.functie_hwl = maak_functie("HWL Vereniging %s" % ver.ver_nr,
                                        "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        # maak test leden aan die we kunnen koppelen aan beheerders functies
        self.account_bko_18 = self._prep_beheerder_lid('BKO')
        self.account_rko1_18 = self._prep_beheerder_lid('RKO1')
        self.account_rko2_18 = self._prep_beheerder_lid('RKO2')
        self.account_rcl101_18 = self._prep_beheerder_lid('RCL101')
        self.account_rcl101_25 = self._prep_beheerder_lid('RCL101-25')
        self.account_rcl112_18 = self._prep_beheerder_lid('RCL112')
        self.account_schutter = self._prep_beheerder_lid('Schutter')
        self.lid_sporter = Sporter.objects.get(
            lid_nr=self.account_schutter.username)

        self.boog_r = BoogType.objects.get(afkorting='R')

        self.sporterboog = SporterBoog(sporter=self.lid_sporter,
                                       boogtype=self.boog_r,
                                       voor_wedstrijd=True)
        self.sporterboog.save()

        # creëer een competitie met deelcompetities
        competities_aanmaken(jaar=2019)

        self.comp_18 = Competitie.objects.get(afstand='18')
        self.comp_25 = Competitie.objects.get(afstand='25')

        # klassengrenzen vaststellen om de competitie voorbij fase A te krijgen
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.url_klassengrenzen_vaststellen_18 = '/bondscompetities/%s/klassengrenzen/vaststellen/' % self.comp_18.pk
        resp = self.client.post(self.url_klassengrenzen_vaststellen_18)
        self.assert_is_redirect_not_plein(resp)  # redirect = success
        self.comp_18 = Competitie.objects.get(
            afstand='18')  # refresh met nieuwe status

        self.client.logout()

        self.deelcomp_bond_18 = DeelCompetitie.objects.filter(
            laag=LAAG_BK, competitie=self.comp_18)[0]
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.filter(
            laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_1)[0]
        self.deelcomp_rayon2_18 = DeelCompetitie.objects.filter(
            laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_2)[0]
        self.deelcomp_regio101_18 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_18,
            nhb_regio=self.regio_101)[0]
        self.deelcomp_regio101_25 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_25,
            nhb_regio=self.regio_101)[0]
        self.deelcomp_regio112_18 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_18,
            nhb_regio=self.regio_112)[0]

        self.cluster_101a = NhbCluster.objects.get(regio=self.regio_101,
                                                   letter='a',
                                                   gebruik='18')

        self.functie_bko_18 = self.deelcomp_bond_18.functie
        self.functie_rko1_18 = self.deelcomp_rayon1_18.functie
        self.functie_rko2_18 = self.deelcomp_rayon2_18.functie
        self.functie_rcl101_18 = self.deelcomp_regio101_18.functie
        self.functie_rcl101_25 = self.deelcomp_regio101_25.functie
        self.functie_rcl112_18 = self.deelcomp_regio112_18.functie

        self.functie_bko_18.accounts.add(self.account_bko_18)
        self.functie_rko1_18.accounts.add(self.account_rko1_18)
        self.functie_rko2_18.accounts.add(self.account_rko2_18)
        self.functie_rcl101_18.accounts.add(self.account_rcl101_18)
        self.functie_rcl101_25.accounts.add(self.account_rcl101_25)
        self.functie_rcl112_18.accounts.add(self.account_rcl112_18)

        self.klasse_r = CompetitieKlasse.objects.filter(
            competitie=self.comp_18,
            indiv__is_onbekend=False,
            indiv__niet_voor_rk_bk=False,
            indiv__volgorde=100,  # Recurve klasse 1
            indiv__boogtype__afkorting='R')[0]
        self.klasse_c = CompetitieKlasse.objects.filter(
            competitie=self.comp_18,
            indiv__is_onbekend=False,
            indiv__niet_voor_rk_bk=False,
            indiv__volgorde=201,  # Compound klasse 2
            indiv__boogtype__afkorting='C')[0]
        self.klasse_ib = CompetitieKlasse.objects.filter(
            competitie=self.comp_18,
            indiv__is_onbekend=False,
            indiv__niet_voor_rk_bk=False,
            indiv__volgorde=400,  # IB klasse 1
            indiv__boogtype__afkorting='IB')[0]

        # maak nog een test vereniging, zonder HWL functie
        ver = NhbVereniging()
        ver.naam = "Kleine Club"
        ver.ver_nr = "1100"
        ver.regio = self.regio_101
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.ver_1100 = ver

    def competitie_sluit_alle_regiocompetities(self, comp):
        # deze functie sluit alle regiocompetities af zodat de competitie in fase G komt
        comp.bepaal_fase()
        # print('comp: %s --> fase=%s' % (comp, comp.fase))
        self.assertTrue('B' < comp.fase < 'G')
        for deelcomp in DeelCompetitie.objects.filter(competitie=comp,
                                                      laag=LAAG_REGIO):
            if not deelcomp.is_afgesloten:  # pragma: no branch
                deelcomp.is_afgesloten = True
                deelcomp.save()
        # for

        comp.bepaal_fase()
        self.assertEqual(comp.fase, 'G')

    def _deelnemers_aanmaken(self):
        KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            klasse=self.klasse_r,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging).save()

        KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            klasse=self.klasse_r,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging).save()

        KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            klasse=self.klasse_r,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging).save()

        KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            klasse=self.klasse_c,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging).save()

        KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            klasse=self.klasse_c,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging).save()

    def test_buiten_eigen_rayon(self):
        # RKO probeert RK wedstrijd toe te voegen en wijzigen buiten eigen rayon
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        # maak een RK wedstrijd aan in een ander rayon
        url = self.url_planning_rayon % self.deelcomp_rayon2_18.pk
        with self.assert_max_queries(23):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        # controleer dat er geen 'ronde toevoegen' knop is
        urls = self.extract_all_urls(resp, skip_menu=True)
        self.assertNotIn(url, urls)  # url wordt gebruikt voor POST

        # coverage: nog een keer ophalen, want dan is het plan er al
        with self.assert_max_queries(21):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not allowed

        # maak een RK wedstrijd aan in het eigen rayon
        url = self.url_planning_rayon % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check success

        wedstrijd_r1_pk = DeelCompetitie.objects.get(
            pk=self.deelcomp_rayon1_18.pk).plan.wedstrijden.all()[0].pk
        url = self.url_wijzig_rk_wedstrijd % wedstrijd_r1_pk

        with self.assert_max_queries(30):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK

        self.e2e_login_and_pass_otp(self.account_rko2_18)
        self.e2e_wissel_naar_functie(self.functie_rko2_18)

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

    def test_planning_rayon(self):
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        self._deelnemers_aanmaken()

        # maak een regiowedstrijd aan, zodat deze geteld kan worden
        deelcomp = DeelCompetitie.objects.get(competitie=self.comp_18,
                                              laag=LAAG_REGIO,
                                              nhb_regio=self.regio_101)
        deelcomp.inschrijf_methode = INSCHRIJF_METHODE_1
        deelcomp.save()

        # maak een RK wedstrijd aan in het eigen rayon
        url = self.url_planning_rayon % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check success

        # nog een wedstrijd
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check success

        # haal het overzicht op met deze nieuwe wedstrijden
        with self.assert_max_queries(24):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('comprayon/planning-rayon.dtl', 'plein/site_layout.dtl'))

        # haal de wedstrijd op
        wedstrijd_r1 = DeelCompetitie.objects.get(
            pk=self.deelcomp_rayon1_18.pk).plan.wedstrijden.all()[0]
        url_w = self.url_wijzig_rk_wedstrijd % wedstrijd_r1.pk
        with self.assert_max_queries(35):
            resp = self.client.get(url_w)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp,
            ('comprayon/wijzig-wedstrijd-rk.dtl', 'plein/site_layout.dtl'))

        # nog een keer ophalen, want dan zijn wedstrijd.vereniging en wedstrijd.locatie al gezet
        with self.assert_max_queries(35):
            resp = self.client.get(url_w)
        self.assertEqual(resp.status_code, 200)  # 200 = OK

        # wijzig de wedstrijd en zet een aantal wedstrijdklassen
        sel_indiv_1 = "wkl_indiv_%s" % self.klasse_r.indiv.pk
        sel_indiv_2 = "wkl_indiv_%s" % self.klasse_c.indiv.pk
        sel_indiv_3 = "wkl_indiv_%s" % self.klasse_ib.indiv.pk
        with self.assert_max_queries(20):
            resp = self.client.post(
                url_w,
                {
                    'weekdag': 1,
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_101.ver_nr,
                    sel_indiv_1: "on",
                    sel_indiv_2: "on",
                    sel_indiv_3: "on",
                    "wkl_indiv_": "on",  # bad
                    "wkl_indiv_bad": "on"
                })  # bad
        self.assert_is_redirect_not_plein(resp)  # check for success

        # wissel naar BKO en haal de planning op
        self.e2e_login_and_pass_otp(self.account_bko_18)
        self.e2e_wissel_naar_functie(self.functie_bko_18)
        with self.assert_max_queries(26):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK

    def test_planning_rayon_verwijder(self):
        # maak een wedstrijd aan en verwijder deze weer
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        # doet een 'get' op de planning zodat er een plan aangemaakt wordt
        url = self.url_planning_rayon % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(23):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_rayon1_18.pk)

        # maak een RK wedstrijd aan in het eigen rayon
        self.assertEqual(self.deelcomp_rayon1_18.plan.wedstrijden.count(), 0)
        url = self.url_planning_rayon % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check success
        self.assertEqual(self.deelcomp_rayon1_18.plan.wedstrijden.count(), 1)

        # bevries de uitslag
        wedstrijd = self.deelcomp_rayon1_18.plan.wedstrijden.all()[0]
        uitslag = CompetitieWedstrijdUitslag(max_score=300,
                                             afstand_meter=18,
                                             is_bevroren=True)
        uitslag.save()
        wedstrijd.uitslag = uitslag
        wedstrijd.save()

        # wedstrijd met bevroren uitslag kan niet verwijderd worden
        url = self.url_verwijder_rk_wedstrijd % wedstrijd.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not found/allowed

        # verwijder de bevriezing
        uitslag.is_bevroren = False
        uitslag.save()

        # verwijder de wedstrijd weer
        url = self.url_verwijder_rk_wedstrijd % wedstrijd.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check success
        self.assertEqual(self.deelcomp_rayon1_18.plan.wedstrijden.count(), 0)

    def test_planning_rayon_verwijder_bad(self):
        # verkeerde rol / niet ingelogd
        url = self.url_verwijder_rk_wedstrijd % 999999
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert403(resp)

        # inloggen
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        # maak een RK wedstrijd aan
        url = self.url_planning_rayon % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check success

        self.deelcomp_rayon1_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_rayon1_18.pk)
        wedstrijd = self.deelcomp_rayon1_18.plan.wedstrijden.all()[0]

        # verwijder bad pk
        url = self.url_verwijder_rk_wedstrijd % 999999
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not found/allowed

        # wedstrijd van niet-RK
        self.deelcomp_rayon1_18.laag = LAAG_REGIO
        self.deelcomp_rayon1_18.save()

        url = self.url_verwijder_rk_wedstrijd % wedstrijd.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not found/allowed

        self.deelcomp_rayon1_18.laag = LAAG_RK
        self.deelcomp_rayon1_18.save()

        # verkeerde rol
        self.e2e_login_and_pass_otp(self.account_rko2_18)
        self.e2e_wissel_naar_functie(self.functie_rko2_18)
        url = self.url_verwijder_rk_wedstrijd % wedstrijd.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert403(resp)

        # verwijder zonder uitslag
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        url = self.url_verwijder_rk_wedstrijd % wedstrijd.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assertEqual(resp.status_code, 302)

    def test_planning_rayon_geen_ver(self):
        self.e2e_login_and_pass_otp(self.account_rko2_18)
        self.e2e_wissel_naar_functie(self.functie_rko2_18)

        # maak een RK wedstrijd aan in het eigen rayon
        url = self.url_planning_rayon % self.deelcomp_rayon2_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check for success

        # haal de wedstrijd op
        # hierbij lukt het niet om de wedstrijd.vereniging in te vullen
        wedstrijd_r2_pk = DeelCompetitie.objects.get(
            pk=self.deelcomp_rayon2_18.pk).plan.wedstrijden.all()[0].pk
        url = self.url_wijzig_rk_wedstrijd % wedstrijd_r2_pk
        with self.assert_max_queries(28):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp,
            ('comprayon/wijzig-wedstrijd-rk.dtl', 'plein/site_layout.dtl'))

        # nu met een vereniging zonder accommodatie
        ver = self.nhbver_112  # heeft geen locatie
        ver.regio = self.regio_105  # verhuis naar rayon 2
        ver.save()

        with self.assert_max_queries(29):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK

        # wijzig de wedstrijd - hierbij wordt de wedstrijd.locatie op None gezet
        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'weekdag': 1,
                'aanvang': '12:34',
                'nhbver_pk': ver.ver_nr
            })
        self.assert_is_redirect_not_plein(resp)  # check for success

    def test_planning_rayon_bad(self):
        # anon
        url = self.url_planning_rayon % self.deelcomp_rayon2_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        # probeer als BKO (RCL kom niet door de user-passes-test-mixin)
        self.e2e_login_and_pass_otp(self.account_bko_18)
        self.e2e_wissel_naar_functie(self.functie_bko_18)

        url = self.url_planning_rayon % self.deelcomp_rayon2_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert403(resp)

        # slechte deelcompetitie
        url = self.url_planning_rayon % 999999
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)

        # probeer een wedstrijd te wijzigen als BKO
        url = self.url_wijzig_rk_wedstrijd % 999999
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        # nogmaals, als RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        url = self.url_wijzig_rk_wedstrijd % 999999
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not allowed

        url = self.url_wijzig_rk_wedstrijd % "BAD"
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not allowed

        url = self.url_wijzig_rk_wedstrijd % "##"
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not allowed

        url = self.url_wijzig_rk_wedstrijd % "1(2)"
        with self.assert_max_queries(20):
            resp = self.client.get(url)

        self.assert404(resp)  # 404 = Not allowed
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not allowed

        # maak een RK wedstrijd aan in het eigen rayon
        url = self.url_planning_rayon % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)  # check for success

        wedstrijd_r1_pk = DeelCompetitie.objects.get(
            pk=self.deelcomp_rayon1_18.pk).plan.wedstrijden.all()[0].pk
        url = self.url_wijzig_rk_wedstrijd % wedstrijd_r1_pk

        # wijzig de wedstrijd
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not allowed

        # slechte weekdag
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': "XX",
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # slechte weekdag
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': 99,
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # slechte weekdag
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': "-1",
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # weekdag buiten RK range (is 1 week lang)
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': 30,
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # slecht tijdstip
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': 1,
                    'aanvang': '(*:#)',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # slecht tijdstip
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': 1,
                    'aanvang': '12:60',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # bad vereniging nummer
        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'weekdag': 1,
                'aanvang': '12:34',
                'nhbver_pk': 999999
            })
        self.assert404(resp)  # 404 = Not allowed

        # niet toegestane vereniging
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': 1,
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_112.ver_nr
                })
        self.assert404(resp)  # 404 = Not allowed

        # probeer wedstrijd van ander rayon te wijzigen
        self.e2e_login_and_pass_otp(self.account_rko2_18)
        self.e2e_wissel_naar_functie(self.functie_rko2_18)

        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'weekdag': 1,
                    'aanvang': '12:34',
                    'nhbver_pk': self.nhbver_101.ver_nr
                })
        self.assert403(resp)

    def test_lijst_rk(self):
        # RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        url = self.url_lijst_rk % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('comprayon/rko-rk-selectie.dtl', 'plein/site_layout.dtl'))

        # nu doorzetten naar RK fase
        self.competitie_sluit_alle_regiocompetities(self.comp_18)
        self.e2e_login_and_pass_otp(self.account_bko_18)
        self.e2e_wissel_naar_functie(self.functie_bko_18)
        resp = self.client.post(self.url_doorzetten_rk % self.comp_18.pk)
        self.assert_is_redirect_not_plein(resp)  # check for success
        # laat de mutaties verwerken
        management.call_command('regiocomp_mutaties',
                                '1',
                                '--quick',
                                stderr=io.StringIO(),
                                stdout=io.StringIO())

        # zet een limiet
        limiet = DeelcompetitieKlasseLimiet(
            deelcompetitie=self.deelcomp_rayon1_18,
            klasse=self.klasse_r,
            limiet=20)
        limiet.save()
        self.assertTrue(str(limiet) != "")  # coverage only

        # nu nog een keer, met een RK deelnemerslijst
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            klasse=self.klasse_r)
        deelnemer.save()
        self.assertTrue(str(deelnemer) != "")  # coverage only

        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            klasse=self.klasse_c)
        deelnemer.save()

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('comprayon/rko-rk-selectie.dtl', 'plein/site_layout.dtl'))

        deelnemer.deelname = DEELNAME_JA
        deelnemer.save()

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('comprayon/rko-rk-selectie.dtl', 'plein/site_layout.dtl'))

        deelnemer.rank = 100
        deelnemer.save()

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('comprayon/rko-rk-selectie.dtl', 'plein/site_layout.dtl'))

        deelnemer.bij_vereniging = None
        deelnemer.rank = 1
        deelnemer.deelname = DEELNAME_NEE
        deelnemer.save()

        # twee deelnemers in dezelfde klasse
        deelnemer.pk = None
        deelnemer.save()

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('comprayon/rko-rk-selectie.dtl', 'plein/site_layout.dtl'))

        url = self.url_lijst_bestand % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assertContains(resp, "100007")
        self.assertContains(resp, "Schutter Test")
        self.assertContains(resp, "[1000] Grote Club")
        self.assertContains(resp, "(deelname onzeker)")
        self.assertContains(resp, "Recurve klasse 1")

    def test_bad_lijst_rk(self):
        # anon
        url = self.url_lijst_rk % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        # RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        # regio deelcomp
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_lijst_rk %
                                   self.deelcomp_regio101_18.pk)
        self.assert404(resp)  # 404 = Not allowed

        # verkeerde rayon deelcomp
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_lijst_rk %
                                   self.deelcomp_rayon2_18.pk)
        self.assert403(resp)

        # geen deelnemers lijst
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_lijst_bestand %
                                   self.deelcomp_rayon1_18.pk)
        self.assert404(resp)  # 404 = Not allowed

        # verkeerde rayon deelcomp - download
        self.deelcomp_rayon2_18.heeft_deelnemerslijst = True
        self.deelcomp_rayon2_18.save()
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_lijst_bestand %
                                   self.deelcomp_rayon2_18.pk)
        self.assert403(resp)

        # bad deelcomp pk
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_lijst_bestand % 999999)
        self.assert404(resp)  # 404 = Not allowed

    def test_bad_wijzig_status(self):
        self.client.logout()
        url = self.url_wijzig_status % 999999
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        # RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not allowed

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not allowed

        # verkeerde RKO
        self.e2e_login_and_pass_otp(self.account_rko2_18)
        self.e2e_wissel_naar_functie(self.functie_rko2_18)

        zet_competitie_fase(self.comp_18, 'J')

        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            klasse=self.klasse_r)
        deelnemer.save()

        url = self.url_wijzig_status % deelnemer.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert403(resp)

    def test_wijzig_status_rko(self):
        # RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        zet_competitie_fase(self.comp_18, 'J')

        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            klasse=self.klasse_r)
        deelnemer.save()

        url = self.url_wijzig_status % deelnemer.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp,
                                  ('comprayon/wijzig-status-rk-deelnemer.dtl',
                                   'plein/site_layout.dtl'))

        # geen vereniging
        deelnemer.bij_vereniging = None
        deelnemer.save()
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)

        self.assertEqual(CompetitieMutatie.objects.count(), 0)

        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'bevestig': '0',
                'afmelden': '0',
                'snel': 1
            })
        self.assertEqual(CompetitieMutatie.objects.count(), 0)

        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'bevestig': '0',
                'afmelden': '1',
                'snel': 1
            })
        self.assertEqual(CompetitieMutatie.objects.count(), 1)

        # bevestigen mag niet, want geen lid bij vereniging
        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'bevestig': '1',
                'afmelden': '0',
                'snel': 1
            })
        self.assertEqual(CompetitieMutatie.objects.count(), 1)

        # verbouw 'time' en voer een test uit zonder 'snel'
        time.sleep = self._dummy_sleep
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'bevestig': '0', 'afmelden': '1'})
        time.sleep = sleep_oud
        self.assertEqual(CompetitieMutatie.objects.count(), 2)

    def test_wijzig_status_hwl(self):
        # HWL
        self.e2e_login_and_pass_otp(self.account_bko_18)
        self.e2e_wissel_naar_functie(self.functie_hwl)

        zet_competitie_fase(self.comp_18, 'J')

        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            klasse=self.klasse_r)
        deelnemer.save()

        # probeer als HWL van een andere vereniging de status van deze sporter aan te passen
        url = self.url_wijzig_status % deelnemer.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)

        with self.assert_max_queries(20):
            resp = self.client.post(url, {})
        self.assertEqual(resp.status_code, 302)  # 302 = redirect

        sporter = self.sporterboog.sporter
        sporter.bij_vereniging = self.ver_1100
        sporter.save()

        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.ver_1100,
            klasse=self.klasse_r)
        deelnemer.save()

        # probeer als HWL van een andere vereniging de status van deze sporter aan te passen
        url = self.url_wijzig_status % deelnemer.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        with self.assert_max_queries(20):
            resp = self.client.post(url, {})
        self.assert403(resp)

    def test_bad_wijzig_limiet(self):
        self.client.logout()
        url = self.url_wijzig_limiet % 999999
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        # RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not allowed

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not allowed

        url = self.url_wijzig_limiet % self.deelcomp_rayon1_18.pk

        sel = 'sel_%s' % self.klasse_c.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 'xx'})
        self.assertEqual(resp.status_code, 302)  # doorloopt alles

        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: '19'})
        self.assert404(resp)  # 404 = Not allowed

        # verkeerde RKO
        self.e2e_login_and_pass_otp(self.account_rko2_18)
        self.e2e_wissel_naar_functie(self.functie_rko2_18)

        url = self.url_wijzig_limiet % self.deelcomp_rayon1_18.pk

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert403(resp)

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert403(resp)

    def test_wijzig_limiet(self):
        # RKO
        self.e2e_login_and_pass_otp(self.account_rko1_18)
        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        # zonder limiet aanwezig
        url = self.url_wijzig_limiet % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp,
            ('comprayon/wijzig-limieten-rk.dtl', 'plein/site_layout.dtl'))

        sel = 'sel_%s' % self.klasse_r.pk

        # limiet op default zetten
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 0)
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 24, 'snel': 1})
        self.assert_is_redirect_not_plein(resp)  # check for success
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 0)

        # limiet zetten
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 0)
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 20, 'snel': 1})
        self.assert_is_redirect_not_plein(resp)  # check for success
        self._verwerk_mutaties()
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 1)

        # limiet opnieuw zetten, geen wijziging
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 20, 'snel': 1})
        self.assert_is_redirect_not_plein(resp)  # check for success
        self._verwerk_mutaties()
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 1)

        # limiet aanpassen
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 16, 'snel': 1})
        self.assert_is_redirect_not_plein(resp)  # check for success
        self._verwerk_mutaties()
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 1)

        # met limiet aanwezig
        url = self.url_wijzig_limiet % self.deelcomp_rayon1_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)

        # limiet verwijderen, zonder 'snel'
        time.sleep = self._dummy_sleep
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 24})
        self.assert_is_redirect_not_plein(resp)  # check for success
        self._verwerk_mutaties()
        self.assertEqual(DeelcompetitieKlasseLimiet.objects.count(), 0)
        time.sleep = sleep_oud

        # nu met een deelnemer, zodat de mutatie opgestart wordt
        deelnemer = KampioenschapSchutterBoog(
            deelcompetitie=self.deelcomp_rayon1_18,
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            klasse=self.klasse_r)
        deelnemer.save()

        aantal = CompetitieMutatie.objects.count()
        with self.assert_max_queries(20):
            resp = self.client.post(url, {sel: 4, 'snel': 1})
        self.assert_is_redirect_not_plein(resp)  # check for success
        self._verwerk_mutaties()
        self.assertEqual(CompetitieMutatie.objects.count(), aantal + 1)
    def _maak_inschrijvingen(self):
        # schrijf iemand in
        boog_ib = BoogType.objects.get(afkorting='IB')
        boog_r = BoogType.objects.get(afkorting='R')
        boog_c = BoogType.objects.get(afkorting='C')

        # sporter 1 aanmelden

        sporterboog = self.sporterboog_100001

        SporterVoorkeuren(sporter=sporterboog.sporter, voorkeur_eigen_blazoen=True).save()

        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_18,
                          indiv__boogtype=boog_r,
                          indiv__is_onbekend=True))[0]

        RegioCompetitieSchutterBoog(
                deelcompetitie=self.deelcomp_regio_18,
                sporterboog=sporterboog,
                bij_vereniging=sporterboog.sporter.bij_vereniging,
                klasse=klasse).save()

        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_25,
                          indiv__boogtype=boog_r,
                          indiv__is_onbekend=True))[0]

        RegioCompetitieSchutterBoog(
                deelcompetitie=self.deelcomp_regio_25,
                sporterboog=sporterboog,
                bij_vereniging=sporterboog.sporter.bij_vereniging,
                klasse=klasse).save()

        # Schutter 2 aanmelden

        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_18,
                          indiv__boogtype=boog_c,
                          indiv__is_onbekend=False))[0]

        sporterboog = SporterBoog(sporter=self.sporter_100002,
                                  boogtype=boog_c,
                                  voor_wedstrijd=True)
        sporterboog.save()

        aanmelding = RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_18,
                                                 sporterboog=sporterboog,
                                                 bij_vereniging=sporterboog.sporter.bij_vereniging,
                                                 klasse=klasse)
        aanmelding.save()

        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_25,
                          indiv__boogtype=boog_c,
                          indiv__is_onbekend=False))[0]

        aanmelding = RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_25,
                                                 sporterboog=sporterboog,
                                                 bij_vereniging=sporterboog.sporter.bij_vereniging,
                                                 klasse=klasse)
        aanmelding.save()

        # aspirant schutter aanmelden
        self.sporter_100012.geboorte_datum = datetime.date(year=self.comp_18.begin_jaar - 10, month=1, day=1)
        self.sporter_100012.save()

        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_18,
                          indiv__boogtype=boog_ib,
                          indiv__beschrijving__contains="Aspirant"))[0]

        sporterboog = SporterBoog(sporter=self.sporter_100012,
                                  boogtype=boog_ib,
                                  voor_wedstrijd=True)
        sporterboog.save()

        aanmelding = RegioCompetitieSchutterBoog(deelcompetitie=self.deelcomp_regio_18,
                                                 sporterboog=sporterboog,
                                                 bij_vereniging=sporterboog.sporter.bij_vereniging,
                                                 klasse=klasse)
        aanmelding.save()

        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_25,
                          indiv__boogtype=boog_ib,
                          indiv__beschrijving__contains="Aspirant"))[0]

        RegioCompetitieSchutterBoog(
                deelcompetitie=self.deelcomp_regio_25,
                sporterboog=sporterboog,
                bij_vereniging=sporterboog.sporter.bij_vereniging,
                klasse=klasse).save()

        # Schutter 3 aanmelden
        klasse = (CompetitieKlasse
                  .objects
                  .filter(competitie=self.comp_18,
                          indiv__boogtype=boog_r))[0]

        sporterboog = SporterBoog(sporter=self.sporter_100003,
                                  boogtype=boog_r,
                                  voor_wedstrijd=True)
        sporterboog.save()

        RegioCompetitieSchutterBoog(
                deelcompetitie=self.deelcomp_regio_18,
                sporterboog=sporterboog,
                bij_vereniging=sporterboog.sporter.bij_vereniging,
                klasse=klasse).save()
示例#13
0
class TestCompRegioPoules(E2EHelpers, TestCase):

    """ tests voor de CompRegio applicatie, Poules functie """

    test_after = ('Competitie.test_fase', 'Competitie.test_beheerders', 'Competitie.test_competitie')

    url_regio_poules = '/bondscompetities/regio/poules/%s/'         # deelcomp_pk
    url_wijzig_poule = '/bondscompetities/regio/poules/wijzig/%s/'  # poule_pk

    testdata = None

    @classmethod
    def setUpTestData(cls):
        cls.testdata = testdata.TestData()
        cls.testdata.maak_accounts()

    def _prep_beheerder_lid(self, voornaam):
        lid_nr = self._next_lid_nr
        self._next_lid_nr += 1

        sporter = Sporter()
        sporter.lid_nr = lid_nr
        sporter.geslacht = "M"
        sporter.voornaam = voornaam
        sporter.achternaam = "Tester"
        sporter.email = voornaam.lower() + "@nhb.test"
        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 = self.nhbver_101
        sporter.save()

        return self.e2e_create_account(lid_nr, sporter.email, sporter.voornaam, accepteer_vhpg=True)

    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self._next_lid_nr = 100001

        self.rayon_1 = NhbRayon.objects.get(rayon_nr=1)
        self.rayon_2 = NhbRayon.objects.get(rayon_nr=2)
        self.regio_101 = NhbRegio.objects.get(regio_nr=101)
        self.regio_105 = NhbRegio.objects.get(regio_nr=105)
        self.regio_112 = NhbRegio.objects.get(regio_nr=112)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Zuidelijke Club"
        ver.ver_nr = 1111
        ver.regio = self.regio_112
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.nhbver_112 = ver

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

        loc = WedstrijdLocatie(banen_18m=1,
                               banen_25m=1,
                               adres='De Spanning 1, Houtdorp')
        loc.save()
        loc.verenigingen.add(ver)
        self.loc = loc

        # maak HWL functie aan voor deze vereniging
        self.functie_hwl = maak_functie("HWL Vereniging %s" % ver.ver_nr, "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        self.functie_wl = maak_functie("WL Vereniging %s" % ver.ver_nr, "WL")
        self.functie_wl.nhb_ver = ver
        self.functie_wl.save()

        # maak test leden aan die we kunnen koppelen aan beheerders functies
        self.account_bko_18 = self._prep_beheerder_lid('BKO')
        self.account_rko1_18 = self._prep_beheerder_lid('RKO1')
        self.account_rko2_18 = self._prep_beheerder_lid('RKO2')
        self.account_rcl101_18 = self._prep_beheerder_lid('RCL101')
        self.account_rcl101_25 = self._prep_beheerder_lid('RCL101-25')
        self.account_rcl112_18 = self._prep_beheerder_lid('RCL112')
        self.account_schutter = self._prep_beheerder_lid('Schutter')
        self.lid_sporter = Sporter.objects.get(lid_nr=self.account_schutter.username)

        self.boog_r = BoogType.objects.get(afkorting='R')

        self.sporterboog = SporterBoog(sporter=self.lid_sporter,
                                       boogtype=self.boog_r,
                                       voor_wedstrijd=True)
        self.sporterboog.save()

        # creëer een competitie met deelcompetities
        competities_aanmaken(jaar=2019)

        self.comp_18 = Competitie.objects.get(afstand='18')
        self.comp_25 = Competitie.objects.get(afstand='25')

        # een parallel competitie is noodzakelijk om corner-cases te raken
        competities_aanmaken(jaar=2020)

        # klassengrenzen vaststellen om de competitie voorbij fase A te krijgen
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.url_klassengrenzen_vaststellen_18 = '/bondscompetities/%s/klassengrenzen/vaststellen/' % self.comp_18.pk
        resp = self.client.post(self.url_klassengrenzen_vaststellen_18)
        self.assert_is_redirect_not_plein(resp)  # check for success

        klasse = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                              team__volgorde=10,
                                              is_voor_teams_rk_bk=False)
        klasse.min_ag = 29.0
        klasse.save()

        klasse = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                              team__volgorde=11,
                                              is_voor_teams_rk_bk=False)
        klasse.min_ag = 25.0
        klasse.save()

        self.client.logout()

        self.klasse_recurve_onbekend = (CompetitieKlasse
                                        .objects
                                        .filter(indiv__boogtype=self.boog_r,
                                                indiv__is_onbekend=True)
                                        .all())[0]

        self.deelcomp_bond_18 = DeelCompetitie.objects.filter(laag=LAAG_BK, competitie=self.comp_18)[0]
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.filter(laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_1)[0]
        self.deelcomp_rayon2_18 = DeelCompetitie.objects.filter(laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_2)[0]
        self.deelcomp_regio101_18 = DeelCompetitie.objects.filter(laag=LAAG_REGIO, competitie=self.comp_18, nhb_regio=self.regio_101)[0]
        self.deelcomp_regio101_25 = DeelCompetitie.objects.filter(laag=LAAG_REGIO, competitie=self.comp_25, nhb_regio=self.regio_101)[0]
        self.deelcomp_regio112_18 = DeelCompetitie.objects.filter(laag=LAAG_REGIO, competitie=self.comp_18, nhb_regio=self.regio_112)[0]

        self.cluster_101a_18 = NhbCluster.objects.get(regio=self.regio_101, letter='a', gebruik='18')
        self.cluster_101e_25 = NhbCluster.objects.get(regio=self.regio_101, letter='e', gebruik='25')

        self.functie_bko_18 = self.deelcomp_bond_18.functie
        self.functie_rko1_18 = self.deelcomp_rayon1_18.functie
        self.functie_rko2_18 = self.deelcomp_rayon2_18.functie
        self.functie_rcl101_18 = self.deelcomp_regio101_18.functie
        self.functie_rcl101_25 = self.deelcomp_regio101_25.functie
        self.functie_rcl112_18 = self.deelcomp_regio112_18.functie

        self.functie_bko_18.accounts.add(self.account_bko_18)
        self.functie_rko1_18.accounts.add(self.account_rko1_18)
        self.functie_rko2_18.accounts.add(self.account_rko2_18)
        self.functie_rcl101_18.accounts.add(self.account_rcl101_18)
        self.functie_rcl101_25.accounts.add(self.account_rcl101_25)
        self.functie_rcl112_18.accounts.add(self.account_rcl112_18)

        # maak nog een test vereniging, zonder HWL functie
        # stop deze in een cluster
        ver = NhbVereniging()
        ver.naam = "Kleine Club"
        ver.ver_nr = "1100"
        ver.regio = self.regio_101
        ver.save()
        ver.clusters.add(self.cluster_101e_25)

    def test_poules_basic(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        deelcomp = DeelCompetitie.objects.get(competitie=self.comp_18, functie=self.functie_rcl112_18)

        url = self.url_regio_poules % deelcomp.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('compregio/rcl-teams-poules.dtl', 'plein/site_layout.dtl'))

        # tot en met fase D mag alles nog
        comp = deelcomp.competitie
        zet_competitie_fase(comp, 'D')

        # maak een poule aan
        self.assertEqual(0, RegiocompetitieTeamPoule.objects.count())
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect(resp, url)
        self.assertEqual(1, RegiocompetitieTeamPoule.objects.count())
        poule = RegiocompetitieTeamPoule.objects.all()[0]

        # coverage
        self.assertTrue(str(poule) != "")

        # bad deelcomp
        bad_url = self.url_regio_poules % 999999
        resp = self.client.get(bad_url)
        self.assert404(resp)
        resp = self.client.post(bad_url)
        self.assert404(resp)

        # verkeerde beheerder
        bad_url = self.url_regio_poules % self.deelcomp_regio101_18.pk
        resp = self.client.get(bad_url)
        self.assert403(resp)
        resp = self.client.post(bad_url)
        self.assert403(resp)

        # wijzig de poule
        url = self.url_wijzig_poule % poule.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('compregio/wijzig-poule.dtl', 'plein/site_layout.dtl'))

        with self.assert_max_queries(20):
            resp = self.client.post(url, {'beschrijving': ' hoi test!'})
        self.assert_is_redirect_not_plein(resp)
        poule = RegiocompetitieTeamPoule.objects.get(pk=poule.pk)
        self.assertEqual(poule.beschrijving, 'hoi test!')

        # wijziging is geen wijziging
        resp = self.client.post(url, {'beschrijving': ' hoi test!'})
        self.assert_is_redirect_not_plein(resp)

        # bad poule
        bad_url = self.url_wijzig_poule % 999999
        resp = self.client.get(bad_url)
        self.assert404(resp)
        resp = self.client.post(bad_url)
        self.assert404(resp)

        # verkeerde beheerder
        poule.deelcompetitie = self.deelcomp_regio101_25
        poule.save(update_fields=['deelcompetitie'])
        bad_url = self.url_wijzig_poule % poule.pk
        resp = self.client.get(bad_url)
        self.assert403(resp)
        resp = self.client.post(bad_url)
        self.assert403(resp)
        poule.deelcompetitie = self.deelcomp_regio112_18
        poule.save(update_fields=['deelcompetitie'])

        # overzicht met een poule erin
        url = self.url_regio_poules % deelcomp.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)

        # na fase D mag je nog kijken maar niet aanpassen
        comp = deelcomp.competitie
        zet_competitie_fase(comp, 'E')

        url = self.url_regio_poules % deelcomp.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('compregio/rcl-teams-poules.dtl', 'plein/site_layout.dtl'))

        # maak een poule aan
        self.assertEqual(1, RegiocompetitieTeamPoule.objects.count())
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp)
        self.assertEqual(1, RegiocompetitieTeamPoule.objects.count())

        # fase E: wijzig de poule
        url = self.url_wijzig_poule % poule.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('compregio/wijzig-poule.dtl', 'plein/site_layout.dtl'))

        with self.assert_max_queries(20):
            resp = self.client.post(url, {'beschrijving': 'nieuwe test'})
        self.assert_is_redirect_not_plein(resp)

        # TODO: controleer dat de teams gekoppeld aan de poule niet meer te wijzigen zijn

        # zet fase F, dan mag niets meer gewijzigd worden
        zet_competitie_fase(comp, 'F')

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)

        with self.assert_max_queries(20):
            resp = self.client.post(url, {'beschrijving': 'nieuwe test'})
        self.assert404(resp)

        # terug naar fase D
        comp = deelcomp.competitie
        zet_competitie_fase(comp, 'D')

        # verwijder een poule
        self.assertEqual(1, RegiocompetitieTeamPoule.objects.count())
        url = self.url_wijzig_poule % poule.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'verwijder_poule': 'aj'})
        self.assert_is_redirect_not_plein(resp)
        self.assertEqual(0, RegiocompetitieTeamPoule.objects.count())

    def test_poules_teams(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        # maak een poule aan
        deelcomp = DeelCompetitie.objects.get(competitie=self.comp_18, functie=self.functie_rcl112_18)

        # tot en met fase D mag alles nog
        comp = deelcomp.competitie
        zet_competitie_fase(comp, 'B')

        url = self.url_regio_poules % deelcomp.pk
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect(resp, url)
        self.assertEqual(1, RegiocompetitieTeamPoule.objects.count())
        poule = RegiocompetitieTeamPoule.objects.all()[0]

        # maak 9 teams aan
        type_r = TeamType.objects.get(afkorting='R')
        klasse_r_ere = CompetitieKlasse.objects.filter(team__team_type=type_r).order_by('team__volgorde')[0]
        for lp in range(9):
            # team zonder sporters maar wel in een klasse is genoeg voor een poule
            RegiocompetitieTeam(
                    deelcompetitie=deelcomp,
                    vereniging=self.nhbver_112,
                    volg_nr=lp + 1,
                    team_type=type_r,
                    team_naam='Recurve Testers %s' % (lp + 1),
                    klasse=klasse_r_ere).save()
        # for
        team_pks = list(RegiocompetitieTeam.objects.values_list('pk', flat=True))

        # maak een compound team aan
        type_c = TeamType.objects.get(afkorting='C')
        klasse_c_ere = CompetitieKlasse.objects.filter(team__team_type=type_c).order_by('team__volgorde')[0]
        team_c = RegiocompetitieTeam(
                    deelcompetitie=deelcomp,
                    vereniging=self.nhbver_112,
                    volg_nr=1,
                    team_type=type_c,
                    team_naam='Compound Testers 9',
                    klasse=klasse_c_ere)
        team_c.save()

        # koppel 5 teams aan de poule
        url = self.url_wijzig_poule % poule.pk
        params = dict()
        for pk in team_pks[:5]:
            params['team_%s' % pk] = 1
        with self.assert_max_queries(20):
            resp = self.client.post(url, params)
        self.assert_is_redirect_not_plein(resp)
        poule = RegiocompetitieTeamPoule.objects.prefetch_related('teams').get(pk=poule.pk)
        self.assertEqual(5, poule.teams.count())

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp, ('compregio/wijzig-poule.dtl', 'plein/site_layout.dtl'))

        # compound team bij recurve-meerderheid wordt niet geaccepteerd (silently ignored)
        params['team_%s' % team_c.pk] = 1
        with self.assert_max_queries(20):
            resp = self.client.post(url, params)
        self.assert_is_redirect_not_plein(resp)
        poule = RegiocompetitieTeamPoule.objects.prefetch_related('teams').get(pk=poule.pk)
        self.assertEqual(5, poule.teams.count())

        # koppel 9 teams aan de poule
        self.assertEqual(9, len(team_pks))
        params = dict()
        for pk in team_pks:
            params['team_%s' % pk] = 1
        with self.assert_max_queries(20):
            resp = self.client.post(url, params)
        self.assert_is_redirect_not_plein(resp)
        poule = RegiocompetitieTeamPoule.objects.prefetch_related('teams').get(pk=poule.pk)
        self.assertEqual(8, poule.teams.count())
示例#14
0
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)
示例#15
0
class TestCompRegioTeams(E2EHelpers, TestCase):
    """ tests voor de CompRegio applicatie, Teams functies voor de RCL """

    test_after = ('Competitie.test_fase', 'Competitie.test_beheerders',
                  'Competitie.test_competitie')

    url_afsluiten_regio = '/bondscompetities/regio/planning/%s/afsluiten/'  # deelcomp_pk
    url_regio_instellingen = '/bondscompetities/regio/instellingen/%s/regio-%s/'  # comp_pk, regio-nr
    url_regio_globaal = '/bondscompetities/regio/instellingen/%s/globaal/'  # comp_pk
    url_ag_controle = '/bondscompetities/regio/%s/ag-controle/regio-%s/'  # comp_pk, regio-nr
    url_regio_teams = '/bondscompetities/regio/%s/teams/'  # deelcomp_pk
    url_regio_teams_alle = '/bondscompetities/regio/%s/teams/%s/'  # comp_pk, subset = auto/alle/rayon_nr
    url_team_ronde = '/bondscompetities/regio/%s/team-ronde/'  # deelcomp_pk

    testdata = None

    @classmethod
    def setUpTestData(cls):
        cls.testdata = testdata.TestData()
        cls.testdata.maak_accounts()

    def _prep_beheerder_lid(self, voornaam):
        lid_nr = self._next_lid_nr
        self._next_lid_nr += 1

        sporter = Sporter()
        sporter.lid_nr = lid_nr
        sporter.geslacht = "M"
        sporter.voornaam = voornaam
        sporter.achternaam = "Tester"
        sporter.email = voornaam.lower() + "@nhb.test"
        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 = self.nhbver_101
        sporter.save()

        return self.e2e_create_account(lid_nr,
                                       sporter.email,
                                       sporter.voornaam,
                                       accepteer_vhpg=True)

    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self._next_lid_nr = 100001

        self.rayon_1 = NhbRayon.objects.get(rayon_nr=1)
        self.rayon_2 = NhbRayon.objects.get(rayon_nr=2)
        self.regio_101 = NhbRegio.objects.get(regio_nr=101)
        self.regio_105 = NhbRegio.objects.get(regio_nr=105)
        self.regio_112 = NhbRegio.objects.get(regio_nr=112)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Zuidelijke Club"
        ver.ver_nr = 1111
        ver.regio = self.regio_112
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.nhbver_112 = ver

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

        loc = WedstrijdLocatie(banen_18m=1,
                               banen_25m=1,
                               adres='De Spanning 1, Houtdorp')
        loc.save()
        loc.verenigingen.add(ver)
        self.loc = loc

        # maak HWL functie aan voor deze vereniging
        self.functie_hwl = maak_functie("HWL Vereniging %s" % ver.ver_nr,
                                        "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        self.functie_wl = maak_functie("WL Vereniging %s" % ver.ver_nr, "WL")
        self.functie_wl.nhb_ver = ver
        self.functie_wl.save()

        # maak test leden aan die we kunnen koppelen aan beheerders functies
        self.account_bko_18 = self._prep_beheerder_lid('BKO')
        self.account_rko1_18 = self._prep_beheerder_lid('RKO1')
        self.account_rko2_18 = self._prep_beheerder_lid('RKO2')
        self.account_rcl101_18 = self._prep_beheerder_lid('RCL101')
        self.account_rcl101_25 = self._prep_beheerder_lid('RCL101-25')
        self.account_rcl112_18 = self._prep_beheerder_lid('RCL112')
        self.account_schutter = self._prep_beheerder_lid('Schutter')
        self.lid_sporter = Sporter.objects.get(
            lid_nr=self.account_schutter.username)

        self.boog_r = BoogType.objects.get(afkorting='R')

        self.sporterboog = SporterBoog(sporter=self.lid_sporter,
                                       boogtype=self.boog_r,
                                       voor_wedstrijd=True)
        self.sporterboog.save()

        # creëer een competitie met deelcompetities
        competities_aanmaken(jaar=2019)

        self.comp_18 = Competitie.objects.get(afstand='18')
        self.comp_25 = Competitie.objects.get(afstand='25')

        # een parallel competitie is noodzakelijk om corner-cases te raken
        competities_aanmaken(jaar=2020)

        # klassengrenzen vaststellen om de competitie voorbij fase A te krijgen
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.url_klassengrenzen_vaststellen_18 = '/bondscompetities/%s/klassengrenzen/vaststellen/' % self.comp_18.pk
        resp = self.client.post(self.url_klassengrenzen_vaststellen_18)
        self.assert_is_redirect_not_plein(resp)  # check for success

        klasse = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                              team__volgorde=10,
                                              is_voor_teams_rk_bk=False)
        klasse.min_ag = 29.0
        klasse.save()

        klasse = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                              team__volgorde=11,
                                              is_voor_teams_rk_bk=False)
        klasse.min_ag = 25.0
        klasse.save()

        self.client.logout()

        self.klasse_recurve_onbekend = (CompetitieKlasse.objects.filter(
            indiv__boogtype=self.boog_r, indiv__is_onbekend=True).all())[0]

        self.deelcomp_bond_18 = DeelCompetitie.objects.filter(
            laag=LAAG_BK, competitie=self.comp_18)[0]
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.filter(
            laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_1)[0]
        self.deelcomp_rayon2_18 = DeelCompetitie.objects.filter(
            laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_2)[0]
        self.deelcomp_regio101_18 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_18,
            nhb_regio=self.regio_101)[0]
        self.deelcomp_regio101_25 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_25,
            nhb_regio=self.regio_101)[0]
        self.deelcomp_regio112_18 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_18,
            nhb_regio=self.regio_112)[0]

        self.cluster_101a_18 = NhbCluster.objects.get(regio=self.regio_101,
                                                      letter='a',
                                                      gebruik='18')
        self.cluster_101e_25 = NhbCluster.objects.get(regio=self.regio_101,
                                                      letter='e',
                                                      gebruik='25')

        self.functie_bko_18 = self.deelcomp_bond_18.functie
        self.functie_rko1_18 = self.deelcomp_rayon1_18.functie
        self.functie_rko2_18 = self.deelcomp_rayon2_18.functie
        self.functie_rcl101_18 = self.deelcomp_regio101_18.functie
        self.functie_rcl101_25 = self.deelcomp_regio101_25.functie
        self.functie_rcl112_18 = self.deelcomp_regio112_18.functie

        self.functie_bko_18.accounts.add(self.account_bko_18)
        self.functie_rko1_18.accounts.add(self.account_rko1_18)
        self.functie_rko2_18.accounts.add(self.account_rko2_18)
        self.functie_rcl101_18.accounts.add(self.account_rcl101_18)
        self.functie_rcl101_25.accounts.add(self.account_rcl101_25)
        self.functie_rcl112_18.accounts.add(self.account_rcl112_18)

        # maak nog een test vereniging, zonder HWL functie
        # stop deze in een cluster
        ver = NhbVereniging()
        ver.naam = "Kleine Club"
        ver.ver_nr = "1100"
        ver.regio = self.regio_101
        ver.save()
        ver.clusters.add(self.cluster_101e_25)

    def _verwerk_mutaties(self,
                          max_mutaties=20,
                          show_warnings=True,
                          show_all=False):
        # vraag de achtergrond taak om de mutaties te verwerken
        f1 = io.StringIO()
        f2 = io.StringIO()
        with self.assert_max_queries(max_mutaties):
            management.call_command('regiocomp_mutaties',
                                    '1',
                                    '--quick',
                                    stderr=f1,
                                    stdout=f2)

        if show_all:  # pragma: no cover
            print(f1.getvalue())
            print(f2.getvalue())

        elif show_warnings:
            lines = f1.getvalue() + '\n' + f2.getvalue()
            for line in lines.split('\n'):
                if line.startswith('[WARNING] '):  # pragma: no cover
                    print(line)
            # for

    def _maak_teams(self, deelcomp):
        """ schrijf een aantal teams in """

        teamtype_r = TeamType.objects.get(afkorting='R')
        klasse_r_ere = CompetitieKlasse.objects.get(
            competitie=deelcomp.competitie,
            team__volgorde=10,
            is_voor_teams_rk_bk=False)  # zie WKL_TEAM in BasisTypen migrations

        team1 = RegiocompetitieTeam(deelcompetitie=deelcomp,
                                    vereniging=self.nhbver_112,
                                    volg_nr=1,
                                    team_type=teamtype_r,
                                    team_naam='Test team 1',
                                    aanvangsgemiddelde=20.0,
                                    klasse=klasse_r_ere)
        team1.save()

        team2 = RegiocompetitieTeam(deelcompetitie=deelcomp,
                                    vereniging=self.nhbver_112,
                                    volg_nr=1,
                                    team_type=teamtype_r,
                                    team_naam='Test team 2',
                                    aanvangsgemiddelde=21.123,
                                    klasse=klasse_r_ere)
        team2.save()

        team3 = RegiocompetitieTeam(deelcompetitie=deelcomp,
                                    vereniging=self.nhbver_112,
                                    volg_nr=1,
                                    team_type=teamtype_r,
                                    team_naam='Test team 3',
                                    aanvangsgemiddelde=18.042,
                                    klasse=klasse_r_ere)
        team3.save()

        # initiële schutters in het team
        # gekoppelde_schutters = models.ManyToManyField(RegioCompetitieSchutterBoog,
        #                                              blank=True)  # mag leeg zijn

        poule = RegiocompetitieTeamPoule(deelcompetitie=deelcomp,
                                         beschrijving='Test poule')
        poule.save()
        poule.teams.add(team1)
        poule.teams.add(team2)
        poule.teams.add(team3)
        # 3 teams zorgt voor een wedstrijd met een Bye

    def test_regio_teams(self):
        # RCL ziet teams
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        team_r = TeamType.objects.get(afkorting='R')
        klasse_r_ere = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                                    team__volgorde=10,
                                                    is_voor_teams_rk_bk=False)
        # create two complete teams
        RegiocompetitieTeam(deelcompetitie=self.deelcomp_regio112_18,
                            vereniging=self.nhbver_112,
                            volg_nr=1,
                            team_type=team_r,
                            team_naam='Test team 1',
                            aanvangsgemiddelde=25.0,
                            klasse=klasse_r_ere).save()

        RegiocompetitieTeam(deelcompetitie=self.deelcomp_regio112_18,
                            vereniging=self.nhbver_112,
                            volg_nr=2,
                            team_type=team_r,
                            team_naam='Test team 2',
                            aanvangsgemiddelde=24.5,
                            klasse=klasse_r_ere).save()

        # create a partial team
        RegiocompetitieTeam(deelcompetitie=self.deelcomp_regio112_18,
                            vereniging=self.nhbver_112,
                            volg_nr=3,
                            team_type=team_r,
                            team_naam='Test team 2',
                            aanvangsgemiddelde=0.0).save()

        temp_team = RegiocompetitieTeam(
            deelcompetitie=self.deelcomp_regio112_18,
            vereniging=self.nhbver_112,
            volg_nr=3,
            team_type=team_r,
            team_naam='',
            aanvangsgemiddelde=0.0)
        self.assertTrue(temp_team.maak_team_naam_kort() != '')

        url = self.url_regio_teams % self.deelcomp_regio112_18.pk

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-teams.dtl', 'plein/site_layout.dtl'))

        # verkeerde deelcomp
        resp = self.client.get(self.url_regio_teams %
                               self.deelcomp_regio101_18.pk)
        self.assert403(resp)

        # niet bestaande deelcomp
        resp = self.client.get(self.url_regio_teams % 999999)
        self.assert404(resp)  # 404 = Not allowed

        # logout

        self.client.logout()
        resp = self.client.get(url)
        self.assert403(resp)

        # 25m

        self.e2e_login_and_pass_otp(self.account_rcl101_25)
        self.e2e_wissel_naar_functie(self.functie_rcl101_25)

        url = self.url_regio_teams % self.deelcomp_regio101_25.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK

        # BB
        self.e2e_login_and_pass_otp(self.testdata.account_admin)
        self.e2e_wisselnaarrol_bb()

        url = self.url_regio_teams_alle % (self.comp_18.pk, 'auto')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-teams.dtl', 'plein/site_layout.dtl'))

        url = self.url_regio_teams_alle % (self.comp_18.pk, 'alle')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-teams.dtl', 'plein/site_layout.dtl'))

        url = self.url_regio_teams_alle % (self.comp_18.pk, '3')  # rayon_nr
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-teams.dtl', 'plein/site_layout.dtl'))

        self.e2e_wissel_naar_functie(self.functie_rko1_18)

        url = self.url_regio_teams_alle % (self.comp_18.pk, 'auto')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-teams.dtl', 'plein/site_layout.dtl'))

        url = self.url_regio_teams_alle % (999999, 'auto')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp, 'Competitie niet gevonden')

        url = self.url_regio_teams_alle % (self.comp_18.pk, '999999'
                                           )  # rayon_nr
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp, 'Selectie wordt niet ondersteund')

        self.e2e_wissel_naar_functie(self.functie_rcl101_18)

        url = self.url_regio_teams_alle % (self.comp_18.pk, 'auto')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp, 'Selectie wordt niet ondersteund')

    def test_ag_controle(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        url = self.url_ag_controle % (self.comp_18.pk, 112)

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-ag-controle.dtl', 'plein/site_layout.dtl'))

        # maak een inschrijving met handmatig AG
        RegioCompetitieSchutterBoog(
            sporterboog=self.sporterboog,
            bij_vereniging=self.sporterboog.sporter.bij_vereniging,
            deelcompetitie=self.deelcomp_regio112_18,
            klasse=self.klasse_recurve_onbekend,
            inschrijf_voorkeur_team=True,
            ag_voor_team_mag_aangepast_worden=True,
            ag_voor_team=5.0).save()

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)

        # verkeerde fase
        zet_competitie_fase(self.comp_18, 'K')
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp)

        # bad pk
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_ag_controle % (999999, 999999))
        self.assert404(resp)

        # verkeerde regio
        with self.assert_max_queries(20):
            resp = self.client.get(self.url_ag_controle %
                                   (self.comp_18.pk, 110))
        self.assert403(resp)

    def test_team_ronde_2p(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 0)

        self.deelcomp_regio112_18.regio_team_punten_model = TEAM_PUNTEN_MODEL_TWEE
        self.deelcomp_regio112_18.save(
            update_fields=['regio_team_punten_model'])

        url = self.url_team_ronde % 999999
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assert404(resp, 'Competitie bestaat niet')

        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert404(resp, 'Competitie bestaat niet')

        url = self.url_team_ronde % self.deelcomp_regio112_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-team-ronde.dtl', 'plein/site_layout.dtl'))
        urls = self.extract_all_urls(resp, skip_menu=True)
        # print('urls: %s' % repr(urls))
        self.assertTrue(len(urls) == 1)
        self.assertTrue(url in urls)

        # maak een paar teams aan
        self._maak_teams(self.deelcomp_regio112_18)

        # start de eerste ronde op
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)

        # nog een paar om concurrency echt flink te testen
        self.client.post(url, {'snel': 1})
        self.client.post(url, {'snel': 1})

        self._verwerk_mutaties(51, show_warnings=False)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        # doorzetten zonder scores werkt niet
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert404(resp, 'Te weinig scores')

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        self._verwerk_mutaties(20)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        # voer een paar scores in
        for ronde_team in RegiocompetitieRondeTeam.objects.all():
            ronde_team.team_score = 100 + ronde_team.pk
            ronde_team.save(update_fields=['team_score'])
        # for

        # doorzetten met scores werkt wel
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)
        self._verwerk_mutaties(39)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 2)

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-team-ronde.dtl', 'plein/site_layout.dtl'))

        # nog een rondje, dan komen in het schema met head-to-head wedstrijden

        # voer weer een paar scores in
        for ronde_team in RegiocompetitieRondeTeam.objects.all():
            ronde_team.team_score = 100 + ronde_team.pk
            ronde_team.save(update_fields=['team_score'])
        # for

        # doorzetten
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)
        self._verwerk_mutaties(39)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 3)

    def test_team_ronde_f1(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 0)

        self.deelcomp_regio112_18.regio_team_punten_model = TEAM_PUNTEN_MODEL_FORMULE1
        self.deelcomp_regio112_18.save(
            update_fields=['regio_team_punten_model'])

        # maak een paar teams aan
        self._maak_teams(self.deelcomp_regio112_18)

        url = self.url_team_ronde % self.deelcomp_regio112_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-team-ronde.dtl', 'plein/site_layout.dtl'))

        # start de eerste ronde op
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)

        self._verwerk_mutaties(39)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        # doorzetten zonder scores werkt niet
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert404(resp, 'Te weinig scores')

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        self._verwerk_mutaties(20)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        # voer een paar scores in
        top_teams = list(
            RegiocompetitieRondeTeam.objects.values_list('pk', flat=True))
        top_teams = top_teams[-2:]
        for ronde_team in RegiocompetitieRondeTeam.objects.all():
            if ronde_team.pk in top_teams:
                ronde_team.team_score = 999
            else:
                ronde_team.team_score = 100 + ronde_team.pk
            ronde_team.save(update_fields=['team_score'])
        # for

        # doorzetten met scores werkt wel
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)
        self._verwerk_mutaties(39)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 2)

        # controleer de wp verdeling: de twee top teams hebben dezelfde score, dus dezelfde wp
        wps = list(
            RegiocompetitieRondeTeam.objects.filter(
                pk__in=top_teams).values_list('team_punten', flat=True))
        self.assertEqual(wps, [10, 10])

    def test_team_ronde_som(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 0)

        self.deelcomp_regio112_18.regio_team_punten_model = TEAM_PUNTEN_MODEL_SOM_SCORES
        self.deelcomp_regio112_18.save(
            update_fields=['regio_team_punten_model'])

        # maak een paar teams aan
        self._maak_teams(self.deelcomp_regio112_18)

        url = self.url_team_ronde % self.deelcomp_regio112_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-team-ronde.dtl', 'plein/site_layout.dtl'))

        # start de eerste ronde op
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)

        self._verwerk_mutaties(39)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        # doorzetten zonder scores werkt niet
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert404(resp, 'Te weinig scores')

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        self._verwerk_mutaties(20)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 1)

        # voor een paar scores in
        for ronde_team in RegiocompetitieRondeTeam.objects.all():
            ronde_team.team_score = 100 + ronde_team.pk
            ronde_team.save(update_fields=['team_score'])
        # for

        # doorzetten met scores werkt wel
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'snel': 1})
        self.assert_is_redirect(
            resp,
            '/bondscompetities/%s/' % self.deelcomp_regio112_18.competitie.pk)
        self._verwerk_mutaties(39)

        self.deelcomp_regio112_18 = DeelCompetitie.objects.get(
            pk=self.deelcomp_regio112_18.pk)
        self.assertEqual(self.deelcomp_regio112_18.huidige_team_ronde, 2)
示例#16
0
    def setUp(self):
        """ initialisatie van de test case """
        regio_111 = NhbRegio.objects.get(pk=111)

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

        teamtype_r = TeamType.objects.get(afkorting='R')

        datum = datetime.date(year=2000, month=1, day=1)

        comp = Competitie(
                    beschrijving='Test',
                    afstand='18',
                    begin_jaar=2000,
                    uiterste_datum_lid=datum,
                    begin_aanmeldingen=datum,
                    einde_aanmeldingen=datum,
                    einde_teamvorming=datum,
                    eerste_wedstrijd=datum,
                    laatst_mogelijke_wedstrijd=datum,
                    datum_klassengrenzen_rk_bk_teams=datum,
                    rk_eerste_wedstrijd=datum,
                    rk_laatste_wedstrijd=datum,
                    bk_eerste_wedstrijd=datum,
                    bk_laatste_wedstrijd=datum)
        comp.save()
        self.comp = comp

        deelcomp = DeelCompetitie(
                            competitie=comp,
                            laag=LAAG_REGIO,
                            nhb_regio=regio_111)
        deelcomp.save()

        indiv_r1 = IndivWedstrijdklasse.objects.filter(boogtype=boog_r)[1]
        indiv_r2 = IndivWedstrijdklasse.objects.filter(boogtype=boog_r)[2]
        indiv_ib = IndivWedstrijdklasse.objects.filter(boogtype=boog_ib)[0]
        indiv_bb = IndivWedstrijdklasse.objects.filter(boogtype=boog_bb)[0]

        klasse_r1 = CompetitieKlasse(
                        competitie=comp,
                        indiv=indiv_r1,
                        min_ag=2.0)
        klasse_r1.save()

        CompetitieKlasse(
                competitie=comp,
                indiv=indiv_r2,
                min_ag=1.0).save()

        CompetitieKlasse(
                competitie=comp,
                indiv=indiv_bb,
                min_ag=0.0).save()

        klasse_ib = CompetitieKlasse(
                        competitie=comp,
                        indiv=indiv_ib,
                        min_ag=0.0)
        klasse_ib.save()

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Grote Club met een naam langer dan 30 tekens"
        ver.ver_nr = "1000"
        ver.regio = regio_111
        ver.save()

        # maak een test lid aan
        sporter = Sporter()
        sporter.lid_nr = 123456
        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 = None
        sporter.email = ''
        sporter.save()
        self.sporter = sporter

        sporterboog_r = SporterBoog(
                            sporter=sporter,
                            boogtype=boog_r,
                            voor_wedstrijd=True)
        sporterboog_r.save()
        self.sporterboog_r = sporterboog_r

        sporterboog_ib = SporterBoog(
                            sporter=sporter,
                            boogtype=boog_ib,
                            voor_wedstrijd=False)
        sporterboog_ib.save()
        self.sporterboog_ib = sporterboog_ib

        sporterboog_bb = SporterBoog(
                            sporter=sporter,
                            boogtype=boog_bb,
                            voor_wedstrijd=False)
        sporterboog_bb.save()
        self.sporterboog_bb = sporterboog_bb

        deelnemer_r = RegioCompetitieSchutterBoog(
                            deelcompetitie=deelcomp,
                            sporterboog=sporterboog_r,
                            bij_vereniging=ver,
                            klasse=klasse_r1,
                            aantal_scores=1)
        deelnemer_r.save()
        self.deelnemer_r = deelnemer_r

        deelnemer_ib = RegioCompetitieSchutterBoog(
                            deelcompetitie=deelcomp,
                            sporterboog=sporterboog_ib,
                            bij_vereniging=ver,
                            klasse=klasse_ib,
                            aantal_scores=2)
        deelnemer_ib.save()
        self.deelnemer_ib = deelnemer_ib

        team = RegiocompetitieTeam(
                            deelcompetitie=deelcomp,
                            vereniging=ver,
                            volg_nr=1,
                            team_type=teamtype_r,
                            team_naam='Test')
        team.save()
        self.team = team

        team.gekoppelde_schutters.add(deelnemer_ib)
示例#17
0
class TestCompRegioInstellingen(E2EHelpers, TestCase):
    """ tests voor de CompRegio applicatie, Teams functie """

    test_after = ('Competitie.test_fase', 'Competitie.test_beheerders',
                  'Competitie.test_competitie')

    url_regio_instellingen = '/bondscompetities/regio/instellingen/%s/regio-%s/'  # comp_pk, regio-nr
    url_regio_globaal = '/bondscompetities/regio/instellingen/%s/globaal/'  # comp_pk

    testdata = None

    @classmethod
    def setUpTestData(cls):
        cls.testdata = testdata.TestData()
        cls.testdata.maak_accounts()

    def _prep_beheerder_lid(self, voornaam):
        lid_nr = self._next_lid_nr
        self._next_lid_nr += 1

        sporter = Sporter()
        sporter.lid_nr = lid_nr
        sporter.geslacht = "M"
        sporter.voornaam = voornaam
        sporter.achternaam = "Tester"
        sporter.email = voornaam.lower() + "@nhb.test"
        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 = self.nhbver_101
        sporter.save()

        return self.e2e_create_account(lid_nr,
                                       sporter.email,
                                       sporter.voornaam,
                                       accepteer_vhpg=True)

    def setUp(self):
        """ eenmalige setup voor alle tests
            wordt als eerste aangeroepen
        """
        self._next_lid_nr = 100001

        self.rayon_1 = NhbRayon.objects.get(rayon_nr=1)
        self.rayon_2 = NhbRayon.objects.get(rayon_nr=2)
        self.regio_101 = NhbRegio.objects.get(regio_nr=101)
        self.regio_105 = NhbRegio.objects.get(regio_nr=105)
        self.regio_112 = NhbRegio.objects.get(regio_nr=112)

        # maak een test vereniging
        ver = NhbVereniging()
        ver.naam = "Zuidelijke Club"
        ver.ver_nr = 1111
        ver.regio = self.regio_112
        # secretaris kan nog niet ingevuld worden
        ver.save()
        self.nhbver_112 = ver

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

        loc = WedstrijdLocatie(banen_18m=1,
                               banen_25m=1,
                               adres='De Spanning 1, Houtdorp')
        loc.save()
        loc.verenigingen.add(ver)
        self.loc = loc

        # maak HWL functie aan voor deze vereniging
        self.functie_hwl = maak_functie("HWL Vereniging %s" % ver.ver_nr,
                                        "HWL")
        self.functie_hwl.nhb_ver = ver
        self.functie_hwl.save()

        self.functie_wl = maak_functie("WL Vereniging %s" % ver.ver_nr, "WL")
        self.functie_wl.nhb_ver = ver
        self.functie_wl.save()

        # maak test leden aan die we kunnen koppelen aan beheerders functies
        self.account_bko_18 = self._prep_beheerder_lid('BKO')
        self.account_rko1_18 = self._prep_beheerder_lid('RKO1')
        self.account_rko2_18 = self._prep_beheerder_lid('RKO2')
        self.account_rcl101_18 = self._prep_beheerder_lid('RCL101')
        self.account_rcl101_25 = self._prep_beheerder_lid('RCL101-25')
        self.account_rcl112_18 = self._prep_beheerder_lid('RCL112')
        self.account_schutter = self._prep_beheerder_lid('Schutter')
        self.lid_sporter = Sporter.objects.get(
            lid_nr=self.account_schutter.username)

        self.boog_r = BoogType.objects.get(afkorting='R')

        self.sporterboog = SporterBoog(sporter=self.lid_sporter,
                                       boogtype=self.boog_r,
                                       voor_wedstrijd=True)
        self.sporterboog.save()

        # creëer een competitie met deelcompetities
        competities_aanmaken(jaar=2019)

        self.comp_18 = Competitie.objects.get(afstand='18')
        self.comp_25 = Competitie.objects.get(afstand='25')

        # een parallel competitie is noodzakelijk om corner-cases te raken
        competities_aanmaken(jaar=2020)

        # klassengrenzen vaststellen om de competitie voorbij fase A te krijgen
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()
        self.url_klassengrenzen_vaststellen_18 = '/bondscompetities/%s/klassengrenzen/vaststellen/' % self.comp_18.pk
        resp = self.client.post(self.url_klassengrenzen_vaststellen_18)
        self.assert_is_redirect_not_plein(resp)  # check for success

        klasse = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                              team__volgorde=10,
                                              is_voor_teams_rk_bk=False)
        klasse.min_ag = 29.0
        klasse.save()

        klasse = CompetitieKlasse.objects.get(competitie=self.comp_18,
                                              team__volgorde=11,
                                              is_voor_teams_rk_bk=False)
        klasse.min_ag = 25.0
        klasse.save()

        self.client.logout()

        self.klasse_recurve_onbekend = (CompetitieKlasse.objects.filter(
            indiv__boogtype=self.boog_r, indiv__is_onbekend=True).all())[0]

        self.deelcomp_bond_18 = DeelCompetitie.objects.filter(
            laag=LAAG_BK, competitie=self.comp_18)[0]
        self.deelcomp_rayon1_18 = DeelCompetitie.objects.filter(
            laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_1)[0]
        self.deelcomp_rayon2_18 = DeelCompetitie.objects.filter(
            laag=LAAG_RK, competitie=self.comp_18, nhb_rayon=self.rayon_2)[0]
        self.deelcomp_regio101_18 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_18,
            nhb_regio=self.regio_101)[0]
        self.deelcomp_regio101_25 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_25,
            nhb_regio=self.regio_101)[0]
        self.deelcomp_regio112_18 = DeelCompetitie.objects.filter(
            laag=LAAG_REGIO, competitie=self.comp_18,
            nhb_regio=self.regio_112)[0]

        self.cluster_101a_18 = NhbCluster.objects.get(regio=self.regio_101,
                                                      letter='a',
                                                      gebruik='18')
        self.cluster_101e_25 = NhbCluster.objects.get(regio=self.regio_101,
                                                      letter='e',
                                                      gebruik='25')

        self.functie_bko_18 = self.deelcomp_bond_18.functie
        self.functie_rko1_18 = self.deelcomp_rayon1_18.functie
        self.functie_rko2_18 = self.deelcomp_rayon2_18.functie
        self.functie_rcl101_18 = self.deelcomp_regio101_18.functie
        self.functie_rcl101_25 = self.deelcomp_regio101_25.functie
        self.functie_rcl112_18 = self.deelcomp_regio112_18.functie

        self.functie_bko_18.accounts.add(self.account_bko_18)
        self.functie_rko1_18.accounts.add(self.account_rko1_18)
        self.functie_rko2_18.accounts.add(self.account_rko2_18)
        self.functie_rcl101_18.accounts.add(self.account_rcl101_18)
        self.functie_rcl101_25.accounts.add(self.account_rcl101_25)
        self.functie_rcl112_18.accounts.add(self.account_rcl112_18)

        # maak nog een test vereniging, zonder HWL functie
        # stop deze in een cluster
        ver = NhbVereniging()
        ver.naam = "Kleine Club"
        ver.ver_nr = "1100"
        ver.regio = self.regio_101
        ver.save()
        ver.clusters.add(self.cluster_101e_25)

    def test_regio_instellingen(self):
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        url = self.url_regio_instellingen % (self.comp_18.pk, 112)

        # fase A

        # tijdens competitie fase A mogen alle instellingen aangepast worden
        zet_competitie_fase(self.comp_18, 'A')

        # when the phase is set artificially, some dates are left behind
        # let's repair that here
        self.comp_18 = Competitie.objects.get(pk=self.comp_18.pk)
        self.comp_18.eerste_wedstrijd = self.comp_18.begin_aanmeldingen
        self.comp_18.eerste_wedstrijd += datetime.timedelta(days=1)
        self.comp_18.save()
        post_datum_ok = self.comp_18.begin_aanmeldingen.strftime('%Y-%m-%d')
        # print('begin_aanmeldingen: %s' % comp_datum1)
        post_datum_bad = self.comp_18.eerste_wedstrijd.strftime('%Y-%m-%d')
        # print('eerste_wedstrijd: %s' % comp_datum2)

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-instellingen.dtl', 'plein/site_layout.dtl'))

        # all params missing
        with self.assert_max_queries(20):
            resp = self.client.post(url)
        self.assert_is_redirect_not_plein(resp)

        # all params present
        with self.assert_max_queries(20):
            resp = self.client.post(
                url, {
                    'teams': 'ja',
                    'team_alloc': 'vast',
                    'team_punten': 'F1',
                    'einde_teams_aanmaken': post_datum_ok
                })
        self.assert_is_redirect_not_plein(resp)

        # late date
        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'teams': 'ja',
                'einde_teams_aanmaken': post_datum_bad
            })
        self.assert404(resp)  # 404 = Not allowed

        # late date - not checked when teams=nee
        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'teams': 'nee',
                'einde_teams_aanmaken': post_datum_bad
            })
        self.assert_is_redirect_not_plein(resp)
        # teamcompetitie staat nu op Nee
        # zet teamcompetitie weer op Ja
        with self.assert_max_queries(20):
            resp = self.client.post(url, {'teams': 'ja', 'team_alloc': 'vast'})
        self.assert_is_redirect_not_plein(resp)

        # bad date
        with self.assert_max_queries(20):
            resp = self.client.post(url, {
                'teams': 'ja',
                'einde_teams_aanmaken': 'xxx'
            })
        self.assert404(resp)  # 404 = Not allowed

        # fase B en C

        # tot en met fase C mogen de team punten en datum aanmaken teams aangepast worden
        oude_punten = 'F1'

        for fase in ('B', 'C'):
            zet_competitie_fase(self.comp_18, fase)

            with self.assert_max_queries(20):
                resp = self.client.get(url)
            self.assertEqual(resp.status_code, 200)  # 200 = OK
            self.assert_html_ok(resp)
            self.assert_template_used(
                resp,
                ('compregio/rcl-instellingen.dtl', 'plein/site_layout.dtl'))

            deelcomp_pre = DeelCompetitie.objects.get(
                pk=self.deelcomp_regio112_18.pk)
            self.assertTrue(deelcomp_pre.regio_organiseert_teamcompetitie)
            self.assertTrue(deelcomp_pre.regio_heeft_vaste_teams)
            self.assertEqual(deelcomp_pre.regio_team_punten_model, oude_punten)
            if oude_punten == 'F1':
                nieuwe_punten = '2P'
            else:
                nieuwe_punten = 'SS'

            # all params present
            with self.assert_max_queries(20):
                resp = self.client.post(
                    url, {
                        'teams': 'nee',
                        'team_alloc': 'vsg',
                        'team_punten': nieuwe_punten,
                        'einde_teams_aanmaken': post_datum_ok
                    })
            self.assert_is_redirect_not_plein(resp)

            deelcomp_post = DeelCompetitie.objects.get(
                pk=self.deelcomp_regio112_18.pk)
            self.assertTrue(deelcomp_post.regio_organiseert_teamcompetitie)
            self.assertTrue(deelcomp_post.regio_heeft_vaste_teams)
            self.assertEqual(deelcomp_post.regio_team_punten_model,
                             nieuwe_punten)
            oude_punten = nieuwe_punten

        # fase D

        zet_competitie_fase(self.comp_18, 'D')

        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(
            resp, ('compregio/rcl-instellingen.dtl', 'plein/site_layout.dtl'))

    def test_regio_instellingen_bad(self):
        # bad cases
        self.e2e_login_and_pass_otp(self.account_rcl112_18)
        self.e2e_wissel_naar_functie(self.functie_rcl112_18)

        url = self.url_regio_instellingen % (self.comp_18.pk, 112)

        # na fase F zijn de instellingen niet meer in te zien
        zet_competitie_fase(self.comp_18, 'K')  # fase G is niet te zetten

        resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not found
        resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not found

        # niet bestaande regio
        url = self.url_regio_instellingen % (self.comp_18.pk, 100)
        resp = self.client.get(url)
        self.assert404(resp)  # 404 = Not found
        resp = self.client.post(url)
        self.assert404(resp)  # 404 = Not found

        # niet de regio van de RCL
        url = self.url_regio_instellingen % (self.comp_18.pk, 110)
        resp = self.client.get(url)
        self.assert403(resp)
        resp = self.client.post(url)
        self.assert403(resp)

        # logout

        url = self.url_regio_instellingen % (self.comp_18.pk, 112)
        self.client.logout()
        resp = self.client.get(url)
        self.assert403(resp)

    def test_regio_globaal(self):
        self.e2e_login_and_pass_otp(self.testdata.account_bb)
        self.e2e_wisselnaarrol_bb()

        url = self.url_regio_globaal % self.comp_18.pk
        with self.assert_max_queries(20):
            resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)  # 200 = OK
        self.assert_html_ok(resp)
        self.assert_template_used(resp,
                                  ('compregio/rcl-instellingen-globaal.dtl',
                                   'plein/site_layout.dtl'))
示例#18
0
    def _maak_leden_aan(self):
        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 = self.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
        sporterboog = SporterBoog(sporter=self.sporter_100001,
                                  boogtype=self.boog_r,
                                  voor_wedstrijd=True)  # TODO: migrate
        sporterboog.save()
        self.sporterboog_100001 = sporterboog

        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 = self.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
        sporterboog = SporterBoog(sporter=self.sporter_100002,
                                  boogtype=self.boog_r,
                                  voor_wedstrijd=True)  # TODO: migrate
        sporterboog.save()
        self.sporterboog_100002 = sporterboog

        sporter = Sporter()
        sporter.lid_nr = 100003
        sporter.geslacht = "M"
        sporter.voornaam = "Geen"
        sporter.achternaam = "Vereniging"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=2008, month=3, day=4)
        sporter.sinds_datum = datetime.date(year=2015, month=11, day=12)
        # lid.bij_vereniging =
        sporter.account = self.e2e_create_account(sporter.lid_nr,
                                                  sporter.email,
                                                  sporter.voornaam)
        sporter.save()

        sporter = Sporter()
        sporter.lid_nr = 100004
        sporter.geslacht = "V"
        sporter.voornaam = "Juf"
        sporter.achternaam = "de Schutter"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=1988, month=12, day=4)
        sporter.sinds_datum = datetime.date(year=2015, month=7, day=15)
        sporter.bij_vereniging = self.ver
        sporter.account = self.e2e_create_account(sporter.lid_nr,
                                                  sporter.email,
                                                  sporter.voornaam)
        sporter.save()
        self.sporter_100004 = sporter
        sporterboog = SporterBoog(sporter=self.sporter_100004,
                                  boogtype=self.boog_r,
                                  voor_wedstrijd=True)  # TODO: migrate
        sporterboog.save()
        self.sporterboog_100004 = sporterboog

        sporter = Sporter()
        sporter.lid_nr = 100005
        sporter.geslacht = "V"
        sporter.voornaam = "Jans"
        sporter.achternaam = "de Schutter"
        sporter.email = "*****@*****.**"
        sporter.geboorte_datum = datetime.date(year=1977, month=12, day=4)
        sporter.sinds_datum = datetime.date(year=2015, month=7, day=15)
        sporter.bij_vereniging = self.ver
        sporter.account = self.e2e_create_account(sporter.lid_nr,
                                                  sporter.email,
                                                  sporter.voornaam)
        sporter.save()
        self.sporter_100005 = sporter
        sporterboog = SporterBoog(sporter=self.sporter_100005,
                                  boogtype=self.boog_r,
                                  voor_wedstrijd=True)  # TODO: migrate
        sporterboog.save()
        self.sporterboog_100005 = sporterboog