Пример #1
0
    def _swap_cluster(self, nhbver, gebruik):
        # vertaal de post value naar een NhbCluster object
        # checkt ook meteen dat het een valide cluster is voor deze regio

        param_name = 'ver_' + str(nhbver.ver_nr)
        post_param = self.request.POST.get(param_name, None)

        cluster_pk = None
        if post_param is not None:
            try:
                cluster_pk = int(post_param)
            except (ValueError, TypeError):
                return

        if cluster_pk is not None:
            try:
                new_cluster = self._pk2cluster[cluster_pk]
            except KeyError:
                new_cluster = None

            try:
                huidige = nhbver.clusters.get(gebruik=gebruik)
            except NhbCluster.DoesNotExist:
                # vereniging zit niet in een cluster voor de 18m
                # stop de vereniging in het gevraagde cluster
                if new_cluster:
                    nhbver.clusters.add(new_cluster)
                    activiteit = "Vereniging %s toegevoegd aan cluster %s" % (
                        nhbver, new_cluster)
                    schrijf_in_logboek(self.request.user, 'Clusters',
                                       activiteit)
                return

            # vereniging zit al in een cluster voor dit gebruik
            if huidige != new_cluster:
                # nieuwe keuze is anders, dus verwijder de vereniging uit dit cluster
                nhbver.clusters.remove(huidige)
                activiteit = "Vereniging %s verwijderd uit cluster %s" % (
                    nhbver, huidige)
                schrijf_in_logboek(self.request.user, 'Clusters', activiteit)

                # stop de vereniging in het gevraagde cluster (if any)
                if new_cluster:
                    nhbver.clusters.add(new_cluster)
                    activiteit = "Vereniging %s toegevoegd aan cluster %s" % (
                        nhbver, new_cluster)
                    schrijf_in_logboek(self.request.user, 'Clusters',
                                       activiteit)
Пример #2
0
    def post(self, request, *args, **kwargs):
        """ wordt aangeroepen als de OPSLAAN knop gebruikt wordt op het formulier
            om een nieuw wachtwoord op te geven.
        """
        context = super().get_context_data(**kwargs)

        account = request.user
        huidige_ww = request.POST.get(
            'huidige', '')[:50]  # afkappen voor extra veiligheid
        nieuw_ww = request.POST.get('nieuwe',
                                    '')[:50]  # afkappen voor extra veiligheid
        from_ip = get_safe_from_ip(self.request)

        try:
            moet_oude_ww_weten = self.request.session['moet_oude_ww_weten']
        except KeyError:
            moet_oude_ww_weten = True

        # controleer het nieuwe wachtwoord
        valid, errmsg = account_test_wachtwoord_sterkte(
            nieuw_ww, account.username)

        # controleer het huidige wachtwoord
        if moet_oude_ww_weten and valid:
            if not authenticate(username=account.username,
                                password=huidige_ww):
                valid = False
                errmsg = "Huidige wachtwoord komt niet overeen"

                schrijf_in_logboek(
                    account=account,
                    gebruikte_functie="Wachtwoord",
                    activiteit=
                    'Verkeerd huidige wachtwoord vanaf IP %s voor account %s' %
                    (from_ip, repr(account.username)))
                my_logger.info(
                    '%s LOGIN Verkeerd huidige wachtwoord voor account %s' %
                    (from_ip, repr(account.username)))

        if not valid:
            context['foutmelding'] = errmsg

            try:
                context['moet_oude_ww_weten'] = self.request.session[
                    'moet_oude_ww_weten']
            except KeyError:
                context['moet_oude_ww_weten'] = True

            if account.sporter_set.count(
            ) > 0:  # FUTURE: ongewenste kennis over Sporter.account
                menu_dynamics(self.request, context, actief="sporter-profiel")
            else:
                menu_dynamics(self.request, context)
            return render(request, self.template_name, context)

        # wijzigen van het wachtwoord zorgt er ook voor dat alle sessies van deze gebruiker vervallen
        # hierdoor blijft de gebruiker niet ingelogd op andere sessies
        account.set_password(nieuw_ww)
        account.save()

        # houd de gebruiker ingelogd in deze sessie
        update_session_auth_hash(request, account)

        try:
            del request.session['moet_oude_ww_weten']
        except KeyError:
            pass

        # schrijf in het logboek
        schrijf_in_logboek(account=account,
                           gebruikte_functie="Wachtwoord",
                           activiteit="Nieuw wachtwoord voor account %s" %
                           repr(account.get_account_full_name()))

        return HttpResponseRedirect(reverse('Plein:plein'))
