Bladeren bron

si sta lavorando sul cambio password utente

mauro 11 maanden geleden
bovenliggende
commit
077443f4d4

+ 23 - 0
azienda/migrations/0012_azienda_cambiopassword_sede_cambiopassword.py

@@ -0,0 +1,23 @@
+# Generated by Django 5.1.4 on 2024-12-16 15:35
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('azienda', '0011_assegnazionesede_azienda'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='azienda',
+            name='cambiopassword',
+            field=models.BooleanField(default=0),
+        ),
+        migrations.AddField(
+            model_name='sede',
+            name='cambiopassword',
+            field=models.BooleanField(default=0),
+        ),
+    ]

+ 3 - 1
azienda/models.py

@@ -11,6 +11,7 @@ class Azienda(models.Model):
    partitaiva = models.CharField(max_length=11,null=False,default="")
    mail = models.CharField(max_length=256,null=False,default="")
    comm=models.CharField(max_length=256,null=False,default="") # email usata come mittente per le comunicazioni
+   cambiopassword = models.BooleanField(null=False,default=0)
 
    class Meta:
      constraints = [ models.UniqueConstraint(fields=['nome','partitaiva'], name="unique-azienda") ]
@@ -25,7 +26,8 @@ class Sede(models.Model):
     '''
     nome = models.CharField(max_length=132,null=False,default="")
     info = models.CharField(max_length=256,null=False,default="")
-    azienda = azienda = models.ForeignKey(Azienda,on_delete=models.PROTECT)
+    azienda = models.ForeignKey(Azienda,on_delete=models.PROTECT)
+    cambiopassword = models.BooleanField(null=False,default=0)
 
     def __str__(self):
         return f"{self.id}: {self.nome}"

+ 1 - 1
comunicazione/admin.py

@@ -2,6 +2,6 @@ from django.contrib import admin
 
 from .models import *
 
-admin.register(Comunicazione)
+admin.site.register(Comunicazione)
 class ComunicazioneAdmin(admin.ModelAdmin):
   list_display = ['indice','valore','nota',]

BIN
db/db.sqlite3


+ 1 - 1
login/templates/updatePassword.html

@@ -19,7 +19,7 @@
     </div>
    </form>
   </div>
-      <div class="form-container card p-3 bg-light'>
+      <div class="form-container card p-3 bg-light">
         <div class="container">
         <p class="lead">L'accesso a questo servizio è monitorato in modo automatico e anonimo. Vengono registrati i dati di connessione, quale data/ora, Ip, UserAgent.</p>
         <p class='lead'>Il pannello utilizza Cookies di sessione e tecnici per consentire il suo corretto funzionamento. E' necessario che siano consentiti nel browser utilizzato. e non sia in funzione la modalità Anonima. Non vengono utilizzati Cookie di terze parti.</p>

+ 16 - 0
login/templates/updatePasswordEnd.html

@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+
+{% block body %}
+    <div class='form-outline mb-2 text-center lead'>
+	    Richiesta Aggiornamento Password.<br>
+  </div>
+  <div class='form-outline mb-2 text-center lead'>
+	   Se i dati inseriti corrispondono a quelli inseriti in archivio, riceverete una email con un link.<br>
+	   Seguendo questo link, sarete guidati al cambio password.
+	   Il link indicato in mail puo' essere usato una sola volta.
+  </div>
+  <div class='form-outline mb-2 text-center lead'>
+	  <a href="{% url 'login:start' %}">Torna alla pagina di login</a>
+  </div>
+
+{% endblock %}

+ 16 - 7
login/views.py

@@ -7,6 +7,8 @@ from .forms import *
 from config.views import getConfig
 from comunicazione.views import ServizioMail
 from att.views import *  
+#from utente.views import *
+
 import uuid
 
 from utente.models import *
@@ -72,6 +74,12 @@ def start(request):
               sm.send()
           ### comunicazioni ###
 
+          ### obbligo cambio password
+          ### se è previsto che l'utente a livello di sede cambi la password
+          ### al primo ingresso, qui vengono effettuati entrambi i check
+          if u.sede.cambiopassword and u.primologin:
+            print("l'utente deve cambiare obbligatoriamente la password")
+
           return HttpResponseRedirect(reverse("utente:download"))
       else: # l'utente ordinario non esiste
         print('verifica amministratore')
@@ -127,7 +135,6 @@ def RichiestaAggiornamentoPassword(request):
   '''
   la form che segue, serve per aggiornare la propria password/pin
   '''
-  data = dict()
   request.session.flush()
   request.session.set_expiry(3600)
 
@@ -148,18 +155,18 @@ def RichiestaAggiornamentoPassword(request):
       d = None
       # 1 tentativo su codice fiscale
       try: 
-        a = Utente.objects.get(codicefiscale=informazione)
+        a = Utente.objects.get(codicefiscale=informazione.upper())
         d = 'u'
       except Utente.DoesNotExist as dne:
         print('informazione non trovata tra i codici fiscali utente')
         try:
-          a = Utente.objects.get(mail=informazione)
+          a = Utente.objects.get(mail=informazione.lower())
           d = 'u'
         except Utente.DoesNotExist as dne:
           print('informazione non trovata tra le email')
           try:
-            a = Amministratore.objects.get(login=informazione)
-          except Amministrazione.DoesNotExist as dne:
+            a = Amministratore.objects.get(login=informazione.lower())
+          except Amministratore.DoesNotExist as dne:
             print('informazione non trovata tra i login amministratotore')
 
       if a:
@@ -183,15 +190,17 @@ def RichiestaAggiornamentoPassword(request):
         utente=dict() #adattamento campo utente
         print(reverse('login:ResetPassword',args=[uuidres]))
 
-        utente['link'] = reverse('login:ResetPassword',args=[uuidres])
+        utente['link'] = reverse('utente:updatePasswordFromLogin',args=[uuidres])
         utente['nome'] = a.nome
         utente['mail'] = a.mail
+        utente['sito'] = getConfig('DefaultSite')
+        utente['titolo'] = getConfig('HeaderTitle')
         sm_data['utente'] = utente
         sm.set_data(sm_data)
         sm.send()
         ### comunicazioni ###
 
-      return HttpResponseRedirect(reverse("login:start"))
+      return render(request,'updatePasswordEnd.html',{})
     else:
       data['informazione'] = PasswordUpdate(request.POST)
   else:

+ 12 - 2
utente/forms.py

@@ -20,7 +20,17 @@ class formPinMail(forms.Form):
 class formUpdatePassword(forms.Form):
   def __init__(self,*args,**kwargs):
     forms.Form.__init__(self,*args,**kwargs)
-    self.fields['codicefiscale'] = forms.CharField(required=False)
-    self.fields['mail'] = forms.CharField(required=False)
+    self.fields['login'] = forms.CharField(required=True)
+    self.fields['uuid'] = forms.CharField(required=True)
+    self.fields['pin0'] = forms.CharField(required=True)
+    self.fields['pin1'] = forms.CharField(required=True)
+    self.fields['pin2'] = forms.CharField(required=True)
 
+class formUpdatePasswordLogin(forms.Form):
+  def __init__(self,*args,**kwargs):
+    forms.Form.__init__(self,*args,**kwargs)
+    self.fields['cfisc'] = forms.CharField(required=True)
+    self.fields['uuid'] = forms.CharField(required=True)
+    self.fields['pin1'] = forms.CharField(required=True)
+    self.fields['pin2'] = forms.CharField(required=True)
 

+ 64 - 0
utente/templates/utente.edit.password.html

@@ -0,0 +1,64 @@
+<div class="tab-pane fade show active" id="profile-pane" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">
+
+
+  <!-- errori utente -->
+  {% if utente.errors %}
+    {{ utente.errors }}
+    {% for field in utente %}
+      {% for error in field.errors %}
+        <div class="alert alert-danger">
+          <strong>{{ error|escape }}</strong>
+        </div>
+      {% endfor %}
+    {% endfor %}
+    {% for error in utente.non_field_errors %}
+      <div class="alert alert-danger">
+          <strong>{{ error|escape }}</strong>
+      </div>
+    {% endfor %}
+  {% else %}
+    Nessun Errore rilevato
+  {% endif %}
+  <!-- fine zona errori -->
+
+  <!-- profilo utente -->
+  <form name='UserEdit' method='post'>
+    {% csrf_token %}
+
+    <div class='form-group'>
+      <label for="codicefiscale">Codice Fiscale</label>
+      <input type='text' class='form-control' name='codicefiscale' id='codicefiscale' value='{{ utente.codicefiscale.value }}'>
+    </div>
+    <div class='form-group'>
+      <label for="nome">Nome Cognome</label>
+      <input type='text' class='form-control form-control-lg' name='nome' id='nome' value='{{ utente.nome.value }}'>
+    </div>
+    <div class='form-group'>
+      <label for="luogonascita">Luogo di nascita</label>
+      <input type='text' class='form-control' name='luogonascita' id='luogonascita' value='{{ utente.luogonascita.value }}'>
+    </div>
+    <div class='form-group'>
+      <label for="datanascita">Data di nascita</label>
+      <input type='date' class='form-control' name='datanascita' id='datanascita' value='{{ utente.datanascita.value|date:'Y-m-d' }}'>
+    </div>
+    <div class='form-group'>
+      <label for="mail" class="form-control-label">Email</label>
+      <input type='mail' class='form-control' name='mail' id='mail' value='{{ utente.mail.value }}'>
+    </div>
+
+    <div class='form-group'>
+      <label for="pin" class='form-control-label'>Pin</label>
+      <input type='text' class='form-control' name='pin' id='pin' value='{{ utente.pin.value }}'>
+    </div>
+
+    <div class='form-check'>
+      <input type="checkbox" class="form-check-input" name='CancellaUtente' id='CancellaUtente'>
+      <Label class="form-check-label" for='CancellaUtente'>Cancella Questo record!</label>
+    </div>
+
+    <input type='submit' class="btn btn-secondary" value='Aggiorna'>
+    <input type='submit' class="btn btn-primary" name="ritorna" value="Ritorna">
+  </form>
+
+</div>
+

+ 54 - 0
utente/templates/utente.edit.password.login.html

@@ -0,0 +1,54 @@
+{% extends 'base.html' %}
+
+{% block top %}
+    <div class='form-outline mb-3 text-center btn-primary h3'>
+           {{ HeaderTitle }}
+    </div>
+    <div class='form-outline mb-3 text-center btn-primary h3'>
+           Azienda in elaborazione: {{ azienda.nome }}
+    </div>
+    <div class='form-outline mb-3 text-center btn-primary h3'>
+           Amministratore: {{ admin.username }}
+    </div>
+{% endblock %}
+
+{% block body %}
+
+  <!-- profilo utente -->
+  <div>
+    <form name='UpdatePassword' method='post' class='form-container card p-3 bg-light'>
+      {% csrf_token %}
+      <div class='form-outline mb-3'>
+      <label class='form-label' for='cfisc'>Email - Codice Fiscale - Login</label>
+      <input type='text'  class='form-control' id='cfisc' name='cfisc' value="{{ informazione.cfisc.value }}"
+    </div>
+    <div class='form-outline mb-3'>
+     <label class='form-label' for='uuid'>Codice Univoco</label>
+     <input type='text'  class='form-control' id='uuid' name='uuid' value="{{ informazione.uuid.value }}" readonly>
+    </div>
+    <div class='form-outline mb-3'>
+     <label class='form-label' for='uuid'>password/pin</label>
+     <input type='password'  class='form-control' id='pin1' name='pin1' value="{{ informazione.pin1.value }}">
+    </div>
+    <div class='form-outline mb-3'>
+     <label class='form-label' for='uuid'>ripeti password/pin</label>
+     <input type='password'  class='form-control' id='pin2' name='pin2' value="{{ informazione.pin2.value }}">
+    </div>
+
+    <div class='form-outline mb-3 text-center'>
+      <button type='submit' class='btn btn-primary btn-block btn-lg mb-3 active'>Aggiorna</button>
+      <button type='reset' class='btn btn-secondary btn-block btn-lg mb-3'>Annulla</button>
+    </div>
+   </form>
+  </div>
+  {% endblock %}
+
+  {% block bottom %}
+  <!-- errori -->
+  <div class='form-container card p-3 bg-light'>
+  {% if informazione.errors %}
+    {{ informazione.errors }}
+  {% endif %}
+  </div>
+  <!-- fine zona errori -->
+  {% endblock %}

+ 47 - 0
utente/templates/utente.password.html

@@ -0,0 +1,47 @@
+<div class="tab-pane fade show active" id="profile-pane" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">
+
+
+  <!-- errori utente -->
+  {% if utente.errors %}
+    {{ utente.errors }}
+    {% for field in utente %}
+      {% for error in field.errors %}
+        <div class="alert alert-danger">
+          <strong>{{ error|escape }}</strong>
+        </div>
+      {% endfor %}
+    {% endfor %}
+    {% for error in utente.non_field_errors %}
+      <div class="alert alert-danger">
+          <strong>{{ error|escape }}</strong>
+      </div>
+    {% endfor %}
+  {% else %}
+    Nessun Errore rilevato
+  {% endif %}
+  <!-- fine zona errori -->
+
+  <!-- profilo utente -->
+  <form name='PassEdit' method='post'>
+    {% csrf_token %}
+
+    <div class='form-group'>
+      <label for="pin0" class='form-control-label'>Pin</label>
+      <input type='password' class='form-control' name='pin0' id='pin0' value='{{ password.pin0.value }}'>
+    </div>
+
+    <div class='form-group'>
+      <label for="pin1" class='form-control-label'>Pin</label>
+      <input type='password' class='form-control' name='pin1' id='pin1' value='{{ password.pin1.value }}'>
+    </div>
+    <div class='form-group'>
+      <label for="pin2" class='form-control-label'>Ripeti</label>
+      <input type='password' class='form-control' name='pin2' id='pin2' value='{{ password.pin2.value }}'>
+    </div>
+
+    <input type='submit' class="btn btn-secondary" value='Conferma'>
+    <input type='submit' class="btn btn-primary" name="ritorna" value="Ritorna">
+  </form>
+
+</div>
+

+ 2 - 0
utente/urls.py

@@ -6,4 +6,6 @@ urlpatterns = [
   path('welcome',views.welcome,name='welcome'),
   path('edit',views.edit,name='edit'),
   path('download',views.download,name='download'),
+  path('updatePasswordFromLogin/<uuid:uuid>',views.updatePasswordFromLogin,name='updatePasswordFromLogin')
+  
   ]

+ 52 - 0
utente/views.py

@@ -251,3 +251,55 @@ def download(request):
     print("Mail valida")
  
   return render(request,'utente.download.html',data)
+
+def updatePasswordFromLogin(request,uuid):
+  '''
+  la form che segue, serve per aggiornare la propria password/pin dal login
+  '''
+  data = dict()
+  data['HeaderTitle'] = getConfig('HeaderTitle')
+  data['uuid'] = uuid
+  print('uuid',uuid)
+
+  if request.method == 'POST':
+    formupdatepasswordlogin = formUpdatePasswordLogin(request.POST)
+    if formupdatepasswordlogin.is_valid():
+      cfisc = formupdatepasswordlogin.cleaned_data.get('cfisc')
+      pin0 = formupdatepasswordlogin.cleaned_data.get('pin0')
+      pin1 = formupdatepasswordlogin.cleaned_data.get('pin1')
+      print(cfisc,pin0,pin1)
+
+      a = None
+      d = None
+      # 1 tentativo su codice fiscale
+      try: 
+        a = Utente.objects.get(codicefiscale=cfisc.upper())
+        d = 'u'
+      except Utente.DoesNotExist as dne:
+        print('informazione non trovata tra i codici fiscali utente')
+        try:
+          a = Utente.objects.get(mail=cfisc.lower())
+          d = 'u'
+        except Utente.DoesNotExist as dne:
+          print('informazione non trovata tra le email')
+          try:
+            a = Amministratore.objects.get(login=cfisc.lower())
+          except Amministratore.DoesNotExist as dne:
+            print('informazione non trovata tra i login amministratotore')
+      if a:
+        print(a)
+      if d:
+        print(d)
+    else:
+      print('form not valid')
+      data['informazione'] = formUpdatePasswordLogin(request.POST)
+  else:
+    print('request non valida', request.POST)
+    tmp = dict()
+    tmp['uuid'] = uuid
+    tmp['pin0'] = ""
+    tmp['pin1'] = ""
+    tmp['cfisc'] = ""
+    data['informazione'] = formUpdatePasswordLogin(tmp)
+    print(data)
+  return render(request,'utente.edit.password.login.html',data)