Pārlūkot izejas kodu

aggiunta:
ricerca negli utenti (codice fiscale e nome)
in caso di presenza di file EMO, viene settato automaticamente il flag
privato
nell'upload dei documenti, impostata anche la causale dell'eventuale
rifiuto

mauro 2 mēneši atpakaļ
vecāks
revīzija
76b9aea136

+ 24 - 4
documento/managefile.py

@@ -135,6 +135,22 @@ def upload_file_indice(uploaded_file):
 
   return stored_file
 
+# sposta directory sulla base del codicefiscale aggiornato
+def rename_dir(utente,old,new):
+  fl_path = os.path.join(settings.BASE_DIR,getConfig('DocPath'))
+
+  try:
+    print("posizione partitaiva codicefiscale",os.path.join(fl_path,utente.azienda.partitaiva,old))
+    os.rename(os.path.join(fl_path,utente.azienda.partitaiva,old),os.path.join(fl_path,utente.azienda.partitaiva,new))
+  except FileExistsError as fee:
+    print("posizione partitaiva codicefiscale old",os.path.join(fl_path,utente.azienda.partitaiva,old))
+    print("posizione partitaiva codicefiscale new",os.path.join(fl_path,utente.azienda.partitaiva,new),"esistente")
+    return False
+  except FileNotFoundError as fnfe:
+    print('non trovo la directory da rinominare')
+    return False
+  return True
+
 # il file caricato viene associato a un utente specifico 
 def associafile_a_utente(singolodocumento,request,utente,azienda=None,sede=None,descrizione=None,amministratore=None,pertutti=False):
 