Пример #3
0
    def post(self, request, *args, **kwargs):
        """ deze functie wordt aangeroepen als een POST request ontvangen is.
            dit is gekoppeld aan het drukken op de knop om een beheerder te koppelen
            (WijzigBeheerdersView)
        """
        functie_pk = self.kwargs['functie_pk']
        try:
            functie = Functie.objects.get(pk=functie_pk)
        except Functie.DoesNotExist:
            # foutieve functie_pk
            raise Http404('Verkeerde functie')

        mag_beheerder_wijzigen_of_403(request, functie)

        form = WijzigBeheerdersForm(request.POST)
        form.full_clean()  # vult cleaned_data
        add = form.cleaned_data.get('add')
        drop = form.cleaned_data.get('drop')

        if add:
            account_pk = add
        elif drop:
            account_pk = drop
        else:
            raise Http404('Verkeerd gebruik')

        try:
            account = Account.objects.get(pk=account_pk)
        except Account.DoesNotExist:
            raise Http404('Account niet gevonden')

        if account.sporter_set.count() > 0:
            sporter = account.sporter_set.all()[0]
            wie = "Sporter %s (%s)" % (sporter.lid_nr,
                                       sporter.volledige_naam())
        else:
            sporter = None
            wie = "Account %s" % account.get_account_full_name()

        if add:
            rol_nu, functie_nu = rol_get_huidige_functie(request)
            if rol_nu in (Rollen.ROL_SEC, Rollen.ROL_HWL):
                # stel zeker dat sporter lid is bij de vereniging van functie
                if not sporter or sporter.bij_vereniging != functie.nhb_ver:
                    raise PermissionDenied('Geen lid van jouw vereniging')

            functie.accounts.add(account)
            schrijf_in_logboek(
                request.user, 'Rollen',
                "%s is beheerder gemaakt voor functie %s" %
                (wie, functie.beschrijving))

            self._stuur_notificatie_email(account,
                                          wie,
                                          functie.beschrijving,
                                          add=True)

            if account.functie_set.count() == 1:
                rol_activeer_wissel_van_rol_menu_voor_account(account)
        else:
            functie.accounts.remove(account)
            schrijf_in_logboek(
                request.user, 'Rollen',
                "%s losgekoppeld van functie %s" % (wie, functie.beschrijving))

            self._stuur_notificatie_email(account,
                                          wie,
                                          functie.beschrijving,
                                          remove=True)

        return HttpResponseRedirect(
            reverse('Functie:wijzig-beheerders',
                    kwargs={'functie_pk': functie.pk}))
Пример #4
0
    def post(self, request, *args, **kwargs):

        """ deze functie wordt aangeroepen als de RCL op de knop drukt om de volgende ronde te beginnen.

            verwerking gebeurt in de achtergrond taak.
        """

        try:
            deelcomp_pk = int(kwargs['deelcomp_pk'][:6])      # afkappen voor de veiligheid
            deelcomp = (DeelCompetitie
                        .objects
                        .select_related('competitie')
                        .get(pk=deelcomp_pk,
                             nhb_regio=self.functie_nu.nhb_regio))
        except (ValueError, DeelCompetitie.DoesNotExist):
            raise Http404('Competitie bestaat niet')

        if deelcomp.huidige_team_ronde <= 7:

            # controleer dat het redelijk is om de volgende ronde op te starten
            if deelcomp.huidige_team_ronde > 0:
                alle_regels, is_redelijk = self._bepaal_wedstrijdpunten(deelcomp)
                if not is_redelijk:
                    raise Http404('Te weinig scores')

                # pas de wedstrijdpunten toe
                if deelcomp.regio_team_punten_model == TEAM_PUNTEN_MODEL_TWEE:
                    for regel in alle_regels:
                        regel.ronde_team1.team_punten = regel.team1_wp
                        regel.ronde_team1.save(update_fields=['team_punten'])

                        if regel.ronde_team2:       # None == Bye
                            regel.ronde_team2.team_punten = regel.team2_wp
                            regel.ronde_team2.save(update_fields=['team_punten'])
                    # for

                elif deelcomp.regio_team_punten_model == TEAM_PUNTEN_MODEL_FORMULE1:
                    for ronde_team in alle_regels:
                        ronde_team.team_punten = ronde_team.ronde_wp
                        ronde_team.save(update_fields=['team_punten'])
                    # for

            account = request.user
            schrijf_in_logboek(account, 'Competitie', 'Teamcompetitie doorzetten naar ronde %s voor %s' % (deelcomp.huidige_team_ronde+1, deelcomp))

            # voor concurrency protection, laat de achtergrondtaak de ronde doorzetten
            door_str = "RCL %s" % account.volledige_naam()
            mutatie = CompetitieMutatie(mutatie=MUTATIE_TEAM_RONDE,
                                        deelcompetitie=deelcomp,
                                        door=door_str)
            mutatie.save()

            mutatie_ping.ping()

            snel = str(request.POST.get('snel', ''))[:1]
            if snel != '1':         # pragma: no cover
                # wacht maximaal 3 seconden tot de mutatie uitgevoerd is
                interval = 0.2  # om steeds te verdubbelen
                total = 0.0  # om een limiet te stellen
                while not mutatie.is_verwerkt and total + interval <= 3.0:
                    time.sleep(interval)
                    total += interval  # 0.0 --> 0.2, 0.6, 1.4, 3.0
                    interval *= 2  # 0.2 --> 0.4, 0.8, 1.6, 3.2
                    mutatie = CompetitieMutatie.objects.get(pk=mutatie.pk)
                # while

        url = reverse('Competitie:overzicht',
                      kwargs={'comp_pk': deelcomp.competitie.pk})
        return HttpResponseRedirect(url)
