def post(self, request, *args, **kwargs): deelcomp = self._get_deelcomp(kwargs['deelcomp_pk']) if self.rol_nu == Rollen.ROL_HWL: ver = self.functie_nu.nhb_ver now = timezone.now() einde = datetime.datetime( year=deelcomp.einde_teams_aanmaken.year, month=deelcomp.einde_teams_aanmaken.month, day=deelcomp.einde_teams_aanmaken.day, hour=0, minute=0, second=0) einde = timezone.make_aware(einde) mag_wijzigen = (now <= einde) if not mag_wijzigen: raise Http404('Mag niet (meer) wijzigen') else: # RCL ver = None # wordt later ingevuld try: team_pk = int(kwargs['team_pk'][:6]) # afkappen voor de veiligheid except (ValueError, KeyError): raise Http404() # default pagina om naar toe te gaan if self.rol_nu == Rollen.ROL_HWL: url = reverse('CompRegio:teams-regio', kwargs={'deelcomp_pk': deelcomp.pk}) else: url = reverse('CompRegio:regio-teams', kwargs={'deelcomp_pk': deelcomp.pk}) if team_pk == 0: # nieuw team volg_nrs = (RegiocompetitieTeam.objects.filter( deelcompetitie=deelcomp, vereniging=ver).values_list('volg_nr', flat=True)) volg_nrs = list(volg_nrs) volg_nrs.append(0) next_nr = max(volg_nrs) + 1 if len(volg_nrs) > 10: # te veel teams raise Http404('Maximum van 10 teams is bereikt') afkorting = request.POST.get('team_type', '') try: team_type = TeamType.objects.get(afkorting=afkorting) except TeamType.DoesNotExist: raise Http404() team = RegiocompetitieTeam(deelcompetitie=deelcomp, vereniging=ver, volg_nr=next_nr, team_type=team_type, team_naam=' ') team.save() verwijderen = False # meteen doorsturen naar de 'koppelen' pagina url = reverse('CompRegio:teams-regio-koppelen', kwargs={'team_pk': team.pk}) else: try: team = (RegiocompetitieTeam.objects.select_related( 'team_type').get(pk=team_pk, deelcompetitie=deelcomp)) except RegiocompetitieTeam.DoesNotExist: raise Http404() if self.rol_nu == Rollen.ROL_HWL: if team.vereniging != self.functie_nu.nhb_ver: raise Http404('Team is niet van jouw vereniging') verwijderen = request.POST.get('verwijderen', None) is not None if not verwijderen: afkorting = request.POST.get('team_type', '') if team.team_type.afkorting != afkorting: try: team_type = TeamType.objects.get(afkorting=afkorting) except TeamType.DoesNotExist: raise Http404() team.team_type = team_type team.aanvangsgemiddelde = 0.0 team.klasse = None team.save() # verwijder eventueel gekoppelde sporters bij wijziging team type, # om verkeerde boog typen te voorkomen team.gekoppelde_schutters.clear() if not verwijderen: team_naam = request.POST.get('team_naam', '') team_naam = team_naam.strip() if team.team_naam != team_naam: if team_naam == '': team_naam = "%s-%s" % (ver.ver_nr, team.volg_nr) team.team_naam = team_naam team.save() else: team.delete() return HttpResponseRedirect(url)
def maak_inschrijvingen_regio_teamcompetitie(self, afstand, ver_nr): """ Schrijf teams in voor de teamcompetitie, voor een specifiek vereniging afstand = 18 / 25 ver_nr = regio_nr * 10 + volgnummer """ ver = NhbVereniging.objects.select_related('regio').get(ver_nr=ver_nr) regio_nr = ver.regio.regio_nr if afstand == 18: deelcomp = self.deelcomp18_regio[regio_nr] deelnemers = self.comp18_deelnemers deelnemers_team = self.comp18_deelnemers_team deelnemers_geen_team = self.comp18_deelnemers_geen_team klassen = self.comp18_klassen_team regioteams = self.comp18_regioteams else: deelcomp = self.deelcomp25_regio[regio_nr] deelnemers = self.comp25_deelnemers deelnemers_team = self.comp25_deelnemers_team deelnemers_geen_team = self.comp25_deelnemers_geen_team klassen = self.comp25_klassen_team regioteams = self.comp25_regioteams # verdeel de deelnemers per boogtype deelnemers_per_boog = dict() # [boogtype.afkorting] = list(deelnemer) for deelnemer in deelnemers: if deelnemer.inschrijf_voorkeur_team: # print('deelnemer: %s (indiv ag: %s, team ag: %s)' % (deelnemer, deelnemer.ag_voor_indiv, deelnemer.ag_voor_team)) afkorting = deelnemer.sporterboog.boogtype.afkorting try: deelnemers_per_boog[afkorting].append(deelnemer) except KeyError: deelnemers_per_boog[afkorting] = [deelnemer] deelnemers_team.append(deelnemer) else: deelnemers_geen_team.append(deelnemer) # for # zet 1x BB en 1x LB in een recurve team deelnemers_per_boog['R'].append(deelnemers_per_boog['BB'].pop(0)) deelnemers_per_boog['R'].append(deelnemers_per_boog['LB'].pop(0)) bulk = list() for afkorting, deelnemers in deelnemers_per_boog.items(): # alle teams moeten in een klasse (maakt niet veel uit welke) klasse = klassen[afkorting][0] aantal = len(deelnemers) while aantal > 0: aantal -= 4 next_nr = len(bulk) + 1 team = RegiocompetitieTeam( deelcompetitie=deelcomp, vereniging=ver, volg_nr=next_nr, team_type=self.afkorting2teamtype[afkorting], team_naam='%s-%s-%s' % (ver_nr, next_nr, afkorting), klasse=klasse) bulk.append(team) # while # for RegiocompetitieTeam.objects.bulk_create(bulk) # koppel de sporters aan het team for team in ( RegiocompetitieTeam.objects.select_related('team_type').filter( deelcompetitie=deelcomp, vereniging=ver)): afkorting = team.team_type.afkorting # selecteer de volgende 4 sporters voor dit team deelnemers = deelnemers_per_boog[afkorting][:4] deelnemers_per_boog[afkorting] = deelnemers_per_boog[afkorting][ len(deelnemers):] # bereken de team sterkte team.aanvangsgemiddelde = sum([ deelnemer.ag_voor_team for deelnemer in deelnemers ]) # TODO: top 3 team.save(update_fields=['aanvangsgemiddelde']) team.gekoppelde_schutters.set(deelnemers) regioteams.append(team)
def get_context_data(self, **kwargs): """ called by the template system to get the context data for the template """ context = super().get_context_data(**kwargs) if self.rol_nu == Rollen.ROL_RCL: raise Http404('Verkeerde rol') # zoek de deelcompetitie waar de regio teams voor in kunnen stellen context['deelcomp'] = deelcomp = self._get_deelcomp( kwargs['deelcomp_pk']) ver = self.functie_nu.nhb_ver now = timezone.now() einde = datetime.datetime(year=deelcomp.einde_teams_aanmaken.year, month=deelcomp.einde_teams_aanmaken.month, day=deelcomp.einde_teams_aanmaken.day, hour=0, minute=0, second=0) einde = timezone.make_aware(einde) mag_wijzigen = (now <= einde) teamtype_default = None teams = TeamType.objects.order_by('volgorde') for obj in teams: obj.choice_name = obj.afkorting if obj.afkorting == 'R': teamtype_default = obj # for context['opt_team_type'] = teams try: team_pk = int(kwargs['team_pk'][:6]) # afkappen voor de veiligheid team = (RegiocompetitieTeam.objects.get(pk=team_pk, deelcompetitie=deelcomp, vereniging=ver)) except (ValueError, RegiocompetitieTeam.DoesNotExist): raise Http404('Team niet gevonden of niet van jouw vereniging') except KeyError: # dit is een nieuw team if not mag_wijzigen: raise Http404('Kan geen nieuw team meer aanmaken') team = RegiocompetitieTeam(pk=0, vereniging=self.functie_nu.nhb_ver, team_type=teamtype_default) context['team'] = team for obj in teams: obj.actief = team.team_type == obj # for if mag_wijzigen: context['url_opslaan'] = reverse('CompRegio:teams-regio-wijzig', kwargs={ 'deelcomp_pk': deelcomp.pk, 'team_pk': team.pk }) if team.pk > 0: context['url_verwijderen'] = context['url_opslaan'] else: context['readonly'] = True menu_dynamics(self.request, context, actief='vereniging') return context
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 _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)
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)
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())