Ejemplo n.º 1
0
    def _schrijf_in_voor_competitie(deelcomp, sportersboog, skip=1):
        while len(sportersboog):
            sporterboog = sportersboog[0]

            # let op: de testen die een schutter doorschuiven vereisen dat schutter 100001 in klasse onbekend
            klassen = (CompetitieKlasse.objects.filter(
                competitie=deelcomp.competitie,
                indiv__is_onbekend=(sporterboog.sporter.lid_nr == 100001),
                indiv__boogtype=sporterboog.boogtype))

            aanmelding = RegioCompetitieSchutterBoog(deelcompetitie=deelcomp,
                                                     sporterboog=sporterboog)
            aanmelding.bij_vereniging = aanmelding.sporterboog.sporter.bij_vereniging

            if len(sportersboog) < len(klassen):
                aanmelding.klasse = klassen[len(sportersboog)]
            else:
                aanmelding.klasse = klassen[0]
            aanmelding.save()
            # print('ingeschreven: %s in klasse %s' % (aanmelding.sporterboog, aanmelding.klasse))

            sportersboog = sportersboog[skip:]
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)