2
0

views.py 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140
  1. from django.shortcuts import render
  2. from django.core.mail import send_mail
  3. from django.core.mail import SafeMIMEText
  4. from configurazione.views import getConfigurazione
  5. from django.core.mail import EmailMultiAlternatives
  6. from django.template.loader import get_template
  7. from django.template import Context
  8. from django.template import engines, TemplateSyntaxError
  9. from datetime import date,datetime
  10. from uuid import uuid4,UUID
  11. import json
  12. from mqtt import views as m
  13. from mqtt.views import mqtt
  14. #from domini.views import Aggiorna_Dominio_Da_Causale
  15. from .models import *
  16. import re
  17. from django.db.models import Sum
  18. from .templatetags.commtags import *
  19. class ServizioMail:
  20. def __init__(self,debug=False):
  21. self._from_ = getConfigurazione('mail_from')
  22. self._to_ = []
  23. self._to = {}
  24. self.debug = debug
  25. self.soggetto = ""
  26. self.corpo_testo = ""
  27. self.corpo_html = ""
  28. self.set_data()
  29. self.json = None
  30. def template_from_string(self,template_string, using=None):
  31. """
  32. Convert a string into a template object,
  33. using a given template engine or using the default backends
  34. from settings.TEMPLATES if no engine was specified.
  35. """
  36. # This function is based on django.template.loader.get_template,
  37. # but uses Engine.from_string instead of Engine.get_template.
  38. chain = []
  39. engine_list = engines.all() if using is None else [engines[using]]
  40. for engine in engine_list:
  41. try:
  42. return engine.from_string(template_string)
  43. except TemplateSyntaxError as e:
  44. chain.append(e)
  45. raise TemplateSyntaxError(template_string, chain=chain)
  46. def set_listadestinatari(self,lista=[]):
  47. self._to_ = []
  48. self.add_listadestinatari(lista)
  49. if self.debug: print('lista destinatari',self._to_)
  50. def set_rcptto(self,lista=[]):
  51. self.set_listadestinatari(lista)
  52. def add_listadestinatari(self,mail=None):
  53. if self.debug: print('type mail:',type(mail))
  54. if mail:
  55. if type(mail) == list:
  56. for i in mail:
  57. self._to_.append(i)
  58. return
  59. self._to_.append((mail))
  60. if self.debug: print('lista destinatari',self._to_)
  61. def add_to(self,mail=None):
  62. self.add_listadestinatari(mail)
  63. def set_soggetto(self,soggetto=""):
  64. self.soggetto = soggetto
  65. def set_oggetto(self,oggetto="",html=False):
  66. self.oggetto = oggetto
  67. if self.debug: print('set_oggetto html:',html)
  68. self.html = html
  69. def set_data(self,data={}):
  70. self.data = data
  71. #print('data',self.data)
  72. def set_json(self,data={}):
  73. self.json = json.dumps(data)
  74. if self.debug: print('json:',self.json)
  75. def send(self):
  76. # normalizza i destinatari (uno solo, non ripetuti)
  77. if self.debug: print('self._to_',self._to_)
  78. for i in self._to_:
  79. self._to[i] = i
  80. self._to_complete = [ x for x in self._to.values() ]
  81. if self.debug: print("destinatari:",self._to_complete)
  82. #rendering del soggetto
  83. soggetto = self.template_from_string(self.soggetto)
  84. soggetto_render = soggetto.render(self.data)
  85. if self.debug: print("soggetto",soggetto)
  86. oggetto = self.template_from_string(self.oggetto)
  87. oggetto_render = None
  88. try:
  89. oggetto_render = oggetto.render(self.data)
  90. except TemplateSyntaxError as tse:
  91. print('Errore nel Template')
  92. print(tse)
  93. if oggetto_render:
  94. if self.debug: print('oggetto render',oggetto_render)
  95. for tt in self._to_complete:
  96. ttl = [tt,]
  97. msg = None
  98. if self.debug: print('richiesta html::',self.html)
  99. if self.html:
  100. msg=EmailMultiAlternatives(soggetto_render, oggetto_render, self._from_, ttl)
  101. msg.attach_alternative(oggetto_render, "text/html")
  102. else: msg=EmailMultiAlternatives(soggetto_render, oggetto_render, self._from_, ttl)
  103. if self.json:
  104. msg.attach_alternative(self.json,'text/json')
  105. msg.send()
  106. def send_mail(self):
  107. '''
  108. wrapper per aggiornare il nome della funzione che spedisce le mail
  109. '''
  110. print('Sto usando ancora send_mail')
  111. self.send()
  112. def ListaDatabaseXDominio(request,dominio=0):
  113. '''
  114. questa funzione consente di avere a video l'elenco dei database, la loro versione suddiviso per dominio
  115. '''
  116. value = dict()
  117. database = SqlDatabase.objects.all().order_by('dominio__nome')
  118. print('database presenti',len(database))
  119. value['database'] = database
  120. return render(request,"Lista.Database.html",value)
  121. def ControlloScadenzeRegistrar(request,demo=0,dominio=0):
  122. '''
  123. questa funzione effettua la scansione dei domini per verificare che non ci siano scadenze imminenti.
  124. il flag: demo se 1 non effettua l'invio
  125. dovrebbero venir inviate le seguenti mail:
  126. scadenza in arrivo: al destinatario
  127. lista prossime scadenze notificate all'amministrazione e al server
  128. demo = 1: nessuna operazione
  129. demo = 0: modalita' demo, non invia le email
  130. dominio = 0: operazioni normali
  131. dominio = id: predispone invio mail per il dominio <id>
  132. causale = 0: operazioni normali
  133. causale = id: invia email con la causale <id>
  134. '''
  135. if demo==1: demo=True
  136. else: demo=False
  137. listalog=[]
  138. listalog.append(("demo: ",demo))
  139. domini = None
  140. if dominio:
  141. # richiesta di singolo dominio.
  142. try:
  143. domini = Domini.objects.all().filter(id=dominio)
  144. listalog.append(("dominio richiesto:",domini[0].nome))
  145. except Domini.DoesNotExists as dne:
  146. print('dominio non trovato')
  147. domini = None
  148. if not domini:
  149. # estrae tutti i domini ordinati per scadenza contratto
  150. domini = Domini.objects.all().filter(enabled=True).order_by('date_expire_contract')
  151. listadomini=[]
  152. for d in domini:
  153. if d.registrar.registrazione: # la gestione del registrar e' nostra.
  154. #l'avviso viene avviato quando viene raggiunto il limite di registrazione indicato
  155. #smette di essere inviato dopo x giorni successivi alla scadenza
  156. print("sc contratto: ",d.nome)
  157. if int((d.date_expire_registrar - date.today()).days) < int(getConfigurazione('registrar-giorni-preavviso')) and int((d.date_expire_registrar - date.today()).days) > -int(getConfigurazione('registrar-giorni-posticipati')):
  158. print("sc contratto: ",d.nome,d.date_expire_registrar,(d.date_expire_registrar - date.today()).days)
  159. # verifica eventuali causali gia' registrate e presenti
  160. listadomini.append(d)
  161. listalog.append(('scadenza registrazione',d.nome,d.date_expire_registrar,(d.date_expire_registrar - date.today()).days))
  162. data={}
  163. data['demo']=demo
  164. data['domini']=listadomini
  165. print('domini',listadomini)
  166. for i in data['domini']:
  167. print(i.registrar.nome)
  168. # invia la mail
  169. for i in listadomini:
  170. sm = ServizioMail()
  171. print('dominio in corso di comunicazione',i.nome)
  172. # servono alcune cose:
  173. #1: template
  174. idtemplate = getConfigurazione('template-registrar-in-scadenza')
  175. template = Template.objects.get(pk=idtemplate)
  176. #2: lista dei destinatari a cui mandare l'avviso
  177. #3: lista da inviare in amministrazione
  178. print(template.nome)
  179. listadestinatari=[]
  180. listadestinatari.append(getConfigurazione('mail_notification'))
  181. dictdict={}
  182. dictdict['domini'] = i.__dict__
  183. dictdict['dominio'] = i
  184. dictdict['registrar'] = i.registrar.nome
  185. dictdict['registrar.id'] = i.registrar
  186. dictdict['totaledomini'] = len(listadomini)
  187. print(dictdict)
  188. #nota ... la funzione dict, non mantiene gli agganci alle altre cartele tramite chiave
  189. sm.set_rcptto(listadestinatari)
  190. sm.set_soggetto(template.soggetto)
  191. sm.set_oggetto(template.oggetto)
  192. sm.set_data(dictdict)
  193. if not demo: sm.send_mail()
  194. # ignoro la verifica dei contatti, tanto stiamo andando solo con la voce nel dominio
  195. return render(request,"Controllo.Scadenze.Registrar.html",data)
  196. def ControlloScadenzeContratto(request,demo=0,dominio=None,causale=None):
  197. '''
  198. questa funzione effettua la scansione dei domini per verificare che non ci siano scadenze imminenti.
  199. il flag: demo se 1 non effettua l'invio
  200. dovrebbero venir inviate le seguenti mail:
  201. scadenza in arrivo: al destinatario
  202. lista prossime scadenze notificate all'amministrazione e al server
  203. demo = 1: nessuna operazione
  204. demo = 0: modalita' demo, non invia le email
  205. dominio = 0: operazioni normali
  206. dominio = id: predispone invio mail per il dominio <id>
  207. causale = 0: operazioni normali
  208. causale = id: invia email con la causale <id>
  209. '''
  210. if demo==1: demo=True
  211. else: demo=False
  212. listalog=[]
  213. listalog.append(("demo: ",demo))
  214. domini = None
  215. if dominio:
  216. # richiesta di singolo dominio.
  217. try:
  218. domini = Domini.objects.all().filter(id=dominio)
  219. listalog.append(("dominio richiesto:",domini[0].nome))
  220. except Domini.DoesNotExists as dne:
  221. print('dominio non trovato')
  222. domini = None
  223. if not domini:
  224. # estrae tutti i domini ordinati per scadenza contratto
  225. domini = Domini.objects.all().filter(enabled=True).order_by('nome')
  226. # estrae l'elenco delle causali
  227. causaleFlag=False
  228. causali = None
  229. if causale:
  230. print('causale richiesta:',causale)
  231. listalog.append(('causale richiesta:',causale))
  232. causali = Causale.objects.filter(id=causale)
  233. else:
  234. causali=Causale.objects.all()
  235. listadomini=[]
  236. for d in domini:
  237. for c in causali:
  238. if c.enabled: #se la causale e' abilitata
  239. if c.renew_request: #riguarda proprio la scadenza del contratto
  240. print("sc contratto: ",d.nome,c.nome,d.date_expire_contract,(d.date_expire_contract - date.today()).days,c.valore)
  241. listalog.append(("scadenza: ",d.nome,c.nome,d.date_expire_contract,(d.date_expire_contract - date.today()).days,c.valore))
  242. if int((d.date_expire_contract - date.today()).days) == int(c.valore): #raggiunta di avviso raggiunta
  243. print("sc contratto trovata: ",d.nome,c.nome,d.date_expire_contract,(d.date_expire_contract - date.today()).days,c.valore)
  244. listalog.append(("scadenza trovata: ",d.nome,c.nome,d.date_expire_contract,(d.date_expire_contract - date.today()).days,c.valore))
  245. # verifica eventuali causali gia' registrate e presenti
  246. try:
  247. print('ordine:',c.id,c.nome,c.ordine,"ultima causale",d.last_causale.id,d.last_causale.nome,d.last_causale.ordine)
  248. listalog.append(("Causale trovata",c.id,c.nome,c.ordine,"ultima causale",d.last_causale.id,d.last_causale.nome,d.last_causale.ordine))
  249. except Domini.last_causale.RelatedObjectDoesNotExist as rodne:
  250. print("errore:",rodne)
  251. listalog.append(("Errore:",rodne))
  252. d.last_causale_id = getConfigurazione('causale:default')
  253. print('d.last_causale_id',d.last_causale_id,d.last_causale.nome)
  254. listalog.append(('d.last_causale_id',d.last_causale_id,d.last_causale.nome))
  255. d.save()
  256. try:
  257. # se la posizione da richiedere e' piu' alta di quella precedentemente inviata:
  258. # correzione del 06/09/21a
  259. print("ordine causale trovata",c.ordine,"ultima causale assegnata",d.last_causale.ordine)
  260. if c.ordine > d.last_causale.ordine:
  261. print('ordine confermato: ',c.ordine,d.last_causale.ordine,d.last_causale.nome)
  262. listalog.append(('ordine confermato: ',c.ordine,d.last_causale.ordine,d.last_causale.nome))
  263. d.last_causale = c
  264. listadomini.append(d)
  265. else:
  266. print('ordine NON confermato: ',c.ordine,d.last_causale.ordine,d.last_causale.nome)
  267. listalog.append(('ordine NON confermato: ',c.ordine,d.last_causale.ordine,d.last_causale.nome))
  268. except Causale.DoesNotExist as dne:
  269. print('ordine forzato: ',c.ordine,d.last_causale.ordine)
  270. listalog.append(('ordine forzato: ',c.ordine,d.last_causale.ordine))
  271. d.last_causale = c
  272. listadomini.append(d)
  273. if not d.renew_code:
  274. d.renew_code = uuid4()
  275. if d.rinnovo_automatico:
  276. c = Causale.objects.get(pk=getConfigurazione('Rinnovo:Automatico'))
  277. print("Causale:",c.nome)
  278. #Aggiorna_Dominio_Da_Causale(d,c,sm=ServizioMail())
  279. if not demo:
  280. d.save()
  281. else:
  282. print("Non salvo - modalita' demo")
  283. listalog.append(("Non salvo - modalità demo"))
  284. data={}
  285. #if demo:
  286. # data['data']=True
  287. data['demo']=demo
  288. data['totaledomini'] = len(domini)
  289. data['domini']=listadomini
  290. print('domini',listadomini,len(listadomini))
  291. listalog.append(('domini',listadomini,len(listadomini)))
  292. # invia la mail ai destinatari
  293. for i in listadomini:
  294. sm = ServizioMail()
  295. print('dominio in corso di comunicazione',i.nome)
  296. # servono alcune cose:
  297. #1: template
  298. template = i.last_causale.template
  299. #2: lista dei destinatari a cui mandare l'avviso
  300. #3: lista da inviare in amministrazione
  301. print(template.nome)
  302. listadestinatari=[]
  303. print(i.contatti)
  304. PresenteContattoDestinatari=False
  305. if len(i.contatti)>0:
  306. PresenteContattoDestinatari=True
  307. tmpdestinatari = re.split(',| ',i.contatti)
  308. for td in tmpdestinatari:
  309. # dovremmo validare ogni elemento
  310. listadestinatari.append(td)
  311. print("mail to ",td)
  312. listalog.append(("mail to ",td))
  313. listadestinatari.append(i.last_causale.from_email)
  314. dictdict={}
  315. dictdict['dominio'] = i.__dict__
  316. dictdict['causale'] = i.last_causale.__dict__
  317. dictdict['totaledomini'] = len(listadomini)
  318. if not demo: dictdict['uuid'] = i.renew_code
  319. else: dictdict['uuid'] = uuid4()
  320. if not demo: dictdict['renew_code'] = i.renew_code
  321. else: dictdict['renew_code'] = uuid4()
  322. print('!!presenza flag PresenteContattoDestinatari:',PresenteContattoDestinatari)
  323. listalog.append(('!!presenza flag PresenteContattoDestinatari:',PresenteContattoDestinatari))
  324. if PresenteContattoDestinatari:
  325. dictdict['PresenteContattoDestinatari']=True
  326. sm.set_rcptto(listadestinatari)
  327. sm.set_soggetto(template.soggetto)
  328. sm.set_oggetto(template.oggetto)
  329. sm.set_data(dictdict)
  330. if not demo:
  331. sm.send()
  332. #************************************
  333. # invia la mail alla contabilita'
  334. lista_destinatari = []
  335. if i.last_causale.send_email_account:
  336. if len(i.last_causale.to_account):
  337. tmplista = re.split(',| ',i.last_causale.to_account)
  338. for t in tmplista:
  339. listadestinatari.append(t)
  340. accountdft = getConfigurazione('mail:accounting')
  341. if accountdft and len(accountdft):
  342. accountdft = re.split(',| ',accountdft)
  343. for t in accountdft:
  344. listadestinatari.append(t)
  345. co = getConfigurazione("mail:accounting:domain:expire")
  346. template = None
  347. flag = False
  348. try:
  349. template = Template.objects.get(pk=co)
  350. flag = True
  351. except Template.DoesNotExists as dne:
  352. print('template errato',co)
  353. listalog.append(('template errato',co))
  354. sm.set_rcptto(listadestinatari)
  355. sm.set_soggetto(template.soggetto)
  356. sm.set_oggetto(template.oggetto)
  357. sm.set_data(dictdict)
  358. if flag and not demo:
  359. sm.send()
  360. else:
  361. print("Modalita' Demo, non spedisco")
  362. listalog.append("Modalita' demo, nessuna spedizione")
  363. # ignoro la verifica dei contatti, tanto stiamo andando solo con la voce nel dominio
  364. if not demo:
  365. data['listalog'] = listalog
  366. return render(request,"Controllo.Scadenze.Contratto.html",data)
  367. def ControlloScadenzaDefinitiva(request,demo=0,dominio=None):
  368. '''
  369. questa funzione effettua la scansione dei domini per verificare che non ci siano scadenze imminenti.
  370. il flag: demo se 1 non effettua l'invio
  371. dovrebbero venir inviate le seguenti mail:
  372. scadenza in arrivo: al destinatario
  373. lista prossime scadenze notificate all'amministrazione e al server
  374. demo = 1: nessuna operazione
  375. demo = 0: modalita' demo, non invia le email
  376. dominio = 0: operazioni normali
  377. dominio = id: predispone invio mail per il dominio <id>
  378. causale = 0: operazioni normali
  379. causale = id: invia email con la causale <id>
  380. '''
  381. domini = Domini.objects.all().filter(enabled=True).order_by('date_expire_contract')
  382. if dominio:
  383. print('dominio richiesto:',dominio)
  384. domini = Domini.objects.filter(id=dominio).filter(enabled=True).order_by('date_expire_contract')
  385. print('dominio trovato:',domini)
  386. causali = Causale.objects.get(pk=getConfigurazione('dominio-scaduto'))
  387. print('causale trovata:',causali)
  388. listadomini=[]
  389. for d in domini:
  390. if causali.enabled: #se la causale e' abilitata
  391. if causali.domain_expired: #riguarda proprio la scadenza del contratt
  392. print('scaduto',d.nome,int((d.date_expire_contract - date.today()).days),int(causali.valore))
  393. # se oggi - data_scadenza (25-20> 3...) allora e' scaduto.
  394. if int((date.today() - d.date_expire_contract).days) > int(causali.valore): #raggiunta di avviso raggiunta
  395. print("scadenze raggiunte: ",d.nome,causali.nome,d.date_expire_contract,(d.date_expire_contract - date.today()).days,causali.valore)
  396. # verifica eventuali causali gia' registrate e presenti
  397. d.last_causale = causali
  398. print('assegnata causale:',d.last_causale.nome)
  399. d.enabled = False
  400. d.save()
  401. listadomini.append(d)
  402. data={}
  403. data['domini']=listadomini
  404. print('domini',listadomini)
  405. # invia la mail
  406. sm = ServizioMail()
  407. for i in listadomini:
  408. print(i.nome)
  409. # servono alcune cose:
  410. #1: template
  411. template = causali.template
  412. #2: lista dei destinatari a cui mandare l'avviso
  413. #3: lista da inviare in amministrazione
  414. print(template.nome)
  415. listadestinatari=[]
  416. print(i.contatti)
  417. PresenteContattoDestinatari=False
  418. #if len(i.contatti)>0:
  419. # PresenteContattoDestinatari=True
  420. # tmpdestinatari = re.split(',| ',i.contatti)
  421. # for d in tmpdestinatari:
  422. # # dovremmo validare ogni elemento
  423. # listadestinatari.append(d)
  424. # print("mail to ",d)
  425. listadestinatari.append(causali.from_email)
  426. dictdict={}
  427. dictdict['dominio'] = i.__dict__
  428. dictdict['causale'] = causali.__dict__
  429. dictdict['data'] = date.today()
  430. print('!!presenza flag PresenteContattoDestinatari:',PresenteContattoDestinatari)
  431. if PresenteContattoDestinatari: dictdict['PresenteContattoDestinatari']=True
  432. sm.set_rcptto(listadestinatari)
  433. sm.set_soggetto(template.soggetto)
  434. sm.set_oggetto(template.oggetto)
  435. sm.set_data(dictdict)
  436. if demo==1:
  437. sm.mail()
  438. return render(request,"Controllo.Scadenze.html",data)
  439. def ControlloScadenzaVicina(request,demo=0,dominio=None):
  440. '''
  441. questa funzione ha il solo scopo di comunicare periodicamente le scadenze vicine (il range puo' essere desunto dalla configurazione)
  442. il flag: demo se 1 non effettua l'invio
  443. '''
  444. if demo==1: demo=True
  445. else: demo=False
  446. domini_scadenza_contract = Domini.objects.all().filter(enabled=True).order_by('date_expire_contract')
  447. domini_scadenza_registrar = Domini.objects.all().filter(enabled=True).order_by('date_expire_registrar')
  448. if dominio:
  449. print('dominio richiesto:',dominio)
  450. domini = Domini.objects.filter(id=dominio).filter(enabled=True).order_by('date_expire_contract')
  451. domini_scadenza_contract = Domini.objects.filter(id=dominio).filter(enabled=True).order_by('date_expire_contract')
  452. domini_scadenza_registrar = Domini.objects.filter(id=dominio).filter(enabled=True).order_by('date_expire_registrar')
  453. print('domini la cui registrazione e in scadenza:',domini_scadenza_registrar)
  454. print('domini il cui contratto e in scadenza: ',domini_scadenza_contract)
  455. limiteAvviso = int(getConfigurazione("scadenza:limite:avviso"))
  456. listascadenzaregistrar = []
  457. listascadenzacontract = []
  458. for d in domini_scadenza_registrar:
  459. if int((d.date_expire_registrar - date.today()).days) < limiteAvviso:
  460. print(int((d.date_expire_registrar - date.today()).days))
  461. listascadenzaregistrar.append(d)
  462. for d in domini_scadenza_contract:
  463. if int((d.date_expire_contract - date.today()).days) < limiteAvviso:
  464. print(int((d.date_expire_contract - date.today()).days))
  465. listascadenzacontract.append(d)
  466. data={}
  467. data['limiteAvviso'] = limiteAvviso
  468. data['listascadenzaregistrar'] = listascadenzaregistrar
  469. data['listascadenzacontract'] = listascadenzacontract
  470. # invia la mail
  471. sm = ServizioMail()
  472. print(dir(sm))
  473. template = Template.objects.get(pk=getConfigurazione("scadenza:limite:template"))
  474. listadestinatari = []
  475. listadestinatari.append(getConfigurazione("mail:notifica"))
  476. dictdict={}
  477. dictdict['listascadenzaregistrar'] = listascadenzaregistrar
  478. dictdict['listascadenzacontract'] = listascadenzacontract
  479. dictdict['data'] = date.today()
  480. dictdict['limiteavviso'] = limiteAvviso
  481. print(template.soggetto)
  482. print(template.oggetto)
  483. sm.set_rcptto(listadestinatari)
  484. sm.set_soggetto(template.soggetto)
  485. sm.set_oggetto(template.oggetto)
  486. sm.set_data(dictdict)
  487. if not demo:
  488. sm.send()
  489. return render(request,"Controllo.Vicino.html",data)
  490. def ConfermaScadenza(request,uuid=None):
  491. # primo step, verifichiamo uuid
  492. print("uuid =",uuid)
  493. print(type(uuid))
  494. dom = Domini.objects.all().filter(enabled=True)
  495. for d in dom:
  496. print("compare:",uuid,d.renew_code)
  497. if d.renew_code and uuid == UUID(d.renew_code):
  498. print(d.nome,uuid)
  499. '''
  500. passaggi da fare:
  501. chiedere conferma
  502. dare conferma al cliente della registrazione
  503. avvisare l'amministrazione
  504. aggiornare il db
  505. '''
  506. value = {}
  507. value['dominio'] = d
  508. if request.method == 'POST':
  509. invia_risposta = False
  510. causale = None
  511. if "Renew" in request.POST:
  512. rinnova = request.POST.get('Renew')
  513. print('dominio da rinnovare',rinnova)
  514. d = Domini.objects.get(pk=rinnova)
  515. if d:
  516. # carica causale di autorizzato al rinnovo
  517. causale = Causale.objects.get(pk=getConfigurazione("causale:rinnovo_autorizzato"))
  518. print("causale: ",causale.nome)
  519. d.last_causale = causale
  520. d.renew_code = None
  521. d.save()
  522. invia_risposta = True
  523. value['risposta'] = True
  524. if "Loose" in request.POST:
  525. perdi = request.POST.get('Loose')
  526. print('dominio da NON rinnovare',perdi)
  527. d = Domini.objects.get(pk=perdi)
  528. if d:
  529. # carica causale di autorizzato al rinnovo
  530. causale = Causale.objects.get(pk=getConfigurazione("causale:rinnovo_non_autorizzato"))
  531. print("causale: ",causale.nome)
  532. d.last_causale = causale
  533. d.renew_code = None
  534. d.save()
  535. invia_risposta = True
  536. value['risposta']=False
  537. if invia_risposta:
  538. sm = ServizioMail()
  539. listadestinatari=[]
  540. print(d.contatti)
  541. if len(d.contatti)>0:
  542. tmpdestinatari = re.split(',| ',d.contatti)
  543. for t in tmpdestinatari:
  544. # dovremmo validare ogni elemento
  545. listadestinatari.append(t)
  546. print("email to: ",t)
  547. listadestinatari.append(causale.from_email)
  548. dictdict={}
  549. dictdict['dominio'] = d.__dict__
  550. dictdict['causale'] = causale.__dict__
  551. dictdict['data'] = date.today()
  552. sm.set_rcptto(listadestinatari)
  553. sm.set_soggetto(causale.template.soggetto)
  554. sm.set_oggetto(causale.template.oggetto)
  555. sm.set_data(dictdict)
  556. sm.send()
  557. if causale.send_email_account:
  558. ac = getConfigurazione("mail:accounting")
  559. sm.set_rcptto([ac,])
  560. te = getConfigurazione("mail:accounting_template")
  561. template = Template.objects.get(pk=te)
  562. sm.set_soggetto(template.soggetto)
  563. sm.set_oggetto(template.oggetto)
  564. sm.set_data(dictdict)
  565. sm.send()
  566. value['causale'] = causale
  567. print("value:",value)
  568. return render(request,"conferma.scelta.rinnovo.html",value)
  569. return render(request,'richiesta.conferma.html',value)
  570. return render(request,"notfound.html")
  571. def ConfermaScadenza(request,uuid=None):
  572. # primo step, verifichiamo uuid
  573. print("uuid =",uuid)
  574. print(type(uuid))
  575. dom = Domini.objects.all().filter(enabled=True)
  576. for d in dom:
  577. print("compare:",uuid,d.renew_code)
  578. if d.renew_code and uuid == UUID(d.renew_code):
  579. print(d.nome,uuid)
  580. '''
  581. passaggi da fare:
  582. chiedere conferma
  583. dare conferma al cliente della registrazione
  584. avvisare l'amministrazione
  585. aggiornare il db
  586. '''
  587. value = {}
  588. value['dominio'] = d
  589. if request.method == 'POST':
  590. invia_risposta = False
  591. causale = None
  592. if "Renew" in request.POST:
  593. rinnova = request.POST.get('Renew')
  594. print('dominio da rinnovare',rinnova)
  595. d = Domini.objects.get(pk=rinnova)
  596. if d:
  597. # carica causale di autorizzato al rinnovo
  598. causale = Causale.objects.get(pk=getConfigurazione("causale:rinnovo_autorizzato"))
  599. print("causale: ",causale.nome)
  600. d.last_causale = causale
  601. d.renew_code = None
  602. d.save()
  603. invia_risposta = True
  604. value['risposta'] = True
  605. if "Loose" in request.POST:
  606. perdi = request.POST.get('Loose')
  607. print('dominio da NON rinnovare',perdi)
  608. d = Domini.objects.get(pk=perdi)
  609. if d:
  610. # carica causale di autorizzato al rinnovo
  611. causale = Causale.objects.get(pk=getConfigurazione("causale:rinnovo_non_autorizzato"))
  612. print("causale: ",causale.nome)
  613. d.last_causale = causale
  614. d.renew_code = None
  615. d.save()
  616. invia_risposta = True
  617. value['risposta']=False
  618. if invia_risposta:
  619. sm = ServizioMail()
  620. listadestinatari=[]
  621. print(d.contatti)
  622. if len(d.contatti)>0:
  623. tmpdestinatari = re.split(',| ',d.contatti)
  624. for t in tmpdestinatari:
  625. # dovremmo validare ogni elemento
  626. listadestinatari.append(t)
  627. print("email to: ",t)
  628. listadestinatari.append(causale.from_email)
  629. dictdict={}
  630. dictdict['dominio'] = d.__dict__
  631. dictdict['causale'] = causale.__dict__
  632. dictdict['data'] = date.today()
  633. sm.set_rcptto(listadestinatari)
  634. sm.set_soggetto(causale.template.soggetto)
  635. sm.set_oggetto(causale.template.oggetto)
  636. sm.set_data(dictdict)
  637. sm.send()
  638. if causale.send_email_account:
  639. ac = getConfigurazione("mail:accounting")
  640. ac = re.split(' |,',ac)
  641. sm.set_rcptto(ac)
  642. te = getConfigurazione("mail:accounting_template")
  643. template = Template.objects.get(pk=te)
  644. sm.set_soggetto(template.soggetto)
  645. sm.set_oggetto(template.oggetto)
  646. sm.set_data(dictdict)
  647. sm.send()
  648. value['causale'] = causale
  649. print("value:",value)
  650. return render(request,"conferma.scelta.rinnovo.html",value)
  651. return render(request,'richiesta.conferma.html',value)
  652. return render(request,"notfound.html")
  653. # misurazioni e occupazioni
  654. def CheckQuotaMail(request,dominio=None,mail=None,quota=None):
  655. value = {}
  656. if dominio:
  657. d = Domini.objecs.filter(nome=dominio.lower())
  658. if len(d) == 1:
  659. d = d[0]
  660. if mail:
  661. print(mail)
  662. u = User.objects.filter(nome=d).filter(mail=mail.lower(),tobedeleted=False)
  663. if len(u) == 1:
  664. print('len',len(u))
  665. u = u[0]
  666. print('Trovato',d.nome,u.id,int(quota))
  667. u.mail_quota = int(quota)
  668. u.save()
  669. result = d.user_set.all().aggregate(Sum('mail_quota'))
  670. if not d.mail_quota:
  671. d.mail_quota = 0
  672. d.last_mail_quota = d.mail_quota
  673. d.date_mail_quota = date.today()
  674. d.last_mail_check = True
  675. if result['mail_quota__sum']:
  676. d.mail_quota = result['mail_quota__sum']
  677. #else:
  678. # d.mail_quota = 0
  679. d.last_mail_quota_check = True
  680. print('Quota mail',d.mail_quota)
  681. d.save()
  682. return render(request,'Controllo.Quota.html',value)
  683. def CheckQuotaHttp(request,dominio=None,quota=None):
  684. value = {}
  685. if dominio:
  686. d = Domini.objects.filter(nome=dominio.lower(),tobedeleted=False)
  687. print(d)
  688. if len(d) == 1:
  689. d = d[0]
  690. print('dominio Trovato',d.nome,int(quota))
  691. d.http_quota = int(quota)
  692. d.save()
  693. # caselle ftp/httpd
  694. result = d.ftpuser_set.filter(ftpgroup__section='http').aggregate(Sum('quota'))
  695. d.last_http_quota = d.http_quota
  696. d.date_http_quota = date.today()
  697. if result['quota__sum']:
  698. d.http_quota = result['quota__sum']
  699. #else:
  700. # d.http_quota = 0
  701. if not d.http_quota:
  702. d.http_quota = 0
  703. d.last_http_quota_check = True
  704. print('Quota http',d.http_quota)
  705. d.save()
  706. return render(request,'Controllo.Quota.html',value)
  707. def CheckQuotaSql(request,database=None,quota=None):
  708. value = {}
  709. dominio_di_riferimento = None
  710. if database:
  711. d = SqlDatabase.objects.filter(nome=database.lower(),tobedeleted=False)
  712. print(d)
  713. if len(d) == 1:
  714. d = d[0]
  715. dominio_di_riferimento = d.dominio_id
  716. print('database Trovato',d.nome,int(quota))
  717. d.quota = int(quota)
  718. d.save()
  719. # sql
  720. #registriamo i dati nel dominio
  721. dd = d.dominio
  722. result = dd.sqldatabase_set.all().aggregate(Sum('quota'))
  723. dd.last_sql_quota = dd.sql_quota
  724. dd.date_sql_quota = date.today()
  725. if result['quota__sum']:
  726. dd.sql_quota = result['quota__sum']
  727. #else:
  728. # dd.sql_quota = 0
  729. if not dd.sql_quota:
  730. dd.sql_quota = 0
  731. dd.last_sql_quota_check = True
  732. dd.save()
  733. print('Quota sql ',dd.sql_quota)
  734. return render(request,'Controllo.Quota.html',value)
  735. def CheckQuotaFtp(request,dominio=None,ftp=None,quota=None):
  736. value = {}
  737. dominio_di_riferimento = None
  738. if dominio:
  739. d = Domini.objects.filter(domain=dominio.lower(),tobedeleted=False)
  740. if len(d) == 1:
  741. d = d[0]
  742. dominio_di_riferimento = d.id
  743. print('dominio Trovato',d.domain)
  744. f = FTPUser.objects.filter(dominio=d.id,utente=ftp,tobedeleted=False)
  745. if len(f) == 1:
  746. f = f[0]
  747. f.ftp_quota = int(quota)
  748. f.save()
  749. result = d.ftpuser_set.filter().filter(ftpgroup__section='ftp').aggregate(Sum('ftp_quota'))
  750. d.last_ftp_quota = d.ftp_quota
  751. d.date_ftp_quota = date.today()
  752. if result['quota__sum']:
  753. d.ftp_quota = result['quota__sum']
  754. else:
  755. d.ftp_quota = 0
  756. if not d.ftp_quota:
  757. d.ftp_quota = 0
  758. d.last_ftp_quota_check = True
  759. d.save()
  760. print('Quota ftp ',d.ftp_quota)
  761. return render(request,'Controllo.Quota.html',value)
  762. def ComunicazioneControlloQuota(request,demo=False,dominio=0):
  763. value = {}
  764. try:
  765. dominio = int(dominio)
  766. print('dominio indicato:',dominio)
  767. except ValueError as ve:
  768. print("dominio non valido:", dominio)
  769. print(ve)
  770. dominio = None
  771. lista_quota = {}
  772. d = Domini.objects.filter(pk=dominio)
  773. print("dominio trovato",d)
  774. if not d:
  775. d = Domini.objects.all().order_by('nome')
  776. print('lista domini',d)
  777. value['domini'] = d
  778. sm = ServizioMail()
  779. quota_notifica = getConfigurazione('quota:notifica')
  780. quota_notifica = re.findall("[ |,]",quota_notifica)
  781. print(quota_notifica)
  782. sm.set_listadestinatari(quota_notifica)
  783. template = Template.objects.get(pk=getConfigurazione('quota:template:notifica'))
  784. sm.set_soggetto(template.soggetto)
  785. print('richiesta html',template.html)
  786. sm.set_oggetto(template.oggetto,template.html)
  787. template_dati = {}
  788. template_dati['domini'] = d
  789. sm.set_data(template_dati)
  790. if not demo:
  791. print('richiesta demo:1')
  792. sm.send()
  793. quota_accounting = getConfigurazione('quota:notifica:accounting')
  794. quota_accounting = re.split(',| ',quota_accounting)
  795. sm.set_listadestinatari(quota_accounting)
  796. print('Quota_Account',quota_accounting)
  797. if not demo:
  798. print('richiesta demo:1')
  799. sm.send()
  800. value['demo'] = demo
  801. return render(request,'Controllo.Quota.html',value)
  802. def ComunicazioneFinale(request,mailfinale=None):
  803. #invia una comunicazione a una specifica email
  804. '''
  805. deve inviare specificatamente:
  806. elenco email e occupazione finale mail
  807. elenco ftp e occupazione finale ftp
  808. elenco sql e occupazione finale sql
  809. elenco nextcloud e occupazione nextcloud
  810. occupazione totale
  811. differenze rispetto al passato
  812. '''
  813. def OccupazioneControlloQuota(request,dominio=None):
  814. value = dict()
  815. c = m.start()
  816. domini = None
  817. dtask = datetime.now().timestamp()
  818. dc = 0
  819. if not dominio:
  820. domini = Domini.objects.all().filter(tobedeleted=False)
  821. else:
  822. print('dominio richiesto:',dominio)
  823. domini = Domini.objects.filter(pk=dominio)
  824. mq = mqtt()
  825. mq.build('topic','messaggio/quota')
  826. mq.build('richiesta','quota')
  827. mq.build('stampa',True)
  828. tmp = dict()
  829. tmp['dtask'] = dtask
  830. tmpdom = list()
  831. for d in domini:
  832. tmpdom.append({'id':d.id,'nome':d.nome})
  833. tmp['domini'] = tmpdom
  834. mq.build('data',tmp)
  835. mq.pubblica()
  836. tmp=None
  837. tmpdom=None
  838. listadomini = list() #contiene la lista dei domini da pubblicare
  839. #cazz - inizio operazioni
  840. for dominio in domini:
  841. listadomini.append(dominio)
  842. ftpdict = dict()
  843. ftpdict['op'] = 'Quota'
  844. ftpdict['id'] = dominio.id
  845. ftpdict['do'] = dominio.nome
  846. ftpdict['stampa'] = True
  847. # ottiene la lista degli spazio assegnati via ftp
  848. listaftp = dominio.ftpuser_set.all()
  849. print('Numero di elementi',len(listaftp))
  850. for lf in listaftp:
  851. # le sezioni si possono dividere in tre, due accorpabili
  852. # http e stor, enb (enb: enbass, da verificare) 01.12.22
  853. ftpdict['ftpid'] = lf.id
  854. ftpdict['ftpuser']= lf.utente
  855. dc = dc +1
  856. ftpdict['dc'] = dc
  857. ftpdict['dtask'] = dtask
  858. ftpdict['stampa']=True
  859. print('ftp id',lf.id,'counter',dc,'dtask',dtask)
  860. try:
  861. #print('ftpgroup',lf.ftpgroup.id)
  862. #construisce la stringa che deve essere inviata via mqtt
  863. ftpdict['ftphome'] = lf.ftpgroup.directory % {'site':dominio.nome,'ftp':lf.utente}
  864. ftpdict['ftpclass'] = lf.ftpgroup.section
  865. except FTPGroup.DoesNotExist as dne:
  866. print('Errore: dato non valido: ',ftpdict)
  867. print('stringa da inviare per ftp: ',ftpdict)
  868. try:
  869. print('richiesta su server specifico',lf.id)
  870. m.publish(c,"Richiesta/Quota/Http/{}".format(lf.ftpgroup.server),json.dumps(ftpdict))
  871. except FTPGroup.DoesNotExist as dne:
  872. print('richiesta diretta a tutti i server',lf.id)
  873. m.publish(c,"Richiesta/Quota/Http",json.dumps(ftpdict))
  874. #ottiene la lista degli utenti mail (locali)
  875. listamail = dominio.user_set.all()
  876. print('Numero di elementi',len(listamail))
  877. for lm in listamail:
  878. maildict = dict()
  879. maildict['op'] = 'Quota'
  880. maildict['id'] = dominio.id
  881. maildict['do'] = dominio.nome
  882. maildict['mailid'] = lm.id
  883. maildict['mailuser'] = lm.mail
  884. maildict['mailserver'] = dominio.mail_server.fisico
  885. maildict['stampa'] = True
  886. dc = dc +1
  887. maildict['dc'] = dc
  888. maildict['dtask'] = dtask
  889. try:
  890. maildict['mailserver'] = lm.mail_server.fisico
  891. except MailServer.DoesNotExist as dne:
  892. print('mail server non indicato nel record mail')
  893. print('stringa da inviare per la mail: ',maildict)
  894. try:
  895. print('richiesta su server specifico',lm.id)
  896. m.publish(c,"Richiesta/Quota/Mail/{}".format(dominio.mail_server.nome),json.dumps(maildict))
  897. except MailServer.DoesNotExist as dne:
  898. print('richiesta diretta a tutti i server',lf.id)
  899. m.publish(c,"Richiesta/Quota/Mail",json.dumps(maildict))
  900. print("json json",json.dumps(maildict))
  901. u = User.objects.get(pk=lm.id)
  902. u.mail_quota=0
  903. u.save()
  904. dominio.mail_quota=0
  905. dominio.save()
  906. value['domini'] = listadomini
  907. print('value',value)
  908. return render(request,'Controllo.Quota.html',value)