@@ -155,19 +171,23 @@ def associafile_a_utente(singolodocumento,request,utente,azienda=None,sede=None,
   print('documento.documento',documento.documento)
   documento.storage = risultato
   documento.descrizione = descrizione
+  if 'emo_' in documento.documento.lower():
+    print("Individuato elemento emo_ in:", documento.documento)
+    documento.privato = True
   try:
     documento.save()
     setLog(8,azienda=azienda,sede=sede,utente=utente,documento=documento,amministratore=amministratore)
-    listaok = documento
+    listaok = {'n':documento.documento,'c':'documento assegnato regolarmente'}
     associato = True
 
   except IntegrityError as ie:
     print("problema di integrita', il file esiste",ie)
-    listanotok = documento
+    listanotok = {'n':documento.documento,'c':'documento esistente'}
 
   if not associato:
     print('documento da rimuovere di nuovo',associato)
-    listanotass = documento
+    listanotass = {'n':documento.documento,'c':'documento esistente'}
+
   return(listaok,listanotok,listanotass)
 
 ##################################################################################
@@ -192,7 +212,6 @@ def save_and_load_file_multiple(listadocumenti,request,utente,azienda=None,sede=
       lok = None
       nok = None
       las = None
-
       # si deve individuare il codice fiscale dell'utente
       if not pertutti:
         if ut.codicefiscale.strip() in singolodocumento.name:
@@ -208,6 +227,7 @@ def save_and_load_file_multiple(listadocumenti,request,utente,azienda=None,sede=
             lok,nok,las = associafile_a_utente(singolodocumento,request,ut,azienda,sede,descrizione,amministratore)
         else:
           print('il codice fiscale',ut.codicefiscale.strip()," non si trova in ",singolodocumento.name)
+          las = {'n':singolodocumento.name,'c':'non associabile - il codice fiscale non corrisponde'}
       else:
         print('associo documento SENZA riferimento a codice fiscale')
         lok,nok,las = associafile_a_utente(singolodocumento,request,ut,azienda,sede,descrizione,amministratore,pertutti)

+ 5 - 3
documento/templates/documento.stato.html

@@ -17,7 +17,7 @@
               <tbody>
                 {% for l in listaok %}
                   <tr>
-                    <td> {{ l.documento }} </td>
+                    <td> {{ l.documento }} - {{ l.n }} {{ l.c }}</td>
                   </tr>
                 {% endfor %}
               </tbody>
@@ -37,12 +37,14 @@
             <tbody>
               {% for l in listanotok %}
                 <tr>
-                  <td> {{ l.documento }} </td>
+    	  	  <td> {{ l.documento }} - {{ l.n }} {{ l.c }}</td>
                 </tr>
               {% endfor %}
             </tbody>
           </table>
+        {% endif %}
 
+        {% if listanotass %}  
           <div>Non sono stati caricati {{ listanotasslen }} documento/i</div>
           <table class='table table-striped table-hover'>
             <thead class='thead-dark'>
@@ -53,7 +55,7 @@
             <tbody>
               {% for l in listanotass %}
                 <tr>
-                  <td> {{ l.documento }} </td>
+			<td>{{ l.documento }} {{ l.n }} {{ l.c }}</td>
                 </tr>
               {% endfor %}
             </tbody>

+ 29 - 4
documento/templates/documento.welcome.upload.html

@@ -23,19 +23,21 @@
 	  <label for='pertutti' class='form-check-label'>Documento Privato (Visibile solo dal Dipendente).</label>
 	  <label for='pertutti' class='form-check-label'>Se il documento inizia per 'emo/EMO/Emo', questi viene reso privato comunque.</label>
 	</div>
+	{% comment %}
 	</br>
         <div class='form-check'>
           <input type='checkbox' class="form-check-input" name='pertutti' id='pertutti'>
           <label for='pertutti' class='form-check-label'>Documento in comune (un singolo documento a disposizione di tutti gli utenti della sede o dell'azienda sulla base della selezione).</label>
         </div>
+	{% endcomment %}
         <br>
    	<div class='form-check'>
 		<input type="checkbox" class="form-check-input" name="ignoraAzienda" id="ignoraAzienda" onclick="if (this.checked) { ignoraSede.checked= false;}">
-          <label for='ignoraAzienda' class="form-check-label">Ignora le aziende: cerca il codice fiscale ovunque.</label>
+          <label for='ignoraAzienda' class="form-check-label">Ignora le aziende: cerca il codice fiscale ovunque in tutte le aziende.</label>
 	</div>
 	<div class='form-check'>
 	  <input type="checkbox" class="form-check-input" name="ignoraSede" id="ignoraSede" onclick="if (this.checked) { ignoraAzienda.checked= false;}">
-          <label for='ignoraSede' class="form-check-label">Ignora le sedi: cerca il codice fiscale ovunque.</label>
+          <label for='ignoraSede' class="form-check-label">Ignora le sedi: cerca il codice fiscale ovunque all'interno dell'azienda.</label>
         </div>
         {% endif %}
         <br>
@@ -47,12 +49,35 @@
         <div><br></div>
 
   	<div class='form-group form-inline'>
-	  <input type='submit' class="btn btn-primary" name="CaricaDocumentoButton" value='Carica Nuovi Documenti'>
-          <button type='button' class='btn btn-primary' data-bs-toggle='modal' data-bs-target='#ConfirmDocumentDeleteModal'>Elimina Vecchi Documenti</button></td>
+          <button type='button' class='btn btn-primary btn-sm' data-bs-toggle='modal' data-bs-target='#ConfirmDocumentUploadModal' value=''>Conferma Caricamento</button>
 	 <input type='submit' class="btn btn-primary" name='indietro' value='Indietro'>
         </div>
+        <!-- Modal -->
+        <div class="modal fade" id="ConfirmDocumentUploadModal" tabindex="-1" role="dialog" aria-labelledby="ConfirmDocumentUploadLabel" aria-hidden="false">
+          <div class="modal-dialog" role="document">
+            <div class="modal-content">
+              <div class="modal-header">
+                <h5 class="modal-title" id="ConfirmUploadLabel">Conferma caricamento documenti?</h5>
+                  <span aria-hidden="false">&times;</span>
+                </button>
+              </div>
+              <div class="modal-body">
+	        Confermi il caricamento dei documenti indicati?<br>
+              </div>
+              <div class="modal-footer">
+                <button type="submit" name="CaricaDocumentoButton" value='CaricaDocumento' class="btn btn-primary">Conferma Caricamento Documenti</button>
+                <button type="button" class="btn btn-primary" data-bs-dismiss="modal">Chiudi</button>
+              </div>
+              </div>
+            </div>
+          </div>
+        </div>
+  <!-- end modal -->
+
       </form>
     </div>
   </div>
   <!-- fine barra tasti ritorno e utilita' -->
 </div>
+
+

+ 23 - 17
documento/views.py

@@ -245,11 +245,14 @@ def welcome(request,utente=None):
             data['listaok'] = listaok
             data['listnotok'] = listanotok
 
-          print('listaok',listaok)
+          print('doc listaok',listaok)
           data['listaoklen']=len(data['listaok'])
-          print('listanotok',listanotok)
+          print('doc listanotok',listanotok)
           data['listanotok'] = listanotok
           data['listanotoklen'] = len(data['listanotok'])
+          data['listanotass'] = listanotass
+          data['listanotasslen'] = len(data['listanotass'])
+
 
         if comunicazione:
           ### comunicazioni ###
@@ -262,23 +265,26 @@ def welcome(request,utente=None):
 
           for u in listaok: # piglia l'elenco dei nominativi dalla lista caricata correttamente 
             sm.set_mailfrom=comunicazione.mittente
-            sm.add_to(u.mail)
-
-            sm.set_soggetto(comunicazione.soggetto)
-            sm.set_corpo(comunicazione.corpo)
+            if len(u.utente.mail) > 0:
+              sm.add_to(u.utente.mail)
+  
+              sm.set_soggetto(comunicazione.soggetto)
+              sm.set_corpo(comunicazione.corpo)
 
-            sm_data = dict()
-            tmp_utente=dict() #adattamento campo utente
+              sm_data = dict()
+              tmp_utente=dict() #adattamento campo utente
 
-            tmp_utente['nome'] = u.nome
-            tmp_utente['mail'] = u.mail
-            tmp_utente['sito'] = getConfig('DefaultSite')
-            tmp_utente['titolo'] = getConfig('HeaderTitle')
-            sm_data['utente'] = tmp_utente
+              tmp_utente['nome'] = u.utente.nome
+              tmp_utente['mail'] = u.utente.mail
+              tmp_utente['sito'] = getConfig('DefaultSite')
+              tmp_utente['titolo'] = getConfig('HeaderTitle')
+              sm_data['utente'] = tmp_utente
 
-            sm.set_data(sm_data)
-            sm.send()
-            ### comunicazioni ###
+              sm.set_data(sm_data)
+              sm.send()
+              ### comunicazioni ###a
+            else:
+              print('impossibile inviare, mail non valida')
 
   ElencoDocumenti = list()
 
@@ -502,7 +508,7 @@ def azienda(request,utente=None):
     
   ### sequenza di ordinamento ####
   print('Sequenza di ordinamento - lettura tasti ')
-  print(request.POST)
+  print('richiesta ricevuta',request.POST)
 
   if request.method == "POST" and 'docUP' in request.POST:
     print('docUP')

+ 5 - 0
utente/forms.py

@@ -20,6 +20,11 @@ class formUtente(forms.Form):
     self.fields['sede'] = forms.IntegerField(required=False)
     self.fields['enabled'] = forms.BooleanField(required=False)
 
+class formCerca(forms.Form):
+  def __init__(self,*args,**kwargs):
+    forms.Form.__init__(self,*args,**kwargs)
+    self.fields['valoredacercare'] = forms.CharField(required=False)
+
 class formPinMail(forms.Form):
   def __init__(self,*args,**kwargs):
     forms.Form.__init__(self,*args,**kwargs)

+ 2 - 7
utente/templates/utente.edit.html

@@ -37,13 +37,8 @@
   <button type='button' class="btn btn-primary"         id="logger-tab" data-bs-toggle="tab" data-bs-target="#logger-pane" role="tab" aria-controls="logger-pane" aria-selected="true">attivita</button>
   <button type='button' class="btn btn-outline-primary" id="return-tab" data-bs-toggle="tab" data-bs-target="#return-pane" role="tab" aria-controls="return-pane" aria-selected="true"><a href="{% url 'utente:welcome' %}">Indietro</a></button>
 </div>
-<div class='text-danger'>
-  {% if mailnonvalida %}
-    <div class='text-center h5'>
-      <b>Attenzione, la mail non risulta inserita/corretta.</b>
-    </div>
-  {% endif %}
-</div>
+
+
 <!-- end nav tabs -->
 <div>&nbsp;</div>
 <!-- Tab panes -->

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

@@ -16,8 +16,6 @@
           <strong>{{ error|escape }}</strong>
       </div>
     {% endfor %}
-  {% else %}
-    Nessun Errore rilevato
   {% endif %}
   <!-- fine zona errori -->
 
@@ -26,7 +24,18 @@
     {% csrf_token %}
 
     <div class='form-group'>
-      <label for="codicefiscale">Codice Fiscale</label>
+      <label for="codicefiscale">Codice Fiscale
+        {% if codicefiscalenonvalido %}
+          <div class='text-danger'>
+            <b>Attenzione, codice fiscale non valido</b>
+          </div>
+        {% endif %}
+        {% if codicefiscaleesistente %}
+          <div class='text-danger'>
+		  <b>Attenzione, codice fiscale gia' presente in {{ codicefiscaleesistente}} - ripristino il vecchio</b>
+          </div>
+        {% endif %}
+      </label>
       <input type='text' class='form-control' name='codicefiscale' id='codicefiscale' value='{{ utente.codicefiscale.value }}' length="16" maxlength="16" required="required">
     </div>
     <div class='form-group'>
@@ -42,7 +51,13 @@
       <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>
+      <label for="mail" class="form-control-label">Email
+        {% if mailnonvalida %}
+          <div class='text-danger'>
+             <b>Attenzione, mail non valida o non presente</b>
+          </div>
+        {% endif %}
+      </label>
       <input type='mail' class='form-control' name='mail' id='mail' value='{{ utente.mail.value }}'>
     </div>
     <div class='form-group'>

+ 3 - 1
utente/templates/utente.welcome.html

@@ -15,7 +15,6 @@ function toggleCSV(source) {
     });
 {% endif %}
 
-
 </script>
 {% endblock %}
 
@@ -29,7 +28,10 @@ function toggleCSV(source) {
       <button type='submit' class="btn btn-primary" name='ScaricaCSVSelezionati' value="Scarica CSV Selezionati"/>Scarica CSV Selezionati</button>
 
     {% endif %}
+    <input type='text' class='form-inline' name='valoredacercare' id='valoredacercare' value='{{ formcerca.valoredacercare.value }}' >
+    <button type='submit' class="btn btn-primary" name="cerca" value="Cerca">Cerca</button>
     <button type='submit' class="btn btn-primary" name="indietro" value="Indietro">Indietro</button>
+
   </div>
   <div class='form-control'>
     Numero di dipendenti selezionati {{ numeroRecordAttuali }} su un totale di {{ numeroRecordAzienda }}.

+ 41 - 3
utente/views.py

@@ -19,6 +19,9 @@ import re
 import csv
 from io import StringIO
 
+from codicefiscale import codicefiscale
+from collections import Counter
+
 def OrdinaUtenti(rq=None,ou=None):
   tmp=None
   print("len(ou)",len(ou))
@@ -67,7 +70,10 @@ def welcome(request):
   else:
     data['AziendaId'] = request.session['AziendaId']
     data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])
+
+    # ottiene tutti gli utenti relativi all'azienda
     data['utenti'] = data['azienda'].utente_set.all().order_by('nome').filter(special=False)
+
     data['numeroRecordAzienda'] = len(data['utenti'])
 
   if 'AdminId' in request.session:
@@ -93,6 +99,7 @@ def welcome(request):
     data['UserId'] = request.session['UserId']
 
   data['utenti'] = OrdinaUtenti(request,data['utenti'])
+
   try:
     data['numeroRecordAttuali'] = len(data['utenti'])
   except TypeError as te:
@@ -138,6 +145,20 @@ def welcome(request):
         else:
           print('request non valida')
 
+      if 'cerca' in request.POST:
+        print('premuto tasto cerca')
+        formcerca = formCerca(request.POST)
+        if formcerca.is_valid():
+          valoredacercare = formcerca.cleaned_data.get('valoredacercare')
+        else:
+          print('form non valida')
+        print('richiesta da cercare',valoredacercare)
+        nome = data['utenti'].filter(nome__icontains=valoredacercare)
+        codicefiscale = data['utenti'].filter(codicefiscale__icontains=valoredacercare)
+        data['formcerca'] = formcerca 
+        data['utenti'] = dict(Counter(nome) + Counter(codicefiscale))
+        
+
       if 'MultipleCSVSelect' in request.POST:
         #validiamo i dati passati
         SelectResponse = formMultipleCheckBoxCSVDOC(request.POST,lista=data['utenti'])
@@ -308,6 +329,7 @@ def edit(request):
         return HttpResponseRedirect(reverse("utente:cancellautente")) 
 
       print('i dati sono grosso modo coerenti, salviamoli')
+      old_utente_codicefiscale = utente.codicefiscale
       utente.nome = fu.cleaned_data['nome'].title()
       utente.codicefiscale = fu.cleaned_data['codicefiscale'].upper()
       utente.luogonascita = fu.cleaned_data['luogonascita'].title()
@@ -328,17 +350,28 @@ def edit(request):
         print('sede non valida',tmp_sede)
       print('utente da registrare',utente.nome,utente.sede_id)
       setLog(7,utente=utente)
+
+      new_utente_codicefiscale = None
       try:
         utente.save()
-        print('utente: salvo record {}'.format(utente.codicefiscale))
-        return  HttpResponseRedirect(reverse("utente:welcome"))
+        print('utente, salvo record {}'.format(utente.codicefiscale))
+        new_utente_codicefiscale = utente.codicefiscale
+        print('new_utente.codicefiscale',new_utente_codicefiscale,old_utente_codicefiscale)
+        if new_utente_codicefiscale:
+          if new_utente_codicefiscale != old_utente_codicefiscale:
+            print('codice fiscale diverso:',old_utente_codicefiscale,new_utente_codicefiscale)
+            rename_dir(utente,old_utente_codicefiscale,new_utente_codicefiscale)
       except IntegrityError as ie:
         print('utente: errore utente presente: {}'.format(utente.codicefiscale))
         utenteIE = Utente.objects.get(codicefiscale=fu.cleaned_data['codicefiscale'])
         print(utenteIE.nome)
         data['IntegrityError']=utenteIE
+        utenteesistente = Utente.objects.get(codicefiscale=utente.codicefiscale)
+        data['codicefiscaleesistente'] = utenteesistente.azienda.nome
 
-    print('Form non valida')
+
+    print('Form non valida,altro ciclo')
+    utente = Utente.objects.get(pk=data['UserEditId'])
     tmp = dict()
     tmp['nome'] = utente.nome
     tmp['codicefiscale'] = utente.codicefiscale
@@ -437,6 +470,11 @@ def edit(request):
     print("Mail non valida")
     data['mailnonvalida']=True
 
+  #verifica bonta' codicefiscale
+  if not codicefiscale.is_valid(utente.codicefiscale):
+    print('codice fiscale tecnicamente non valido')
+    data['codicefiscalenonvalido'] = True
+
   return render(request,'utente.edit.html',data)
 
 def download(request):