Пример #5
0
    def post(request, *args, **kwargs):
        """ deze functie wordt aangeroepen als een POST request ontvangen is.
            dit is gekoppeld aan het drukken op de Registreer knop.
        """
        form = RegistreerForm(request.POST)
        if form.is_valid():
            nhb_nummer = form.cleaned_data.get('nhb_nummer')
            email = form.cleaned_data.get('email')
            nieuw_wachtwoord = form.cleaned_data.get('nieuw_wachtwoord')
            from_ip = get_safe_from_ip(request)
            try:
                sporter_create_account_nhb(nhb_nummer, email, nieuw_wachtwoord)
            except SporterGeenEmail as exc:
                schrijf_in_logboek(account=None,
                                   gebruikte_functie="Registreer met NHB nummer",
                                   activiteit='NHB lid %s heeft geen email adres.' % nhb_nummer)
                my_logger.info('%s REGISTREER Geblokkeerd voor NHB nummer %s (geen email)' % (from_ip, repr(nhb_nummer)))

                # redirect naar een pagina met een uitgebreider duidelijk bericht
                context = {'sec_email': '',
                           'sec_naam': '',
                           'email_bb': settings.EMAIL_BONDSBUREAU}
                ver = exc.sporter.bij_vereniging
                if ver:
                    secs = Secretaris.objects.filter(vereniging=ver).exclude(sporter=None).all()
                    if secs.count() > 0:
                        sec = secs[0].sporter
                        context['sec_naam'] = sec.volledige_naam()

                    functie = Functie.objects.get(rol='SEC', nhb_ver=ver)
                    context['sec_email'] = functie.bevestigde_email

                menu_dynamics(request, context)
                return render(request, TEMPLATE_REGISTREER_GEEN_EMAIL, context)

            except AccountCreateError as exc:
                form.add_error(None, str(exc))

                # schrijf in het logboek
                schrijf_in_logboek(account=None,
                                   gebruikte_functie="Registreer met NHB nummer",
                                   activiteit="Mislukt voor nhb nummer %s vanaf IP %s: %s" % (repr(nhb_nummer), from_ip, str(exc)))
                my_logger.info('%s REGISTREER Mislukt voor NHB nummer %s met email %s (reden: %s)' % (from_ip, repr(nhb_nummer), repr(email), str(exc)))
            except SporterInactief:
                # NHB lid is mag niet gebruik maken van de diensten van de NHB, inclusief deze website
                schrijf_in_logboek(account=None,
                                   gebruikte_functie="Registreer met NHB nummer",
                                   activiteit='NHB lid %s is inactief (geblokkeerd van gebruik NHB diensten).' % nhb_nummer)
                form.add_error(None, 'Gebruik van NHB diensten is geblokkeerd. Neem contact op met de secretaris van je vereniging.')
                my_logger.info('%s REGISTREER Geblokkeerd voor NHB nummer %s (inactief)' % (from_ip, repr(nhb_nummer)))
                # FUTURE: redirect naar een pagina met een uitgebreider duidelijk bericht
            else:
                # schrijf in het logboek
                schrijf_in_logboek(account=None,
                                   gebruikte_functie="Registreer met NHB nummer",
                                   activiteit="Account aangemaakt voor NHB nummer %s vanaf IP %s" % (repr(nhb_nummer), from_ip))
                my_logger.info('%s REGISTREER account aangemaakt voor NHB nummer %s' % (from_ip, repr(nhb_nummer)))

                request.session['login_naam'] = nhb_nummer
                request.session['partial_email'] = mailer_obfuscate_email(email)
                return HttpResponseRedirect(reverse('Account:aangemaakt'))

        # still here --> re-render with error message
        context = {'form': form}
        menu_dynamics(request, context)
        return render(request, TEMPLATE_REGISTREER, context)
