Ejemplo n.º 1
0
    def post(request, *args, **kwargs):
        """ Deze functie wordt aangeroepen als de sporter op zijn profiel pagina
            de knop Aanmelden gebruikt voor een specifieke regiocompetitie en boogtype.
        """
        # voorkom misbruik: ingelogd als niet geblokkeerd nhblid vereist
        sporter = None
        account = request.user
        if account.is_authenticated:
            if account.sporter_set.count() > 0:
                sporter = account.sporter_set.all()[0]
                if not (sporter.is_actief_lid and sporter.bij_vereniging):
                    sporter = None
        if not sporter:
            raise Http404('Sporter niet gevonden')

        # converteer en doe eerste controle op de parameters
        try:
            deelcomp_pk = int(
                kwargs['deelcomp_pk'][:10])  # afkappen voor de veiligheid
            sporterboog_pk = int(
                kwargs['sporterboog_pk'][:10])  # afkappen voor de veiligheid

            sporterboog = (SporterBoog.objects.select_related('sporter').get(
                pk=sporterboog_pk))

            deelcomp = (DeelCompetitie.objects.select_related(
                'competitie', 'nhb_regio').get(pk=deelcomp_pk))
        except (ValueError, KeyError):
            # vuilnis
            raise Http404()
        except (SporterBoog.DoesNotExist, DeelCompetitie.DoesNotExist):
            # niet bestaand record(s)
            raise Http404('Sporter of competitie niet gevonden')

        # controleer dat de competitie aanmeldingen accepteert
        deelcomp.competitie.bepaal_fase()
        if deelcomp.competitie.fase < 'B' or deelcomp.competitie.fase >= 'F':
            raise Http404('Verkeerde competitie fase')

        # controleer dat sporterboog bij de ingelogde gebruiker hoort
        # controleer dat deelcompetitie bij de juist regio hoort
        if (sporterboog.sporter != sporter or deelcomp.laag != LAAG_REGIO
                or deelcomp.nhb_regio != sporter.bij_vereniging.regio):
            raise Http404('Geen valide combinatie')

        # voorkom dubbele aanmelding
        if (RegioCompetitieSchutterBoog.objects.filter(
                deelcompetitie=deelcomp, sporterboog=sporterboog).count() > 0):
            # al aangemeld - zie niet hier moeten zijn gekomen
            raise Http404('Sporter is al aangemeld')

        # urlconf parameters geaccepteerd

        # bepaal de inschrijfmethode voor deze regio
        methode = deelcomp.inschrijf_methode

        # bepaal in welke wedstrijdklasse de sporter komt
        age = sporterboog.sporter.bereken_wedstrijdleeftijd(
            deelcomp.competitie.begin_jaar + 1)

        aanmelding = RegioCompetitieSchutterBoog(
            deelcompetitie=deelcomp,
            sporterboog=sporterboog,
            bij_vereniging=sporterboog.sporter.bij_vereniging,
            ag_voor_indiv=AG_NUL,
            ag_voor_team=AG_NUL,
            ag_voor_team_mag_aangepast_worden=True)

        # haal AG op, indien aanwezig
        scores = Score.objects.filter(
            sporterboog=sporterboog,
            type=SCORE_TYPE_INDIV_AG,
            afstand_meter=deelcomp.competitie.afstand)
        if len(scores):
            score = scores[0]
            ag = Decimal(score.waarde) / 1000
            aanmelding.ag_voor_indiv = ag
            aanmelding.ag_voor_team = ag
            if ag > 0.000:
                aanmelding.ag_voor_team_mag_aangepast_worden = False

        bepaler = KlasseBepaler(deelcomp.competitie)
        try:
            bepaler.bepaal_klasse_deelnemer(aanmelding)
        except LookupError as exc:
            raise Http404(str(exc))

        udvl = deelcomp.competitie.uiterste_datum_lid  # uiterste datum van lidmaatschap
        dvl = sporterboog.sporter.sinds_datum  # datum van lidmaatschap

        # geen aspirant, op tijd lid en op tijd aangemeld?
        mag_team_schieten = (deelcomp.regio_organiseert_teamcompetitie
                             and age > MAXIMALE_WEDSTRIJDLEEFTIJD_ASPIRANT
                             and dvl < udvl
                             and deelcomp.competitie.fase == 'B')

        # kijk of de sporter met een team mee wil schieten voor deze competitie
        if mag_team_schieten and request.POST.get('wil_in_team', '') != '':
            aanmelding.inschrijf_voorkeur_team = True

        # kijk of er velden van een formulier bij zitten
        if methode == INSCHRIJF_METHODE_3:
            aanmelding.inschrijf_voorkeur_dagdeel = ''
            dagdelen_spl = deelcomp.toegestane_dagdelen.split(',')

            dagdeel = request.POST.get('dagdeel', '')
            if dagdeel in DAGDEEL_AFKORTINGEN:
                if deelcomp.toegestane_dagdelen == '' or dagdeel in dagdelen_spl:
                    aanmelding.inschrijf_voorkeur_dagdeel = dagdeel

            if aanmelding.inschrijf_voorkeur_dagdeel == '':
                # dagdeel is verplicht
                raise Http404('Verzoek is niet compleet')

        opmerking = request.POST.get('opmerking', '')
        if len(opmerking) > 500:
            opmerking = opmerking[:
                                  500]  # moet afkappen, anders database foutmelding
        aanmelding.inschrijf_notitie = opmerking

        aanmelding.save()

        if methode == INSCHRIJF_METHODE_1:
            pks = list()
            for ronde in (
                    DeelcompetitieRonde.objects.select_related('plan').filter(
                        deelcompetitie=deelcomp)):
                # sta alle wedstrijden in de regio toe, dus alle clusters
                pks.extend(ronde.plan.wedstrijden.values_list('pk', flat=True))
            # for
            wedstrijden = list()
            for pk in pks:
                key = 'wedstrijd_%s' % pk
                if request.POST.get(key, '') != '':
                    wedstrijden.append(pk)
            # for
            aanmelding.inschrijf_gekozen_wedstrijden.set(wedstrijden)

        return HttpResponseRedirect(reverse('Sporter:profiel'))
