Browse Source

azienda/migrations/0013_azienda_forzanuovapassword_sede_forzanuovapassword.py
login/templates/forzaNuovaPasswordEnd.html
utente/migrations/0018_utente_lostpin.py
utente/templates/utente.edit.password.primologin.html

Mauro 11 tháng trước cách đây
mục cha
commit
0173172bf5

+ 4 - 1
azienda/forms.py

@@ -6,7 +6,8 @@ class formAzienda(forms.Form):
     self.fields['nome'] = forms.CharField(required=True)
     self.fields['partitaiva'] = forms.CharField(required=True)
     self.fields['mail'] = forms.CharField(required=False)
-    self.fields['forzanuovapassword'] = forms.BooleanField(required=False)
+    self.fields['cambiopassword'] = forms.BooleanField(required=False)
+    self.fields['forzanuovapassword' ] = forms.BooleanField(required=False)
     self.fields['cancellaazienda'] = forms.BooleanField(required=False)
 
 class formSede(forms.Form):
@@ -15,6 +16,8 @@ class formSede(forms.Form):
     self.fields['nome'] = forms.CharField(required=True)
     self.fields['info'] = forms.CharField(required=False)
     self.fields['cancellasede'] = forms.BooleanField(required=False)
+    self.fields['cambiopassword'] = forms.BooleanField(required=False)
+    self.fields['forzanuovapassword'] = forms.BooleanField(required=False)
 
 class formPinMail(forms.Form):
   def __init__(self,*args,**kwargs):

+ 7 - 2
azienda/models.py

@@ -10,7 +10,11 @@ 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)
+   cambiopassword = models.BooleanField(null=False,default=False)
+   forzanuovapassword = models.BooleanField(null=False,default=False)
+
+   # cambiopassword = e' consentito il cambio password agli utenti
+   # forzanuovapassword = obbligatorio il cambio password al primo login
 
    class Meta:
      constraints = [ models.UniqueConstraint(fields=['nome','partitaiva'], name="unique-azienda") ]
@@ -26,7 +30,8 @@ class Sede(models.Model):
     nome = models.CharField(max_length=132,null=False,default="")
     info = models.CharField(max_length=256,null=False,default="")
     azienda = models.ForeignKey(Azienda,on_delete=models.PROTECT)
-    cambiopassword = models.BooleanField(null=False,default=0)
+    cambiopassword = models.BooleanField(null=False,default=False)
+    forzanuovapassword = models.BooleanField(null=False,default=False)
 
     def __str__(self):
         return f"{self.id}: {self.nome}"

+ 7 - 2
azienda/templates/azienda.editAzienda.html

@@ -48,8 +48,13 @@
       <input type='mail' class='form-control' name='mail' id='mail' value='{{ azienda.mail.value }}'>
     </div>
     <div class='form-check'>
-      <input class="form-check-input" type="checkbox" value="{{ azienda.forzanuovapassword.value }}" id="forzanuovapassword" name="forzanuovapassword">
-      <label for='forzanuovapassword' class='form-control-label'>L'utente deve cambiare la password al primo login</label>
+      <input class="form-check-input" type="checkbox" {% if azienda.cambiopassword.value %} checked {% endif %} id="cambiopassword" name="cambiopassword">
+      <label for='cambiopassword' class='form-control-label'>Il dipendente può aggiornare la password</label>
+    </div>
+
+    <div class='form-check'>
+      <input class="form-check-input" type="checkbox" {% if azienda.forzanuovapassword.value %} checked {% endif %} id="forzanuovapassword" name="forzanuovapassword">
+      <label for='forzanuovapassword' class='form-control-label'>Il dipendente deve cambiare la password al primo login</label>
     </div>
     <div class="form-check">
       <input class="form-check-input" type="checkbox" value="{{ azienda.cancellaazienda.value }}" id="cancellaazienda" name="cancellaazienda">

+ 7 - 2
azienda/templates/azienda.editSede.html

@@ -44,8 +44,13 @@
       <input type='text' class='form-control form-control-lg' name='info' id='info' value='{{ sede.info.value }}'>
     </div>
     <div class='form-check'>
