From f79ea5716592291c52923dd8723fa1e43a8f36c4 Mon Sep 17 00:00:00 2001 From: MaM Web user Date: Sun, 5 Sep 2021 21:35:13 +0200 Subject: [PATCH] =?UTF-8?q?Implementovan=C3=A1=20doregistrace=20=C5=99e?= =?UTF-8?q?=C5=A1itel=C5=AF,=20asi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/forms.py | 10 +++++--- seminar/views/views_all.py | 51 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/seminar/forms.py b/seminar/forms.py index 966ed54c..d5211bc9 100644 --- a/seminar/forms.py +++ b/seminar/forms.py @@ -103,10 +103,14 @@ class PrihlaskaForm(PasswordResetForm): err_logger = logging.getLogger('seminar.prihlaska.problem') email = self.cleaned_data.get('email') try: - Osoba.objects.get(email=email) + osoba = Osoba.objects.get(email=email) msg = "Email {} exists".format(email) - err_logger.info(msg) - raise forms.ValidationError('E-mail je již použit') + if osoba.user is not None: + err_logger.info(msg) + raise forms.ValidationError('E-mail je již použit') + else: + msg += ', but currently has no User, so allowing registration.' + err_logger.info(msg) except ObjectDoesNotExist: pass diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index fb79805f..4ae7f4f8 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -1241,6 +1241,7 @@ def prihlaskaView(request): psc = fcd.get('psc',''), poznamka = str(fcd) ) + if fcd.get('spam',False): o.datum_souhlasu_zasilani = date.today() if fcd.get('stat','') in ('CZ','SK'): @@ -1250,6 +1251,32 @@ def prihlaskaView(request): msg = "Unknown country {}".format(fcd['stat_text']) err_logger.warn(msg + str(form_hash)) + + # Dovolujeme doregistraci uživatele pro existující mail, takže naopak chceme doplnit/aktualizovat údaje do stávajícího objektu + try: + orig_osoba = m.Osoba.objects.get(email=fcd['email']) + orig_osoba.poznamka += f'\nDOREGISTRACE K EXISTUJÍCÍMU E-MAILU, diff níže.' + except m.Osoba.DoesNotExist: + # Trik: Budeme aktualizovat údaje nové osoby, takže se asi nic nezmění, ale fungovat to bude. + orig_osoba = o + + # Porovnání údajů + assert orig_osoba.user is None, "Právě-registrující-se osoba už má Uživatele!" + osoba_attrs = ['jmeno', 'prijmeni', 'pohlavi_muz', 'email', 'telefon', 'datum_narozeni', 'ulice', 'mesto', 'psc', 'stat', 'datum_souhlasu_udaje', 'datum_souhlasu_zasilani', 'datum_registrace'] + diffattrs = [] + for attr in osoba_attrs: + new = getattr(o, attr) + old = getattr(orig_osoba, attr) + if new != old: + orig_osoba.poznamka += f'\nRozdíl v {attr}: Původní {old}, nový {new}' + diffattrs.append(f'Osoba.{attr}') + setattr(orig_osoba, attr, new) + # Datum registrace chceme původní / nižší: + orig_osoba.datum_registrace = min(orig_osoba.datum_registrace, o.datum_registrace) + + # Od této chvíle dál je správná osoba ta "původní", novou podle formuláře si ale zachováme + o, o_form = orig_osoba, o + o.save() o.user = u o.save() @@ -1260,16 +1287,36 @@ def prihlaskaView(request): zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'] ) - r.save() - r.osoba = o if fcd.get('skola'): r.skola = fcd['skola'] else: # Unknown school - log it msg = "Unknown school {}, {}".format(fcd['skola_nazev'],fcd['skola_adresa']) err_logger.warn(msg + str(form_hash)) + + # Porovnání údajů u řešitele + try: + orig_resitel = o.resitel + orig_resitel.poznamka += f'\nDOREGISTRACE ŘEŠITELE, diff:' + except m.Resitel.DoesNotExist: + # Stejný trik: + orig_resitel = r + resitel_attrs = ['skola', 'poznamka', 'rok_maturity', 'zasilat', 'zasilat_cislo_emailem'] + for attr in resitel_attrs: + new = getattr(r, attr) + old = getattr(orig_resitel, attr) + if new != old: + orig_resitel.poznamka += f'\nRozdíl v {attr}: Původní {old}, nový {new}' + diffattrs.append(f'Resitel.{attr}') + setattr(orig_resitel, attr, new) + r, r_form = orig_resitel, r + + r.save() + r.osoba = o # Tohle by mělo být bezpečné… r.save() + if diffattrs: err_logger.warning(f'Different fields when matching Řešitel id {r.id} or Osoba id {o.id}: {diffattrs}') + uid = urlsafe_base64_encode(force_bytes(u.pk)) token = PasswordResetTokenGenerator().make_token(u) url = "https://%s%s" % (