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)
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'))
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}))
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)
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)
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)
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
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)
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)
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'))
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'))
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)