Ejemplo n.º 2
0
    def post(self, request, *args, **kwargs):
        """ Deze functie wordt aangeroepen als de knop 'Geselecteerde schutters aanmelden' wordt gebruikt
            het csrf token is al gecontroleerd
        """
        try:
            comp_pk = int(self.kwargs['comp_pk'][:10])      # afkappen voor de veiligheid
            comp = Competitie.objects.get(pk=comp_pk)
        except (ValueError, TypeError, Competitie.DoesNotExist):
            raise Http404('Competitie niet gevonden')

        # check dat competitie open is voor inschrijvingen
        comp.bepaal_fase()
        if not ('B' <= comp.fase <= 'E'):
            raise Http404('Verkeerde competitie fase')

        # rol is HWL (zie test_func)

        # bepaal de inschrijfmethode voor deze regio
        hwl_regio = self.functie_nu.nhb_ver.regio

        if hwl_regio.is_administratief:
            # niemand van deze vereniging mag meedoen aan wedstrijden
            raise Http404('Geen wedstrijden in deze regio')

        # zoek de juiste DeelCompetitie erbij
        deelcomp = DeelCompetitie.objects.get(competitie=comp,
                                              nhb_regio=hwl_regio)
        methode = deelcomp.inschrijf_methode

        boog2teamtype = dict()
        for obj in TeamType.objects.all():
            boog2teamtype[obj.afkorting] = obj
        # for

        # zoek eerst de voorkeuren op
        mag_team_schieten = comp.fase == 'B'
        bulk_team = False
        if mag_team_schieten and request.POST.get('wil_in_team', '') != '':
            bulk_team = True

        bulk_wedstrijden = list()
        if methode == INSCHRIJF_METHODE_1:
            pks = list()
            for ronde in (DeelcompetitieRonde
                          .objects
                          .select_related('plan')
                          .filter(deelcompetitie=deelcomp)):
                # sta alle wedstrijden in de regio toe, dus alle clusters
                pks.extend(ronde.plan.wedstrijden.values_list('pk', flat=True))
            # for
            for pk in pks:
                key = 'wedstrijd_%s' % pk
                if request.POST.get(key, '') != '':
                    bulk_wedstrijden.append(pk)
            # for

        bulk_dagdeel = ''
        if methode == INSCHRIJF_METHODE_3:
            dagdeel = request.POST.get('dagdeel', '')
            if dagdeel in DAGDEEL_AFKORTINGEN:
                if dagdeel in deelcomp.toegestane_dagdelen or deelcomp.toegestane_dagdelen == '':
                    bulk_dagdeel = dagdeel
            if not bulk_dagdeel:
                raise Http404('Incompleet verzoek')

        bulk_opmerking = request.POST.get('opmerking', '')
        if len(bulk_opmerking) > 500:
            bulk_opmerking = bulk_opmerking[:500]     # moet afkappen, anders database foutmelding

        udvl = comp.uiterste_datum_lid

        bepaler = KlasseBepaler(comp)

        # all checked boxes are in the post request as keys, typically with value 'on'
        for key, _ in request.POST.items():
            # key = 'lid_NNNNNN_boogtype_MM' (of iets anders)
            spl = key.split('_')
            # spl = ('lid', 'NNNNNN', 'boogtype', 'MM')
            if len(spl) == 4 and spl[0] == 'lid' and spl[2] == 'boogtype':
                # dit lijkt ergens op - converteer de getallen (geeft ook input bescherming)
                try:
                    sporter_pk = int(spl[1])
                    boogtype_pk = int(spl[3])
                except (TypeError, ValueError):
                    # iemand loopt te klooien
                    raise Http404('Verkeerde parameters')

                # SporterBoog record met voor_wedstrijd==True moet bestaan
                try:
                    sporterboog = (SporterBoog
                                   .objects
                                   .select_related('sporter',
                                                   'boogtype')
                                   .get(sporter=sporter_pk,
                                        boogtype=boogtype_pk))
                except SporterBoog.DoesNotExist:
                    # iemand loopt te klooien
                    raise Http404('Sporter niet gevonden')

                if not sporterboog.voor_wedstrijd:
                    # iemand loopt te klooien
                    raise Http404('Sporter heeft geen voorkeur voor wedstrijden opgegeven')

                # controleer lid bij vereniging HWL
                if sporterboog.sporter.bij_vereniging != self.functie_nu.nhb_ver:
                    # iemand loopt te klooien
                    raise PermissionDenied('Geen lid bij jouw vereniging')

                # voorkom dubbele aanmelding
                if (RegioCompetitieSchutterBoog
                        .objects
                        .filter(deelcompetitie=deelcomp,
                                sporterboog=sporterboog)
                        .count() > 0):
                    # al aangemeld - zou niet hier moeten zijn gekomen
                    raise Http404('Sporter is al ingeschreven')

                # bepaal in welke wedstrijdklasse de schutter komt
                age = sporterboog.sporter.bereken_wedstrijdleeftijd(deelcomp.competitie.begin_jaar + 1)
                dvl = sporterboog.sporter.sinds_datum

                aanmelding = RegioCompetitieSchutterBoog()
                aanmelding.deelcompetitie = deelcomp
                aanmelding.sporterboog = sporterboog
                aanmelding.bij_vereniging = sporterboog.sporter.bij_vereniging
                aanmelding.ag_voor_indiv = AG_NUL
                aanmelding.ag_voor_team = AG_NUL
                aanmelding.ag_voor_team_mag_aangepast_worden = True

                # zoek de aanvangsgemiddelden er bij, indien beschikbaar
                for score in Score.objects.filter(sporterboog=sporterboog,
                                                  afstand_meter=comp.afstand,
                                                  type=SCORE_TYPE_INDIV_AG):
                    ag = Decimal(score.waarde) / 1000
                    aanmelding.ag_voor_indiv = ag
                    aanmelding.ag_voor_team = ag
                    aanmelding.ag_voor_team_mag_aangepast_worden = False
                # for

                # zoek een toepasselijke klasse aan de hand van de leeftijd
                try:
                    bepaler.bepaal_klasse_deelnemer(aanmelding)
                except LookupError as exc:
                    raise Http404(str(exc))

                # kijk of de schutter met een team mee wil en mag schieten voor deze competitie
                if age > MAXIMALE_WEDSTRIJDLEEFTIJD_ASPIRANT and dvl < udvl:
                    # is geen aspirant en was op tijd lid
                    aanmelding.inschrijf_voorkeur_team = bulk_team

                aanmelding.inschrijf_voorkeur_dagdeel = bulk_dagdeel
                aanmelding.inschrijf_notitie = bulk_opmerking
                aanmelding.save()

                if methode == INSCHRIJF_METHODE_1:
                    aanmelding.inschrijf_gekozen_wedstrijden.set(bulk_wedstrijden)

            # else: silently ignore
        # for

        url = reverse('CompInschrijven:leden-ingeschreven', kwargs={'deelcomp_pk': deelcomp.pk})
        return HttpResponseRedirect(url)