managefile.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. from django.shortcuts import render
  2. from django.http import HttpResponse,HttpResponseRedirect,FileResponse
  3. from django.contrib.auth.models import User
  4. from django.urls import reverse
  5. from django.db import IntegrityError
  6. from .models import *
  7. from config.views import *
  8. from django.conf import settings
  9. from django.conf.urls.static import static
  10. from django.contrib.auth import authenticate
  11. import mimetypes
  12. from random import randint
  13. import csv
  14. import time
  15. import datetime
  16. #pip install python-codicefiscale
  17. from codicefiscale import codicefiscale
  18. import os
  19. def download_file(request,uid):
  20. u = Utenti.objects.get(pk=uid)
  21. fl_path = '/'.join((settings.MEDIA_ROOT,azienda.codicefiscale,))
  22. print('path completa','/'.join((fl_path,u.codicefiscale,u.storage)))
  23. if u.storage and os.path.isfile('/'.join((fl_path,codicefiscale,u.storage))):
  24. try:
  25. fl = open('/'.join((fl_path,codicefiscale,u.storage)), 'rb')
  26. except Exception as er:
  27. print('errore',er)
  28. data=dict()
  29. data['errore']="File non esistente o non ancora disponibile"
  30. data['utente'] = u
  31. return render(request,'welcome.error.html',data)
  32. else:
  33. print('il file non esiste')
  34. data=dict()
  35. data['errore']='File non esistente o non ancora disponibile'
  36. data['utente'] = u
  37. return render(request,'welcome.error.html',data)
  38. mime_type, _ = mimetypes.guess_type('/'.join((fl_path,codicefiscale,u.storage)))
  39. fl = '/'.join((fl_path,codicefiscale,u.storage))
  40. print('fl',fl,mime_type)
  41. response = FileResponse(open(fl,'rb'),content_type='application/pdf',as_attachment=False)
  42. #response['Content-Disposition'] = "attachment; filename=%s" % u.documento
  43. return response
  44. def upload_file(uploaded_file,utente,originale=False):
  45. stored_file = ''.join((str(time.time()),'.saved'))
  46. fl_path = settings.MEDIA_ROOT
  47. print('nome file',uploaded_file.name,stored_file)
  48. nomefile=None
  49. if originale:
  50. nomefile = uploaded_file.name
  51. else:
  52. nomefile = stored_file
  53. # vediamo se caricare o meno.
  54. # in questo caso, se il documento esiste gia', non lo carica.
  55. # come facciamo a stabilire se il documento esiste gia'?
  56. # fl_path = corrisponde a media.ROOT (che mi domando se non e' il caso di spostarlo nella configurazione)
  57. # azienda.partitaiva
  58. # utente.codicefiscale (prima era "record" e mi sono deciso a cambiarlo)
  59. try:
  60. os.mkdir('/'.join((fl_path,utente.azienda.partitaiva)))
  61. except FileExistsError as fee:
  62. print('/'.join((fl_path,utente,azienda.partitaiva)),"esistente")
  63. try:
  64. os.mkdir('/'.join((fl_path,utente.azienda.partitaiva,utente.codicefiscale)))
  65. except FileExistsError as fee:
  66. print('/'.join((fl_path,utente.azienda.partitaiva,utente.codicefiscale)),"esistente")
  67. with open('/'.join((fl_path,utente.azienda.partitaiva,utente.codicefiscale,nomefile)),'wb+') as d:
  68. for chunk in uploaded_file.chunks():
  69. d.write(chunk)
  70. if originale:
  71. return '/'.join((fl_path,utente.azienda.partitaiva.utente.codicefiscale,uploaded_file.name))
  72. return stored_file
  73. def save_and_load_file_multiple(listadocumenti,request,utente,azienda,descrizione):
  74. listaok = list()
  75. listanotok = list()
  76. for singolodocumento in listadocumenti:
  77. print('singolodocumento',singolodocumento)
  78. for ut in utente:
  79. if ut.codicefiscale.strip() in singolodocumento.name:
  80. print('match utente-documento')
  81. risultato = upload_file(singolodocumento,ut)
  82. documento = Documento()
  83. documento.dataupload = datetime.datetime.now()
  84. documento.utente = ut
  85. documento.azienda = azienda
  86. documento.documento = singolodocumento.name
  87. documento.storage = risultato
  88. documento.descrizione = descrizione
  89. try:
  90. documento.save()
  91. listaok.append(documento.documento)
  92. except IntegrityError as ie:
  93. print("problema di integrita', il file esiste",ie)
  94. listanotok.append(documento.documento)
  95. print(listaok,listanotok)
  96. return (listaok,listanotok)
  97. def save_and_load_file_single(listadocumenti,request,utente,azienda,descrizione):
  98. listaok = list()
  99. listanotok = list()
  100. for singolodocumento in listadocumenti:
  101. print('singolodocumento',singolodocumento,descrizione)
  102. risultato = upload_file(singolodocumento,utente)
  103. documento = Documento()
  104. documento.dataupload = datetime.datetime.now()
  105. documento.utente = utente
  106. documento.azienda = azienda
  107. documento.documento = singolodocumento.name
  108. documento.storage = risultato
  109. documento.descrizione = descrizione
  110. try:
  111. documento.save()
  112. listaok.append(documento.documento)
  113. except IntegritiError as ie:
  114. print("problema di integrita', il file esiste",ie)
  115. listanotok.append(documento.documento)
  116. return (listaok,listanotok)
  117. def save_and_load_file_indice(fileindice,request,documento):
  118. print('nome indice caricato',fileindice.name)
  119. upload_file(fileindice,request.FILES['indice'],True)
  120. fl_path = settings.MEDIA_ROOT
  121. risultato = None
  122. with open(''.join((fl_path,'/',fileindice.name)),'rb') as ind:
  123. risultato = ind.read()
  124. risultato = risultato.decode('utf-8',errors='replace')
  125. if isinstance(risultato,str):
  126. risultato = risultato.encode('utf8')
  127. with open(''.join((fl_path,'/',fileindice.name,'.cvtd')),'wb') as ind:
  128. ind.write(risultato)
  129. print('una volta convertito, passiamo oltre')
  130. with open(''.join((fl_path,'/',fileindice.name,'.cvtd')),'rt') as ind:
  131. spamreader = csv.reader(ind,delimiter=';')
  132. errori = list()
  133. count = 0
  134. for sr in spamreader:
  135. salvare = False
  136. count +=1
  137. if count==1: continue
  138. print(count,'sr',sr,len(sr))
  139. '''
  140. rispetto a farma, questo tracciato e' diverso
  141. 0: 0308 - BOX3 S.R.L.;
  142. 1: Elaborazioni - Lul Libro Unico del Lavoro lavoratore;
  143. 2: ALESSE ANTONIO - LSSNTN63A25H501Y;
  144. 3: DA0308_L.U.L._LAVORATORE_#_ALESSE_ANTONIO_#_LSSNTN63A25H501Y_#_06.2024_12.07.2024_10.18.43.pdf;
  145. 4: ="06.2024";
  146. 5: 12.07.2024 10:34:17;
  147. 6: Cliente;
  148. 7: 2024.07.15 11:40:33;
  149. 8: 12.07.2024;
  150. 9: 12.07.2024;
  151. '''
  152. if len(sr) > 1: # la lunghezza del record segnala qualcosa
  153. utente = None
  154. try:
  155. utente = Utente.objects.get(codicefiscale=sr[2].split(' - ')[1].strip().upper())
  156. except Utente.DoesNotExist as dne:
  157. print('Utente non trovato')
  158. utente = Utente()
  159. utente.azienda = azienda
  160. utente.nome = sr[2].capitalize()
  161. try:
  162. data_convertita = datetime.datetime.strptime(sr[8], "%d.%m.%Y")
  163. print('data convertita',data_convertita)
  164. utente.datanascita = data_convertita
  165. except ValueError as ve:
  166. print(ve)
  167. utente.codicefiscale = sr[2].split(' - ')[1].strip().upper()
  168. utente.password = str(randint(100000,999999))
  169. utente.save()
  170. # caricamento documenti
  171. if filecaricati.cleaned_data.get('allegati'):
  172. print('presenti documenti da allegare')
  173. listadocumenti = filecaricati.cleaned_data['allegati']
  174. print(listadocumenti)
  175. u = Utenti.objects.all()
  176. for singolodocumento in listadocumenti:
  177. print('singolodocumento',singolodocumento)
  178. for utente in u:
  179. if utente.codicefiscale.strip() in singolodocumento.name:
  180. print('match utente-documento')
  181. risultato = upload_file(singolodocumento,utente)
  182. # risultato: nome del file memorizzato (nome interno)
  183. # singolodocumento.name = nome del file originale