def get(self, request, *args, **kwargs): """ called by the template system to get the context data for the template """ if not is_browser_supported(request): return redirect('Plein:niet-ondersteund') # zet alles goed voor bezoekers / geen rol template = TEMPLATE_PLEIN_BEZOEKER context = dict() # ga naar live server banner tonen? context['ga_naar_live_server'] = settings.IS_TEST_SERVER if request.user.is_authenticated: rol_nu = rol_get_huidige(request) if rol_nu == Rollen.ROL_SPORTER: template = TEMPLATE_PLEIN_SPORTER elif rol_nu == Rollen.ROL_NONE or rol_nu is None: # gebruik de bezoeker pagina pass else: # beheerder template = TEMPLATE_PLEIN_BEHEERDER handleiding_pagina = ROL2HANDLEIDING_PAGINA[rol_nu] context['handleiding_url'] = reverse_handleiding( request, handleiding_pagina) if rol_nu == Rollen.ROL_BB: context['rol_is_bb'] = True elif rol_nu == Rollen.ROL_BKO: context['rol_is_bko'] = True elif rol_nu == Rollen.ROL_RKO: context['rol_is_rko'] = True elif rol_nu == Rollen.ROL_RCL: context['rol_is_rcl'] = True elif rol_nu == Rollen.ROL_HWL: context['rol_is_hwl'] = True elif rol_nu == Rollen.ROL_WL: context['rol_is_wl'] = True elif rol_nu == Rollen.ROL_SEC: context['rol_is_sec'] = True else: # pragma: no cover # vangnet voor nieuwe rollen raise ValueError("PleinView: onbekende rol %s" % rol_nu) context['huidige_rol'] = rol_get_beschrijving(request) # kijk hoeveel taken er open staan eval_open_taken(request) context['naam_site'] = settings.NAAM_SITE context['email_support'] = settings.EMAIL_SUPPORT menu_dynamics(self.request, context) return render(request, template, context)
def test_geen_sessie(self): # probeer beveiliging tegen afwezigheid sessie variabelen # typisch tweedelijns, want views checken user.is_authenticated request = self.client self.assertTrue( SESSIONVAR_ROL_MAG_WISSELEN not in request.session.keys()) res = rol_mag_wisselen(request) self.assertFalse(res) self.assertTrue(SESSIONVAR_ROL_HUIDIGE not in request.session.keys()) rol_activeer_rol(request, 'schutter') self.assertTrue(SESSIONVAR_ROL_HUIDIGE not in request.session.keys()) rol_activeer_functie(request, 'geen getal') self.assertTrue( SESSIONVAR_ROL_PALLET_FUNCTIES not in request.session.keys()) rol_activeer_functie(request, 0) self.assertTrue( SESSIONVAR_ROL_PALLET_VAST not in request.session.keys()) pallet = [tup for tup in rol_enum_pallet(request)] self.assertEqual(len(pallet), 0) rol_activeer_rol(request, 'geen') self.assertTrue( SESSIONVAR_ROL_BESCHRIJVING not in request.session.keys()) self.assertEqual(rol_get_beschrijving(request), "?")
def menu_dynamics(request, context, actief='hetplein'): """ Deze functie update the template context voor het dynamische gedrag van menu zoals de 'Andere rollen' en het menu item dat actief is. """ # welke regel van het menu op laten lichten? context['menu_actief'] = actief if not (actief in ACTIEF_OPTIES or actief.startswith('competitie-')): raise AssertionError("menu_dynamics: Onbekende 'actief' waarde: %s" % repr(actief)) # test server banner tonen? context['is_test_server'] = settings.IS_TEST_SERVER # zet context variabelen om aan te geven welke optionele delen van het menu getoond moeten worden context['toon_kalender'] = False if request.user.is_authenticated: # sidenav naam context['menu_toon_naam'] = True # wissel van rol toegestaan? if rol_mag_wisselen(request): rol = rol_get_huidige(request) context['toon_kalender'] = True # sidenav rol context['menu_rol_beschrijving'] = rol_get_beschrijving(request) # activeer menu 'wissel van rol' context['menu_show_wisselvanrol'] = True if rol in (Rollen.ROL_SEC, Rollen.ROL_HWL, Rollen.ROL_WL): context['menu_toon_vereniging'] = True if rol == Rollen.ROL_SPORTER: context['menu_toon_sporter_profiel'] = True if rol in (Rollen.ROL_BKO, Rollen.ROL_RKO, Rollen.ROL_RCL, Rollen.ROL_SEC, Rollen.ROL_HWL, Rollen.ROL_WL): context['toon_kalender'] = False # taken if rol in (Rollen.ROL_BB, Rollen.ROL_BKO, Rollen.ROL_RKO, Rollen.ROL_RCL, Rollen.ROL_HWL): context['menu_show_taken'] = True context['menu_aantal_open_taken'] = aantal_open_taken(request) else: context['menu_toon_sporter_profiel'] = True # het label met de scherm grootte boven aan het scherm context['toon_schermgrootte'] = settings.DEBUG
def _get_competitie_overzicht_hwl(self, request, context, comp): context['huidige_rol'] = rol_get_beschrijving(request) # haal zowel de 18m als 25m deelcompetities op in de regio van de HWL context['planning_deelcomp'] = (DeelCompetitie .objects .filter(competitie=comp, laag=LAAG_REGIO, is_afgesloten=False, nhb_regio=self.functie_nu.nhb_ver.regio)) for deelcomp in context['planning_deelcomp']: comp.regio_einde_teams_aanmaken = deelcomp.einde_teams_aanmaken # for comp.url_inschrijvingen = reverse('CompInschrijven:lijst-regiocomp-regio', kwargs={'comp_pk': comp.pk, 'regio_pk': self.functie_nu.nhb_ver.regio.pk}) return TEMPLATE_COMPETITIE_OVERZICHT_HWL
def _get_competitie_overzicht_beheerder(self, request, context, comp): kan_beheren = False context['huidige_rol'] = rol_get_beschrijving(request) context['toon_functies'] = self.rol_nu in (Rollen.ROL_BB, Rollen.ROL_BKO, Rollen.ROL_RKO) if self.functie_nu: # kijk of deze rol nog iets te doen heeft context['rol_is_klaar'] = True # toon de competitie waar de functie een rol in heeft of had (BKO/RKO/RCL) for deelcomp in (DeelCompetitie .objects .filter(competitie=comp, functie=self.functie_nu)): kan_beheren = True deelcomp.competitie.bepaal_fase() if not deelcomp.is_afgesloten: context['rol_is_klaar'] = False # for else: # toon alle competities (IT/BB) context['rol_is_klaar'] = False context['object_list'] = list() context['regio_instellingen_globaal'] = True if self.rol_nu == Rollen.ROL_BB: context['rol_is_bb'] = True kan_beheren = True if not comp.klassengrenzen_vastgesteld: afstand_meter = int(comp.afstand) datum = wanneer_ag_vastgesteld(afstand_meter) if datum: context['datum_ag_vastgesteld'] = localize(datum.date()) context['comp_afstand'] = comp.afstand comp.url_ag_vaststellen = reverse('Competitie:ag-vaststellen-afstand', kwargs={'afstand': comp.afstand}) context['planning_deelcomp'] = (DeelCompetitie .objects .filter(competitie=comp, laag=LAAG_BK) .select_related('competitie') .order_by('competitie__afstand')) for obj in context['planning_deelcomp']: kan_beheren = True obj.titel = 'Planning' obj.tekst = 'Landelijke planning voor deze competitie.' obj.url = reverse('Competitie:bond-planning', kwargs={'deelcomp_pk': obj.pk}) # for if self.rol_nu in (Rollen.ROL_BB, Rollen.ROL_BKO, Rollen.ROL_RKO): # laat alle teams zien, ook de teams die nog niet af zijn of nog niet in een poule zitten # vanaf fase E laten we dit niet meer zien en komen de RK Teams in beeld if comp.fase < 'E': context['tekst_regio_teams_alle'] = "Alle teams inzien van de regiocompetitie." context['url_regio_teams_alle'] = reverse('CompRegio:regio-teams-alle', kwargs={'comp_pk': comp.pk, 'subset': 'auto'}) if comp.fase == 'J' and not comp.klassengrenzen_vastgesteld_rk_bk and self.rol_nu == Rollen.ROL_BKO: context['tekst_klassengrenzen_rk_bk_vaststellen'] = "Open inschrijving RK teams sluiten en de klassengrenzen voor het RK teams en BK teams vaststellen." context['url_klassengrenzen_rk_bk_vaststellen'] = reverse('CompRayon:klassengrenzen-vaststellen-rk-bk-teams', kwargs={'comp_pk': comp.pk}) if self.rol_nu in (Rollen.ROL_BB, Rollen.ROL_BKO): if comp.fase < 'L': context['tekst_rayon_teams_alle'] = "Alle aangemelde teams voor de rayonkampioenschappen teams in deze competitie" context["url_rayon_teams_alle"] = reverse('CompRayon:rayon-teams-alle', kwargs={'comp_pk': comp.pk, 'subset': 'auto'}) if self.rol_nu == Rollen.ROL_RCL: toon_handmatige_ag = False context['toon_clusters'] = True context['planning_deelcomp'] = (DeelCompetitie .objects .filter(competitie=comp, functie=self.functie_nu, is_afgesloten=False) .select_related('nhb_regio', 'competitie')) for obj in context['planning_deelcomp']: kan_beheren = True obj.titel = 'Planning Regio %s' % obj.nhb_regio.regio_nr obj.tekst = 'Planning van de wedstrijden in %s voor deze competitie.' % obj.nhb_regio.naam obj.url = reverse('CompRegio:regio-planning', kwargs={'deelcomp_pk': obj.pk}) if obj.regio_organiseert_teamcompetitie and 'E' <= comp.fase <= 'F': obj.titel_team_ronde = "Team Ronde" obj.tekst_team_ronde = "Stel de team punten vast en zet de teamcompetitie door naar de volgende ronde." obj.url_team_ronde = reverse('CompRegio:start-volgende-team-ronde', kwargs={'deelcomp_pk': obj.pk}) obj.tekst_scores = "Scores invoeren en aanpassen voor %s voor deze competitie." % obj.nhb_regio.naam obj.url_scores = reverse('CompScores:scores-rcl', kwargs={'deelcomp_pk': obj.pk}) if obj.regio_organiseert_teamcompetitie: obj.tekst_regio_teams = "Teams voor de regiocompetitie in %s inzien voor deze competitie." % obj.nhb_regio.naam obj.url_regio_teams = reverse('CompRegio:regio-teams', kwargs={'deelcomp_pk': obj.pk}) # poules kaartje alleen het head-to-head puntenmodel gekozen is if obj.heeft_poules_nodig(): obj.tekst_poules = "Poules voor directe teamwedstrijden tussen teams in deze regiocompetitie." obj.url_poules = reverse('CompRegio:regio-poules', kwargs={'deelcomp_pk': obj.pk}) toon_handmatige_ag = True comp.regio_einde_teams_aanmaken = obj.einde_teams_aanmaken # for if comp.fase <= 'F': comp.url_regio_instellingen = reverse('CompRegio:regio-instellingen', kwargs={'comp_pk': comp.pk, 'regio_nr': self.functie_nu.nhb_regio.regio_nr}) if toon_handmatige_ag: comp.url_regio_handmatige_ag = reverse('CompRegio:regio-ag-controle', kwargs={'comp_pk': comp.pk, 'regio_nr': self.functie_nu.nhb_regio.regio_nr}) if 'B' <= comp.fase <= 'E': comp.url_inschrijvingen = reverse('CompInschrijven:lijst-regiocomp-regio', kwargs={'comp_pk': comp.pk, 'regio_pk': self.functie_nu.nhb_regio.pk}) if comp.fase >= 'E': context['afsluiten_deelcomp'] = (DeelCompetitie .objects .filter(competitie=comp, functie=self.functie_nu, is_afgesloten=False) .select_related('nhb_regio', 'competitie')) for obj in context['afsluiten_deelcomp']: kan_beheren = True obj.titel = 'Sluit Regiocompetitie' obj.tekst = 'Bevestig eindstand %s voor de %s.' % (obj.nhb_regio.naam, obj.competitie.beschrijving) obj.url_afsluiten = reverse('CompRegio:afsluiten-regiocomp', kwargs={'deelcomp_pk': obj.pk}) # for context['regio_instellingen_globaal'] = False elif self.rol_nu == Rollen.ROL_RKO: deelcomp_rks = (DeelCompetitie .objects .select_related('nhb_rayon', 'competitie') .filter(competitie=comp, functie=self.functie_nu, is_afgesloten=False)) if len(deelcomp_rks): kan_beheren = True deelcomp_rk = deelcomp_rks[0] deelcomp_rk.titel = 'Planning %s' % deelcomp_rk.nhb_rayon.naam deelcomp_rk.tekst = 'Planning voor %s voor deze competitie.' % deelcomp_rk.nhb_rayon.naam deelcomp_rk.url = reverse('CompRayon:rayon-planning', kwargs={'rk_deelcomp_pk': deelcomp_rk.pk}) deelcomp_rk.tekst_rayon_teams = "Aangemelde teams inzien voor de rayonkampioenschappen in Rayon %s, voor deze competitie." % deelcomp_rk.nhb_rayon.rayon_nr deelcomp_rk.url_rayon_teams = reverse('CompRayon:rayon-teams', kwargs={'rk_deelcomp_pk': deelcomp_rk.pk}) context['planning_deelcomp'] = [deelcomp_rk, ] # geeft de RKO de mogelijkheid om de deelnemerslijst voor het RK te bewerken context['url_lijst_rk'] = reverse('CompRayon:lijst-rk', kwargs={'rk_deelcomp_pk': deelcomp_rk.pk}) context['url_limieten_rk'] = reverse('CompRayon:rayon-limieten', kwargs={'rk_deelcomp_pk': deelcomp_rk.pk}) if 'B' <= comp.fase <= 'E': comp.url_inschrijvingen = reverse('CompInschrijven:lijst-regiocomp-rayon', kwargs={'comp_pk': comp.pk, 'rayon_pk': self.functie_nu.nhb_rayon.pk}) elif self.rol_nu == Rollen.ROL_BKO: context['planning_deelcomp'] = (DeelCompetitie .objects .filter(competitie=comp, functie=self.functie_nu, is_afgesloten=False) .select_related('competitie')) for obj in context['planning_deelcomp']: kan_beheren = True obj.titel = 'Planning' obj.tekst = 'Landelijke planning voor deze competitie.' obj.url = reverse('Competitie:bond-planning', kwargs={'deelcomp_pk': obj.pk}) # geef de BKO de mogelijkheid om # - de regiocompetitie door te zetten naar de rayonkampioenschappen # - de RK door te zetten naar de BK if 'E' <= comp.fase <= 'G': comp.url_doorzetten = reverse('Competitie:bko-doorzetten-naar-rk', kwargs={'comp_pk': comp.pk}) comp.titel_doorzetten = '%s doorzetten naar de volgende fase (Regio naar RK)' % comp.beschrijving context['bko_doorzetten'] = comp elif 'M' <= comp.fase < 'P': comp.url_doorzetten = reverse('Competitie:bko-doorzetten-naar-bk', kwargs={'comp_pk': comp.pk}) comp.titel_doorzetten = '%s doorzetten naar de volgende fase (RK naar BK)' % comp.beschrijving context['bko_doorzetten'] = comp elif 'R' <= comp.fase < 'Z': comp.url_afsluiten = reverse('Competitie:bko-competitie-afsluiten', kwargs={'comp_pk': comp.pk}) comp.titel_afsluiten = '%s helemaal afsluiten' % comp.beschrijving context['bko_afsluiten'] = comp # for if kan_beheren: template_name = TEMPLATE_COMPETITIE_OVERZICHT_BEHEERDER else: template_name = TEMPLATE_COMPETITIE_OVERZICHT return template_name
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) context['geen_wedstrijden'] = True pks1 = list( DeelcompetitieRonde.objects.filter( deelcompetitie__is_afgesloten=False, plan__wedstrijden__vereniging=self.functie_nu.nhb_ver, deelcompetitie__laag=LAAG_REGIO).values_list( 'plan__wedstrijden', flat=True)) pks2 = list( DeelCompetitie.objects.filter( is_afgesloten=False, plan__wedstrijden__vereniging=self.functie_nu.nhb_ver, laag__in=(LAAG_RK, LAAG_BK)). exclude( plan__wedstrijden=None) # excludes when ManyToMany is empty .values_list('plan__wedstrijden', flat=True)) pks = list(pks1) + list(pks2) is_mix = (1 <= len(pks2) < len(pks1)) wedstrijden = (CompetitieWedstrijd.objects.filter(pk__in=pks).order_by( 'datum_wanneer', 'tijd_begin_wedstrijd')) for wedstrijd in wedstrijden: # voor competitiewedstrijden wordt de beschrijving ingevuld # als de instellingen van de ronde opgeslagen worden # dit is slechts fall-back if wedstrijd.beschrijving == "": # als deze wedstrijd bij een competitieronde hoort, # maak een passende beschrijving voor # CompetitieWedstrijd --> CompetitieWedstrijdenPlan --> DeelcompetitieRonde / DeelCompetitie plan = wedstrijd.competitiewedstrijdenplan_set.all()[0] if plan.deelcompetitieronde_set.count() > 0: ronde = plan.deelcompetitieronde_set.select_related( 'deelcompetitie', 'deelcompetitie__competitie').all()[0] wedstrijd.beschrijving1 = ronde.deelcompetitie.competitie.beschrijving wedstrijd.beschrijving2 = ronde.beschrijving else: deelcomp = plan.deelcompetitie_set.select_related( 'competitie').all()[0] wedstrijd.beschrijving1 = deelcomp.competitie.beschrijving if deelcomp.laag == LAAG_RK: wedstrijd.beschrijving2 = "Rayonkampioenschappen" else: wedstrijd.beschrijving2 = "Bondskampioenschappen" else: msg = wedstrijd.beschrijving pos = msg.find(' - ') if pos > 0: wedstrijd.beschrijving1 = msg[:pos].strip() wedstrijd.beschrijving2 = msg[pos + 3:].strip() else: wedstrijd.beschrijving1 = msg wedstrijd.beschrijving2 = '' wedstrijd.is_rk = ( wedstrijd.beschrijving2 == 'Rayonkampioenschappen') wedstrijd.is_bk = ( wedstrijd.beschrijving2 == 'Bondskampioenschappen') wedstrijd.opvallen = (wedstrijd.is_rk or wedstrijd.is_bk) and is_mix wedstrijd.toon_geen_uitslag = True if not (wedstrijd.is_rk or wedstrijd.is_bk): heeft_uitslag = (wedstrijd.uitslag and wedstrijd.uitslag.scores.count() > 0) mag_wijzigen = self.uitslag_invoeren and not ( wedstrijd.uitslag and wedstrijd.uitslag.is_bevroren) if self.rol_nu in (Rollen.ROL_HWL, Rollen.ROL_WL) and mag_wijzigen: # mag uitslag wijzigen url = reverse('CompScores:uitslag-invoeren', kwargs={'wedstrijd_pk': wedstrijd.pk}) if heeft_uitslag: wedstrijd.url_uitslag_aanpassen = url else: wedstrijd.url_score_invoeren = url wedstrijd.toon_geen_uitslag = False else: if heeft_uitslag: wedstrijd.url_uitslag_bekijken = reverse( 'CompScores:uitslag-bekijken', kwargs={'wedstrijd_pk': wedstrijd.pk}) wedstrijd.toon_geen_uitslag = False # link naar de waarschijnlijke deelnemerslijst if self.rol_nu in (Rollen.ROL_HWL, Rollen.ROL_WL) and not ( wedstrijd.uitslag and wedstrijd.uitslag.is_bevroren): if wedstrijd.is_rk or wedstrijd.is_bk: wedstrijd.url_waarschijnlijke_deelnemers = reverse( 'CompRayon:download-formulier', kwargs={'wedstrijd_pk': wedstrijd.pk}) else: wedstrijd.url_waarschijnlijke_deelnemers = reverse( 'CompRegio:waarschijnlijke-deelnemers', kwargs={'wedstrijd_pk': wedstrijd.pk}) context['geen_wedstrijden'] = False # for context['vereniging'] = self.functie_nu.nhb_ver context['huidige_rol'] = rol_get_beschrijving(self.request) context['wedstrijden'] = wedstrijden context['uitslag_invoeren'] = self.uitslag_invoeren menu_dynamics(self.request, context, actief='vereniging') return context
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) context['toon_rayon'] = True context['toon_regio'] = True context['toon_cluster'] = False context['toon_details'] = True context['toon_ledental'] = self.is_staff menu_actief = 'hetplein' context['huidige_rol'] = rol_get_beschrijving(self.request) context['landelijk'] = self.rol_nu in (Rollen.ROL_BB, Rollen.ROL_BKO) if self.rol_nu == Rollen.ROL_BB: context['contact_geen_beheerders'] = reverse( 'Vereniging:contact-geen-beheerders') if self.rol_nu == Rollen.ROL_RKO: context['toon_rayon'] = False if self.rol_nu in (Rollen.ROL_RCL, Rollen.ROL_HWL, Rollen.ROL_SEC): context['toon_rayon'] = False context['toon_regio'] = False if self.rol_nu == Rollen.ROL_HWL: menu_actief = 'vereniging' context['verenigingen'] = verenigingen = self._get_verenigingen() # voeg de url toe voor de "details" knoppen for nhbver in verenigingen: nhbver.details_url = reverse('Vereniging:accommodatie-details', kwargs={'vereniging_pk': nhbver.pk}) for loc in ( nhbver. wedstrijdlocatie_set # FUTURE: kost een query -> aparte ophalen in dict .filter(zichtbaar=True)): if loc.baan_type == 'E': nhbver.heeft_externe_locaties = True elif loc.baan_type == 'B': nhbver.buiten_locatie = loc else: nhbver.locatie = loc # for if nhbver.clusters.count() > 0: context['toon_cluster'] = True letters = [cluster.letter for cluster in nhbver.clusters.all()] letters.sort() nhbver.cluster_letters = ",".join(letters) if not context['toon_regio']: # verander in 101a,b nhbver.cluster_letters = str( nhbver.regio.regio_nr) + nhbver.cluster_letters # for menu_dynamics(self.request, context, actief=menu_actief) return context
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) rol_nu, functie_nu = rol_get_huidige_functie(self.request) context['huidige_rol'] = rol_get_beschrijving(self.request) context['terug_url'] = reverse('Competitie:kies') # filter clusters die aangepast mogen worden op competitie type # waarvan de definitie heel handig overeen komt met cluster.gebruik context['gebruik'] = gebruik_filter = functie_nu.comp_type # probeer een competitie te vinden om te tonen in het menu try: deelcomp = DeelCompetitie.objects.get( competitie__afstand=gebruik_filter, nhb_regio=functie_nu.nhb_regio) except DeelCompetitie.DoesNotExist: comp_pk = None else: comp_pk = deelcomp.competitie.pk context['terug_url'] = reverse('Competitie:overzicht', kwargs={'comp_pk': comp_pk}) # cluster namen objs = (NhbCluster.objects.filter( regio=functie_nu.nhb_regio, gebruik=gebruik_filter).select_related('regio').order_by('letter')) context['cluster_list'] = objs context['regio_heeft_clusters'] = objs.count() > 0 context['opslaan_url'] = reverse('CompRegio:clusters') for obj in objs: obj.veld_naam = "naam_%s" % obj.pk # for # maak lijstje voor het formulier met de keuze opties van de pull-down lijstjes opts = objs[:] for opt in opts: opt.tekst = opt.cluster_code_str() opt.choice_name = str(opt.pk) # gebruik de cluster pk als selector # for # voeg de "geen cluster" opties toe opt_geen = NhbCluster() opt_geen.tekst = "Geen" opt_geen.choice_name = "0" opts.insert(0, opt_geen) # vereniging in de regio objs = (NhbVereniging.objects.filter(regio=functie_nu.nhb_regio). prefetch_related('clusters').order_by('ver_nr')) context['object_list'] = objs for obj in objs: # voeg form-fields toe die voor de post gebruikt kunnen worden obj.veld_naam = 'ver_' + str(obj.ver_nr) # maak een kopie om een vlag te kunnen zetten op de huidige optie obj.cluster_opties = copy.deepcopy(opts) # zet de 'selected' vlag op de huidige cluster keuzes voor de vereniging for cluster in obj.clusters.all(): # zoek dit cluster op for opt in obj.cluster_opties: if opt.pk == cluster.pk: opt.actief = True # for # for # for context['handleiding_clusters_url'] = reverse('Handleiding:Clusters') context['email_bondsbureau'] = settings.EMAIL_BONDSBUREAU if comp_pk: menu_dynamics_competitie(self.request, context, comp_pk=comp_pk) else: menu_dynamics(self.request, context, actief='competitie') return context