Exemple #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)
Exemple #3
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()
Exemple #4
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)
Exemple #5
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()
Exemple #6
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
    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()
    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()
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)
Exemple #10
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)
Exemple #11
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)
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'))
Exemple #13
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
Exemple #14
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)
Exemple #15
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())