Пример #6
0
    def post(self, request, *args, **kwargs):
        """ Deze functie wordt aangeroepen als de gebruik op de 'opslaan' knop drukt
            op het accommodatie-details formulier.
        """
        binnen_locatie, buiten_locatie, _, nhbver = self._get_locaties_nhbver_or_404(**kwargs)

        rol_nu, functie_nu = rol_get_huidige_functie(self.request)

        if not self._mag_wijzigen(nhbver, rol_nu, functie_nu):
            raise PermissionDenied('Wijzigen niet toegestaan')

        if request.POST.get('verwijder_buitenbaan', None):
            if buiten_locatie:
                buiten_locatie.zichtbaar = False
                buiten_locatie.save()
            if 'is_ver' in kwargs:  # wordt gezet door VerenigingAccommodatieDetailsView
                urlconf = 'Vereniging:vereniging-accommodatie-details'
            else:
                urlconf = 'Vereniging:accommodatie-details'
            url = reverse(urlconf, kwargs={'vereniging_pk': nhbver.pk})
            return HttpResponseRedirect(url)

        if request.POST.get('maak_buiten_locatie', None):
            if buiten_locatie:
                if not buiten_locatie.zichtbaar:
                    buiten_locatie.zichtbaar = True
                    buiten_locatie.save()
            elif binnen_locatie:
                buiten = WedstrijdLocatie(
                                baan_type='B',
                                adres_uit_crm=False,
                                adres=binnen_locatie.adres,
                                plaats=binnen_locatie.plaats,
                                notities='')
                buiten.save()
                buiten.verenigingen.add(nhbver)

            if 'is_ver' in kwargs:  # wordt gezet door VerenigingAccommodatieDetailsView
                urlconf = 'Vereniging:vereniging-accommodatie-details'
            else:
                urlconf = 'Vereniging:accommodatie-details'
            url = reverse(urlconf, kwargs={'vereniging_pk': nhbver.pk})
            return HttpResponseRedirect(url)

        form = AccommodatieDetailsForm(request.POST)
        if not form.is_valid():
            raise Http404('Geen valide invoer')

        if binnen_locatie:
            msgs = list()
            data = form.cleaned_data.get('baan_type')
            if binnen_locatie.baan_type != data:
                old_str = BAANTYPE2STR[binnen_locatie.baan_type]
                new_str = BAANTYPE2STR[data]
                msgs.append("baan type aangepast van '%s' naar '%s'" % (old_str, new_str))
                binnen_locatie.baan_type = data

            data = form.cleaned_data.get('banen_18m')
            if binnen_locatie.banen_18m != data:
                msgs.append("Aantal 18m banen aangepast van %s naar %s" % (binnen_locatie.banen_18m, data))
                binnen_locatie.banen_18m = data

            data = form.cleaned_data.get('banen_25m')
            if binnen_locatie.banen_25m != data:
                msgs.append("Aantal 25m banen aangepast van %s naar %s" % (binnen_locatie.banen_25m, data))
                binnen_locatie.banen_25m = data

            # data = form.cleaned_data.get('max_dt')
            # if binnen_locatie.max_dt_per_baan != data:
            #     msgs.append("Max DT per baan aangepast van %s naar %s" % (binnen_locatie.max_dt_per_baan, data))
            #     binnen_locatie.max_dt_per_baan = data

            data_18 = form.cleaned_data.get('max_sporters_18m')
            data_25 = form.cleaned_data.get('max_sporters_25m')
            if data_18 is not None and data_25 is not None:
                if binnen_locatie.max_sporters_18m != data_18 or binnen_locatie.max_sporters_25m != data_25:
                    msgs.append("Max sporters 18m/25m aangepast van %s/%s naar %s/%s" % (binnen_locatie.max_sporters_18m, binnen_locatie.max_sporters_25m, data_18, data_25))
                    binnen_locatie.max_sporters_18m = data_18
                    binnen_locatie.max_sporters_25m = data_25

            if len(msgs) > 0:
                activiteit = "Aanpassingen aan binnen locatie van vereniging %s: %s" % (nhbver, "; ".join(msgs))
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                binnen_locatie.save()

            disc_old = binnen_locatie.disciplines_str()
            binnen_locatie.discipline_indoor = (str(binnen_locatie.banen_18m) != "0" or
                                                str(binnen_locatie.banen_25m) != "0")
            binnen_locatie.discipline_25m1pijl = False
            binnen_locatie.discipline_outdoor = False
            binnen_locatie.discipline_clout = False
            binnen_locatie.discipline_veld = False
            binnen_locatie.discipline_run = False
            binnen_locatie.discipline_3d = False
            disc_new = binnen_locatie.disciplines_str()
            if disc_old != disc_new:
                activiteit = "Aanpassing disciplines van binnen locatie van vereniging %s: [%s] (was [%s])" % (
                                nhbver, disc_new, disc_old)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                binnen_locatie.save()

            data = form.cleaned_data.get('notities')
            data = data.replace('\r\n', '\n')
            if binnen_locatie.notities != data:
                activiteit = "Aanpassing bijzonderheden van binnen locatie van vereniging %s: %s (was %s)" % (
                                nhbver,
                                repr(data.replace('\n', ' / ')),
                                repr(binnen_locatie.notities.replace('\n', ' / ')))
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                binnen_locatie.notities = data
                binnen_locatie.save()

        if buiten_locatie:
            msgs = list()
            updated = list()

            data = form.cleaned_data.get('buiten_banen')
            if buiten_locatie.buiten_banen != data:
                msgs.append("Aantal buiten banen aangepast van %s naar %s" % (buiten_locatie.buiten_banen, data))
                buiten_locatie.buiten_banen = data
                updated.append('buiten_banen')

            data = form.cleaned_data.get('buiten_max_afstand')
            if buiten_locatie.buiten_max_afstand != data:
                msgs.append("Maximale afstand aangepast van %s naar %s" % (buiten_locatie.buiten_max_afstand, data))
                buiten_locatie.buiten_max_afstand = data
                updated.append('buiten_max_afstand')

            if len(msgs) > 0:
                activiteit = "Aanpassingen aan buiten locatie van vereniging %s: %s" % (nhbver, "; ".join(msgs))
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)

            buiten_locatie.save(update_fields=updated)

            data = form.cleaned_data.get('buiten_notities')
            data = data.replace('\r\n', '\n')
            if buiten_locatie.notities != data:
                activiteit = "Aanpassing notitie van buiten locatie van vereniging %s: %s (was %s)" % (
                                    nhbver,
                                    repr(data.replace('\n', ' / ')),
                                    repr(buiten_locatie.notities.replace('\n', ' / ')))
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                buiten_locatie.notities = data
                buiten_locatie.save(update_fields=['notities'])

            disc_old = buiten_locatie.disciplines_str()
            buiten_locatie.discipline_25m1pijl = form.cleaned_data.get('disc_25m1p')
            buiten_locatie.discipline_outdoor = form.cleaned_data.get('disc_outdoor')
            buiten_locatie.discipline_indoor = False
            buiten_locatie.discipline_clout = form.cleaned_data.get('disc_clout')
            buiten_locatie.discipline_veld = form.cleaned_data.get('disc_veld')
            buiten_locatie.discipline_run = form.cleaned_data.get('disc_run')
            buiten_locatie.discipline_3d = form.cleaned_data.get('disc_3d')
            disc_new = buiten_locatie.disciplines_str()
            if disc_old != disc_new:
                activiteit = "Aanpassing disciplines van buiten locatie van vereniging %s: [%s] (was [%s])" % (
                                nhbver, disc_new, disc_old)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                buiten_locatie.save()

        if 'is_ver' in kwargs:
            url = reverse('Vereniging:overzicht')
        else:
            url = reverse('Vereniging:lijst-verenigingen')

        return HttpResponseRedirect(url)
