PageRenderTime 28ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/core/promogest/ui/AnagraficaComplessa.py

http://promogest.googlecode.com/
Python | 790 lines | 755 code | 12 blank | 23 comment | 3 complexity | ed485c497bcf5c7225f133eb7ec2b38b MD5 | raw file
Possible License(s): GPL-2.0
  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2005, 2006, 2007 2008, 2009, 2010 by Promotux
  3. # di Francesco Meloni snc - http://www.promotux.it/
  4. # Author: Alceste Scalas <alceste@promotux.it>
  5. # Author: Andrea Argiolas <andrea@promotux.it>
  6. # Author: Francesco Meloni <francesco@promotux.it
  7. # This file is part of Promogest.
  8. # Promogest is free software: you can redistribute it and/or modify
  9. # it under the terms of the GNU General Public License as published by
  10. # the Free Software Foundation, either version 2 of the License, or
  11. # (at your option) any later version.
  12. # Promogest is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. # You should have received a copy of the GNU General Public License
  17. # along with Promogest. If not, see <http://www.gnu.org/licenses/>.
  18. import time
  19. from promogest.ui.gtk_compat import *
  20. import os
  21. import sys
  22. import threading
  23. import os.path
  24. from promogest.Environment import conf
  25. from promogest.ui.GladeWidget import GladeWidget
  26. from promogest.ui.widgets.FilterWidget import FilterWidget
  27. from promogest.lib.XmlGenerator import XlsXmlGenerator
  28. from promogest.lib.CsvGenerator import CsvFileGenerator
  29. from promogest.ui.utils import *
  30. import subprocess
  31. import shlex
  32. from promogest import Environment
  33. from calendar import Calendar
  34. #if Environment.new_print_enjine:
  35. from promogest.lib.sla2pdf.Sla2Pdf_ng import Sla2Pdf_ng
  36. from promogest.lib.sla2pdf.SlaTpl2Sla import SlaTpl2Sla as SlaTpl2Sla_ng
  37. from promogest.lib.SlaTpl2Sla import SlaTpl2Sla
  38. #else:
  39. from promogest.ui.SendEmail import SendEmail
  40. from promogest.lib.HtmlHandler import createHtmlObj, renderTemplate, renderHTML
  41. from promogest.dao.Azienda import Azienda
  42. class Anagrafica(GladeWidget):
  43. """ Classe base per le anagrafiche di Promogest """
  44. def __init__(self, windowTitle, recordMenuLabel,
  45. filterElement, htmlHandler, reportHandler, editElement, labelHandler = None, gladeFile=None, aziendaStr=None):
  46. GladeWidget.__init__(self, 'anagrafica_complessa_window',
  47. fileName=gladeFile)
  48. if aziendaStr is not None:
  49. self.anagrafica_complessa_window.set_title(windowTitle[:12]+' su ('+aziendaStr+') - '+windowTitle[11:])
  50. else:
  51. self.anagrafica_complessa_window.set_title(windowTitle)
  52. self.record_menu.get_child().set_label(recordMenuLabel)
  53. if self.anagrafica_complessa_window not in Environment.windowGroup:
  54. Environment.windowGroup.append(self.anagrafica_complessa_window)
  55. self.html = createHtmlObj(self)
  56. self.anagrafica_detail_scrolledwindow.add(self.html)
  57. self._setFilterElement(filterElement)
  58. self._setHtmlHandler(htmlHandler)
  59. self._setReportHandler(reportHandler)
  60. self._setEditElement(editElement)
  61. self._setLabelHandler(labelHandler)
  62. self._selectedDao = None
  63. # Initial (in)sensitive widgets
  64. textStatusBar = " ***** PromoGest - 800 034561 - www.promogest.me - info@promotux.it ***** "
  65. context_id = self.pg2_statusbar.get_context_id("anagrafica_complessa_windows")
  66. self.pg2_statusbar.push(context_id,textStatusBar)
  67. self.record_delete_button.set_sensitive(False)
  68. self.record_delete_menu.set_sensitive(False)
  69. self.duplica_button.set_sensitive(False)
  70. self.record_edit_button.set_sensitive(False)
  71. self.record_edit_menu.set_sensitive(False)
  72. self.duplica_in_cliente.set_sensitive(False)
  73. self.duplica_in_fornitore.set_sensitive(False)
  74. # self.record_duplicate_menu.set_property('visible', False)
  75. # self.record_duplicate_menu.set_no_show_all(True)
  76. self.record_duplicate_menu.set_sensitive(False)
  77. self.duplica_button.set_sensitive(False)
  78. self.selected_record_print_button.set_sensitive(False)
  79. self.selected_record_print_menu.set_sensitive(False)
  80. self.placeWindow(self.anagrafica_complessa_window)
  81. self.filter.draw()
  82. self.editElement.draw(cplx=True)
  83. self.email = ""
  84. self.setFocus()
  85. def _setFilterElement(self, gladeWidget):
  86. self.bodyWidget = FilterWidget(owner=gladeWidget, filtersElement=gladeWidget)
  87. self.filter = self.bodyWidget.filtersElement
  88. self.filterTopLevel = self.filter.getTopLevel()
  89. filterElement = self.bodyWidget.filter_frame
  90. filterElement.unparent()
  91. self.anagrafica_filters_viewport.add(filterElement)
  92. self.anagrafica_hpaned.set_position(350)
  93. resultElement = self.bodyWidget.filter_list_vbox
  94. resultElement.unparent()
  95. self.anagrafica_results_viewport.add(resultElement)
  96. self.anagrafica_filter_treeview = self.bodyWidget.resultsElement
  97. gladeWidget.build()
  98. accelGroup = gtk.AccelGroup()
  99. self.getTopLevel().add_accel_group(accelGroup)
  100. self.bodyWidget.filter_clear_button.add_accelerator('clicked',
  101. accelGroup, GDK_KEY_ESCAPE, 0, GTK_ACCEL_VISIBLE)
  102. self.bodyWidget.filter_search_button.add_accelerator('clicked',
  103. accelGroup, GDK_KEY_F3, 0, GTK_ACCEL_VISIBLE)
  104. # self.bodyWidget.filter_search_button.add_accelerator('clicked',
  105. # accelGroup, gtk.keysyms.KP_Enter, 0, gtk.ACCEL_VISIBLE)
  106. # self.bodyWidget.filter_search_button.add_accelerator('clicked',
  107. # accelGroup, gtk.keysyms.Return, 0, gtk.ACCEL_VISIBLE)
  108. def _setHtmlHandler(self, htmlHandler):
  109. self.htmlHandler = htmlHandler
  110. html = """<html><body></body></html>"""
  111. renderHTML(self.html,html)
  112. def _setLabelHandler(self, labelHandler):
  113. self.labelHandler = labelHandler
  114. def _setReportHandler(self, reportHandler):
  115. self.reportHandler = reportHandler
  116. def _setEditElement(self, gladeWidget):
  117. self.editElement = gladeWidget
  118. def placeWindow(self, window):
  119. GladeWidget.placeWindow(self, window)
  120. if (self.width is None and self.height is None and
  121. self.left is None and self.top is None):
  122. window.maximize()
  123. def show_all(self):
  124. """ Visualizza/aggiorna tutta la struttura dell'anagrafica """
  125. self.anagrafica_complessa_window.show_all()
  126. def on_records_file_export_clicked(self, widget):
  127. dao = self.editElement.setDao(None)
  128. #print "DAOO", dao
  129. # data = self.set_export_data()
  130. # data_export = self.filter.xptDaoList
  131. # values = self.set_data_list(data_export)
  132. from ExportCsv import ExportCsv
  133. anag = ExportCsv(self, dao=dao)
  134. dao=None
  135. return
  136. data = self.set_export_data()
  137. saveDialog = gtk.FileChooserDialog("export in a file...",
  138. None,
  139. gtk.FILE_CHOOSER_ACTION_SAVE,
  140. (gtk.STOCK_CANCEL,
  141. GTK_RESPONSE_CANCEL,
  142. gtk.STOCK_SAVE,
  143. GTK_RESPONSE_OK))
  144. saveDialog.set_default_response(GTK_RESPONSE_OK)
  145. self.__homeFolder = setconf("General", "cartella_predefinita") or ""
  146. if self.__homeFolder == '':
  147. if os.name == 'posix':
  148. self.__homeFolder = os.environ['HOME']
  149. elif os.name == 'nt':
  150. self.__homeFolder = os.environ['USERPROFILE']
  151. saveDialog.set_current_folder(self.__homeFolder)
  152. folder = self.__homeFolder
  153. filter = gtk.FileFilter()
  154. filter.set_name("All files")
  155. filter.add_pattern("*")
  156. saveDialog.add_filter(filter)
  157. filter1 = gtk.FileFilter()
  158. filter1.set_name("XML files")
  159. filter1.add_pattern("*.xml")
  160. filter1.add_pattern("*.XML")
  161. saveDialog.add_filter(filter1)
  162. filter2 = gtk.FileFilter()
  163. filter2.set_name("CSV files")
  164. filter2.add_pattern("*.csv")
  165. filter2.add_pattern("*.CSV")
  166. saveDialog.add_filter(filter2)
  167. currentName = data['currentName']
  168. saveDialog.set_filter(filter1)
  169. saveDialog.set_current_name(currentName)
  170. cb_typeList = [['CSV','Csv compatibile Excel'],
  171. ['XML','MS Excel 2003 Xml format']]
  172. typeComboBox = insertFileTypeChooser(filechooser=saveDialog,
  173. typeList=cb_typeList)
  174. typeComboBox.connect('changed', on_typeComboBox_changed,
  175. saveDialog, currentName)
  176. typeComboBox.set_active(1)
  177. xmlMarkup = data['XmlMarkup']
  178. data_export = self.filter.xptDaoList
  179. values = self.set_data_list(data_export)
  180. saveDialog.show_all()
  181. response = saveDialog.run()
  182. if response == GTK_RESPONSE_OK:
  183. (fileType,file_name) = on_typeComboBox_changed(typeComboBox,
  184. saveDialog,
  185. currentName,
  186. isEvent=False)
  187. if fileType == "CSV":
  188. csvFile = CsvFileGenerator(file_name)
  189. csvFile.setAttributes(head=xmlMarkup[0],
  190. cols=xmlMarkup[2],
  191. data=values,
  192. totColumns=xmlMarkup[1])
  193. csvFile.createFile(wtot=True)
  194. elif fileType == "XML":
  195. xmlFile = XlsXmlGenerator(file_name)
  196. xmlFile.setAttributes(head=xmlMarkup[0], cols=xmlMarkup[2], data=values, totColumns=xmlMarkup[1])
  197. # wtot is to tell the function if it can close the worksheet after filling it with data.
  198. xmlFile.createFile(wtot=True)
  199. #the previous function by default closes automatically the worksheet
  200. #xmlFile.close_sheet()
  201. xmlFile.XlsXmlFooter()
  202. saveDialog.destroy()
  203. elif response == GTK_RESPONSE_CANCEL:
  204. saveDialog.destroy()
  205. def on_credits_menu_activate(self, widget):
  206. creditsDialog = GladeWidget('credits_dialog', callbacks_proxy=self)
  207. creditsDialog.getTopLevel().set_transient_for(self.getTopLevel())
  208. creditsDialog.getTopLevel().show_all()
  209. response = creditsDialog.credits_dialog.run()
  210. if response == GTK_RESPONSE_OK:
  211. creditsDialog.credits_dialog.destroy()
  212. def on_send_Email_activate(self, widget):
  213. sendemail = SendEmail()
  214. def on_licenza_menu_activate(self, widget):
  215. licenzaDialog = GladeWidget('licenza_dialog', callbacks_proxy=self)
  216. licenzaDialog.getTopLevel().set_transient_for(self.getTopLevel())
  217. licenseText = ''
  218. try:
  219. lines = open('./LICENSE').readlines()
  220. for l in lines:
  221. licenseText += l
  222. except:
  223. licenseText = 'Lavori in corso ....'
  224. print 'License file not found (LICENSE).'
  225. textBuffer = licenzaDialog.licenza_textview.get_buffer()
  226. textBuffer.set_text(licenseText)
  227. licenzaDialog.licenza_textview.set_buffer(textBuffer)
  228. licenzaDialog.getTopLevel().show_all()
  229. response = licenzaDialog.licenza_dialog.run()
  230. if response == GTK_RESPONSE_OK:
  231. licenzaDialog.licenza_dialog.destroy()
  232. def on_seriale_menu_activate(self, widget):
  233. try:
  234. fileName = Environment.conf.guiDir + 'logo_promogest.png'
  235. f = open(fileName,'rb')
  236. content = f.read()
  237. f.close()
  238. msg = 'Codice installazione:\n\n' + str(md5.new(content).hexdigest().upper())
  239. except:
  240. msg = 'Impossibile generare il codice !!!'
  241. messageInfo(msg=msg)
  242. def on_anagrafica_filter_treeview_cursor_changed(self, treeview=None):
  243. sel = self.anagrafica_filter_treeview.get_selection()
  244. if sel.get_mode() == GTK_SELECTIONMODE_MULTIPLE:
  245. return
  246. elif sel.get_mode() == GTK_SELECTIONMODE_SINGLE:
  247. (model, iterator) = sel.get_selected()
  248. if iterator is not None:
  249. self.dao = model.get_value(iterator, 0)
  250. else:
  251. self.dao = None
  252. if self.dao is not None:
  253. self.htmlHandler.setDao(self.dao)
  254. self.record_edit_button.set_sensitive(self.dao is not None)
  255. self.record_edit_menu.set_sensitive(self.dao is not None)
  256. if self.dao.__class__.__name__ in ["TestataDocumento", "Articolo", "TestataMovimento", "Listino"]:
  257. self.duplica_button.set_sensitive(self.dao is not None)
  258. self.record_duplicate_menu.set_sensitive(self.dao is not None)
  259. self.record_delete_button.set_sensitive(self.dao is not None)
  260. self.record_delete_menu.set_sensitive(self.dao is not None)
  261. self.selected_record_print_button.set_sensitive(self.dao is not None)
  262. self.selected_record_print_menu.set_sensitive(self.dao is not None)
  263. return self.dao or False
  264. def on_anagrafica_filter_treeview_row_activated(self, widget, path, column):
  265. self.on_record_edit_activate(widget, path, column)
  266. def on_anagrafica_filter_treeview_selection_changed(self, treeSelection):
  267. sel = treeSelection
  268. self.daoSelection = []
  269. self.dao = None
  270. if sel.get_mode() == GTK_SELECTIONMODE_MULTIPLE:
  271. model, iterator = sel.get_selected_rows()
  272. count = sel.count_selected_rows()
  273. if count > 1:
  274. for iter in iterator:
  275. self.daoSelection.append(model[iter][0])
  276. self.dao = None
  277. elif count == 1:
  278. self.dao = model[iterator[0]][0]
  279. else:
  280. iterator = None
  281. # No items are currently selected
  282. self.dao = None
  283. else:
  284. return
  285. if self.dao is not None:
  286. self.htmlHandler.setDao(self.dao)
  287. self.record_edit_button.set_sensitive(self.dao is not None)
  288. self.record_edit_menu.set_sensitive(self.dao is not None)
  289. if self.dao.__class__.__name__ in ["TestataDocumento", "Articolo", "TestataMovimento", "Listino"]:
  290. self.duplica_button.set_sensitive(self.dao is not None)
  291. self.record_duplicate_menu.set_sensitive(self.dao is not None)
  292. self.record_delete_button.set_sensitive(self.dao is not None)
  293. self.record_delete_menu.set_sensitive(self.dao is not None)
  294. self.selected_record_print_button.set_sensitive(self.dao is not None)
  295. self.selected_record_print_menu.set_sensitive(self.dao is not None)
  296. return self.daoSelection or self.dao or False
  297. def on_record_new_activate(self, widget=None):
  298. self.editElement.setVisible(True)
  299. self.editElement.setDao(None)
  300. self.setFocus()
  301. def on_record_delete_activate(self, widget):
  302. if not YesNoDialog(msg='Confermi l\'eliminazione ?', transient=self.getTopLevel()):
  303. return
  304. dao = self.filter.getSelectedDao()
  305. if dao:
  306. dao.delete()
  307. self.filter.refresh()
  308. self.htmlHandler.setDao(None)
  309. self.setFocus()
  310. def on_record_edit_activate(self, widget=None, path=None, column=None, dao=None):
  311. if not dao:
  312. dao = self.filter.getSelectedDao()
  313. self._selectedDao = dao
  314. self.editElement.setVisible(True)
  315. self.editElement.setDao(dao)
  316. self.setFocus()
  317. def on_record_duplicate_menu_activate(self, widget, path=None, column=None):
  318. dao = self.filter.getSelectedDao()
  319. self._selectedDao = dao
  320. self.duplicate(dao)
  321. def duplicate(self):
  322. """ Duplica il dao corrente """
  323. raise NotImplementedError
  324. def on_records_print_activate(self, widget):
  325. self._handlePrinting(pdfGenerator=self.reportHandler, report=True)
  326. def on_Stampa_Frontaline_clicked(self, widget):
  327. if posso("LA"):
  328. results = self.filter.runFilter(offset=None, batchSize=None)
  329. self.manageLabels(results)
  330. else:
  331. fenceDialog()
  332. def on_selected_record_print_activate(self, widget):
  333. self._handlePrinting(daos=[self.filter.getSelectedDao()],
  334. pdfGenerator=self.htmlHandler,
  335. report=True)
  336. def manageLabels(self, results):
  337. from promogest.modules.Label.ui.ManageLabelsToPrint import ManageLabelsToPrint
  338. a = ManageLabelsToPrint(mainWindow=self,daos=results)
  339. anagWindow = a.getTopLevel()
  340. returnWindow = self.getTopLevel().get_toplevel()
  341. anagWindow.set_transient_for(returnWindow)
  342. anagWindow.show_all()
  343. def _handlePrinting(self, pdfGenerator, report,
  344. daos=None, label=None,
  345. returnResults=None,classic=False, template_file=False):
  346. # FIXME: refactor this mess!!!
  347. # tiro su la finestrella con la progress bar
  348. progressDialog = GladeWidget('records_print_progress_dialog',
  349. callbacks_proxy=self)
  350. progressDialog.getTopLevel().set_transient_for(self.getTopLevel())
  351. progressDialog.getTopLevel().show_all()
  352. pbar = progressDialog.records_print_progress_bar
  353. pbar.set_text('Lettura dati')
  354. self.__pulseSourceTag = None
  355. self.__cancelOperation = False
  356. self.__pdfGenerator = pdfGenerator
  357. self.__returnResults = returnResults
  358. self.__pdfReport = None
  359. self._reportType = report
  360. self._template_file = template_file
  361. self._classic = classic
  362. self.label = label # tipo report ma anche opzione label
  363. self._pdfName = str(pdfGenerator.defaultFileName)
  364. self._folder = setconf("General", "cartella_predefinita") or ""
  365. if self._folder == '':
  366. if os.name == 'posix':
  367. self._folder = os.environ['HOME']
  368. elif os.name == 'nt':
  369. self._folder = os.environ['USERPROFILE']
  370. def showPrintingDialog():
  371. if self.__cancelOperation:
  372. # Operation has been cancelled, do nothing
  373. return
  374. progressDialog.getTopLevel().destroy()
  375. gobject.source_remove(self.__pulseSourceTag)
  376. printDialog = GladeWidget('records_print_dialog',
  377. callbacks_proxy=self)
  378. printDialog.getTopLevel().set_transient_for(self.getTopLevel())
  379. printDialog.records_print_dialog_description_label.\
  380. set_markup('<span weight="bold">' +\
  381. self._pdfName + '</span>')
  382. printDialog.records_print_dialog_size_label.\
  383. set_markup('<span weight="bold">' +\
  384. str(len(self.__pdfReport) / 1024) +\
  385. ' Kb</span>')
  386. printDialog.placeWindow(printDialog.getTopLevel())
  387. printDialog.getTopLevel().show_all()
  388. self.printDialog = printDialog
  389. return False
  390. def progressCB(results, prevLen, totalLen):
  391. if self.__cancelOperation:
  392. raise Exception, 'Operation cancelled, thread killed'
  393. # Let's schedule progress bar update from the main thread
  394. def updateProgressBarIdle():
  395. if self.__cancelOperation:
  396. # Progress bar is being destroyed, do nothing
  397. return
  398. if results:
  399. frac = len(results) / float(totalLen)
  400. pbar.set_fraction(frac)
  401. return False
  402. gobject.idle_add(updateProgressBarIdle)
  403. if len(results) == totalLen:
  404. # We're done: let's switch progress bar type from the
  405. # main thread
  406. def renewProgressBarIdle():
  407. pbar.set_pulse_step(0.07)
  408. pbar.set_text('Creazione della stampa')
  409. # Let's also schedule the progress bar pulsing from
  410. # the main thread
  411. def pulsePBar():
  412. pbar.pulse()
  413. return True
  414. self.__pulseSourceTag = gobject.timeout_add(33, pulsePBar)
  415. return False
  416. gobject.idle_add(renewProgressBarIdle)
  417. # In the end, let's launch the template rendering thread
  418. def renderingThread():
  419. """ Questo č il thread di conversione e generazione della stampa"""
  420. operationName = ""
  421. pdfGenerator.setObjects(results)
  422. print "TEMPLATE FILE", self._template_file
  423. self._pdfName = str(pdfGenerator.defaultFileName)
  424. if pdfGenerator.defaultFileName == 'documento':
  425. dao = self.filter.getSelectedDao()
  426. data = dao.data_documento
  427. operationName = dao.operazione
  428. intestatario = permalinkaTitle(dao.intestatario)[0:15] or ""
  429. #intestatario = dao.intestatario[0:15].replace(" ","_").replace("\\n","") or ""
  430. self._pdfName = operationName + \
  431. '_' +\
  432. str(dao.numero) +\
  433. '_' +\
  434. intestatario + \
  435. '_' +\
  436. data.strftime('%d-%m-%Y')
  437. elif pdfGenerator.defaultFileName == 'promemoria':
  438. dao = self.filter.getSelectedDao()
  439. self._pdfName = self.__pdfGenerator.defaultFileName +\
  440. '_' + \
  441. str(dao.id)
  442. elif pdfGenerator.defaultFileName == 'label':
  443. self._pdfName = pdfGenerator.defaultFileName +\
  444. '_' + \
  445. time.strftime('%d-%m-%Y')
  446. operationName = "label"
  447. self.__pdfReport = pdfGenerator.pdf(operationName,
  448. classic=self._classic,
  449. template_file=self._template_file)
  450. # When we're done, let's schedule the printing
  451. # dialog (going back to the main GTK loop)
  452. gobject.idle_add(showPrintingDialog)
  453. if pdfGenerator.defaultFileName == 'label' and self.__returnResults == None:
  454. progressDialog.getTopLevel().destroy()
  455. #gobject.idle_add(self.manageLabels,results)
  456. self.manageLabels(results)
  457. else:
  458. if Environment.tipo_eng =="sqlite":
  459. renderingThread()
  460. else:
  461. t = threading.Thread(group=None, target=renderingThread,
  462. name='Data rendering thread', args=(),
  463. kwargs={})
  464. #t.setDaemon(True) # FIXME: are we sure?
  465. t.start()
  466. def fetchingThread(daos=None):
  467. """ funzione di prelievo dei risultati """
  468. if daos is None:
  469. # Let's fetch the data
  470. self.unused = self.filter.runFilter(offset=None, batchSize=None,
  471. progressCB=progressCB,
  472. progressBatchSize=5)
  473. progressCB(results=self.unused, prevLen=0, totalLen=len(self.unused))
  474. else:
  475. # We've got all the data we need, let's jump to the
  476. # callback directly
  477. progressCB(results=daos, prevLen=0, totalLen=len(daos))
  478. # Qui c'č il cuore della funzione di stampa con il lancio del thread separato
  479. if Environment.tipo_eng =="sqlite":
  480. fetchingThread(daos=daos)
  481. else:
  482. t = threading.Thread(group=None, target=fetchingThread,
  483. name='Data fetching thread', args=(),
  484. kwargs={'daos' : daos})
  485. #t.setDaemon(True) # FIXME: are we sure?
  486. t.start()
  487. def on_records_print_on_screen_activate(self, widget):
  488. """ Questo segnale rimanda a AnagraficaComplessaReport
  489. che a sua volta rimanda a AnagraficaComplessaPrineterPreview che
  490. si occupa della visualizzazione e della stampa"""
  491. previewDialog = self.reportHandler.buildPreviewWidget()
  492. def on_records_print_progress_dialog_response(self, dialog, responseId):
  493. if responseId == GTK_RESPONSE_CANCEL:
  494. self.__cancelOperation = True
  495. #self.__pdfGenerator.cancelOperation()
  496. if self.__pulseSourceTag is not None:
  497. gobject.source_remove(self.__pulseSourceTag)
  498. self.on_records_print_dialog_close(dialog)
  499. # del self.__pdfReport
  500. # del self.__pdfGenerator
  501. def on_records_print_progress_dialog_close(self, dialog, event=None):
  502. # FIXME: we're leaving the threads running!
  503. print 'diediedie'
  504. dialog.destroy()
  505. def on_riferimento2_combobox_entry_changed(self, combobox):
  506. stringContatti = 'Contatti...'
  507. def refresh_combobox(anagWindow, tipo):
  508. if anag.dao is None:
  509. id = None
  510. else:
  511. id = anag.dao.id
  512. if tipo == 'fornitore':
  513. res = leggiFornitore(id)
  514. elif tipo == 'cliente':
  515. res = leggiCliente(id)
  516. elif tipo == 'contatto':
  517. res = leggiContatto(id)
  518. if res.has_key("ragioneSociale") and res["ragioneSociale"] != '':
  519. self.printDialog.riferimento2_combobox_entry.\
  520. child.set_text(res["ragioneSociale"])
  521. else:
  522. self.printDialog.riferimento2_combobox_entry.\
  523. child.set_text(res["email"])
  524. self.email = res["email"]
  525. anagWindow.destroy()
  526. if self.printDialog.riferimento2_combobox_entry.get_active_text() == stringContatti:
  527. from promogest.modules.Contatti.ui.RicercaContatti import RicercaContatti
  528. anag = RicercaContatti()
  529. anagWindow = anag.getTopLevel()
  530. anagWindow.connect("hide", refresh_combobox, 'contatto')
  531. returnWindow = combobox.get_toplevel()
  532. anagWindow.set_transient_for(returnWindow)
  533. anag.show_all()
  534. def tryToSavePdf(self, pdfFile):
  535. try:
  536. ##trying to save the file with the right name
  537. f = file(pdfFile, 'wb')
  538. f.write(self.__pdfReport)
  539. f.close()
  540. except:
  541. msg = """Errore nel salvataggio!
  542. Verificare i permessi della cartella"""
  543. messageError(msg=msg)
  544. return
  545. def on_send_email_button_clicked(self, widget):
  546. """ ATTENZIONE: l'errore parrebbe corretto nel launchpad ma ancora non funziona
  547. con thunderbird controllando in simplescan lo stesso errore che riscontro io
  548. aspettiamo...."""
  549. self.email = self.printDialog.riferimento2_combobox_entry.\
  550. get_active_text()
  551. pdfFile = os.path.join(self._folder + self._pdfName +'.pdf')
  552. self.tryToSavePdf(pdfFile)
  553. fileName = self._pdfName +'.pdf'
  554. subject= "Invio: %s" %fileName
  555. body = conf.body %fileName
  556. # if self.email:
  557. # arghi = "xdg-email --utf8 --attach '%s' --subject '%s' --body '%s' '%s'" %(pdfFile,subject,body,self.email)
  558. # else:
  559. # arghi = "xdg-email --attach '%s' --subject '%s' --body '%s'" %(str(pdfFile),subject,body)
  560. messageInfo(msg=""" Purtroppo per un bug indipendente dalla nostra volontŕ
  561. l'unico client di posta supportato su windows e su linux č <b>Thunderbird</b>
  562. Chi avesse bisogno di un template di spedizione email piů complesso anche in formato
  563. html contatti <b>assistenza@promotux.it</b> per informazioni
  564. Grazie!""")
  565. if os.name == "nt":
  566. arghi = "start thunderbird -compose subject='%s',body='%s',attachment='file:///%s',to='%s'" %(subject,body,str(pdfFile),self.email)
  567. else:
  568. arghi = "thunderbird -compose subject='%s',body='%s',attachment='file:///%s',to='%s'" %(subject,body,str(pdfFile),self.email)
  569. # args = shlex.split(arghi)
  570. # arghi = "evolution mailto:frank@sislands.com&Subject=mailto Creator"
  571. subprocess.Popen(arghi, shell=True)
  572. def on_close_button_clicked(self,widget):
  573. self.on_records_print_dialog_close(self.printDialog)
  574. def on_save_button_clicked(self, widget):
  575. self.__handleSaveResponse(self.printDialog.getTopLevel())
  576. #self.on_records_print_dialog_close(self.printDialog)
  577. def on_open_button_clicked(self, widget):
  578. self.__handleOpenResponse(self.printDialog.getTopLevel())
  579. #self.on_records_print_dialog_close(self.printDialog)
  580. def on_records_print_dialog_close(self, dialog, event=None):
  581. dialog.hide()
  582. # del self.__pdfReport
  583. # del self.__pdfGenerator
  584. def __handleOpenResponse(self, dialog):
  585. """ Qui gestiamo l'apertura
  586. """
  587. pdfFile = os.path.join(self._folder + self._pdfName +'.pdf')
  588. self.pdfFile = pdfFile
  589. self.tryToSavePdf(pdfFile)
  590. try:
  591. subprocess.Popen(['xdg-open', pdfFile])
  592. except:
  593. os.startfile(pdfFile)
  594. def __handleSaveResponse(self, dialog):
  595. fileDialog = gtk.FileChooserDialog(title='Salva il file',
  596. parent=dialog,
  597. action=gtk.FILE_CHOOSER_ACTION_SAVE,
  598. buttons=(gtk.STOCK_CANCEL,
  599. GTK_RESPONSE_CANCEL,
  600. gtk.STOCK_SAVE,
  601. GTK_RESPONSE_OK),
  602. backend=None)
  603. fileDialog.set_current_name(self._pdfName+".pdf")
  604. fileDialog.set_current_folder(self._folder)
  605. fltr = gtk.FileFilter()
  606. fltr.add_mime_type('application/pdf')
  607. fltr.set_name('File Promogest:(*.pdf & *.ods)')
  608. fltr.add_pattern("*.pdf")
  609. fileDialog.add_filter(fltr)
  610. fltr = gtk.FileFilter()
  611. fltr.set_name("All files")
  612. fltr.add_pattern("*")
  613. fltr.set_name('Tutti i file')
  614. fileDialog.add_filter(fltr)
  615. response = fileDialog.run()
  616. # FIXME: handle errors here
  617. if ( (response == GTK_RESPONSE_CANCEL) or ( response == GTK_RESPONSE_DELETE_EVENT)) :
  618. pass
  619. elif response == GTK_RESPONSE_OK:
  620. filename = fileDialog.get_filename()
  621. #modifiche
  622. can_save = 0
  623. esci = False
  624. # Let's check whether the file is going to be overwritten
  625. while esci == False:
  626. if os.path.exists(filename):
  627. msg = 'Il file "%s" esiste. Sovrascrivere?' % filename
  628. if YesNoDialog(msg=msg, transient=self.getTopLevel()):
  629. can_save = 1
  630. #overwrite the file if user click yes
  631. break
  632. else:
  633. response = fileDialog.run()
  634. if response == GTK_RESPONSE_CANCEL or response == GTK_RESPONSE_DELETE_EVENT:
  635. #exit but don't save the file
  636. esci = True
  637. can_save = 0
  638. break
  639. elif response == GTK_RESPONSE_OK:
  640. filename = fileDialog.get_filename()
  641. else:
  642. can_save = 1
  643. if can_save == 1:
  644. while True:
  645. try:
  646. #trying to save the file
  647. f = file(filename, 'wb')
  648. f.write(self.__pdfReport)
  649. f.close()
  650. esci = True
  651. break
  652. except:
  653. msg = """Errore nel salvataggio!
  654. Verificare i permessi della cartella"""
  655. response = messageError(msg=msg)
  656. if response == GTK_RESPONSE_CANCEL or \
  657. response == GTK_RESPONSE_DELETE_EVENT:
  658. response = fileDialog.run()
  659. if response == GTK_RESPONSE_CANCEL or \
  660. response == GTK_RESPONSE_DELETE_EVENT:
  661. #exit but don't save the file
  662. esci = True
  663. break
  664. elif response == GTK_RESPONSE_OK:
  665. filename = fileDialog.get_filename()
  666. break
  667. fileDialog.destroy()
  668. def setFocus(self, widget=None):
  669. self.filter.setFocus()
  670. def on_anagrafica_window_close(self, widget, event=None):
  671. if self.anagrafica_complessa_window in Environment.windowGroup:
  672. Environment.windowGroup.remove(self.anagrafica_complessa_window)
  673. self.destroy()
  674. def getHtmlWidget(self):
  675. return self.html
  676. def hideNavigator(self):
  677. self.bodyWidget.filter_navigation_hbox.set_no_show_all(True)
  678. self.bodyWidget.filter_navigation_hbox.hide()