-      <input class="form-check-input" type="checkbox" value="{{ sede.forzanuovapassword.value }}" id="forzanuovapassword" name="forzanuovapassword">
-      <label for='forzanuovapassword' class='form-control-label'>L'utente deve cambiare la password al primo login</label>
+      <input class="form-check-input" type="checkbox" {% if sede.cambiopassword.value %} checked {% endif %} id="cambiopassword" name="cambiopassword">
+      <label for='cambiopassword' class='form-control-label'>Il dipendente deve cambiare la password al primo login</label>
+    </div>
+
+    <div class='form-check'>
+      <input class="form-check-input" type="checkbox" {% if sede.forzanuovapassword.value %} checked {% endif %} id="forzanuovapassword" name="forzanuovapassword">
+      <label for='forzanuovapassword' class='form-control-label'>Il dipendente deve cambiare la password al primo login</label>
     </div>
     <div class="form-check">
       <input class="form-check-input" type="checkbox" value="{{ sede.cancellasede.value }}" id="cancellasede" name="cancellasede">

+ 17 - 7
azienda/views.py

@@ -197,6 +197,8 @@ def editAzienda(request):
       azienda.nome = nuovaazienda.cleaned_data.get('nome')
       azienda.mail = nuovaazienda.cleaned_data.get('mail')
       azienda.partitaiva = nuovaazienda.cleaned_data.get('partitaiva')
+      azienda.cambiopassword = nuovaazienda.cleaned_data.get('cambiopassword')
+      azienda.forzanuovapassword = nuovaazienda.cleaned_data.get('forzanuovapassword')
       azienda.save()
       request.session['AziendaIdEdit'] = azienda.id
       print('azienda:',azienda.id)
@@ -222,14 +224,16 @@ def editAzienda(request):
         tmp['nome'] = azienda.nome
         tmp['partitaiva'] = azienda.partitaiva
         tmp['mail'] = azienda.mail
-        tmp['forzanuovapassword'] = True
+        tmp['forzanuovapassword'] = azienda.forzanuovapassword
+        tmp['cambiopassword'] = azienda.cambiopassword
         formAziendaField = formAzienda(tmp)
     else:
         tmp = dict()
         tmp['nome'] = ''
         tmp['partitaiva'] = ''
         tmp['mail'] = user.mail
-        tmp['forzanuovapassword'] = True
+        tmp['forzanuovapassword'] = false
+        tmp['cambiopassword' ] = false
         formAziendaField = formAzienda(tmp)
 
     data['azienda'] = formAziendaField
@@ -269,6 +273,8 @@ def editSede(request):
         sede.azienda = Azienda.objects.get(pk=AziendaId)
       sede.nome = nuovasede.cleaned_data.get('nome')
       sede.mail = nuovasede.cleaned_data.get('mail')
+      sede.cambiopassword = nuovasede.cleaned_data.get('cambiopassword')
+      sede.forzanuovapassword = nuovasede.cleaned_data.get('forzanuovapassword')
       sede.save()
       request.session['SedeIdEdit'] = sede.id
       print('sede:',sede.id)
@@ -285,16 +291,20 @@ def editSede(request):
       print("form non valido")
       data['sede'] = formSede(request.POST)
   else: #non è un post
+
     print("Non è un post")
     formSedeField = None
     tmp = dict()
-    tmp['nome'] = sede.nome
-    tmp['info'] = sede.info
     if sede:
-        print('Abbiamo sede',sede.nome)
-        tmp['id'] = sede.id
-    formSedeField = formSede(tmp)
+      tmp['nome'] = sede.nome
+      tmp['info'] = sede.info
+      tmp['cambiopassword'] = sede.cambiopassword
+      tmp['forzanuovapassword'] = sede.forzanuovapassword
+    else:
+      tmp['cambiopassword'] = azienda.cambiopassword
+      tmp['forzanuovapassword'] = azienda.forzanuovapassword
 
+    formSedeField = formSede(tmp)
     data['sede'] = formSedeField
 
   return render(request,'azienda.editSede.html',data)

BIN
db/db.sqlite3


+ 59 - 8
login/views.py

@@ -44,6 +44,63 @@ def start(request):
         print("utente inesistente a livello dipendente")
 
       if u: #utente esiste