Пример #7
0
    def post(self, request, *args, **kwargs):

        from_ip = get_safe_from_ip(request)
        context = super().get_context_data(**kwargs)
        context['foutmelding'] = ''

        email = request.POST.get('email',
                                 '')[:150]  # afkappen voor extra veiligheid
        if not mailer_email_is_valide(email):
            context[
                'foutmelding'] = 'Voer het e-mailadres in van een bestaand account'

        if not context['foutmelding']:
            # zoek een account met deze email
            try:
                account_email = (
                    AccountEmail.objects.get(bevestigde_email__iexact=email)
                )  # iexact = case insensitive volledige match

            except AccountEmail.DoesNotExist:
                # email is ook niet bekend
                context[
                    'foutmelding'] = 'Voer het e-mailadres in van een bestaand account'

            except AccountEmail.MultipleObjectsReturned:
                # kan niet kiezen tussen verschillende accounts
                # werkt dus niet als het email hergebruikt is voor meerdere accounts
                context[
                    'foutmelding'] = 'Er is een probleem met dit e-mailadres. Neem contact op met het bondsburo!'

                # schrijf de intentie in het logboek
                schrijf_in_logboek(
                    account=None,
                    gebruikte_functie="Wachtwoord",
                    activiteit=
                    "E-mail adres %s wordt gebruikt voor meer dan een account. Dit wordt niet ondersteund."
                    % repr(email))

        # we controleren hier niet of het account inactief is, dat doet login wel weer

        if not context['foutmelding']:
            # we hebben nu het account waar we een de e-mail voor moeten sturen

            schrijf_in_logboek(
                account=None,
                gebruikte_functie="Wachtwoord",
                activiteit=
                "Stuur e-mail naar adres %s voor account %s, verzocht vanaf IP %s."
                %
                (repr(account_email.bevestigde_email),
                 repr(account_email.account.get_account_full_name()), from_ip))

            account_stuur_email_wachtwoord_vergeten(
                account_email,
                wachtwoord='vergeten',
                email=account_email.bevestigde_email)
            httpresp = render(request, TEMPLATE_EMAIL, context)
        else:
            httpresp = render(request, self.template_name, context)

        return httpresp
Пример #8
0
    def _import_data(self, data):
        # doorloop de tabbladen
        for sheet in data['valueRanges']:
            naam = sheet['range']       # 'Tabblad naam'!A1:AF1006
            if 'Data individueel outdoor' in naam:
                blad = 'OD'
                COLS = ['Index', 'Geslacht', 'Leeftijd', 'Materiaalklasse', 'Discipline', 'Soort_record', 'Para klasse',
                        'Verbeterbaar', 'Pijlen', 'Bondsnummer', 'Naam', 'Datum', 'Plaats', 'Land', 'Score', 'X-count',
                        'Ook ER', 'Ook WR', 'Notities']
            elif 'Data individueel indoor' in naam:
                blad = '18'
                COLS = ['Index', 'Geslacht', 'Leeftijd', 'Materiaalklasse', 'Discipline', 'Soort_record', 'Para klasse',
                        'Verbeterbaar', 'Pijlen', 'Bondsnummer', 'Naam', 'Datum', 'Plaats', 'Land', 'Score', 'X-count',
                        'Ook ER', 'Ook WR', 'Notities']
            elif 'Data individueel 25m1pijl' in naam:
                blad = '25'
                COLS = ['Index', 'Geslacht', 'Leeftijd', 'Materiaalklasse', 'Discipline', 'Soort_record', 'Para klasse',
                        'Verbeterbaar', 'Pijlen', 'Bondsnummer', 'Naam', 'Datum', 'Plaats', 'Land', 'Score', 'Notities']
            elif 'Data team' in naam:
                blad = 'team'
                COLS = ['Geslacht', 'Leeftijd', 'Materiaalklasse', 'Discipline', 'Soort_record',
                        'Verbeterbaar', 'Pijlen', 'Bondsnummer', 'Naam', 'Datum', 'Plaats', 'Land', 'Score', 'Notities']
            else:
                self.stderr.write('[ERROR] Niet ondersteunde tabblad naam: %s' % naam)
                continue    # with the for

            # check the headers
            cols = sheet['values'][0]
            drop = 0
            if cols[-1] == 'Tekstversie datum':
                cols = cols[:-1]
            if cols[-1] == '':
                cols = cols[:-1]
            if cols != COLS:
                self.stderr.write('[ERROR] Kolom headers kloppen niet voor range %s' % naam)
                self.stderr.write('        Verwacht: %s' % repr(COLS))
                self.stderr.write('        Aanwezig: %s' % repr(cols))
            else:
                if blad in ('OD', '18', '25'):
                    self._import_indiv(sheet, blad)
                    self.check_consistency(blad)
                else:
                    # FUTURE: support voor team records toevoegen
                    self.stdout.write("[TODO] Team records worden nog niet ondersteund")
        # for

        # rapporteer de samenvatting en schrijf deze ook in het logboek
        samenvatting = "Samenvatting: %s records; %s ongewijzigd; %s overgeslagen i.v.m. fouten; %s verwijderd; %s wijzigingen; %s toegevoegd; %s waarschuwingen, %s fouten" % (
                           self.count_read,
                           self.count_ongewijzigd,
                           self.count_errors_skipped,
                           self.count_verwijderd,
                           self.count_wijzigingen,
                           self.count_toegevoegd,
                           self.count_waarschuwing,
                           self.count_andere_errors)

        if self.dryrun:
            self.stdout.write("\nDRY RUN")
        else:
            schrijf_in_logboek(None, 'Records', 'Import uitgevoerd\n' + samenvatting)
            self.stdout.write("\n")

        self.stdout.write(samenvatting)
