views.py 36 KB

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