+
+        ### obbligo cambio password
+        ### se è previsto che l'utente a livello di sede cambi la password
+        ### al primo ingresso, qui vengono effettuati entrambi i check
+        
+        print('sede',u.sede.nome)
+        print('stato possibilita cambio password',u.sede.cambiopassword)
+        print('stato forzatura cambio password',u.sede.forzanuovapassword)
+
+        if u.sede.forzanuovapassword and u.primologin:
+          print("l'utente deve cambiare obbligatoriamente la password")
+          # la sede e' impostata per forza il cambio password al primo login e l'utente e' al primo login
+
+          # forzatura cambio password
+          data = dict()
+          data['HeaderTitle'] = getConfig('HeaderTitle')
+          data['utente'] = u
+          uuidres = str(uuid.uuid4())
+          print('uuid',uuidres)
+
+          ### comunicazioni ###
+          sm = ServizioMail(debug=True)
+          comunicazione = None
+          try:
+            comunicazione = Comunicazione.objects.get(pk=6)
+            print('comunicazione',comunicazione.id)
+          except Comunicazione.DoesNotExist as dne:
+            print("Record comunicazione inesistente",dne)
+
+          if comunicazione: 
+            sm.set_mailfrom=comunicazione.mittente
+            sm.add_to(u.mail)
+
+            sm.set_soggetto(comunicazione.soggetto)
+            sm.set_corpo(comunicazione.corpo)
+
+            sm_data = dict()
+            utente=dict() #adattamento campo utente
+            print(reverse('login:ResetPassword',args=[uuidres]))
+
+            utente['link'] = reverse('utente:forceUpdatePassword',args=[uuidres])
+            utente['nome'] = u.nome
+            utente['mail'] = u.mail
+            utente['sito'] = getConfig('DefaultSite')
+            utente['titolo'] = getConfig('HeaderTitle')
+            sm_data['utente'] = utente
+            sm.set_data(sm_data)
+            sm.send()
+            ### comunicazioni ###
+
+            ### salva uuid
+            u.uuid = uuidres
+            u.save()
+
+            return render(request,'forzaNuovaPasswordEnd.html',data)
+            # richiesta forzata cambio password - fine 
+
         if u.pin.strip()== pin:
           # password valida
           data = dict()
@@ -76,14 +133,6 @@ 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:
-            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')
@@ -98,6 +147,7 @@ def start(request):
 
         if a:
           print(a.id,a.login,a.pin,pin)
+
           if a.pin.strip()== pin:
             request.session['AdminId'] = a.id
             setLog(1,amministratore=a)
@@ -214,6 +264,7 @@ def RichiestaAggiornamentoPassword(request):
 
         ### salva uuid
         a.uuid = uuidres
+        a.lostpin = True
         a.save()
 
       return render(request,'updatePasswordEnd.html',{})

+ 17 - 2
utente/forms.py

@@ -13,6 +13,7 @@ class formUtente(forms.Form):
     self.fields['mail'] = forms.CharField(required=False)
     self.fields['CancellaUtente'] = forms.BooleanField(required=False)
     self.fields['pin'] = forms.CharField(required=True)
+    self.fields['primologin'] = forms.BooleanField(required=False)
 
 class formPinMail(forms.Form):
   def __init__(self,*args,**kwargs):
@@ -20,7 +21,7 @@ class formPinMail(forms.Form):
     self.fields['mail'] = forms.CharField(required=False)
     self.fields['pin'] = forms.CharField(required=True)
 
-class formUpdatePassword(forms.Form):
+class formUpdatePasswordPrimoLogin(forms.Form):
   def __init__(self,*args,**kwargs):
     forms.Form.__init__(self,*args,**kwargs)
     self.fields['cfisc'] = forms.CharField(required=True)
@@ -28,6 +29,21 @@ class formUpdatePassword(forms.Form):
     self.fields['pin0'] = forms.CharField(required=True)
     self.fields['pin1'] = forms.CharField(required=True)
     self.fields['pin2'] = forms.CharField(required=True)
+    self.fields['lostpin'] = forms.CharField(required=False)
+
+  def clean_pin1(self): 
+    print(dir(self))
+    # validazione password
+    if self.data['pin1'] != self.data['pin2']:
+      # password non corrispondente
+      raise forms.ValidationError("Le due password devono essere uguali")
+    if self.data['pin1'] == self.data['cfisc']:
+      # nome uguale a login
+      raise forms.ValidationError("La password non puo' essere uguale al login")
+    if len(self.data['pin1']) < int(getConfig('PasswordMin')):
+      # lunghezza minima della password
+      raise forms.ValidationError("Password troppo corta")
+    return self.data['pin1']
 
 class formUpdatePasswordLogin(forms.Form):
   def __init__(self,*args,**kwargs):
@@ -38,7 +54,6 @@ class formUpdatePasswordLogin(forms.Form):
     self.fields['pin2'] = forms.CharField(required=True)
 
   def clean_pin1(self):