Пример #9
0
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)
Пример #10
0
    def _probeer_login(self, form, account):
        """ Kijk of het wachtwoord goed is en het account niet geblokkeerd is """

        from_ip = get_safe_from_ip(self.request)
        login_naam = form.cleaned_data.get('login_naam')
        wachtwoord = form.cleaned_data.get('wachtwoord')
        next_url = form.cleaned_data.get('next')

        # controleer het wachtwoord
        account2 = authenticate(username=account.username, password=wachtwoord)
        if not account2:
            # authenticatie is niet gelukt
            # reden kan zijn: verkeerd wachtwoord of is_active=False

            # onthoudt precies wanneer dit was
            account.laatste_inlog_poging = timezone.now()
            schrijf_in_logboek(
                account, 'Inloggen',
                'Mislukte inlog vanaf IP %s voor account %s' %
                (from_ip, repr(login_naam)))
            my_logger.info('%s LOGIN Mislukte inlog voor account %s' %
                           (from_ip, repr(login_naam)))

            # onthoudt hoe vaak dit verkeerd gegaan is
            account.verkeerd_wachtwoord_teller += 1
            account.save()

            # bij te veel pogingen, blokkeer het account
            if account.verkeerd_wachtwoord_teller >= settings.AUTH_BAD_PASSWORD_LIMIT:
                account.is_geblokkeerd_tot = (
                    timezone.now() +
                    timedelta(minutes=settings.AUTH_BAD_PASSWORD_LOCKOUT_MINS))
                account.verkeerd_wachtwoord_teller = 0  # daarna weer volle mogelijkheden
                account.save()
                schrijf_in_logboek(
                    account, 'Inlog geblokkeerd',
                    'Account %s wordt geblokkeerd tot %s' %
                    (repr(login_naam),
                     account.is_geblokkeerd_tot.strftime('%Y-%m-%d %H:%M:%S')))
                context = {'account': account}
                return render(self.request, TEMPLATE_GEBLOKKEERD, context)

            # wachtwoord klopt niet, doe opnieuw
            return None

        # wachtwoord is goed
        account = account2

        # kijk of er een reden is om gebruik van het account te weren
        for _, func in account_plugins_login:
            httpresp = func(self.request, from_ip, account)
            if httpresp:
                # plugin has decided that the user may not login
                # and has generated/rendered an HttpResponse
                return httpresp

        # integratie met de authenticatie laag van Django
        login(self.request, account)

        my_logger.info('%s LOGIN op account %s' %
                       (from_ip, repr(account.username)))

        if account.verkeerd_wachtwoord_teller > 0:
            account.verkeerd_wachtwoord_teller = 0
            account.save()

        # Aangemeld blijven checkbox
        if not form.cleaned_data.get('aangemeld_blijven', False):
            # gebruiker wil NIET aangemeld blijven
            # zorg dat de session-cookie snel verloopt
            self.request.session.set_expiry(0)

        account_rechten_login_gelukt(self.request)

        # voer de automatische redirect uit, indien gevraagd
        if next_url:
            # reject niet bestaande urls
            # resolve zoekt de view die de url af kan handelen
            if next_url[-1] != '/':
                next_url += '/'
            try:
                resolve(next_url)
            except Resolver404:
                pass
            else:
                # is valide url
                return HttpResponseRedirect(next_url)

        if account.otp_is_actief:
            return HttpResponseRedirect(reverse('Functie:otp-controle'))

        return HttpResponseRedirect(reverse('Plein:plein'))
