managefile.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. from django.shortcuts import render
  2. from django.http import HttpResponse,HttpResponseRedirect,FileResponse
  3. from django.urls import reverse
  4. from django.db import IntegrityError
  5. from .models import *
  6. from config.views import *
  7. from att.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. import zipfile
  17. #pip install python-codicefiscale
  18. from codicefiscale import codicefiscale
  19. import os
  20. # come sono gestiti i file nella configurazione:
  21. # MEDIA_ROOT=os.path.join(settings.BASE_DIR,'static/upload')
  22. # che diventa = os.path.join(settings.BASE_DIR,getConfig('DocPath'))
  23. # inoltre devo aver fatto qualche casino oggi 9.8.24 con i copia e incolla. ho dovuto rivedere tutto il file
  24. # il terrore si impossessa di me. sta storia del cvs non e' esattamente chiara
  25. def delete_file(documento):
  26. # questo blocco rimuove fisicamente il file prima della sua rimozione logica nel db
  27. file_path = os.path.join(settings.BASE_DIR,getConfig('DocPath'),documento.utente.azienda.partitaiva,documento.utente.codicefiscale,documento.storage)
  28. print('Path completa:',file_path)
  29. if os.path.isfile(file_path):
  30. print('rimozione fisica file:',file_path)
  31. try:
  32. os.remove(file_path)
  33. except OSError as ose:
  34. print('errore nella rimozione del file:',ose)
  35. def download_file(request,uid):
  36. utente = Utenti.objects.get(pk=uid)
  37. file_path = os.path.join(settings.BASE_DIR,getConfig('DocPath'),documento.utente.azienda.partitaiva,documento.utente.codicefiscale,utente.storage)
  38. print('Path completa da Basedir:',file_path)
  39. if utente.storage and os.path.isfile(file_path):
  40. try:
  41. fl = open(file_path, 'rb')
  42. except Exception as er:
  43. print('errore',er)
  44. data=dict()
  45. data['errore']="File non esistente o non ancora disponibile"
  46. data['utente'] = utente
  47. return render(request,'welcome.error.html',data)
  48. else:
  49. print('il file non esiste',file_path)
  50. data=dict()
  51. data['errore']='File non esistente o non ancora disponibile'
  52. data['utente'] = utente
  53. return render(request,'welcome.error.html',data)
  54. mime_type, _ = mimetypes.guess_type(file_path)
  55. print('file',file_path,mime_type)
  56. response = FileResponse(open(file_path,'rb'),content_type='application/pdf',as_attachment=False)
  57. #response['Content-Disposition'] = "attachment; filename=%s" % u.documento
  58. return response
  59. def upload_file(uploaded_file,utente,originale=False):
  60. '''
  61. caricamento files
  62. '''
  63. stored_file = ''.join((str(time.time()),'.saved'))
  64. fl_path = os.path.join(settings.BASE_DIR,getConfig('DocPath'))
  65. print('nome file',uploaded_file.name,stored_file)
  66. nomefile=None
  67. if originale:
  68. nomefile = uploaded_file.name
  69. else:
  70. nomefile = stored_file
  71. # vediamo se caricare o meno.
  72. # in questo caso, se il documento esiste gia', non lo carica.
  73. # come facciamo a stabilire se il documento esiste gia'?
  74. # fl_path = corrisponde a media.ROOT (che mi domando se non e' il caso di spostarlo nella configurazione)
  75. # azienda.partitaiva
  76. # utente.codicefiscale (prima era "record" e mi sono deciso a cambiarlo)
  77. try:
  78. print(os.path.join(fl_path,utente.azienda.partitaiva))
  79. os.mkdir(os.path.join(fl_path,utente.azienda.partitaiva))
  80. except FileExistsError as fee:
  81. print(os.path.join(fl_path,utente.azienda.partitaiva),"esistente")
  82. try:
  83. os.mkdir(os.path.join(fl_path,utente.azienda.partitaiva,utente.codicefiscale))
  84. except FileExistsError as fee:
  85. print(os.path.join(fl_path,utente.azienda.partitaiva,utente.codicefiscale),"esistente")
  86. with open(os.path.join(fl_path,utente.azienda.partitaiva,utente.codicefiscale,nomefile),'wb+') as d:
  87. for chunk in uploaded_file.chunks():
  88. d.write(chunk)
  89. if originale:
  90. return os.path.join(fl_path,utente.azienda.partitaiva,utente.codicefiscale,nomefile)
  91. return stored_file
  92. def upload_file_indice(uploaded_file):
  93. # caricamento file indice (gestito in modo diverso)
  94. stored_file = ''.join((str(time.time()),'.saved'))
  95. fl_path = os.path.join(settings.BASE_DIR,getConfig('DocPath'),getConfig('DocPathIndex'))
  96. print('nome file',uploaded_file.name,stored_file)
  97. # verifica l'esistenza della directory
  98. try:
  99. os.mkdir(fl_path)
  100. except FileExistsError as fee:
  101. print(fl_path,"esistente")
  102. print('file_memorizzato',os.path.join(fl_path,stored_file))
  103. with open(os.path.join(fl_path,stored_file),'wb+') as d:
  104. for chunk in uploaded_file.chunks():
  105. d.write(chunk)
  106. return stored_file
  107. def associafile_a_utente(singolodocumento,request,utente,azienda=None,sede=None,descrizione=None,amministratore=None,listaok=None,listanotok=None,pertutti=False):
  108. risultato = upload_file(singolodocumento,utente)
  109. documento = Documento()
  110. documento.dataupload = datetime.datetime.now()
  111. documento.utente = utente
  112. if pertutti:
  113. documento.documento = "".join((utente.codicefiscale.strip(),"_",singolodocumento.name))
  114. else:
  115. documento.documento = singolodocumento.name
  116. print('documento.documento',documento.documento)
  117. documento.storage = risultato
  118. documento.descrizione = descrizione
  119. try:
  120. documento.save()
  121. setLog(8,azienda=azienda,sede=sede,utente=utente,documento=documento,amministratore=amministratore)
  122. listaok.append(documento)
  123. except IntegrityError as ie:
  124. print("problema di integrita', il file esiste",ie)
  125. listanotok.append(documento)
  126. ##################################################################################
  127. # carica file multipli. Utilizzato prevalentemente dalla gestione documenti.
  128. def save_and_load_file_multiple(listadocumenti,request,utente,azienda=None,sede=None,descrizione=None,amministratore=None,pertutti=False,ignoraAzienda=False):
  129. listaok = list()
  130. listanotok = list()
  131. if azienda: print('Caricamento Multiplo,azienda',azienda.nome)
  132. if sede: print('Caricamento Multiplo,sede',sede.nome)
  133. if ignoraAzienda: print("Ignora le aziende",ignoraAzienda)
  134. for singolodocumento in listadocumenti:
  135. print('singolodocumento',singolodocumento)
  136. for ut in utente:
  137. if not pertutti:
  138. if ut.codicefiscale.strip() in singolodocumento.name:
  139. print('associa documento CON riferimento a codice fiscale')
  140. if ignoraAzienda:
  141. print("Effettua ricerca in tutte le aziende")
  142. associafile_a_utente(singolodocumento,request,ut,ut.azienda,sede,descrizione,amministratore,listaok,listanotok)
  143. else:
  144. print("Caricamento solo per l'azienda corrente")
  145. associafile_a_utente(singolodocumento,request,ut,azienda,sede,descrizione,amministratore,listaok,listanotok)
  146. else:
  147. print('il codice fiscale',ut.codicefiscale.strip()," non si trova in ",singolodocumento.name)
  148. else:
  149. print('associo documento SENZA riferimento a codice fiscale')
  150. associafile_a_utente(singolodocumento,request,ut,azienda,sede,descrizione,amministratore,listaok,listanotok,pertutti)
  151. print('liste',listaok,listanotok)
  152. return (listaok,listanotok)
  153. #carica un singolofile - utilizzato prevalentemente nella pagina utente
  154. def save_and_load_file_single(listadocumenti,request,utente,azienda=None,sede=None,descrizione=None,amministratore=None):
  155. listaok = list()
  156. listanotok = list()
  157. for singolodocumento in listadocumenti:
  158. print('singolodocumento',singolodocumento,descrizione)
  159. risultato = upload_file(singolodocumento,utente)
  160. documento = Documento()
  161. documento.dataupload = datetime.datetime.now()
  162. documento.utente = utente
  163. documento.documento = singolodocumento.name
  164. documento.storage = risultato
  165. documento.descrizione = descrizione
  166. try:
  167. documento.save()
  168. setLog(8,azienda=azienda,sede=sede,utente=utente,documento=documento,amministratore=amministratore)
  169. listaok.append(documento)
  170. except IntegrityError as ie:
  171. print("problema di integrita', il file esiste",ie)
  172. listanotok.append(documento)
  173. return (listaok,listanotok)
  174. #file_indice: contiene l'elenco dei nominativi da gestire.
  175. def save_and_load_file_indice(request,fileindice,azienda=None,sede=None):
  176. print('nome indice caricato',fileindice.name)
  177. if azienda: print('azienda',azienda.nome)
  178. if sede: print('sede',sede.nome)
  179. file_memorizzato = upload_file_indice(request.FILES['indice'])
  180. fl_path = os.path.join(getConfig('DocPath'),getConfig('DocPathIndex'))
  181. risultato = None
  182. with open(os.path.join(fl_path,file_memorizzato),'rb') as ind:
  183. risultato = ind.read()
  184. risultato = risultato.decode('utf-8',errors='replace')
  185. if isinstance(risultato,str):
  186. risultato = risultato.encode('utf8')
  187. with open(os.path.join(fl_path,''.join((file_memorizzato,'.cvtd'))),'wb') as ind:
  188. ind.write(risultato)
  189. print('una volta convertito, passiamo oltre')
  190. with open(os.path.join(fl_path,''.join((file_memorizzato,'.cvtd'))),'rt') as ind:
  191. spamreader = csv.reader(ind,delimiter=';')
  192. errori = list()
  193. count = 0
  194. for sr in spamreader:
  195. salvare = False
  196. count +=1
  197. if count==1: continue
  198. print(count,'sr',sr,len(sr))
  199. if len(sr) >= 1: # la lunghezza del record segnala qualcosa
  200. print('lunghezza ok',sr[0])
  201. utente = None
  202. print('codice fiscale',sr[1].strip().upper())
  203. try:
  204. utente = Utente.objects.get(codicefiscale=sr[1].strip().upper())
  205. except Utente.DoesNotExist as dne:
  206. print('Utente non trovato')
  207. utente = Utente()
  208. if azienda: utente.azienda = azienda
  209. if sede: utente.sede = sede
  210. utente.nome = sr[0].strip().title()
  211. utente.codicefiscale=sr[1].strip().upper()
  212. for fmt in ('%d/%m/%y','%d/%m/%Y','%d-%m-%y','%d-%m-%Y'):
  213. try:
  214. data_convertita = datetime.datetime.strptime(sr[2],fmt)
  215. print('data convertita',data_convertita)
  216. utente.datanascita = data_convertita
  217. except ValueError as ve:
  218. print('errore con la data di nascita',ve)
  219. utente.luogonascita = sr[3].title()
  220. utente.mail = sr[4].strip().lower()
  221. # ricerca sede: se il codice estratto nella colonna corrisponde...
  222. tmp_sede = sr[5]
  223. lista_sede = azienda.sede_set.all()
  224. for ls in lista_sede:
  225. if tmp_sede == ls.identificativo:
  226. utente.sede = ls
  227. utente.cabiopassword = ls.cambiopassword
  228. utente.forzanuovapassword = ls.forzanuovapassword
  229. utente.otppassword = ls.otppassword
  230. else:
  231. utente.cabiopassword = azienda.cambiopassword
  232. utente.forzanuovapassword = azienda.forzanuovapassword
  233. utente.otppassword = azienda.otppassword
  234. utente.inserimento = datetime.datetime.today().strftime("%Y-%m-%d")
  235. utente.pin = str(randint(100000,999999))
  236. utente.save()
  237. def PrepareZipFile(listafile=[]):
  238. zip_path = os.path.join(settings.BASE_DIR,getConfig('DocZipFile'))
  239. print("zip_path:",zip_path)
  240. # verifica l'esistenza della directory
  241. try:
  242. os.mkdir(zip_path)
  243. except FileExistsError as fee:
  244. print(zip_path,"esistente")
  245. filename = ''.join((str(time.time()),'.zip'))
  246. with zipfile.ZipFile(os.path.join(zip_path,filename),'w') as zip:
  247. for lf in listafile:
  248. d = Documento.objects.get(pk=lf)
  249. file2zip = os.path.join(settings.BASE_DIR,getConfig('DocPath'),d.utente.azienda.partitaiva,d.utente.codicefiscale,d.storage)
  250. zip.write(file2zip,arcname=d.documento)
  251. print('path completa',file2zip)
  252. print('file completo',os.path.join(zip_path,filename))
  253. return (zip_path,filename)