-
     print(dir(self))
     # validazione password
     if self.data['pin1'] != self.data['pin2']:

+ 1 - 0
utente/models.py

@@ -19,6 +19,7 @@ class Utente(models.Model):
     pin = models.CharField(max_length=64,null=False,default="")
     encrypt=models.CharField(max_length=64,null=False,default="")
     uuid = models.CharField(max_length=32,null=False,default="")
+    lostpin = models.BooleanField(null=False,default=False)
     @property
     def documenti(self):
       return len(self.documento_set.all())

+ 4 - 3
utente/templates/utente.edit.password.login.html

@@ -23,9 +23,8 @@
       <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>
+     <input type='hidden'  class='form-control' id='uuid' name='uuid' value="{{ informazione.uuid.value }}" readonly>
+    <div>
     <div class='form-outline mb-3'>
      <label class='form-label' for='pin1'>password/pin</label>
      <input type='password'  class='form-control' id='pin1' name='pin1' value="{{ informazione.pin1.value }}">
@@ -44,6 +43,7 @@
   {% endblock %}
 
   {% block bottom %}
+  <div>
   <!-- errori -->
   <div class='form-container card p-3 bg-light'>
   {% if informazione.errors %}
@@ -51,4 +51,5 @@
   {% endif %}
   </div>
   <!-- fine zona errori -->
+  <div>
   {% endblock %}

+ 4 - 0
utente/templates/utente.edit.profile.html

@@ -51,6 +51,10 @@
       <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='primologin' id='primologin'>
+      <label class="form-check-label" for="primologin">Cambio Password primo accesso</label>
+    </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>

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

@@ -1,47 +0,0 @@
-<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 - 2
utente/urls.py

@@ -6,6 +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')
-  
+  path('updatePasswordFromLogin/<uuid:uuid>',views.updatePasswordFromLogin,name='updatePasswordFromLogin'),
+  path('forceUpdatePassword/<uuid:uuid>',views.forceUpdatePassword,name='forceUpdatePassword')  
   ]

+ 130 - 24
utente/views.py

@@ -116,6 +116,7 @@ def edit(request):
     utente = Utente()
     utente.pin = str(randint(100000,999999))
     utente.azienda = data['azienda']
+    utente.azienda.forzanuovapassword
   else:
     try:
       utente = Utente.objects.get(pk=data['UserEditId'])
@@ -152,6 +153,7 @@ def edit(request):
       utente.datanascita = fu.cleaned_data['datanascita']
       utente.mail = fu.cleaned_data['mail'].lower()
       utente.pin = fu.cleaned_data['pin']
+      utente.primologin = fu.cleaned_data['primologin']
       print('utente id',utente.id,utente.nome)
       setLog(7,utente=utente)
       utente.save()
@@ -185,6 +187,7 @@ def edit(request):
     tmp['luogonascita'] = utente.luogonascita
     tmp['mail'] = utente.mail
     tmp['pin'] = utente.pin
+    tmp['primologin'] = utente.primologin
     print("tmp su request non valida",tmp)
     data['utente'] = formUtente(tmp)
 
@@ -270,7 +273,8 @@ def updatePasswordFromLogin(request,uuid):
       cfisc = formupdatepasswordlogin.cleaned_data.get('cfisc')
       pin1 = formupdatepasswordlogin.cleaned_data.get('pin1')
       pin2 = formupdatepasswordlogin.cleaned_data.get('pin2')
-      print('stato',cfisc,pin1,pin2)
+      uuidl = formupdatepasswordlogin.cleaned_data.get('uuid')
+      print('stato',cfisc,pin1,pin2,uuidl)
 
       a = None
       d = None
@@ -292,35 +296,42 @@ def updatePasswordFromLogin(request,uuid):
             print('informazione non trovata tra i login amministratotore')
 
       print('record',a.id,a.nome,a.uuid,d)
+
       if d == 'u':
         print('utente',a.codicefiscale)
       if d == 'a':
         print('amministratore',a.login)
 
-      a.pin = pin1
-      a.uuid = ""
-      a.save()
+      if uuidl == a.uuid:
+        print('uuid corrisponde',uuidl,uuid)
+        a.pin = pin1
+        a.uuid = ""
+        a.lostpin = False
+        a.save()
 
