views.py 34 KB

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