Пример #11
0
    def post(self, request, *args, **kwargs):
        """ wordt aangeroepen als de gebruik op de knop OPSLAAN druk """

        try:
            rk_deelcomp_pk = int(
                kwargs['rk_deelcomp_pk'][:6])  # afkappen voor de veiligheid
            deelcomp_rk = (
                DeelCompetitie.objects.select_related('competitie').get(
                    pk=rk_deelcomp_pk, laag=LAAG_RK))
        except (ValueError, DeelCompetitie.DoesNotExist):
            raise Http404('Competitie niet gevonden')

        # controleer dat de juiste RKO aan de knoppen zit
        if self.functie_nu != deelcomp_rk.functie:
            raise PermissionDenied()  # niet de juiste RKO

        pk2ckl = dict()
        pk2keuze = dict()

        for ckl in (CompetitieKlasse.objects.exclude(
                indiv__niet_voor_rk_bk=True).filter(
                    competitie=deelcomp_rk.competitie, team=None)):

            sel = 'sel_%s' % ckl.pk
            keuze = request.POST.get(sel, None)
            if keuze:
                try:
                    pk2keuze[ckl.pk] = int(
                        keuze[:2])  # afkappen voor de veiligheid
                    pk2ckl[ckl.pk] = ckl
                except ValueError:
                    pass
                else:
                    if pk2keuze[ckl.pk] not in (24, 20, 16, 12, 8, 4):
                        raise Http404('Geen valide keuze')
        # for

        for ckl in (CompetitieKlasse.objects.filter(
                competitie=deelcomp_rk.competitie,
                is_voor_teams_rk_bk=True,
                indiv=None)):

            sel = 'sel_%s' % ckl.pk
            keuze = request.POST.get(sel, None)
            if keuze:
                try:
                    pk2keuze[ckl.pk] = int(
                        keuze[:2])  # afkappen voor de veiligheid
                    pk2ckl[ckl.pk] = ckl
                except ValueError:
                    pass
                else:
                    if pk2keuze[ckl.pk] not in (12, 10, 8, 6, 4):
                        raise Http404('Geen valide keuze')
        # for

        wijzig_limiet = list(
        )  # list of tup(klasse, nieuwe_limiet, oude_limiet)

        for limiet in (DeelcompetitieKlasseLimiet.objects.select_related(
                'klasse').filter(deelcompetitie=deelcomp_rk,
                                 klasse__in=list(pk2keuze.keys()))):
            pk = limiet.klasse.pk
            keuze = pk2keuze[pk]
            del pk2keuze[pk]

            tup = (limiet.klasse, keuze, limiet.limiet)
            wijzig_limiet.append(tup)
        # for

        # verwerk de overgebleven keuzes waar nog geen limiet voor was
        for pk, keuze in pk2keuze.items():
            klasse = pk2ckl[pk]
            if klasse.indiv:
                default = 24
                tup = (klasse, keuze, default)
                wijzig_limiet.append(tup)
            else:
                # ERE klasse: 12 teams
                # overige: 8 teams
                default = 12 if "ERE" in klasse.team.beschrijving else 8
                tup = (klasse, keuze, default)
                wijzig_limiet.append(tup)
        # for

        # laat opnieuw de deelnemers boven de cut bepalen en sorteer op gemiddelde
        account = request.user
        door_str = "RKO %s" % account.volledige_naam()

        mutatie = None
        for klasse, nieuwe_limiet, oude_limiet in wijzig_limiet:
            # schrijf in het logboek
            if oude_limiet != nieuwe_limiet:
                msg = "De limiet (cut) voor klasse %s van de %s is aangepast van %s naar %s." % (
                    str(klasse), str(deelcomp_rk), oude_limiet, nieuwe_limiet)
                schrijf_in_logboek(self.request.user, "Competitie", msg)

                mutatie = CompetitieMutatie(mutatie=MUTATIE_CUT,
                                            door=door_str,
                                            deelcompetitie=deelcomp_rk,
                                            klasse=klasse,
                                            cut_oud=oude_limiet,
                                            cut_nieuw=nieuwe_limiet)
                mutatie.save()
        # for

        if mutatie:
            mutatie_ping.ping()

            # wacht op verwerking door achtergrond-taak voordat we verder gaan
            snel = str(request.POST.get('snel', ''))[:1]  # voor autotest

            if snel != '1':
                # wacht 3 seconden tot de mutatie uitgevoerd is
                interval = 0.2  # om steeds te verdubbelen
                total = 0.0  # om een limiet te stellen
                while not mutatie.is_verwerkt and total + interval <= 3.0:
                    time.sleep(interval)
                    total += interval  # 0.0 --> 0.2, 0.6, 1.4, 3.0, 6.2
                    interval *= 2  # 0.2 --> 0.4, 0.8, 1.6, 3.2
                    mutatie = CompetitieMutatie.objects.get(pk=mutatie.pk)
                # while

        return HttpResponseRedirect(reverse('Competitie:kies'))
