ソースを参照

attivato meccanismo documenti azienda

mauro 6 ヶ月 前
コミット
7330a1b4db

+ 3 - 0
azienda/templates/azienda.welcome.html

@@ -12,6 +12,9 @@
       {% if 'DOCUMENTO' in permesso %}
       <button type='submit' class="btn btn-primary" name="documenti" value='{{ azienda.id }}'>Documenti</button>
       {% endif %}
+      {% if 'AZIENDA.DOCUMENTO' in permesso %}
+      <button type='submit' class="btn btn-primary" name="azienda.documenti" value='{{ azienda.id }}'>Documenti Aziendali</button>
+      {% endif %}
       {% if 'ATTIVITA' in permesso %}
       {% if listaAttivitaxAzienda %}
         <button type 'submit' class='btn btn-primary' name="xx" value='{{ azienda.id }}'>Attività proprie</button>

+ 7 - 0
azienda/views.py

@@ -167,6 +167,13 @@ def welcome(request):
       print('premuto tasto documenti')
       return HttpResponseRedirect(reverse('documento:welcome'))
 
+    if 'azienda.documenti' in request.POST:
+      # stato premuto tasto documenti aziendali
+      print('premuto tasto azienda.documenti')
+      u = data['azienda'].utente_set.get(special=True)
+      print('**** utente',u,u.id)
+      return HttpResponseRedirect(reverse('documento:azienda',args=[u.id,]))
+
     if "attivita" in request.POST:
       print('premuto tasto attivita')
       print("azienda:",data['azienda'])

+ 106 - 0
documento/templates/documento.azienda.html

@@ -0,0 +1,106 @@
+{% extends "base.html" %}
+
+{% block headersupplement %}
+<script language="JavaScript">
+function toggle(source) {
+  checkboxes = document.getElementsByName('select');
+  for(var i=0, n=checkboxes.length;i<n;i++) {
+    checkboxes[i].checked = source.checked;
+  }
+}
+</script>
+{% endblock %}
+
+{% block body %}
+<!-- Nav tabs -->
+<div class="button-group" role="tablist">
+  <button class="btn btn-primary active" id="documento-tab" data-bs-toggle="tab" data-bs-target="#documento-pane" type="button" role="tab" aria-controls="documento-pane" aria-selected="true">Documento</button>
+  {% if 'AZIENDA.DOCUMENTO.CREA' in permesso %}
+  <button class="btn btn-primary" id="upload-tab" data-bs-toggle="tab" data-bs-target="#upload-pane" type="button" role="tab" aria-controls="upload-pane" aria-selected="true">Upload</button>
+  {% endif %}
+  {% if 'AZIENDA.DOCUMENTO.EDIT' in permesso %}
+  <button class="btn btn-primary" id="delete-tab" data-bs-toggle="tab" data-bs-target="#delete-pane" type="button" role="tab" aria-controls="delete-pane" aria-selected="true">Cancella Vecchi</button>
+  {% endif %}
+  <button class="btn btn-outline-primary" id="return-tab" data-bs-toggle="tab" data-bs-target="#return-pane" type="button" role="tab" aria-controls="return-pane" aria-selected="true"><a href="{% url 'azienda:welcome' %}">Indietro</a></button>
+</div>
+<!-- end nav tabs -->
+
+<div>&nbsp;</div>
+<!-- Tab panes -->
+<div class="tab-content" id='mycontent'>
+  {% include 'documento.welcome.documento.html' %}
+  {% include 'documento.welcome.upload.html' %}
+</div>
+
+  <!-- Modal -->
+<div class="modal fade" id="ConfirmDocumentDeleteModal" tabindex="-1" role="dialog" aria-labelledby="ConfirmDocumentDeleteLabel{{ document.id }}" aria-hidden="true">
+         <div class="modal-dialog" role="document">
+           <div class="modal-content">
+             <form name='ConfirmDeleteModal' method='POST'>
+               {% csrf_token %}
+               <div class="modal-header">
+                <h5 class="modal-title" id="ConfirmDeleteLabel">Conferma Cancellazione?</h5>
+                  <span aria-hidden="true">&times;</span>
+                </button>
+               </div>
+               <div class="modal-body">
+               Confermi la cancellazione dei vecchi documenti?<br>
+               La cancellazione è definitiva,immediata e non recuperabile
+               <label for='limite'>Documenti più vecchi di:&nbsp;</label>
+               <input type='text' name='limite' id='limite' value='{{ eol }}' maxlenght='4' size='4'>
+               <label for='limite'>giorni.</label>
+               </div>
+               <div class="modal-footer">
+                 <button type="submit" name="DeleteOldDocuments" value='{{ documento.id }}' class="btn btn-primary">Elimina Vecchi Documenti</button>
+                 <button type="button" class="btn btn-primary" data-bs-dismiss="modal">Chiudi</button>
+               </div>
+             </form>
+           </div>
+         </div>
+       </div>
+</div>
+  <!-- end modal -->
+{% endblock %}
+
+{% block bodybottom %}
+  {% if listaok %}
+    <div>Sono stati caricati {{ listaoklen }} documento/i</div>
+    <table class='table table-striped table-hover'>
+      <thead class='thead-dark'>
+        <tr>
+          <th scope='col'>Documento caricato con successo</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for l in listaok %}
+        <tr>
+          <td> {{ l.documento }} </td>
+        </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+    </div>
+  {% endif %}
+
+  <div><br></div>
+
+  {% if listanotok %}
+    <div>Sono stati rifiutati {{ listanotoklen }} documento/i</div>
+    <table class='table table-striped table-hover'>
+      <thead class='thead-dark'>
+        <tr>
+          <th scope='col'>Documento non caricato perche già presente</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for l in listanotok %}
+        <tr>
+          <td> {{ l.documento }} </td>
+        </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+    </div>
+  {% endif %}
+{% endblock %}
+