-      ### comunicazioni ###
-      if len(a.mail) > 0:
-        comunicazione = None
-        try:
-          comunicazione = Comunicazione.objects.get(pk=5)
-        except Comunicazione.DoesNotExist as dne:
-          print('comunicazione non valida',dne)
-        if comunicazione:
-          sm = ServizioMail(debug=True)
-          sm.set_mailfrom=comunicazione.mittente
-          sm.add_to(a.mail)
-
-          sm.set_soggetto(comunicazione.soggetto)
-          sm.set_corpo(comunicazione.corpo)
-
-          sm_data = dict()
-          sm_data['utente'] = a
-          sm.set_data(sm_data)
-          sm.send()
-      ### comunicazioni ###
+        ### comunicazioni ###
+        if len(a.mail) > 0:
+          comunicazione = None
+          try:
+            comunicazione = Comunicazione.objects.get(pk=5)
+          except Comunicazione.DoesNotExist as dne:
+            print('comunicazione non valida',dne)
+          if comunicazione:
+            sm = ServizioMail(debug=True)
+            sm.set_mailfrom=comunicazione.mittente
+            sm.add_to(a.mail)
+
+            sm.set_soggetto(comunicazione.soggetto)
+            sm.set_corpo(comunicazione.corpo)
+
+            sm_data = dict()
+            sm_data['utente'] = a
+            sm.set_data(sm_data)
+            sm.send()
+          ### comunicazioni ###
+      else:
+        print('form non valida, errore uuid')
+        data['informazione'] = formUpdatePasswordLogin(request.POST)
 
       return HttpResponseRedirect(reverse("login:start"))
     else:
@@ -337,3 +348,98 @@ def updatePasswordFromLogin(request,uuid):
     print(data)
 
   return render(request,'utente.edit.password.login.html',data)
+
+def forceUpdatePassword(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':
+    print(request.POST)
+    formupdatepasswordlogin = formUpdatePasswordPrimoLogin(request.POST)
+    if formupdatepasswordlogin.is_valid():
+      cfisc = formupdatepasswordlogin.cleaned_data.get('cfisc')
+      pin0 = formupdatepasswordlogin.cleaned_data.get('pin0')
+      pin1 = formupdatepasswordlogin.cleaned_data.get('pin1')
+      pin2 = formupdatepasswordlogin.cleaned_data.get('pin2')
+      print('stato',cfisc,pin1,pin2)
+
+      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())
+            d = 'a'
+          except Amministratore.DoesNotExist as dne:
+            print('informazione non trovata tra i login amministratotore')
+
+      oldpwd = False
+      print('record',a.id,a.nome,a.uuid,d)
+      if d == 'u':
+        print('utente',a.codicefiscale)
+        if a.pin == pin0:
+          oldpwd = True
+          print('verificata la vecchia password')
+      if d == 'a':
+        print('amministratore',a.login)
+
+      if oldpwd:
+        print('password vecchia ok')
+        a.pin = pin1
+        a.uuid = ""
+        a.primologin = False
+        a.lostpassword = False
+        a.save()
+
+        ### comunicazioni ###
+        if len(a.mail) > 0:
+          comunicazione = None
+          try:
+            comunicazione = Comunicazione.objects.get(pk=5)
+          except Comunicazione.DoesNotExist as dne:
+            print('comunicazione non valida',dne)
+          if comunicazione:
+            sm = ServizioMail(debug=True)
+            sm.set_mailfrom=comunicazione.mittente
+            sm.add_to(a.mail)
+            sm.set_soggetto(comunicazione.soggetto)
+            sm.set_corpo(comunicazione.corpo)
+
+            sm_data = dict()
+            sm_data['utente'] = a
+            sm.set_data(sm_data)
+            sm.send()
+        ### comunicazioni ###
+        return HttpResponseRedirect(reverse("login:start"))
+      else:
+        print('form not valid nella validazione vecchia password',a.pin,pin0)
+        data['informazione'] = formUpdatePasswordPrimoLogin(request.POST)
+    else:
+      print('form not valid')
+      data['informazione'] = formUpdatePasswordPrimoLogin(request.POST)
+  else:
+    print('request non valida', request.POST)
+    tmp = dict()
+    tmp['cfisc'] = ""
+    tmp['uuid'] = uuid
+    tmp['pin0'] = ""
+    tmp['pin1'] = ""
+    tmp['pin2'] = ""
+    data['informazione'] = formUpdatePasswordPrimoLogin(tmp)
+    print(data)
+
+  return render(request,'utente.edit.password.primologin.html',data)