Пример #12
0
    def post(self, request, *args, **kwargs):
        locatie = self.get_locatie()
        ver = self.get_vereniging()
        readonly = self._check_access(locatie, ver)
        if readonly:
            raise PermissionDenied(
                'Wijzigen alleen door HWL van de vereniging')

        if request.POST.get('verwijder', ''):
            locatie.zichtbaar = False
            locatie.save()

            # FUTURE: als de locatie nergens meer gebruikt wordt, dan kan deze opgeruimd worden

            url = reverse('Vereniging:externe-locaties',
                          kwargs={'vereniging_pk': ver.pk})
            return HttpResponseRedirect(url)

        data = request.POST.get('naam', '')
        if locatie.naam != data:
            activiteit = "Aanpassing naam externe locatie van vereniging %s: %s (was %s)" % (
                ver, repr(data), repr(locatie.naam))
            schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
            locatie.naam = data

        data = request.POST.get('adres', '')
        data = data.replace('\r\n', '\n')
        if locatie.adres != data:
            activiteit = "Aanpassing adres van externe locatie %s van vereniging %s: %s (was %s)" % (
                locatie.naam, ver, repr(data.replace(
                    '\n', ', ')), repr(locatie.adres.replace('\n', ', ')))
            schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
            locatie.adres = data

        data = request.POST.get('plaats', '')[:50]
        if locatie.plaats != data:
            activiteit = "Aanpassing plaats van externe locatie %s van vereniging %s: %s (was %s)" % (
                locatie.naam, ver, repr(data), repr(locatie.plaats))
            schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
            locatie.plaats = data

        disc_old = locatie.disciplines_str()
        locatie.discipline_25m1pijl = (request.POST.get('disc_25m1p', '') !=
                                       '')
        locatie.discipline_outdoor = (request.POST.get('disc_outdoor', '') !=
                                      '')
        locatie.discipline_indoor = (request.POST.get('disc_indoor', '') != '')
        locatie.discipline_clout = (request.POST.get('disc_clout', '') != '')
        locatie.discipline_veld = (request.POST.get('disc_veld', '') != '')
        locatie.discipline_run = (request.POST.get('disc_run', '') != '')
        locatie.discipline_3d = (request.POST.get('disc_3d', '') != '')
        disc_new = locatie.disciplines_str()
        if disc_old != disc_new:
            activiteit = "Aanpassing disciplines van externe locatie %s van vereniging %s: [%s] (was [%s])" % (
                locatie.naam, ver, disc_new, disc_old)
            schrijf_in_logboek(request.user, 'Accommodaties', activiteit)

        # extra velden voor indoor locaties
        if locatie.discipline_indoor or locatie.discipline_25m1pijl:
            try:
                banen = int(request.POST.get('banen_18m', 0))
                banen = max(banen, 0)  # ondergrens
                banen = min(banen, 24)  # bovengrens
            except ValueError:
                banen = 0
            if locatie.banen_18m != banen:
                activiteit = "Aanpassing aantal 18m banen van externe locatie %s van vereniging %s: naar %s (was %s)" % (
                    locatie.naam, ver, banen, locatie.banen_18m)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                locatie.banen_18m = banen

            try:
                banen = int(request.POST.get('banen_25m', 0))
                banen = max(banen, 0)  # ondergrens
                banen = min(banen, 24)  # bovengrens
            except ValueError:
                banen = 0
            if locatie.banen_25m != banen:
                activiteit = "Aanpassing aantal 25m banen van externe locatie %s van vereniging %s: naar %s (was %s)" % (
                    locatie.naam, ver, banen, locatie.banen_25m)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                locatie.banen_25m = banen

            # FUTURE: remove when max_dt_per_baan has been removed
            # max_dt = 3
            # if request.POST.get('max_dt', '') == '4':
            #     max_dt = 4
            # if locatie.max_dt_per_baan != max_dt:
            #     activiteit = "Aanpassing max DT per baan van externe locatie %s van vereniging %s: naar %s (was %s)" % (
            #                     locatie.naam, ver, max_dt, locatie.max_dt_per_baan)
            #     schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
            #     locatie.max_dt_per_baan = max_dt

            try:
                sporters = int(request.POST.get('max_sporters_18m', 0))
                sporters = max(sporters, 0)  # ondergrens
                sporters = min(sporters, 99)  # bovengrens
            except ValueError:
                sporters = 0
            if locatie.max_sporters_18m != sporters:
                activiteit = "Aanpassing maximum sporters 18m van externe locatie %s van vereniging %s: naar %s (was %s)" % (
                    locatie.naam, ver, sporters, locatie.max_sporters_18m)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                locatie.max_sporters_18m = sporters

            try:
                sporters = int(request.POST.get('max_sporters_25m', 0))
                sporters = max(sporters, 0)  # ondergrens
                sporters = min(sporters, 99)  # bovengrens
            except ValueError:
                sporters = 0
            if locatie.max_sporters_25m != sporters:
                activiteit = "Aanpassing maximum sporters 25m van externe locatie %s van vereniging %s: naar %s (was %s)" % (
                    locatie.naam, ver, sporters, locatie.max_sporters_25m)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                locatie.max_sporters_25m = sporters

        # extra velden voor outdoor locaties
        if locatie.discipline_outdoor or locatie.discipline_veld:
            try:
                max_afstand = int(request.POST.get('buiten_max_afstand', 0))
                max_afstand = max(max_afstand, 30)  # ondergrens
                max_afstand = min(max_afstand, 100)  # bovengrens
            except ValueError:
                max_afstand = 30

            try:
                banen = int(request.POST.get('buiten_banen', 0))
                banen = max(banen, 1)  # ondergrens
                banen = min(banen, 80)  # bovengrens
            except ValueError:
                banen = 0

            if max_afstand != locatie.buiten_max_afstand or banen != locatie.buiten_banen:
                activiteit = "Aanpassing aantal outdoor banen van externe locatie %s van vereniging %s: naar %s x %s meter (was %s x %sm)" % (
                    locatie.naam, ver, banen, max_afstand,
                    locatie.buiten_banen, locatie.buiten_max_afstand)
                schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
                locatie.buiten_max_afstand = max_afstand
                locatie.buiten_banen = banen

        data = request.POST.get('notities', '')
        data = data.replace('\r\n', '\n')
        if locatie.notities != data:
            activiteit = "Aanpassing bijzonderheden van externe locatie %s van vereniging %s: %s (was %s)" % (
                locatie.naam, ver, repr(data.replace(
                    '\n', ' / ')), repr(locatie.notities.replace('\n', ' / ')))
            schrijf_in_logboek(request.user, 'Accommodaties', activiteit)
            locatie.notities = data

        locatie.save()

        url = reverse('Vereniging:externe-locaties',
                      kwargs={'vereniging_pk': ver.pk})
        return HttpResponseRedirect(url)