PageRenderTime 59ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/core/promogest/modules/MailAndFax/ui/plus003.py

http://promogest.googlecode.com/
Python | 675 lines | 596 code | 55 blank | 24 comment | 32 complexity | 8e9409440ff1bb207f103831a1d7dfc9 MD5 | raw file
Possible License(s): GPL-2.0
  1. # -*- coding: iso-8859-15 -*-
  2. # Copyright (C) 2005, 2006, 2007 2008, 2009, 2010, 2011 by Promotux
  3. # di Francesco Meloni snc - http://www.promotux.it/
  4. # Author: Alceste Scalas <alceste@promotux.it>
  5. # Author: Francesco Marella <francesco.marella@gmail.com>
  6. # This file is part of Promogest.
  7. # Promogest is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation, either version 2 of the License, or
  10. # (at your option) any later version.
  11. # Promogest is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. # You should have received a copy of the GNU General Public License
  16. # along with Promogest. If not, see <http://www.gnu.org/licenses/>.
  17. import threading
  18. import smtplib, mimetypes, popen2, os
  19. from promogest import Environment
  20. from promogest.ui.GladeWidget import GladeWidget
  21. from email import Encoders
  22. from promogest.dao.CategoriaContatto import CategoriaContatto
  23. from email.MIMEAudio import MIMEAudio
  24. from email.MIMEBase import MIMEBase
  25. from email.MIMEMultipart import MIMEMultipart
  26. from email.MIMEImage import MIMEImage
  27. from email.MIMEText import MIMEText
  28. from promogest.ui.gtk_compat import *
  29. class SpamFrame(GladeWidget):
  30. """ Frame per la gestione delle aziende """
  31. def __init__(self, mainWindow):
  32. self.mainWindow = mainWindow
  33. GladeWidget.__init__(self, 'spam_frame')
  34. # Costruisco treeview categorie mail e fax
  35. modelRiga = gtk.ListStore(int, str)
  36. treeview = self.category_treeview
  37. renderer = gtk.CellRendererText()
  38. column = gtk.TreeViewColumn('Categoria', renderer, text=1)
  39. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  40. column.set_clickable(False)
  41. column.set_resizable(True)
  42. column.set_expand(False)
  43. treeview.append_column(column)
  44. treeview.set_model(modelRiga)
  45. modelRiga = gtk.ListStore(int, str)
  46. treeview = self.sendfax_category_treeview
  47. renderer = gtk.CellRendererText()
  48. column = gtk.TreeViewColumn('Categoria', renderer, text=1)
  49. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  50. column.set_clickable(False)
  51. column.set_resizable(True)
  52. column.set_expand(False)
  53. treeview.append_column(column)
  54. treeview.set_model(modelRiga)
  55. # Costruisco treeview files
  56. modelRiga = gtk.ListStore(str)
  57. treeview = self.attachment_treeview
  58. renderer = gtk.CellRendererText()
  59. column = gtk.TreeViewColumn('Nome file', renderer, text=0)
  60. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  61. column.set_clickable(False)
  62. column.set_resizable(True)
  63. column.set_expand(False)
  64. treeview.append_column(column)
  65. treeview.set_model(modelRiga)
  66. # Costruisco treeviews singoli contatti
  67. modelRiga = gtk.ListStore(str, str)
  68. treeview = self.contact_treeview
  69. renderer = gtk.CellRendererText()
  70. column = gtk.TreeViewColumn('Contatto', renderer, text=0)
  71. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  72. column.set_clickable(False)
  73. column.set_resizable(True)
  74. column.set_expand(False)
  75. treeview.append_column(column)
  76. treeview.set_model(modelRiga)
  77. renderer = gtk.CellRendererText()
  78. column = gtk.TreeViewColumn('E-Mail', renderer, text=1)
  79. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  80. column.set_clickable(False)
  81. column.set_resizable(True)
  82. column.set_expand(False)
  83. treeview.append_column(column)
  84. treeview.set_model(modelRiga)
  85. modelRiga = gtk.ListStore(str, str)
  86. treeview = self.contact_fax_treeview
  87. renderer = gtk.CellRendererText()
  88. column = gtk.TreeViewColumn('Contatto', renderer, text=0)
  89. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  90. column.set_clickable(False)
  91. column.set_resizable(True)
  92. column.set_expand(False)
  93. treeview.append_column(column)
  94. treeview.set_model(modelRiga)
  95. renderer = gtk.CellRendererText()
  96. column = gtk.TreeViewColumn('Fax', renderer, text=1)
  97. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  98. column.set_clickable(False)
  99. column.set_resizable(True)
  100. column.set_expand(False)
  101. treeview.append_column(column)
  102. treeview.set_model(modelRiga)
  103. # Riempio combobox categorie mail e fax
  104. combobox = self.category_combobox
  105. model = gtk.ListStore(int, str)
  106. cats = CategoriaContatto().select(denominazione=None,
  107. orderBy = None,
  108. offset = None,
  109. batchSize = None)
  110. for c in cats:
  111. model.append((c.id, (c.denominazione or '')[0:20]))
  112. combobox.clear()
  113. renderer = gtk.CellRendererText()
  114. combobox.pack_start(renderer, True)
  115. combobox.add_attribute(renderer, 'text', 1)
  116. combobox.set_model(model)
  117. combobox = self.sendfax_category_combobox
  118. model = gtk.ListStore(int, str)
  119. for c in cats:
  120. model.append((c.id, (c.denominazione or '')[0:20]))
  121. combobox.clear()
  122. renderer = gtk.CellRendererText()
  123. combobox.pack_start(renderer, True)
  124. combobox.add_attribute(renderer, 'text', 1)
  125. combobox.set_model(model)
  126. def on_add_button_clicked(self, button):
  127. combobox = self.category_combobox
  128. model = combobox.get_model()
  129. iterator = combobox.get_active_iter()
  130. if iterator is not None:
  131. id = model.get_value(iterator, 0)
  132. categoria = model.get_value(iterator, 1)
  133. for c in self.category_treeview.get_model():
  134. if c[0] == id:
  135. return
  136. self.category_treeview.get_model().append((id, categoria))
  137. def on_delete_button_clicked(self, button):
  138. treeSelection = self.category_treeview.get_selection()
  139. (model, iterator) = treeSelection.get_selected()
  140. if iterator is not None:
  141. model.remove(iterator)
  142. def on_sendfax_add_button_clicked(self, button):
  143. combobox = self.sendfax_category_combobox
  144. model = combobox.get_model()
  145. iterator = combobox.get_active_iter()
  146. if iterator is not None:
  147. id = model.get_value(iterator, 0)
  148. categoria = model.get_value(iterator, 1)
  149. for c in self.sendfax_category_treeview.get_model():
  150. if c[0] == id:
  151. return
  152. self.sendfax_category_treeview.get_model().append((id, categoria))
  153. def on_sendfax_delete_button_clicked(self, button):
  154. treeSelection = self.sendfax_category_treeview.get_selection()
  155. (model, iterator) = treeSelection.get_selected()
  156. if iterator is not None:
  157. model.remove(iterator)
  158. def on_button_open_attach_clicked(self, button):
  159. fileDialog = gtk.FileChooserDialog(title='Scegli attachment',
  160. parent=self.mainWindow.getTopLevel(),
  161. action=GTK_FILE_CHOOSER_ACTION_OPEN,
  162. buttons=(gtk.STOCK_CANCEL, GTK_RESPONSE_CANCEL,
  163. gtk.STOCK_OPEN, GTK_RESPONSE_OK))
  164. response = fileDialog.run()
  165. if response == GTK_RESPONSE_OK:
  166. filename = fileDialog.get_filename()
  167. fileDialog.destroy()
  168. for f in self.attachment_treeview.get_model():
  169. if f[0] == filename:
  170. return
  171. self.attachment_treeview.get_model().append((filename,))
  172. elif response == GTK_RESPONSE_CANCEL:
  173. fileDialog.destroy()
  174. def on_button_delete_attach_clicked(self, button):
  175. treeSelection = self.attachment_treeview.get_selection()
  176. (model, iterator) = treeSelection.get_selected()
  177. if iterator is not None:
  178. model.remove(iterator)
  179. def on_sendfax_open_button_clicked(self, button):
  180. fileDialog = gtk.FileChooserDialog(title='Scegli file',
  181. parent=self.mainWindow.getTopLevel(),
  182. action=GTK_FILE_CHOOSER_ACTION_OPEN,
  183. buttons=(gtk.STOCK_CANCEL, GTK_RESPONSE_CANCEL,
  184. gtk.STOCK_OPEN, GTK_RESPONSE_OK))
  185. filter = gtk.FileFilter()
  186. filter.set_name("Immagini TIFF")
  187. filter.add_mime_type("image/tiff")
  188. filter.add_pattern("*.tif")
  189. filter.add_pattern("*.tiff")
  190. fileDialog.add_filter(filter)
  191. filter = gtk.FileFilter()
  192. filter.set_name("PDF/PS")
  193. filter.add_mime_type("application/pdf")
  194. filter.add_mime_type("application/postscript")
  195. filter.add_pattern("*.pdf")
  196. filter.add_pattern("*.ps")
  197. fileDialog.add_filter(filter)
  198. filter = gtk.FileFilter()
  199. filter.set_name("Testo")
  200. filter.add_mime_type("text/plain")
  201. filter.add_pattern("*.txt")
  202. fileDialog.add_filter(filter)
  203. response = fileDialog.run()
  204. if response == GTK_RESPONSE_OK:
  205. filename = fileDialog.get_filename()
  206. fileDialog.destroy()
  207. self.sendfax_file_entry.set_text(filename)
  208. elif response == GTK_RESPONSE_CANCEL:
  209. fileDialog.destroy()
  210. def check_before_send(self):
  211. # controllo se e` stato inserito il soggetto
  212. if self.subject_textentry.get_text() == '':
  213. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  214. GTK_DIALOG_MODAL
  215. | GTK_DIALOG_DESTROY_WITH_PARENT,
  216. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  217. dialog.set_markup("<b>ATTENZIONE: </b>Inserire il soggetto")
  218. response = dialog.run()
  219. dialog.destroy()
  220. return False
  221. # controllo se e` stato inserito del testo
  222. if self.plain_textview.get_buffer().get_char_count() == 0:
  223. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  224. GTK_DIALOG_MODAL
  225. | GTK_DIALOG_DESTROY_WITH_PARENT,
  226. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  227. dialog.set_markup("<b>ATTENZIONE: </b>Inserire il testo del messaggio")
  228. response = dialog.run()
  229. dialog.destroy()
  230. return False
  231. # controllo se e` stato inserita almeno una categoria od almeno un contatto
  232. elif len(self.category_treeview.get_model()) ==0 and len(self.contact_treeview.get_model()) == 0:
  233. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  234. GTK_DIALOG_MODAL
  235. | GTK_DIALOG_DESTROY_WITH_PARENT,
  236. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  237. dialog.set_markup(
  238. "<b>ATTENZIONE: </b>Specificare almeno una categoria od un contatto a cui spedire")
  239. response = dialog.run()
  240. dialog.destroy()
  241. return False
  242. else:
  243. return True
  244. def check_before_sendfax(self):
  245. # controllo se e` stato inserito il file
  246. if self.sendfax_file_entry.get_text() == '':
  247. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  248. GTK_DIALOG_MODAL
  249. | GTK_DIALOG_DESTROY_WITH_PARENT,
  250. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  251. dialog.set_markup("<b>ATTENZIONE: </b>Scegliere il file")
  252. response = dialog.run()
  253. dialog.destroy()
  254. return False
  255. # controllo se e` stato inserita almeno una categoria od un contatto singolo
  256. elif len(self.sendfax_category_treeview.get_model()) == 0 and len(
  257. self.contact_fax_treeview.get_model()) == 0:
  258. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  259. GTK_DIALOG_MODAL
  260. | GTK_DIALOG_DESTROY_WITH_PARENT,
  261. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  262. dialog.set_markup("<b>ATTENZIONE: </b>Specificare almeno una categoria od un contatto a cui spedire")
  263. response = dialog.run()
  264. dialog.destroy()
  265. return False
  266. else:
  267. return True
  268. def sendresponse(self, recipients):
  269. host = 'localhost'
  270. if hasattr(Environment.conf.Promospam,'mail_host'):
  271. host = Environment.conf.Promospam.mail_host
  272. sender = getattr(Environment.conf.Promospam,'mittente','mittente@mail.it')
  273. message = MIMEMultipart()
  274. message['Subject'] = 'Riepilogo spedizione'
  275. message['From'] = sender
  276. # To guarantee the message ends with a newline
  277. message.set_charset('iso-8859-15')
  278. message.epilogue = ''
  279. buffer = "Messaggio spedito a:\n\n"
  280. for rec in recipients:
  281. buffer = buffer + rec + "\n"
  282. msg = MIMEText(buffer, _subtype='plain')
  283. msg.set_charset('iso-8859-15')
  284. msg.add_header('Content-Disposition', 'inline')
  285. message.attach(msg)
  286. # Spedisco il messaggio
  287. message['To'] = sender
  288. s = smtplib.SMTP()
  289. s.connect(host=host)
  290. s.sendmail(sender, sender, message.as_string())
  291. s.close()
  292. def sendmail(self, subject, recipients):
  293. host = 'localhost'
  294. if hasattr(Environment.conf.Promospam,'mail_host'):
  295. host = Environment.conf.Promospam.mail_host
  296. sender = getattr(Environment.conf.Promospam,'mittente','mittente@mail.it')
  297. message = MIMEMultipart()
  298. message['Subject'] = subject
  299. message['From'] = sender
  300. # To guarantee the message ends with a newline
  301. message.set_charset('iso-8859-15')
  302. message.epilogue = ''
  303. buffer = self.plain_textview.get_buffer()
  304. msg = MIMEText(buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(),True)
  305. ,_subtype='plain')
  306. msg.set_charset('iso-8859-15')
  307. msg.add_header('Content-Disposition', 'inline')
  308. message.attach(msg)
  309. # allego i files
  310. model = self.attachment_treeview.get_model()
  311. for row in model:
  312. path = row[0]
  313. ctype, encoding = mimetypes.guess_type(path)
  314. if ctype is None or encoding is not None:
  315. ctype = 'application/octet-stream'
  316. maintype, subtype = ctype.split('/', 1)
  317. if maintype == 'text':
  318. fp = open(path)
  319. msg = MIMEText(fp.read(), _subtype=subtype)
  320. fp.close()
  321. elif maintype == 'image':
  322. fp = open(path, 'rb')
  323. msg = MIMEImage(fp.read(), _subtype=subtype)
  324. fp.close()
  325. elif maintype == 'audio':
  326. fp = open(path, 'rb')
  327. msg = MIMEAudio(fp.read(), _subtype=subtype)
  328. fp.close()
  329. else:
  330. fp = open(path, 'rb')
  331. msg = MIMEBase(maintype, subtype)
  332. msg.set_payload(fp.read())
  333. fp.close()
  334. Encoders.encode_base64(msg)
  335. # Set the filename parameter
  336. msg.add_header('Content-Disposition', 'attachment', filename=path)
  337. message.attach(msg)
  338. # Spedisco i messaggi
  339. for recipient in recipients:
  340. message['To'] = recipient
  341. s = smtplib.SMTP()
  342. #s.set_debuglevel(True)
  343. s.connect(host=host)
  344. s.sendmail(sender, recipient, message.as_string())
  345. s.close()
  346. # spedisco riepilogo
  347. self.sendresponse(recipients)
  348. def on_send_button_clicked(self, button):
  349. if self.check_before_send():
  350. def exitFunc(dialog):
  351. gobject.source_remove(self.__pulseSourceTag)
  352. dialog.getTopLevel().destroy()
  353. # controllo valore di ritorno
  354. if self._ret_value is not None:
  355. self.response_label.set_markup(
  356. "<b>ATTENZIONE: </b>alcuni destinatari non sono stati raggiunti")
  357. else:
  358. self.response_label.set_markup(
  359. "<b>Spedizione completata con successo</b>")
  360. return False
  361. # Instanziare finestra di progresso e schedulare funzione di pulse
  362. progressDialog = GladeWidget('spam_sending_dialog',
  363. callbacks_proxy=self)
  364. progressDialog.getTopLevel().set_transient_for(self.mainWindow.getTopLevel())
  365. progressDialog.getTopLevel().show_all()
  366. pbar = progressDialog.export_progressbar
  367. self.__pulseSourceTag = None
  368. self.__cancelOperation = False
  369. pbar.set_pulse_step(0.07)
  370. def pulsePBar():
  371. pbar.pulse()
  372. return True
  373. self.__pulseSourceTag = gobject.timeout_add(33, pulsePBar)
  374. def sendThread():
  375. model = self.category_treeview.get_model()
  376. recipients = []
  377. for row in model:
  378. if self.__cancelOperation:
  379. return
  380. id_categoria = row[0]
  381. # trovo indirizzi a cui spedire di questa categoria
  382. strQuery = 'select R.recapito from ' + Environment.connection._schemaAzienda + (
  383. '.contatto_categoria_contatto CCC ') + (
  384. 'left outer join ') + Environment.connection._schemaAzienda + (
  385. '.recapito R on R.id_contatto = CCC.id_contatto ') + (
  386. 'left outer join ') + Environment.connection._schemaAzienda + (
  387. '.categoria_contatto CC ') + (
  388. 'on CCC.id_categoria_contatto = CC.id ') + (
  389. 'where tipo_recapito = \'E-Mail\' and CC.id = %s')
  390. if self.__cancelOperation:
  391. return
  392. Environment.connection._cursor.execute(strQuery, (id_categoria,))
  393. res = Environment.connection._cursor.fetchall()
  394. for row_res in res:
  395. if self.__cancelOperation:
  396. return
  397. recipients.append(row_res[0])
  398. # Aggiungo contatti singoli
  399. model = self.contact_treeview.get_model()
  400. for row in model:
  401. recipients.append(row[1])
  402. self._ret_value = self.sendmail(self.subject_textentry.get_text(), recipients)
  403. gobject.idle_add(exitFunc, progressDialog)
  404. t = threading.Thread(group=None, target=sendThread,
  405. name='Spam sending thread', args=(),
  406. kwargs={})
  407. t.setDaemon(True) # FIXME: are we sure? ( he doesn't remember )
  408. t.start()
  409. def on_sendfax_button_clicked(self, button):
  410. if self.check_before_sendfax():
  411. def exitFunc(dialog):
  412. gobject.source_remove(self.__pulseSourceTag)
  413. dialog.getTopLevel().destroy()
  414. if self.__cancelOperation:
  415. self.export_message_label.set_markup("Esecuzione interrotta")
  416. self.__cancelOperation = False
  417. elif self.__exitStatus!=0:
  418. self.sendfax_result_label.set_markup(
  419. "<b>Attenzione</b>: L' esecuzione del comando e` fallita miseramente, controllare il log per informazioni")
  420. else:
  421. self.sendfax_result_label.set_markup(
  422. "<b>" + str(self.faxcount) + " fax accodati con successo</b>")
  423. return False
  424. # Instanziare finestra di progresso e schedulare funzione di pulse
  425. progressDialog = GladeWidget('spam_sending_dialog',
  426. callbacks_proxy=self)
  427. progressDialog.getTopLevel().set_transient_for(self.mainWindow.getTopLevel())
  428. progressDialog.title_label.set_markup(
  429. '<span weight="bold" size="larger">Accodamento fax in corso...</span>')
  430. progressDialog.getTopLevel().show_all()
  431. pbar = progressDialog.export_progressbar
  432. self.__pulseSourceTag = None
  433. self.__cancelOperation = False
  434. pbar.set_pulse_step(0.07)
  435. def pulsePBar():
  436. pbar.pulse()
  437. return True
  438. self.__pulseSourceTag = gobject.timeout_add(33, pulsePBar)
  439. def sendfaxThread():
  440. model = self.sendfax_category_treeview.get_model()
  441. recipients = []
  442. for row in model:
  443. if self.__cancelOperation:
  444. return
  445. id_categoria = row[0]
  446. # trovo indirizzi a cui spedire di questa categoria
  447. strQuery = 'select R.recapito from ' + Environment.connection._schemaAzienda + (
  448. '.contatto_categoria_contatto CCC ') + (
  449. 'left outer join ') + Environment.connection._schemaAzienda + (
  450. '.recapito R on R.id_contatto = CCC.id_contatto ') + (
  451. 'left outer join ') + Environment.connection._schemaAzienda + (
  452. '.categoria_contatto CC ') + (
  453. 'on CCC.id_categoria_contatto = CC.id ') + (
  454. 'where tipo_recapito = \'Fax\' and CC.id = %s')
  455. if self.__cancelOperation:
  456. return
  457. Environment.connection._cursor.execute(strQuery, (id_categoria,))
  458. res = Environment.connection._cursor.fetchall()
  459. for row_res in res:
  460. if self.__cancelOperation:
  461. return
  462. recipients.append(row_res[0])
  463. # Aggiungo contatti singoli
  464. model = self.contact_fax_treeview.get_model()
  465. for row in model:
  466. recipients.append(row[1])
  467. self.faxcount = 0
  468. buffer = ''
  469. for rec in recipients:
  470. if self.__cancelOperation:
  471. return
  472. program_launch = Environment.conf.Promospam.sendfax_program
  473. program_params = ' -n -G -f ' + Environment.conf.Promospam.mittente + (
  474. ' -h ') + Environment.conf.Promospam.halyfax_host + (
  475. ' -o ') + Environment.conf.Promospam.halyfax_user + (
  476. ' -s ') + Environment.conf.Promospam.fax_format + (
  477. ' -d ') + rec + ' ' + self.sendfax_file_entry.get_text()
  478. if os.name == 'nt':
  479. exportingProcessPid = os.spawnl(os.P_NOWAIT, program_launch, program_params)
  480. id, self.__exitStatus = os.waitpid(exportingProcessPid, 0)
  481. self.__exitStatus = self.__exitStatus >> 8
  482. buffer = ''
  483. else:
  484. command = program_launch + program_params
  485. process = popen2.Popen3(command, True)
  486. buf = process.fromchild.readlines()
  487. for line in buf:
  488. buffer = buffer + line
  489. self.__exitStatus = process.wait()
  490. if self.__exitStatus == 0:
  491. self.faxcount = self.faxcount + 1
  492. gobject.idle_add(exitFunc, progressDialog)
  493. t = threading.Thread(group=None, target=sendfaxThread,
  494. name='Sendfax thread', args=(),
  495. kwargs={})
  496. t.setDaemon(True) # FIXME: are we sure? ( he does'nt remember )
  497. t.start()
  498. def on_sending_mail_progress_dialog_response(self, dialog, responseId):
  499. if responseId == GTK_RESPONSE_CANCEL:
  500. if self.__pulseSourceTag is not None:
  501. gobject.source_remove(self.__pulseSourceTag)
  502. self.__cancelOperation = True
  503. dialog.destroy()
  504. def on_sending_fax_progress_dialog_response(self, dialog, responseId):
  505. if responseId == GTK_RESPONSE_CANCEL:
  506. if self.__pulseSourceTag is not None:
  507. gobject.source_remove(self.__pulseSourceTag)
  508. self.__cancelOperation = True
  509. dialog.destroy()
  510. def ricercaContatto(self, source):
  511. def on_ricerca_contatto_email_hide(anagWindow, anag):
  512. if anag.dao is None:
  513. anagWindow.destroy()
  514. return
  515. anagWindow.destroy()
  516. email = None
  517. for recapito in anag.dao.recapiti:
  518. if recapito.tipo_recapito == 'E-Mail':
  519. email = recapito.recapito
  520. if email is None:
  521. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  522. GTK_DIALOG_MODAL
  523. | GTK_DIALOG_DESTROY_WITH_PARENT,
  524. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  525. dialog.set_markup("<b>ATTENZIONE: </b>Questo contatto non dispone di un E-Mail")
  526. response = dialog.run()
  527. dialog.destroy()
  528. else:
  529. model = self.contact_treeview.get_model()
  530. model.append((anag.dao.cognome + ' ' + anag.dao.nome, email))
  531. def on_ricerca_contatto_fax_hide(anagWindow, anag):
  532. if anag.dao is None:
  533. anagWindow.destroy()
  534. return
  535. anagWindow.destroy()
  536. fax = None
  537. for recapito in anag.dao.recapiti:
  538. if recapito.tipo_recapito == 'Fax':
  539. fax = recapito.recapito
  540. if fax is None:
  541. dialog = gtk.MessageDialog(self.mainWindow.getTopLevel(),
  542. GTK_DIALOG_MODAL
  543. | GTK_DIALOG_DESTROY_WITH_PARENT,
  544. GTK_DIALOG_MESSAGE_WARNING, GTK_BUTTONS_OK)
  545. dialog.set_markup("<b>ATTENZIONE: </b>Questo contatto non dispone di un numero Fax")
  546. response = dialog.run()
  547. dialog.destroy()
  548. else:
  549. model = self.contact_fax_treeview.get_model()
  550. model.append((anag.dao.cognome + ' ' + anag.dao.nome, fax))
  551. from promogest.ui.RicercaContatti import RicercaContatti
  552. anag = RicercaContatti()
  553. anagWindow = anag.getTopLevel()
  554. if source == 'contact_fax_add_button':
  555. anagWindow.connect("hide", on_ricerca_contatto_fax_hide, anag)
  556. elif source == 'contact_add_button':
  557. anagWindow.connect("hide", on_ricerca_contatto_email_hide, anag)
  558. anagWindow.set_transient_for(self.mainWindow.getTopLevel())
  559. anagWindow.show_all()
  560. def on_contact_add_button_clicked(self, button):
  561. self.ricercaContatto(button.name)
  562. def on_contact_delete_button_clicked(self, button):
  563. if button.name == 'contact_delete_button':
  564. treeSelection = self.contact_treeview.get_selection()
  565. elif button.name == 'contact_fax_delete_button':
  566. treeSelection = self.contact_fax_treeview.get_selection()
  567. (model, iterator) = treeSelection.get_selected()
  568. if iterator is not None:
  569. model.remove(iterator)