2
0

views.py 35 KB

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