+ 1 - 0
documento/urls.py

@@ -5,6 +5,7 @@ app_name='documento'
 urlpatterns = [
   path('welcome',views.welcome,name='welcome'),
   path('welcome/<int:utente>',views.welcome,name='welcome'),
+  path('azienda/<int:utente>',views.azienda,name='azienda'),
   path('finalize/<int:did>',views.finalize_download,name='finalize'),
   path('finalize/<int:did>/<int:uid>',views.finalize_download,name='finalize'),
   ]

+ 328 - 0
documento/views.py

@@ -24,6 +24,8 @@ def welcome(request,utente=None):
 /  vengono mostrati tutti i documenti presenti
   '''
 
+  print('** ** **',uu,'** ** **')
+
   if not 'AdminId' in request.session or 'UserId' in request.session:
     print("Non rilevo presensa UserId e AdminId in request.session")
     return HttpResponseRedirect(reverse("login:start"))
@@ -326,6 +328,332 @@ def welcome(request,utente=None):
 
   return render(request,'documento.welcome.html',data)
 
+
+def azienda(request,utente=None):
+  uu = utente
+  '''
+  punto di ingresso.
+/  vengono mostrati tutti i documenti presenti
+  '''
+
+  print('** ** **',uu,'** ** **')
+
+  '''
+  un piccolo controllo: non mi piace l'idea di passare un parametro via url perche' potrebbe venir alterato.
+  pero', aggiungendo una piccola verifica, potremo fregare l'eventuale furbetto
+  '''
+
+  #prendiamo l'azienda
+  test = Utente.objects.get(pk=uu)
+  az = test.azienda
+  # tiriamo fuori l'utente speciale aziendale
+  check = az.utente_set.get(special=True)
+  if uu != check.id:
+    print('cazzo, ci hai provato! Non corrisponde')
+    return HttpResponseRedirect(reverse("login:start"))
+
+  if not 'AdminId' in request.session or 'UserId' in request.session:
+    print("Non rilevo presensa UserId e AdminId in request.session")
+    return HttpResponseRedirect(reverse("login:start"))
+
+  data = dict()
+  data['HeaderTitle'] = getConfig('HeaderTitle')
+
+  if not 'AziendaId' in request.session:
+    print('manca azienda')
+    return HttpResponseRedirect(reverse("login:start"))
+
+  azienda = None
+  data['AziendaId'] = request.session['AziendaId']
+  AziendaId = request.session['AziendaId']
+  print('AziendaId',AziendaId)
+  azienda = Azienda.objects.get(pk=AziendaId)
+  data['azienda'] = azienda
+
+  data['AdminId'] = request.session['AdminId']
+  admin = Amministratore.objects.get(pk=data['AdminId'])
+  data['admin'] = admin
+  print('admin',admin.id,admin.nome)
+
+  sede = None
+  if 'SedeId' in request.session:
+    SedeId = request.session['SedeId']
+    print('SedeId',SedeId)
+    try:
+      sede = Sede.objects.get(pk=SedeId)
+    except Sede.DoesNotExist as dne:
+      print("sede non esistente")
+    data['sede'] = sede
+  
+  if 'UserId' in request.session:
+    data['UserId'] = request.session['UserId']
+
+  data['azienda'] = Azienda.objects.get(pk=data['AziendaId'])
+  data['utenti'] = data['azienda'].utente_set.all()
+
+  #filtro:
+  # selezionare tutti gli utenti per AziendaId
+  admin = Amministratore.objects.get(pk=data['AdminId'])
+  data['admin'] = admin 
+
+  azienda = Azienda.objects.get(pk=data['AziendaId'])
+  data['azienda'] = azienda
+
+  utenti = Utente.objects.filter(azienda = azienda)  
+  data['utenti'] = utenti
+
+  eol = getConfig('DocEol')
+  data['eol'] = eol
+
+  ElencoDocumenti = list()
+
+  if utente: #visualizza i documenti per l'utente
+    ElencoDocumenti = Documento.objects.filter(utente=utente).order_by("utente__nome","documento") 
+  elif sede:
+    tmpUtenti = sede.utente_set.all()
+    for t in tmpUtenti:
+      d = t.documento_set.all()
+      for id in d:
+        ElencoDocumenti.append(id)
+  else:
+    tmpUtenti = azienda.utente_set.all()
+    for t in tmpUtenti:
+      d = t.documento_set.all()
+      for id in d:
+        ElencoDocumenti.append(id)
+
+  # lettura permessi - da rivedere!
+  print('inizio sequenza permessi')
+  ### permessi inizio ###
+  data['permesso'] = getAMP(admin)[0]
+  print('permesso generale:',data['permesso'])
+  print("CAZZO CAZZO CAZZO e di nuovo cazzo cazzo")
+
+  #####
+  # filtro temporaneo, non mostra i documenti che iniziano per EMO
+  #####
+  tmp = list()
+  if not "DOCUMENTO.MOSTRA.PRIVATO" in data['permesso']:
+    for ed in ElencoDocumenti:
+       if "emo_" not in ed.documento.lower():
+         tmp.append(ed)
+  else:
+    tmp = ElencoDocumenti     
+    
+  print('ElencoDocumenti/tmp',len(ElencoDocumenti),len(tmp))
+    
+  ### sequenza di ordinamento ####
+  print('Sequenza di ordinamento - lettura tasti ')
+  print(request.POST)
+  if request.method == "POST" and 'uteUP' in request.POST:
+    print('uteUP')
+    request.session['docOrder'] = 'uteUP'
+    
+  if request.method == "POST" and 'uteDW' in request.POST:
+    print('uteDW')
+    request.session['docOrder'] = 'uteDW'
+    
+  if request.method == "POST" and 'docUP' in request.POST:
+    print('docUP')
+    request.session['docOrder'] = 'docUP'
+        
+  if request.method == "POST" and 'docDW' in request.POST:
+    print('docDW')
+    request.session['docOrder'] = 'docDW'
+
+  if request.method == "POST" and 'seUP' in request.POST:
+    print('seUP')
+    request.session['docOrder'] = 'seUP'
+        
+  if request.method == "POST" and 'seDW' in request.POST:
+    print('seDW')
+    request.session['docOrder'] = 'seDW'
+
+  if request.method == "POST" and 'carUP' in request.POST:
+    print('carUP')
+    request.session['docOrder'] = 'carUP'
+        
+  if request.method == "POST" and 'carDW' in request.POST:
+    print('carDW')
+    request.session['docOrder'] = 'carDW'
+
+  print('Fine Sequenza di ordinamento - lettura tasti')
+
+  res = None
+  if 'docOrder' in request.session and 'uteDW' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.utente.nome,reverse=False)
+  if 'docOrder' in request.session and 'uteUP' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.utente.nome,reverse=True)
+  if 'docOrder' in request.session and 'docDW' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.documento ,reverse=False)
+  if 'docOrder' in request.session and 'docUP' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.documento,reverse=True)
+  if 'docOrder' in request.session and 'seDW' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.utente.sede.nome ,reverse=False)
+  if 'docOrder' in request.session and 'seUP' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.utente.sede.nome,reverse=True)
+  if 'docOrder' in request.session and 'carDW' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.dataupload ,reverse=False)
+  if 'docOrder' in request.session and 'carUP' in request.session.get('docOrder'):
+    res = sorted(tmp, key = lambda x: x.dataupload,reverse=True)
+
+  if not res:
+    data['ElencoDocumenti'] = tmp     
+  else:
+    data['ElencoDocumenti'] = res 
+
+  if 'AziendaId' in data:
+    print('livello azienda',getAZP(data['AziendaId'],admin)[0])
+    for t in getAZP(data['AziendaId'],admin)[0]:
+      if t not in data['permesso']:
+        data['permesso'].append(t)
+        
+    if 'sede' in data:
+      print('livello sede',getSEP(data['sede'],admin))
+      for t in getSEP(data['sede'],admin):
+        if t not in data['permesso']:
+          data['permesso'].append(t)
+    print('Stato permessi:',data['permesso'])
+         ### permessi fine ###
+
+  if request.method == 'POST':
+    if 'indietro' in request.POST:
+      print("AziendaId",request.session['AziendaId'])
+      print("AdminId",request.session['AdminId'])
+      return HttpResponseRedirect(reverse("azienda:welcome"))
+
+    if 'ScaricaSelezionati' in request.POST:
+      print('Premuto tasto Scarica Selezionati')
+      if 'select' in request.POST:
+        SelectResponse = formMultipleCheckBox(request.POST)
+        SelectResponse.c(data['ElencoDocumenti'])
+        print("SelectResponse",SelectResponse)
+
+        if SelectResponse.is_valid():
+          select = SelectResponse.cleaned_data.get('select')
+          print('select',select,type(select))
+          (pathzipfile,filePreparato) = PrepareZipFile(select)
+          # scarica il file
+          response = None
+          with open(os.path.join(pathzipfile,filePreparato),'rb') as f:
+            response =  HttpResponse(f.read(),content_type='application/zip')
+            response['Content-Disposition'] = 'attachment; filename={}'.format(filePreparato)
+          os.unlink(os.path.join(pathzipfile,filePreparato))
+          return response
+
+    if 'DeleteOldDocuments' in request.POST:
+      print('Richiesta di eliminazione vecchi documenti')
+      dods = DeleteOldDocuments(request.POST)
+      if dods.is_valid():
+        print('dods',dods.cleaned_data)
+        print('effettuata scelta di cancellazione vecchi documenti')
+        # costuire una lista dei documenti più vecchi
+        limite = int(request.POST['limite'])
+        print('limite',limite)
+        d = datetime.now()
+        r = d - timedelta(days=limite)
+        print(r)
+        oldDocs = Documento.objects.filter(azienda=azienda)
+        oldDocs1 = oldDocs.filter(dataupload__lt=r)
+        print('lista documenti',len(oldDocs1))
+        for i in oldDocs1:
+          print('documento',i.documento)
+          delete_file(i)
+          i.delete()
+
+    if 'DeleteDocument' in request.POST and request.POST.get('DeleteDocument'):
+      print('Richiesta cancellazione Documento',request.POST)
+      documento = request.POST['DeleteDocument']  # perche' lo considera una lista e non un singolo valore?
+      print('richiesta cancellazione documento:',documento)
+      try:
+        d = Documento.objects.get(pk=documento)
+        delete_file(d)  #rimozione fisica del documento 
+        d.delete()
+      except Documento.DoesNotExist as dne:
+        print('il documento non esiste')
+
+    if "CaricaDocumentoButton" in request.POST:
+      print("Premuto CaricaDocumentoButton")
+      filecaricati = AdminUpload(request.POST,request.FILES)
+      if filecaricati.is_valid():
+        pertutti = filecaricati.cleaned_data.get('pertutti')
+
+        print('stato -pertutti-',pertutti," ",filecaricati.cleaned_data.get('pertutti'))
+        #pertutti: il documento viene messo a disposizione a tutti gli utenti, non rientra nel filtro x utente, ma solo nel filtro x azienda
+     
+        print('record filecaricati validi')
+
+        comunicazione = filecaricati.cleaned_data.get('comunicazione')
+        ignoraAzienda = filecaricati.cleaned_data.get('ignoraAzienda')
+        ignoraSede = filecaricati.cleaned_data.get('ignoraSede')
+
+        if 'allegati' in filecaricati.cleaned_data and filecaricati.cleaned_data.get('allegati'):
+          print('presenti documenti da allegare')
+          listadocumenti = filecaricati.cleaned_data.get('allegati')
+          descrizione = filecaricati.cleaned_data.get('descrizione')
+          print(listadocumenti)
+          print("azienda interessata",azienda.id,azienda.nome)
+    
+          if not utente:
+            # effettua una scelta nel caso venga indicata di caricare il documento ignorando azienda e sede e cercando il codice fiscale ovunque
+            if ignoraAzienda:
+              # ignoraAzienda: cerca ovunque, in tutte le aziende
+              listaok,listanotok = save_and_load_file_multiple(listadocumenti,request,Utente.objects.filter(special=False),azienda,sede,descrizione,admin.nome,pertutti,ignoraAzienda=ignoraAzienda)
+              # e non va bene: dovrebbe cercare in tutte le aziende autorizzate per quell'amministratore
+            elif ignoraSede:
+              # ignora sede: cerca in tutta l'azienda ignorando le sedi (sempre che ci siano)
+              listaok,listanotok = save_and_load_file_multiple(listadocumenti,request,azienda.utente_set.filter(special=False),azienda,sede,descrizione,admin.nome,pertutti,ignoraAzienda=ignoraAzienda)
+            else:
+              # carica solo per l'utente.
+              listaok,listanotok = save_and_load_file_multiple(listadocumenti,request,utenti,azienda,sede,descrizione,admin.nome,pertutti,ignoraAzienda=ignoraAzienda)
+            data['listaok'] = listaok
+            data['listanotok'] = listanotok
+          else:
+            # questa scelta vale nel singolo utente.
+            u = Utente.objects.get(pk=uu)
+            listaok,listanotok = save_and_load_file_single(listadocumenti,request,u,data['azienda'],data['sede'],filecaricati.cleaned_data['descrizione'],data['admin'])
+            data['listaok'] = listaok
+            data['listnotok'] = listanotok
+
+          print('listaok',listaok)
+          data['listaoklen']=len(data['listaok'])
+          print('listanotok',listanotok)
+          data['listanotok'] = listanotok
+          data['listanotoklen'] = len(data['listanotok'])
+
+        if comunicazione:
+          ### comunicazioni ###
+          sm = ServizioMail(debug=True)
+
+          try:
+            comunicazione = Comunicazione.objects.get(pk=7)
+          except Comunicazione.DoesNotExist as dne:
+            print("Record comunicazione inesistente",dne)
+
+          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)
+
+            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
+
+            sm.set_data(sm_data)
+            sm.send()
+            ### comunicazioni ###
+
+  print("Numero documenti associati",len(ElencoDocumenti),len(data['ElencoDocumenti']))
+
+  return render(request,'documento.azienda.html',data)
+
 def finalize_download(request,did,uid=None):
   '''
   viene comunicato l'utente

ファイルの差分が大きいため隠しています
+ 0 - 1
sicurezza/fixtures/permesso.json


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません