class RicercaComplessa(GladeWidget): """ Classe base per le ricerche avanzate di Promogest """ def __init__(self, windowTitle, filtersElement): GladeWidget.__init__(self, root='ricerca_window', path="ricerca_window.glade") #self.ricerca_html.destroy() self.dao = None self.window = self.ricerca_window self.filter = FilterWidget(owner=self, filtersElement=filtersElement) filtersElement.filter = self.filter self.filterTopLevel = self.filter.getTopLevel() self.filters = self.filter.filtersElement self.results = self.filter.resultsElement self.filter.filter_body_label.set_no_show_all(True) self.filter.filter_body_label.set_property('visible', False) self.window.set_title(windowTitle) self.placeWindow(self.window) def on_filter_treeview_selection_changed(self,selection): pass def show_all(self): """ Visualizza/aggiorna tutta la struttura della ricerca """ #if self.window not in Environment.windowGroup: #Environment.windowGroup.append(self.window) self.window.show_all() def insert(self, toggleButton, returnWindow): """ Richiama l'anagrafica per l'inserimento """ raise NotImplementedError def on_inserimento_togglebutton_clicked(self, toggleButton): if not(toggleButton.get_active()): toggleButton.set_active(False) return anagReturn = self.getTopLevel() self.insert(toggleButton, anagReturn) def on_confirm_button_clicked(self, widget): """ Riga confermata """ if self.ricerca_window in Environment.windowGroup: Environment.windowGroup.remove(self.ricerca_window) self.ricerca_window.hide() def on_ricerca_window_close(self, widget, event=None): if self.ricerca_window in Environment.windowGroup: Environment.windowGroup.remove(self.ricerca_window) self.hide() return True
def __init__(self, anagrafica, windowTitle, previewTemplate, tipo=None): GladeWidget.__init__(self, root='htmlviewer', path="htmlviewer.glade") self.windowTitle = windowTitle self.visualizzatore_html.set_title(windowTitle) self._anagrafica = anagrafica self._tipo = tipo self.bodyWidget = FilterWidget(owner=self, resultsElement='html') self.bodyWidget.filter_navigation_hbox.destroy() self.bodyWidget.info_label.set_markup("INSERT INFO") self.html_scrolledwindow.add_with_viewport( self.bodyWidget.getTopLevel()) self.print_on_screen_html = self.bodyWidget.resultsElement self._gtkHtmlDocuments = None self._previewTemplate = previewTemplate self.html = createHtmlObj(self) #Prendo tutti i dati dalla finestra di filtraggio, compresi i dati # di ordinamento e di batchSize self._changeOrderBy = self.bodyWidget._changeOrderBy self.orderBy = self.bodyWidget.orderBy self.batchSize = self.bodyWidget.batchSize self.offset = self.bodyWidget.offset self.numRecords = self.bodyWidget.numRecords self._filterClosure = self._anagrafica.filter._filterClosure self._filterCountClosure = self._anagrafica.filter._filterCountClosure self.placeWindow(self.visualizzatore_html) self.bodyWidget.generic_button.set_property('visible', False) def test(): self.html_code = "<html><body></body></html>" glib.idle_add(self.refresh)
def draw(self): self.filterss = FilterWidget( owner=self, filtersElement=GladeWidget( root='scontrini_filter_table', path="VenditaDettaglio/gui/_scontrini_emessi_elements.glade", isModule=True), #resultsElement="scontrino" ) self.filters = self.filterss.filtersElement self.filterTopLevel = self.filterss.getTopLevel() filterElement = self.filterss.filter_frame filterElement.unparent() self.filter_viewport.add(filterElement) self.anagrafica_hpaned.set_position(350) resultElement = self.filterss.filter_list_vbox resultElement.unparent() self.anagrafica_results_viewport.add(resultElement) self.detail = createHtmlObj(self) self.detail_scrolled.add(self.detail) self.filterss.hbox1.destroy() self.filterss.filter_info_hbox.show() self.filterss.filter_info_label.set_text("") self.filters.id_articolo_filter_customcombobox.setId(self._idArticolo) if self._daData is None: self.filters.da_data_filter_entry.setNow() else: self.filters.da_data_filter_entry.set_text(self_daData) if self._aData is None: self.filters.a_data_filter_entry.setNow() else: self.filters.a_data_filter_entry.set_text(self_aData) fillComboboxMagazzini(self.filters.id_magazzino_filter_combobox) fillComboboxPos(self.filters.id_pos_filter_combobox) if hasattr(Environment.conf, "VenditaDettaglio"): if hasattr(Environment.conf.VenditaDettaglio, "magazzino"): findComboboxRowFromStr(self.filters.id_magazzino_filter_combobox, Environment.conf.VenditaDettaglio.magazzino,2) if hasattr(Environment.conf.VenditaDettaglio, "puntocassa"): findComboboxRowFromStr(self.filters.id_pos_filter_combobox, Environment.conf.VenditaDettaglio.puntocassa,2) else: if setconf("VenditaDettaglio", "magazzino_vendita"): findComboboxRowFromId(self.filters.id_magazzino_filter_combobox,setconf("VenditaDettaglio", "magazzino_vendita")) if setconf("VenditaDettaglio", "punto_cassa"): findComboboxRowFromId(self.filters.id_pos_filter_combobox, setconf("VenditaDettaglio", "punto_cassa")) self.refreshHtml() self.refresh()
def _setFilterElement(self, gladeWidget): self.bodyWidget = FilterWidget(owner=gladeWidget, filtersElement=gladeWidget) self.ricerca_viewport.add(self.bodyWidget.getTopLevel()) self.bodyWidget.filter_body_label.set_no_show_all(True) self.bodyWidget.filter_body_label.set_property('visible', False) self.filter = self.bodyWidget.filtersElement self.filterTopLevel = self.filter.getTopLevel() self.filterTopLevel.set_sensitive(True) self.bodyWidget.generic_button.destroy() self.ricerca_filter_treeview = self.bodyWidget.resultsElement self._treeViewModel = None gladeWidget.build()
def __init__(self, anagrafica, windowTitle, previewTemplate, veter=False): GladeWidget.__init__(self, root='htmlviewer', path="htmlviewer.glade") self.windowTitle = windowTitle self.visualizzatore_html.set_title(windowTitle) self._anagrafica = anagrafica self._veter = veter self.bodyWidget = FilterWidget(owner=self, resultsElement='html') self.bodyWidget.filter_navigation_hbox.destroy() self.bodyWidget.info_label.set_markup("INSERT INFO") self.html_scrolledwindow.add_with_viewport( self.bodyWidget.getTopLevel()) self.print_on_screen_html = self.bodyWidget.resultsElement self._gtkHtmlDocuments = None self._previewTemplate = previewTemplate self.html = createHtmlObj(self) #Prendo tutti i dati dalla finestra di filtraggio, compresi i dati # di ordinamento e di batchSize self._changeOrderBy = self.bodyWidget._changeOrderBy self.orderBy = self.bodyWidget.orderBy self.batchSize = self.bodyWidget.batchSize self.offset = self.bodyWidget.offset self.numRecords = self.bodyWidget.numRecords self._filterClosure = self._anagrafica.filter._filterClosure self._filterCountClosure = self._anagrafica.filter._filterCountClosure self.placeWindow(self.visualizzatore_html) self.bodyWidget.generic_button.set_property('visible', False) def test(): self.html_code = "<html><body></body></html>" #self.html.load_html_string(self.html_code, "file:///"+sys.path[0]+os.sep) #self.html.show() #renderHTML(self.print_on_screen_html, self.html_code) #generaButton = self.bodyWidget.generic_button #generaButton.connect('clicked', self.on_generic_button_clicked ) #generaButton.set_label("Genera Pdf Anteprima Html") #if Environment.pg3: #glib.idle_add(test) #else: #gobject.idle_add(test) if Environment.pg3: glib.idle_add(self.refresh) else: gobject.idle_add(self.refresh)
def __init__(self, windowTitle, recordMenuLabel, filterElement, detailElement, path=None, url_help="http://www.promogest.me/promoGest/faq"): if not path: path='anagrafica_semplice_window.glade' GladeWidget.__init__(self, root='anagrafica_semplice_window', path=path) Environment.windowGroup.append(self.anagrafica_semplice_window) self.anagrafica_semplice_window.set_title(windowTitle) self.record_menu.set_label(recordMenuLabel) self.bodyWidget = FilterWidget(owner=self, filtersElement=filterElement) #self.anagrafica_scrolledwindow.add(self.bodyWidget.getTopLevel()) self.anagrafica_viewport.add(self.bodyWidget.getTopLevel()) self.bodyWidget.filter_body_label.set_no_show_all(True) self.bodyWidget.filter_body_label.set_property('visible', False) self.bodyWidget.generic_button.set_no_show_all(True) self.bodyWidget.generic_button.set_property('visible', False) self.filter = self.bodyWidget.filtersElement self.url_help = url_help self.filterTopLevel = self.filter.getTopLevel() self.filterTopLevel.set_sensitive(True) self.detail = detailElement self.anagrafica_treeview = self.bodyWidget.resultsElement self._treeViewModel = None self._rowEditingPath = None self._tabPressed = False # mapping fields and methods from bodyWidget to this class self.anagrafica_filter_navigation_hbox = self.bodyWidget.filter_navigation_hbox self.anagrafica_filter_frame = self.bodyWidget.filter_frame self._widgetFirstFocus = self.bodyWidget._firstFocusWidget self._changeOrderBy = self.bodyWidget._changeOrderBy self.orderBy = self.bodyWidget.orderBy = None self.batchSize = self.bodyWidget.batchSize = int(setconf("Numbers", "batch_size")) self.offset = self.bodyWidget.offset = 0 self.numRecords = self.bodyWidget.numRecords = 0 self._filterClosure = None self.placeWindow(self.anagrafica_semplice_window) self.draw() self.setFocus()
def __init__(self, windowTitle, filtersElement): GladeWidget.__init__(self, root='ricerca_window', path="ricerca_window.glade") #self.ricerca_html.destroy() self.dao = None self.window = self.ricerca_window self.filter = FilterWidget(owner=self, filtersElement=filtersElement) filtersElement.filter = self.filter self.filterTopLevel = self.filter.getTopLevel() self.filters = self.filter.filtersElement self.results = self.filter.resultsElement self.filter.filter_body_label.set_no_show_all(True) self.filter.filter_body_label.set_property('visible', False) self.window.set_title(windowTitle) self.placeWindow(self.window)
class GestioneScontrini(GladeWidget): """ Classe per la gestione degli scontrini emessi """ def __init__(self, idArticolo = None, daData = None, aData = None, righe = []): self._idArticolo = idArticolo self._daData = daData self._aData = aData self._righe = righe self._htmlTemplate = None self.dao = None self.daoTse = None self.html = "" GladeWidget.__init__(self, root='scontrini_emessi', path="VenditaDettaglio/gui/scontrini_emessi.glade", isModule=True) self._window = self.scontrini_emessi self.getTopLevel().set_modal(modal=True) self.placeWindow(self._window) self.draw() def draw(self): self.filterss = FilterWidget( owner=self, filtersElement=GladeWidget( root='scontrini_filter_table', path="VenditaDettaglio/gui/_scontrini_emessi_elements.glade", isModule=True), #resultsElement="scontrino" ) self.filters = self.filterss.filtersElement self.filterTopLevel = self.filterss.getTopLevel() filterElement = self.filterss.filter_frame filterElement.unparent() self.filter_viewport.add(filterElement) self.anagrafica_hpaned.set_position(350) resultElement = self.filterss.filter_list_vbox resultElement.unparent() self.anagrafica_results_viewport.add(resultElement) self.detail = createHtmlObj(self) self.detail_scrolled.add(self.detail) self.filterss.hbox1.destroy() self.filterss.filter_info_hbox.show() self.filterss.filter_info_label.set_text("") self.filters.id_articolo_filter_customcombobox.setId(self._idArticolo) if self._daData is None: self.filters.da_data_filter_entry.setNow() else: self.filters.da_data_filter_entry.set_text(self_daData) if self._aData is None: self.filters.a_data_filter_entry.setNow() else: self.filters.a_data_filter_entry.set_text(self_aData) fillComboboxMagazzini(self.filters.id_magazzino_filter_combobox) fillComboboxPos(self.filters.id_pos_filter_combobox) if hasattr(Environment.conf, "VenditaDettaglio"): if hasattr(Environment.conf.VenditaDettaglio, "magazzino"): findComboboxRowFromStr(self.filters.id_magazzino_filter_combobox, Environment.conf.VenditaDettaglio.magazzino,2) if hasattr(Environment.conf.VenditaDettaglio, "puntocassa"): findComboboxRowFromStr(self.filters.id_pos_filter_combobox, Environment.conf.VenditaDettaglio.puntocassa,2) else: if setconf("VenditaDettaglio", "magazzino_vendita"): findComboboxRowFromId(self.filters.id_magazzino_filter_combobox,setconf("VenditaDettaglio", "magazzino_vendita")) if setconf("VenditaDettaglio", "punto_cassa"): findComboboxRowFromId(self.filters.id_pos_filter_combobox, setconf("VenditaDettaglio", "punto_cassa")) self.refreshHtml() self.refresh() def _reOrderBy(self, column): if column.get_name() == "data_column": return self.filterss._changeOrderBy(column,(None,TestataScontrino.data_inserimento)) if column.get_name() == "totale_column": return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_scontrino)) if column.get_name() == "contanti_column": return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_contanti)) if column.get_name() == "assegni_column": return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_assegni)) if column.get_name() == "cdicredito_column": return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_carta_credito)) def clear(self): # Annullamento filtro self.filters.id_articolo_filter_customcombobox.set_active(0) self.filters.id_cliente_search_customcombobox.set_active(0) if hasattr(Environment.conf, "VenditaDettaglio"): if hasattr(Environment.conf.VenditaDettaglio, "magazzino"): findComboboxRowFromStr(self.filters.id_magazzino_filter_combobox, Environment.conf.VenditaDettaglio.magazzino,2) if hasattr(Environment.conf.VenditaDettaglio, "puntocassa"): findComboboxRowFromStr(self.filters.id_pos_filter_combobox, Environment.conf.VenditaDettaglio.puntocassa,2) else: if setconf("VenditaDettaglio", "magazzino_vendita"): findComboboxRowFromId(self.filters.id_magazzino_filter_combobox,setconf("VenditaDettaglio", "magazzino_vendita")) if setconf("VenditaDettaglio", "punto_cassa"): findComboboxRowFromId(self.filters.id_pos_filter_combobox, setconf("VenditaDettaglio", "punto_cassa")) self.filters.da_data_filter_entry.setNow() self.filters.a_data_filter_entry.setNow() self.refresh() def refresh(self): # Aggiornamento TreeView idArticolo = self.filters.id_articolo_filter_customcombobox.getId() daData = stringToDate(self.filters.da_data_filter_entry.get_text()) aData = stringToDateBumped(self.filters.a_data_filter_entry.get_text()) idPuntoCassa = findIdFromCombobox(self.filters.id_pos_filter_combobox) idMagazzino = findIdFromCombobox(self.filters.id_magazzino_filter_combobox) idCliente = self.filters.id_cliente_search_customcombobox.getId() self.filterss.numRecords = TestataScontrino().count(idArticolo=idArticolo, daData=daData, aData=aData, idMagazzino = idMagazzino, idPuntoCassa = idPuntoCassa, idCliente = idCliente) self.filterss._refreshPageCount() scos = TestataScontrino().select( orderBy=self.filterss.orderBy, idArticolo=idArticolo, daData=daData, aData=aData, idMagazzino = idMagazzino, idPuntoCassa = idPuntoCassa, idCliente = idCliente, offset=self.filterss.offset, batchSize=self.filterss.batchSize) #self.filterss._treeViewModel.clear() self.rows_listore.clear() for s in scos: totale = mNLC(s.totale_scontrino,2) or 0 contanti = mNLC(s.totale_contanti,2) or 0 assegni = mNLC(s.totale_assegni,2) or 0 carta = mNLC(s.totale_carta_credito,2) or 0 self.rows_listore.append((s, dateTimeToString(s.data_inserimento).replace(" "," Ore: "), totale, contanti, assegni, carta, dateToString(s.data_movimento), str(s.numero_movimento or ''))) scos_no_batchSize = TestataScontrino().select( orderBy=self.filterss.orderBy, idArticolo=idArticolo, idMagazzino = idMagazzino, idPuntoCassa = idPuntoCassa, daData=daData, aData=aData, idCliente=idCliente, offset=None, batchSize=None) self.scontrini = scos_no_batchSize self.calcolaTotale(scos_no_batchSize) def calcolasconto(self, dao): if dao.sconti[0].tipo_sconto=="valore": return dao.sconti[0].valore else: #print ((dao.totale_scontrino*100)/dao.sconti[0].valore), (dao.totale_scontrino) return (100 * dao.totale_scontrino) / (100 - dao.sconti[0].valore) -(dao.totale_scontrino) #totale_scontato = total-totale_sconto def calcolaTotale(self, scos_no_batchSize): tot=0 totccr = 0 totass = 0 totnum = 0 totcont = 0 tot_sconti = 0 totcont_netto = 0 totcont_resto = 0 for m in scos_no_batchSize: if m.sconti: tot_sconti += self.calcolasconto(m) tot += m.totale_scontrino # totale incassato totccr += m.totale_carta_credito #totale carta di credito totass += m.totale_assegni # totale assegni totcont += m.totale_contanti # totale dato in contanti if m.totale_carta_credito == 0 and m.totale_assegni == 0 and m.totale_contanti ==0 : totcont += m.totale_scontrino if m.totale_carta_credito == 0 and m.totale_assegni == 0: totcont_netto += m.totale_scontrino totcont_resto = totcont-totcont_netto totnum += 1 #self.filterss.label1.set_text("") stringa = """GENERALE:<b><span foreground="black" size="20000">%s</span></b> - NUM. SCONTRINI:<b><span foreground="black" size="18000">%s</span></b> TOT CARTA:<b>%s</b> - TOT ASSEGNI:<b>%s</b> - TOT CONT.:<b>%s</b> - TOT SCONTI:<b>%s</b> - """ %(mNLC(tot,2), totnum, mNLC(totccr,2), mNLC(totass,2), mNLC(totcont,2), mNLC(tot_sconti,2) ) self.filterss.info_label.set_markup(str(stringa)) def on_filter_treeview_cursor_changed(self, treeview): sel = self.filterss.resultsElement.get_selection() (model, iterator) = sel.get_selected() if iterator is None: print 'on_filter_treeview_cursor_changed(): FIXME: iterator is None!' return self.dao = model.get_value(iterator, 0) self.refreshHtml(self.dao) def on_filter_treeview_row_activated(self, treeview, path, column): # Not used here pass def on_filter_treeview_selection_changed(self, treeSelection): (model, iterator) = treeSelection.get_selected() if iterator: self.crea_fattura_button.set_sensitive(True) self.id_cliente_emessi_customcombobox.set_sensitive(True) self.operazione_combobox.set_sensitive(True) self.daoTse = model.get_value(iterator, 0) if model.get_value(iterator, 0).id_cliente_testata_scontrino: a = model.get_value(iterator, 0).id_cliente_testata_scontrino self.id_cliente_emessi_customcombobox.setId(a) else: self.id_cliente_emessi_customcombobox.set_active(0) self.operazione_combobox.set_active(0) #self.crea_fattura_button.set_sensitive(False) #self.id_cliente_emessi_customcombobox.set_sensitive(False) #self.operazione_combobox.set_sensitive(False) #self.daoTse = None else: self.id_cliente_emessi_customcombobox.set_active(0) self.crea_fattura_button.set_sensitive(False) self.id_cliente_emessi_customcombobox.set_sensitive(False) self.operazione_combobox.set_sensitive(False) self.daoTse = None def refreshHtml(self, dao=None): pageData = {} self.html = '<html></html>' if self.dao: pageData = { "file": "scontrino.html", "dao" :self.dao, "tutto":True, } self.html = renderTemplate(pageData) renderHTML(self.detail,self.html) def on_scontrini_window_close(self, widget, event=None): self.destroy() return None def on_rhesus_button_clicked(self, widget): if self.dao is not None: self._righe.append(self.dao.id) self.on_scontrini_window_close(widget) def on_delete_button_clicked(self, button): if self.dao is not None: msg = """ ATTENZIONE!!!! Si sta per cancellare uno scontrino, L'operazione è irreversibile per cui dovete essere sicuri di quel che state facendo. VUOI CANCELLARLO?""" if YesNoDialog(msg=msg, transient=self.getTopLevel()): if self.dao.numero_movimento: messageInfo(msg= """Esiste già un movimento abbinato di chiusura per scarico da cassa, l'operazione è comunque impossibile Rivolgersi all'assistenza""") else: Environment.pg2log.info("CANCELLO UNO SCONTRINO DAL PG2 ") self.dao.delete() self.refresh() else: return def on_affluenza_oraria_chart_clicked(self, button): if posso("STA_DETT"): from promogest.modules.Statistiche.ui.chart import chartViewer chartViewer(self._window, func="affluenzaOrariaGiornaliera",daos= self.scontrini) else: fencemsg() def on_affluenza_mensile_chart_clicked(self, button): if posso("STA_DETT"): from promogest.modules.Statistiche.ui.chart import chartViewer chartViewer(self._window, func="affluenzaGiornalieraMensile", daos= self.scontrini) else: fencemsg() def on_affluenza_annuale_chart_clicked(self, button): if posso("STA_DETT"): from promogest.modules.Statistiche.ui.chart import chartViewer chartViewer(self._window, func="affluenzaMensileAnnuale", daos= self.scontrini) else: fencemsg() def on_esporta_affluenza_csv_clicked(self, button): print "esport to csv" def on_aggiorna_inve_activate(self, item): """ Questa funzione serve a ricalibrare le giacenze di inventario con gli articoli venduti al dettaglio """ return from promogest.dao.Inventario import Inventario msg = """ ATTENZIONE!!!! QUESTA OPERAZIONE È PERICOLOSSIMA!!!! è stata aggiunta per corprire una casistica specifica di "aggiornamento della tabella inventario rispetto al venduto al dettaglio vuoi farlo??""" if YesNoDialog(msg=msg, transient=self.getTopLevel()): if posso("IN"): idMagazzinosel = Magazzino().select(denominazione = Environment.conf.VenditaDettaglio.magazzino) if Environment.conf.VenditaDettaglio.jolly: idArticoloGenericoSel = Articolo().select(codiceEM = Environment.conf.VenditaDettaglio.jolly) if idArticoloGenericoSel: idArticoloGenerico = idArticoloGenericoSel[0].id else: idArticoloGenerico = None if idMagazzinosel: idMagazzino = idMagazzinosel[0].id else: print "ERRORE NELLA DEFINIZIONE DEL MAGAZZINO" return for scontrino in self.scontrini: for riga in scontrino.righe: daoInv = Inventario().select(idArticolo=riga.id_articolo, idMagazzino = idMagazzino) if daoInv and idArticoloGenerico!=riga.id_articolo: if daoInv[0].data_aggiornamento is None or scontrino.data_inserimento < daoInv[0].data_aggiornamento: quantitaprecedente = daoInv[0].quantita or 0 quantitavenduta = riga.quantita nuovaquantita = quantitaprecedente+quantitavenduta print "OPERAZIONE DA EFFETTUARE", quantitaprecedente,quantitavenduta, nuovaquantita daoInv[0].quantita= nuovaquantita daoInv[0].persist() else: print "IL MODULO INVENTARIO NON e' ATTIVO " def on_distinta_button_clicked(self, button): gest = Distinta(righe = self.scontrini) gestWnd = gest.getTopLevel() showAnagraficaRichiamata(self.getTopLevel(), gestWnd, None, None) def on_acqmedcli_menu_activate(self, menu): gest = AcquistoMedioCliente(righe = self.scontrini) gestWnd = gest.getTopLevel() showAnagraficaRichiamata(self.getTopLevel(), gestWnd, None, None) def ricercaListino(self): """ check if there is a priceList like setted on configure file """ if hasattr(Environment.conf, "VenditaDettaglio"): if hasattr(Environment.conf.VenditaDettaglio,"listino"): pricelist = Listino().select(denominazione = Environment.conf.VenditaDettaglio.listino, offset = None, batchSize = None) else: pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita")) else: pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita")) if pricelist: id_listino = pricelist[0].id else: id_listino = None return id_listino def on_crea_fattura_button_clicked(self, button): """ RIGA DOCUMENTO: id, valore_unitario_netto, valore_unitario_lordo, quantita, moltiplicatore, applicazione_sconti, percentuale_iva, descrizione, id_articolo, id_magazzino, id_multiplo, id_listino, id_iva, id_riga_padre RIGA SCONTRINO: id, prezzo, prezzo_scontato, quantita, descrizione, id_testata_scontrino, id_articolo TODO: Vanno gestiti gli sconti """ if not self.daoTse: messageInfo(msg="Nessuno scontrino selezionato") return if self.daoTse and not self.daoTse.id_cliente_testata_scontrino: if self.id_cliente_emessi_customcombobox.getId(): a = TestataScontrinoCliente() a.id_cliente = self.id_cliente_emessi_customcombobox.getId() a.id_testata_scontrino = self.daoTse.id a.persist() else: messageInfo(msg="Scontrino selezionato, ma nessun cliente assegnato") return if not findStrFromCombobox(self.operazione_combobox,0): obligatoryField(self.getTopLevel(), self.operazione_combobox, msg="SELEZIONA IL TIPO DOCUMENTO") one_day = datetime.timedelta(days=1) proviamo = datetime.datetime(self.daoTse.data_inserimento.year,self.daoTse.data_inserimento.month, self.daoTse.data_inserimento.day) listascontrini = TestataScontrino().select(daData=proviamo, aData=proviamo+one_day, batchSize=None, orderBy="data_inserimento") a = [i for i,x in enumerate(listascontrini) if x == self.daoTse] if a: a = a[0] else: a=0 posizione= a + 1 note = "Rif. Scontrino" + " n. " + str(posizione) + " del " + dateToString(self.daoTse.data_inserimento) newDao = TestataDocumento() newDao.data_documento = datetime.datetime.now() newDao.operazione = findStrFromCombobox(self.operazione_combobox,0) newDao.id_cliente = self.id_cliente_emessi_customcombobox.getId() newDao.note_pie_pagina = note #newDao.applicazione_sconti = self.dao.applicazione_sconti #sconti = [] #sco = self.dao.sconti or [] scontiRigaDocumento=[] scontiSuTotale=[] righeDocumento=[] #for s in sco: #daoSconto = ScontoTestataDocumento() #daoSconto.valore = s.valore #daoSconto.tipo_sconto = s.tipo_sconto #scontiSuTotale.append(daoSconto) newDao.scontiSuTotale = scontiSuTotale #righe = [] rig = self.daoTse.righe for r in rig: daoRiga = RigaDocumento() daoRiga.id_testata_documento = newDao.id daoRiga.id_articolo = r.id_articolo daoRiga.id_magazzino = self.daoTse.id_magazzino daoRiga.descrizione = r.descrizione # Copia il campo iva arto = leggiArticolo(r.id_articolo) daoRiga.id_iva = arto["idAliquotaIva"] #ricalcola prezzi daoRiga.id_listino = self.ricercaListino() imponibile = float(r.prezzo)/(1+float(arto["percentualeAliquotaIva"])/100) imponibile_scontato = float(r.prezzo_scontato)/(1+float(arto["percentualeAliquotaIva"])/100) daoRiga.valore_unitario_lordo = imponibile or 0 daoRiga.valore_unitario_netto = imponibile_scontato daoRiga.percentuale_iva = arto["percentualeAliquotaIva"] #daoRiga.applicazione_sconti = r.applicazione_sconti daoRiga.quantita = r.quantita daoRiga.id_multiplo = None daoRiga.moltiplicatore = 1 #sconti = [] scontiRigaDocumento = [] #sco = r.sconti #for s in sco: #daoSconto = ScontoRigaDocumento() #daoSconto.valore = s.valore #daoSconto.tipo_sconto = s.tipo_sconto #scontiRigaDocumento.append(daoSconto) daoRiga.scontiRigaDocumento = scontiRigaDocumento righeDocumento.append(daoRiga) newDao.righeDocumento = righeDocumento tipoid = findStrFromCombobox(self.operazione_combobox,0) #tipo = Operazione().getRecord(id=tipoid) #if not newDao.numero: valori = numeroRegistroGet(tipo=tipoid, date=self.daoTse.data_inserimento) newDao.numero = valori[0] newDao.registro_numerazione= valori[1] newDao.persist() res = TestataDocumento().getRecord(id=newDao.id) msg = "Documento creato da scontrino !\n\nIl nuovo documento e' il n. " + str(res.numero) + " del " + dateToString(res.data_documento) + " (" + newDao.operazione + ")\n" + "Lo vuoi modificare?" if YesNoDialog(msg=msg, transient=self.getTopLevel()): from promogest.ui.anagDocumenti.AnagraficaDocumenti import AnagraficaDocumenti anag = AnagraficaDocumenti() anagWindow = anag.getTopLevel() anagWindow.show_all() anag.editElement.setVisible(True) anag.editElement.setDao(newDao) anag.editElement.id_persona_giuridica_customcombobox.set_sensitive(True) anag.editElement.setFocus() self.destroy() def on_stampa_button_clicked(self, button): from xhtml2pdf import pisa if self.dao: f = str(self.html) # f = "Hello <strong>World</strong>" filename =Environment.tempDir + "ristampa.pdf" g = file(filename, "wb") pdf = pisa.CreatePDF(f,g) g .close() anag = PrintDialogHandler(self,"SCONTRINO", tempFile=Environment.tempDir + "ristampa.pdf") anagWindow = anag.getTopLevel() returnWindow = self.getTopLevel().get_toplevel() anagWindow.set_transient_for(returnWindow) anagWindow.show_all() else: messageInfo(msg="Selezionare uno scontrino da stampare")
class Ricerca(GladeWidget): """ Classe base per le ricerche di Promogest """ def __init__(self, windowTitle, filterElement, htmlHandler=None): GladeWidget.__init__(self, root='ricerca_window', path="ricerca_window.glade") self.ricerca_window.set_title(windowTitle) self.dao = None self._setFilterElement(filterElement) self._setHtmlHandler(htmlHandler) self.htmlHandler = htmlHandler self.placeWindow(self.ricerca_window) self.filter.draw() def _setFilterElement(self, gladeWidget): self.bodyWidget = FilterWidget(owner=gladeWidget, filtersElement=gladeWidget) self.ricerca_viewport.add(self.bodyWidget.getTopLevel()) self.bodyWidget.filter_body_label.set_no_show_all(True) self.bodyWidget.filter_body_label.set_property('visible', False) self.filter = self.bodyWidget.filtersElement self.filterTopLevel = self.filter.getTopLevel() self.filterTopLevel.set_sensitive(True) self.bodyWidget.generic_button.destroy() self.ricerca_filter_treeview = self.bodyWidget.resultsElement self._treeViewModel = None gladeWidget.build() def _setHtmlHandler(self, htmlHandler): #self.htmlHandler = htmlHandler #html = """<html><body></body></html>""" #renderHTML(self.html,html) return def show_all(self): """ Visualizza/aggiorna tutta la struttura della ricerca """ Environment.windowGroup.append(self.ricerca_window) self.ricerca_window.show_all() def on_anagrafica_filter_treeview_row_activated(self, treeview): """ Gestisce lo spostamento tra le righe """ if self.getTopLevel() in Environment.windowGroup: Environment.windowGroup.remove(self.getTopLevel()) self.getTopLevel().hide() #self.on_filter_treeview_row_activated(treeview) def on_anagrafica_filter_treeview_cursor_changed(self, treeview): self.on_filter_treeview_cursor_changed(treeview) def on_anagrafica_filter_treeview_selection_changed(self, selection): self.on_filter_treeview_selection_changed(selection) def on_filter_treeview_row_activated(self, widget, path, column): """ Gestisce la conferma della riga """ self.ricerca_window.hide() if self.ricerca_window in Environment.windowGroup: Environment.windowGroup.remove(self.ricerca_window) print " SEI TU" def on_filter_treeview_cursor_changed(self, treeview): """ Gestisce lo spostamento tra le righe """ sel = self.ricerca_filter_treeview.get_selection() #(model, iterator) = sel.get_selected() if sel.get_mode() != GTK_SELECTIONMODE_MULTIPLE: (model, iterator) = sel.get_selected() if iterator is not None: self.dao = model.get_value(iterator, 0) else: self.dao = None else: model, iterator = sel.get_selected_rows() count = sel.count_selected_rows() if count == 1: self.dao = model[iterator[0]][0] if iterator is None: return #self.dao = model.get_value(iterator, 0) if self.htmlHandler is not None: self.htmlHandler.setDao(self.dao) def on_filter_treeview_selection_changed(self, selection): """ questo gestisce la sola selezione """ return def insert(self, toggleButton, returnWindow): """ Richiama l'anagrafica per l'inserimento """ raise NotImplementedError def on_inserimento_togglebutton_clicked(self, toggleButton): if not(toggleButton.get_active()): toggleButton.set_active(False) return anagReturn = self.getTopLevel() self.insert(toggleButton, anagReturn) def on_confirm_button_clicked(self, widget): """ Riga confermata """ self.ricerca_window.hide() if self.ricerca_window in Environment.windowGroup: Environment.windowGroup.remove(self.ricerca_window) return self.dao def on_ricerca_window_close(self, widget, event=None): """ Uscita """ if self.ricerca_window in Environment.windowGroup: Environment.windowGroup.remove(self.ricerca_window) self.destroy() return None def getHtmlWidget(self): #return self.ricerca_html return
class AnagraficaPrintPreview(GladeWidget): """ Print preview """ # FIXME: a lot of duplicated code from AnagraficaFilter here! def __init__(self, anagrafica, windowTitle, previewTemplate, tipo=None): GladeWidget.__init__(self, root='htmlviewer', path="htmlviewer.glade") self.windowTitle = windowTitle self.visualizzatore_html.set_title(windowTitle) self._anagrafica = anagrafica self._tipo = tipo self.bodyWidget = FilterWidget(owner=self, resultsElement='html') self.bodyWidget.filter_navigation_hbox.destroy() self.bodyWidget.info_label.set_markup("INSERT INFO") self.html_scrolledwindow.add_with_viewport( self.bodyWidget.getTopLevel()) self.print_on_screen_html = self.bodyWidget.resultsElement self._gtkHtmlDocuments = None self._previewTemplate = previewTemplate self.html = createHtmlObj(self) #Prendo tutti i dati dalla finestra di filtraggio, compresi i dati # di ordinamento e di batchSize self._changeOrderBy = self.bodyWidget._changeOrderBy self.orderBy = self.bodyWidget.orderBy self.batchSize = self.bodyWidget.batchSize self.offset = self.bodyWidget.offset self.numRecords = self.bodyWidget.numRecords self._filterClosure = self._anagrafica.filter._filterClosure self._filterCountClosure = self._anagrafica.filter._filterCountClosure self.placeWindow(self.visualizzatore_html) self.bodyWidget.generic_button.set_property('visible', False) def test(): self.html_code = "<html><body></body></html>" glib.idle_add(self.refresh) def on_csv_button_clicked(self, button): messageInfo(msg="NON ANCORA IMPLEMENTATO") def on_generic_combobox_changed(self, combobox): if self.codBar_combo.get_active() == 0: from PrintDialog import PrintDialogHandler from xhtml2pdf import pisa f = self.html_code g = file(Environment.tempDir + ".temp.pdf", "wb") pisa.CreatePDF(str(f), g) g .close() anag = PrintDialogHandler(self, self.windowTitle) anagWindow = anag.getTopLevel() returnWindow = self.bodyWidget.getTopLevel().get_toplevel() anagWindow.set_transient_for(returnWindow) anagWindow.show_all() #self.codBar_combo.set_active(0) elif self.codBar_combo.get_active() == 1: print "ANTEPRIMA CSV" else: self.codBar_combo.set_active(-1) def _refreshPageCount(self): """ Aggiorna la paginazione """ self.bodyWidget.numRecords = self.numRecords self.bodyWidget._refreshPageCount() @timeit def refresh(self): """ show the html page in the custom widget""" self.bodyWidget.orderBy = self.orderBy self.bodyWidget.tipo = self._tipo # self.pbar_dialog.run() # self.pbar_dialog.destroy() daos = self.bodyWidget.runFilter(offset=None, batchSize=None, filterClosure=self._filterClosure, ) azienda = Azienda().getRecord(id=Environment.azienda) # pbar(self.pbar_report,parziale=daos.index(ragsoc), totale=len(nomi), text=ragsoc, noeta=False) #pbar(self.pbar_report,parziale=1, totale=4) if hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "cliforn": if self._anagrafica.aa < 0: daos.sort(key=lambda x: x.intestatario.strip().upper()) else: daos.sort(key=lambda x: x.intestatario.strip().upper(),reverse=True) elif hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "impo": for t in daos: try: t._totaleImponibileScontato except: t.totali if self._anagrafica.aa < 0: daos.sort(key=lambda x: x._totaleImponibileScontato) else: daos.sort(key=lambda x: x._totaleImponibileScontato,reverse=True) self.numRecords = self.bodyWidget.countFilterResults( self._filterCountClosure, ) # self._refreshPageCount() #pbar(self.pbar_report,parziale=2, totale=4) pageData = {} self.html_code = "<html><body></body></html>" if self._tipo == "veter": daos = daos[:] da = [] for d in daos: c = [] for a in d.righe: if "TRIPLICE" in a.rig.arti.denominazione_famiglia: c.append(a) if len(c)>0: da.append(d) daos = da elif self._tipo == "massa": daos=daos[:] articoli_dict = {} if daos: cliente = daos[0].CLI else: cliente = None for d in daos: for x in d.righe: if x.id_articolo: if x.rig.arti.APADR and (x.rig.arti.APADR.percentuale_carbonio or x.rig.arti.APADR.percentuale_cov or x.rig.arti.APADR.percentuale_secco): a_adr = x.rig.arti # print(a_adr) if a_adr in articoli_dict: articoli_dict[a_adr] += ( x.quantita*x.moltiplicatore ) else: articoli_dict[a_adr] = ( x.quantita * x.moltiplicatore ) print(self._anagrafica.filter) daData = self._anagrafica.filter.daData aData = self._anagrafica.filter.aData pageData = { "file" : "report_massa.html", "rows": articoli_dict, "azienda":azienda, "cliente":cliente, "daData":daData, "aData":aData, "daos":daos, } self.html_code = renderTemplate(pageData) try: renderHTML(self.print_on_screen_html, str(self.html_code)) except: renderHTML(self.print_on_screen_html, self.html_code) return #pbar(self.pbar_report,parziale=2.5, totale=4) if daos: pageData = { "file": self._previewTemplate[1], #"dao":daos, "objects": daos, "azienda" : azienda, } self.html_code = renderTemplate(pageData) #pbar(self.pbar_report,parziale=3.75, totale=4) #pbar(self.pbar_report,stop=True) #self.pbar_dialog.hide() try: renderHTML(self.print_on_screen_html, str(self.html_code)) except: renderHTML(self.print_on_screen_html, self.html_code) def on_print_on_screen_dialog_response(self, dialog, responseId): if responseId == GTK_RESPONSE_CLOSE: self.on_print_on_screen_dialog_delete_event() def on_print_on_screen_dialog_delete_event(self, dialog=None, event=None): self.destroy() def on_pdf_button_clicked(self, button): from PrintDialog import PrintDialogHandler operation = Gtk.PrintOperation() setting = Gtk.PageSetup() ps = Gtk.PaperSize.new_custom("cc", "cc", 210, 297, gtk.Unit.MM) st = Gtk.PrintSettings() s = Gtk.PageSetup() s.set_paper_size(ps) margine_fondo = float(setconf("Stampa", "report_margine_basso") or 4.3) s.set_bottom_margin(margine_fondo, gtk.Unit.MM) margine_sinistro = float( setconf("Stampa", "report_margine_sinistro") or 4.3) s.set_left_margin(margine_sinistro, gtk.Unit.MM) margine_destro = float( setconf("Stampa", "report_margine_destro") or 4.3) s.set_right_margin(margine_destro, gtk.Unit.MM) margine_alto = float(setconf("Stampa", "report_margine_alto") or 4.3) s.set_top_margin(margine_alto, gtk.Unit.MM) orientamento = str(setconf("Stampa", "report_ori")) if not orientamento or orientamento == "orizzontale": s.set_orientation(Gtk.PageOrientation.LANDSCAPE) operation.set_default_page_setup(s) operation.set_export_filename(Environment.tempDir + ".temp.pdf") #import xhtml2pdf.pisa as pisa #import cStringIO #data= self.print_on_screen_html.get_main_frame().get_data_source().get_data().str #g = open(Environment.tempDir + "ciccio.html", "w") # pdf = pisa.CreatePDF( # cStringIO.StringIO(data), # g # ) #g.write(data) #g.close() p = self.print_on_screen_html.get_main_frame().print_full(operation, gtk.PrintOperationAction.EXPORT) pbar(self.pbar, pulse=True, text="GENERAZIONE STAMPA ATTENDERE") pbar(self.pbar, stop=True) anag = PrintDialogHandler(self, self.windowTitle, tipo="report") anagWindow = anag.getTopLevel() returnWindow = self.bodyWidget.getTopLevel().get_toplevel() anagWindow.set_transient_for(returnWindow) anagWindow.show_all()
class AnagraficaPrintPreview(GladeWidget): """ Print preview """ # FIXME: a lot of duplicated code from AnagraficaFilter here! def __init__(self, anagrafica, windowTitle, previewTemplate, veter=False): GladeWidget.__init__(self, root='htmlviewer', path="htmlviewer.glade") self.windowTitle = windowTitle self.visualizzatore_html.set_title(windowTitle) self._anagrafica = anagrafica self._veter = veter self.bodyWidget = FilterWidget(owner=self, resultsElement='html') self.bodyWidget.filter_navigation_hbox.destroy() self.bodyWidget.info_label.set_markup("INSERT INFO") self.html_scrolledwindow.add_with_viewport( self.bodyWidget.getTopLevel()) self.print_on_screen_html = self.bodyWidget.resultsElement self._gtkHtmlDocuments = None self._previewTemplate = previewTemplate self.html = createHtmlObj(self) #Prendo tutti i dati dalla finestra di filtraggio, compresi i dati # di ordinamento e di batchSize self._changeOrderBy = self.bodyWidget._changeOrderBy self.orderBy = self.bodyWidget.orderBy self.batchSize = self.bodyWidget.batchSize self.offset = self.bodyWidget.offset self.numRecords = self.bodyWidget.numRecords self._filterClosure = self._anagrafica.filter._filterClosure self._filterCountClosure = self._anagrafica.filter._filterCountClosure self.placeWindow(self.visualizzatore_html) self.bodyWidget.generic_button.set_property('visible', False) def test(): self.html_code = "<html><body></body></html>" #self.html.load_html_string(self.html_code, "file:///"+sys.path[0]+os.sep) #self.html.show() #renderHTML(self.print_on_screen_html, self.html_code) #generaButton = self.bodyWidget.generic_button #generaButton.connect('clicked', self.on_generic_button_clicked ) #generaButton.set_label("Genera Pdf Anteprima Html") #if Environment.pg3: #glib.idle_add(test) #else: #gobject.idle_add(test) if Environment.pg3: glib.idle_add(self.refresh) else: gobject.idle_add(self.refresh) #self.refresh() def on_pdf_button_clicked(self, button): from PrintDialog import PrintDialogHandler from xhtml2pdf import pisa f = self.html_code.replace("€","€") g = file(Environment.tempDir + ".temp.pdf", "wb") pbar(self.pbar, pulse=True, text="GENERAZIONE STAMPA ATTENDERE") pisa.CreatePDF(str(f), g) g .close() pbar(self.pbar, stop=True) anag = PrintDialogHandler(self, self.windowTitle) anagWindow = anag.getTopLevel() returnWindow = self.bodyWidget.getTopLevel().get_toplevel() anagWindow.set_transient_for(returnWindow) anagWindow.show_all() def on_csv_button_clicked(self, button): messageInfo(msg="NON ANCORA IMPLEMENTATO") def on_generic_combobox_changed(self, combobox): if self.codBar_combo.get_active() == 0: from PrintDialog import PrintDialogHandler from xhtml2pdf import pisa f = self.html_code g = file(Environment.tempDir + ".temp.pdf", "wb") pisa.CreatePDF(str(f), g) g .close() anag = PrintDialogHandler(self, self.windowTitle) anagWindow = anag.getTopLevel() returnWindow = self.bodyWidget.getTopLevel().get_toplevel() anagWindow.set_transient_for(returnWindow) anagWindow.show_all() #self.codBar_combo.set_active(0) elif self.codBar_combo.get_active() == 1: print "ANTEPRIMA CSV" else: self.codBar_combo.set_active(-1) def _refreshPageCount(self): """ Aggiorna la paginazione """ self.bodyWidget.numRecords = self.numRecords self.bodyWidget._refreshPageCount() @timeit def refresh(self): """ show the html page in the custom widget""" self.bodyWidget.orderBy = self.orderBy self.bodyWidget.veter = self._veter #self.pbar_dialog.run() #self.pbar_dialog.destroy() daos = self.bodyWidget.runFilter(offset=None, batchSize=None, filterClosure=self._filterClosure, ) #pbar(self.pbar_report,parziale=daos.index(ragsoc), totale=len(nomi), text=ragsoc, noeta=False) #pbar(self.pbar_report,parziale=1, totale=4) if hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "cliforn": if self._anagrafica.aa < 0: daos.sort(key=lambda x: x.intestatario.strip().upper()) else: daos.sort(key=lambda x: x.intestatario.strip().upper(),reverse=True) elif hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "impo": for t in daos: try: t._totaleImponibileScontato except: t.totali if self._anagrafica.aa < 0: daos.sort(key=lambda x: x._totaleImponibileScontato) else: daos.sort(key=lambda x: x._totaleImponibileScontato,reverse=True) self.numRecords = self.bodyWidget.countFilterResults( self._filterCountClosure, ) # self._refreshPageCount() #pbar(self.pbar_report,parziale=2, totale=4) pageData = {} self.html_code = "<html><body></body></html>" if self._veter: daos = daos[:] da = [] for d in daos: c = [] for a in d.righe: if "TRIPLICE" in a.rig.arti.denominazione_famiglia: c.append(a) if len(c)>0: da.append(d) daos = da #pbar(self.pbar_report,parziale=2.5, totale=4) if daos: pageData = { "file": self._previewTemplate[1], #"dao":daos, "objects": daos } self.html_code = renderTemplate(pageData) #pbar(self.pbar_report,parziale=3.75, totale=4) #pbar(self.pbar_report,stop=True) #self.pbar_dialog.hide() renderHTML(self.print_on_screen_html, self.html_code) def on_print_on_screen_dialog_response(self, dialog, responseId): if responseId == GTK_RESPONSE_CLOSE: self.on_print_on_screen_dialog_delete_event() def on_print_on_screen_dialog_delete_event(self, dialog=None, event=None): self.destroy()
class Anagrafica(GladeWidget): """ Classe base per le anagrafiche semplici """ def __init__(self, windowTitle, recordMenuLabel, filterElement, detailElement, path=None, url_help="http://www.promogest.me/promoGest/faq"): if not path: path='anagrafica_semplice_window.glade' GladeWidget.__init__(self, root='anagrafica_semplice_window', path=path) Environment.windowGroup.append(self.anagrafica_semplice_window) self.anagrafica_semplice_window.set_title(windowTitle) self.record_menu.set_label(recordMenuLabel) self.bodyWidget = FilterWidget(owner=self, filtersElement=filterElement) #self.anagrafica_scrolledwindow.add(self.bodyWidget.getTopLevel()) self.anagrafica_viewport.add(self.bodyWidget.getTopLevel()) self.bodyWidget.filter_body_label.set_no_show_all(True) self.bodyWidget.filter_body_label.set_property('visible', False) self.bodyWidget.generic_button.set_no_show_all(True) self.bodyWidget.generic_button.set_property('visible', False) self.filter = self.bodyWidget.filtersElement self.url_help = url_help self.filterTopLevel = self.filter.getTopLevel() self.filterTopLevel.set_sensitive(True) self.detail = detailElement self.anagrafica_treeview = self.bodyWidget.resultsElement self._treeViewModel = None self._rowEditingPath = None self._tabPressed = False # mapping fields and methods from bodyWidget to this class self.anagrafica_filter_navigation_hbox = self.bodyWidget.filter_navigation_hbox self.anagrafica_filter_frame = self.bodyWidget.filter_frame self._widgetFirstFocus = self.bodyWidget._firstFocusWidget self._changeOrderBy = self.bodyWidget._changeOrderBy self.orderBy = self.bodyWidget.orderBy = None self.batchSize = self.bodyWidget.batchSize = int(setconf("Numbers", "batch_size")) self.offset = self.bodyWidget.offset = 0 self.numRecords = self.bodyWidget.numRecords = 0 self._filterClosure = None self.placeWindow(self.anagrafica_semplice_window) self.draw() self.setFocus() def draw(self): """ Facoltativo ma suggerito per indicare la lunghezza massima della cella di testo """ self._treeViewModel = self.filter.filter_listore self.refresh() def show_all(self): """ Visualizza/aggiorna tutta la struttura dell'anagrafica """ self.anagrafica_semplice_window.show_all() def on_credits_menu_activate(self, widget): creditsDialog = GladeWidget(root='credits_dialog',path='credits_dialog.glade', callbacks_proxy=self) creditsDialog.getTopLevel().set_transient_for(self.getTopLevel()) creditsDialog.getTopLevel().show_all() response = creditsDialog.credits_dialog.run() if response == GTK_RESPONSE_OK: creditsDialog.credits_dialog.destroy() def on_send_Email_activate(self, widget): sendemail = SendEmail() def on_help_activated(self, widget): webbrowser.open_new_tab(self.url_help) def on_licenza_menu_activate(self, widget): licenzaDialog = GladeWidget(root='licenza_dialog',path="licenza_dialog.glade", callbacks_proxy=self) licenzaDialog.getTopLevel().set_transient_for(self.getTopLevel()) licenseText = '' try: lines = open('./LICENSE').readlines() for l in lines: licenseText += l except: licenseText = 'Lavori in corso ....' print 'License file not found (LICENSE).' textBuffer = licenzaDialog.licenza_textview.get_buffer() textBuffer.set_text(licenseText) licenzaDialog.licenza_textview.set_buffer(textBuffer) licenzaDialog.getTopLevel().show_all() response = licenzaDialog.licenza_dialog.run() if response == GTK_RESPONSE_OK: licenzaDialog.licenza_dialog.destroy() def on_record_new_activate(self, widget,codice=None): """ Nuovo record """ if codice: self.detail.setDao(None, codice=codice) else: self.detail.setDao(None) if self._windowName == 'AnagraficaBanche': from AnagraficaBancheEdit import AnagraficaBancheEdit anag = AnagraficaBancheEdit(self, codice=codice) return self.filterTopLevel.set_sensitive(False) self.anagrafica_filter_navigation_hbox.set_sensitive(False) self.anagrafica_filter_frame.set_sensitive(False) self.anagrafica_treeview_set_edit(True) self.anagrafica_treeview.set_headers_clickable(False) self.anagrafica_treeview.set_enable_search(False) self.record_new_button.set_sensitive(False) self.record_new_menu.set_sensitive(False) self.record_save_button.set_sensitive(True) self.record_save_menu.set_sensitive(True) self.record_cancel_button.set_sensitive(True) self.record_cancel_menu.set_sensitive(True) self.record_undo_button.set_sensitive(False) self.record_undo_menu.set_sensitive(False) self.record_delete_button.set_sensitive(False) self.record_delete_menu.set_sensitive(False) def on_record_delete_activate(self, widget): """ Eliminazione record """ if not YesNoDialog(msg='Confermi l\'eliminazione ?', transient=None): self.anagrafica_treeview.grab_focus() return self.detail.deleteDao() self.refresh() self.filterTopLevel.set_sensitive(True) self.anagrafica_filter_navigation_hbox.set_sensitive(True) self.anagrafica_filter_frame.set_sensitive(True) self.anagrafica_treeview_set_edit(False) self.anagrafica_treeview.set_headers_clickable(True) self.anagrafica_treeview.set_enable_search(True) self.record_new_button.set_sensitive(True) self.record_new_menu.set_sensitive(True) self.record_save_button.set_sensitive(False) self.record_save_menu.set_sensitive(False) self.record_cancel_button.set_sensitive(False) self.record_cancel_menu.set_sensitive(False) self.record_undo_button.set_sensitive(False) self.record_undo_menu.set_sensitive(False) self.record_delete_button.set_sensitive(False) self.record_delete_menu.set_sensitive(False) self.setFocus() def on_record_save_activate(self, widget, path=None, column=None): """ Salvataggio record """ self.anagrafica_treeview.grab_focus() try: self.detail.saveDao() except Exception: self.anagrafica_treeview_set_edit(True) return self.filterTopLevel.set_sensitive(True) self.anagrafica_filter_navigation_hbox.set_sensitive(True) self.anagrafica_filter_frame.set_sensitive(True) self.anagrafica_treeview_set_edit(False) self.anagrafica_treeview.set_headers_clickable(True) self.anagrafica_treeview.set_enable_search(True) self.refresh() self.record_new_button.set_sensitive(True) self.record_new_menu.set_sensitive(True) self.record_save_button.set_sensitive(False) self.record_save_menu.set_sensitive(False) self.record_cancel_button.set_sensitive(False) self.record_cancel_menu.set_sensitive(False) self.record_undo_button.set_sensitive(False) self.record_undo_menu.set_sensitive(False) self.record_delete_button.set_sensitive(False) self.record_delete_menu.set_sensitive(False) self.setFocus() def on_record_cancel_activate(self, widget): """ Annullamento modifiche record """ if self._rowEditingPath is None: return dialog = gtk.MessageDialog(self.getTopLevel(), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_MESSAGE_QUESTION, GTK_BUTTON_YES_NO, 'Abbandonare le modifiche ?') response = dialog.run() dialog.destroy() if response != GTK_RESPONSE_YES: self.anagrafica_treeview.grab_focus() return self.anagrafica_treeview.grab_focus() self.detail.updateDao() self.filterTopLevel.set_sensitive(True) self.anagrafica_filter_navigation_hbox.set_sensitive(True) self.anagrafica_filter_frame.set_sensitive(True) self.anagrafica_treeview_set_edit(False) self.anagrafica_treeview.set_headers_clickable(True) self.anagrafica_treeview.set_enable_search(True) self.refresh() self.record_new_button.set_sensitive(True) self.record_new_menu.set_sensitive(True) self.record_save_button.set_sensitive(False) self.record_save_menu.set_sensitive(False) self.record_cancel_button.set_sensitive(False) self.record_cancel_menu.set_sensitive(False) self.record_undo_button.set_sensitive(False) self.record_undo_menu.set_sensitive(False) self.record_delete_button.set_sensitive(False) self.record_delete_menu.set_sensitive(False) self.setFocus() def on_export_csv_button_clicked(self, button): dao = self.detail.setDao(None) from ExportCsv import ExportCsv anag = ExportCsv(self, dao=dao) dao=None return def on_record_undo_activate(self, widget): """ Rilettura record """ if self._rowEditingPath is None: return dialog = gtk.MessageDialog(self.getTopLevel(), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_MESSAGE_QUESTION, GTK_BUTTON_YES_NO, 'Cancellare le modifiche ?') response = dialog.run() dialog.destroy() if response != GTK_RESPONSE_YES: self.anagrafica_treeview.grab_focus() self.anagrafica_treeview_set_edit(True) return self.anagrafica_treeview.grab_focus() self.detail.updateDao() self.filterTopLevel.set_sensitive(False) self.anagrafica_filter_navigation_hbox.set_sensitive(False) self.anagrafica_filter_frame.set_sensitive(False) self.anagrafica_treeview.set_headers_clickable(False) self.anagrafica_treeview.set_enable_search(False) self.record_new_button.set_sensitive(False) self.record_new_menu.set_sensitive(False) self.record_save_button.set_sensitive(True) self.record_save_menu.set_sensitive(True) self.record_cancel_button.set_sensitive(True) self.record_cancel_menu.set_sensitive(True) self.record_undo_button.set_sensitive(True) self.record_undo_menu.set_sensitive(True) self.record_delete_button.set_sensitive(True) self.record_delete_menu.set_sensitive(True) self.record_edit_button.set_sensitive(False) self.record_edit_menu.set_sensitive(False) def on_record_edit_activate(self, widget): """ Modifica record """ self.detail.updateDao() if self._windowName == 'AnagraficaBanche': from AnagraficaBancheEdit import AnagraficaBancheEdit anag = AnagraficaBancheEdit(self, dao=self.detail.dao) return self.filterTopLevel.set_sensitive(False) self.anagrafica_filter_navigation_hbox.set_sensitive(False) self.anagrafica_filter_frame.set_sensitive(False) self.anagrafica_treeview_set_edit(True) self.anagrafica_treeview.set_headers_clickable(False) self.anagrafica_treeview.set_enable_search(False) self.record_new_button.set_sensitive(False) self.record_new_menu.set_sensitive(False) self.record_save_button.set_sensitive(True) self.record_save_menu.set_sensitive(True) self.record_cancel_button.set_sensitive(True) self.record_cancel_menu.set_sensitive(True) self.record_undo_button.set_sensitive(True) self.record_undo_menu.set_sensitive(True) self.record_delete_button.set_sensitive(True) self.record_delete_menu.set_sensitive(True) self.record_edit_button.set_sensitive(False) self.record_edit_menu.set_sensitive(False) def setFocus(self, widget=None): """ Da il fuoco al widget indicato o al primo widget """ if widget is None: self.filter._widgetFirstFocus.grab_focus() else: widget.grab_focus() def on_filter_treeview_row_activated(self, treeview, path, column): """ Gestisce la conferma della riga """ if self._rowEditingPath is None: self.on_record_edit_activate(self.record_edit_button) def on_filter_treeview_cursor_changed(self, treeview): """ Gestisce lo spostamento tra le righe """ sel = self.anagrafica_treeview.get_selection() if not sel: return (model, iterator) = sel.get_selected() if self._rowEditingPath is not None: if iterator: row = model[iterator] if row.path != self._rowEditingPath: sel.select_path(self._rowEditingPath) return else: if iterator is None: return dao = model.get_value(iterator, 0) self.detail.setDao(dao) self.record_edit_button.set_sensitive(True) self.record_edit_menu.set_sensitive(True) def on_filter_treeview_selection_changed(self, selection): pass def _newRow(self, modelRow): """ Crea una nuova riga """ sel = self.anagrafica_treeview.get_selection() (model, iterator) = sel.get_selected() iterator = model.append(modelRow) sel.select_iter(iterator) def _getRowEditingPath(self, model, iterator): """ Restituisce il path relativo alla riga che e' in modifica """ if iterator is not None: row = model[iterator] self._rowEditingPath = row.path def on_filter_treeview_keypress_event(self, treeview, event): """ Gestisce la pressione del tab su una cella """ if event.keyval == 65289: self._tabPressed = True def on_column_edited(self, cell, path, value, treeview, editNext=True, column=None): """ Gestisce l'immagazzinamento dei valori nelle celle """ model = treeview.get_model() iterator = model.get_iter(path) if column is None: column = cell.column row = model[iterator] if row.path == self._rowEditingPath: if cell.__class__ is gtk.CellRendererText: try: length = cell.get_data('max_length') model.set_value(iterator, column+1, value[:length]) except: model.set_value(iterator, column+1, value) elif cell.__class__ is gtk.CellRendererToggle: model.set_value(iterator, column+1, not cell.get_active()) columns = treeview.get_columns() if column+1 <= columns: if self._tabPressed: self._tabPressed = False gobject.timeout_add(1, treeview.set_cursor, gtk.TreePath(str(path)), treeview.get_column(column+1), editNext) def anagrafica_treeview_set_edit(self, flag): """ Mette la riga corrente della treeview in stato di edit / browse """ sel = self.anagrafica_treeview.get_selection() (model, iterator) = sel.get_selected() columns = self.anagrafica_treeview.get_columns() for c in columns: renderers = c.get_cells() for r in renderers: if r.__class__ is gtk.CellRendererText: r.set_property('editable', flag) elif r.__class__ is gtk.CellRendererToggle: r.set_property('activatable', flag) if flag: self._getRowEditingPath(model, iterator) row = model[iterator] column = self.anagrafica_treeview.get_column(0) self.anagrafica_treeview.grab_focus() self.anagrafica_treeview.set_cursor(row.path, column, True) else: self._rowEditingPath = None def on_anagrafica_window_close(self, widget, event=None): """ Gestisce la richiesta di uscita dall'anagrafica """ if self._rowEditingPath is not None: dialog = gtk.MessageDialog(self.getTopLevel(), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_MESSAGE_QUESTION, GTK_BUTTON_YES_NO, 'Confermi la chiusura ?') response = dialog.run() dialog.destroy() if response != GTK_RESPONSE_YES: return True self.destroy() #def draw(self): #""" #Disegna i contenuti dell'elenco dell' anagrafica. Metodo invocato #una sola volta, dopo la costruzione dell'oggetto #""" #raise NotImplementedError def refresh(self): """ Aggiorna il l'elenco dell'anagrafica in base ai parametri impostati """ raise NotImplementedError def clear(self): """ Annulla i parametri impostati per la ricerca """ self.filter.clear() def runFilter(self, offset='__default__', batchSize='__default__', progressCB=None, progressBatchSize=0): """ Recupera i dati """ self.bodyWidget.orderBy = self.orderBy return self.bodyWidget.runFilter(offset=offset, batchSize=batchSize, progressCB=progressCB, progressBatchSize=progressBatchSize, filterClosure=self._filterClosure) def _refreshPageCount(self): """ Aggiorna la paginazione """ self.bodyWidget.numRecords = self.numRecords self.bodyWidget._refreshPageCount()
class Visualizzazione(GladeWidget): """ Classe base per le visualizzazioni di Promogest """ def __init__(self, windowTitle, filterElement): GladeWidget.__init__(self, root='visualizzazione_window', path='visualizzazione_window.glade') self.visualizzazione_window.set_title(windowTitle) self.dao = None self._setFilterElement(filterElement) self.placeWindow(self.visualizzazione_window) self.filter.draw() def _setFilterElement(self, gladeWidget): self.bodyWidget = FilterWidget(owner=gladeWidget, filtersElement=gladeWidget) self.visualizzazione_viewport.add(self.bodyWidget.getTopLevel()) self.bodyWidget.filter_body_label.set_no_show_all(True) self.bodyWidget.filter_body_label.set_property('visible', False) self.filter = self.bodyWidget.filtersElement self.filterTopLevel = self.filter.getTopLevel() self.filterTopLevel.set_sensitive(True) self.visualizzazione_filter_treeview = self.bodyWidget.resultsElement self._treeViewModel = None gladeWidget.build() def show_all(self): """ Visualizza/aggiorna tutta la struttura della visualizzazione """ self.visualizzazione_window.show_all() def on_filter_treeview_row_activated(self, treeview, path, column): """ Gestisce la conferma della riga """ self.visualizzazione_window.hide() def on_filter_treeview_cursor_changed(self, treeview): """ Gestisce lo spostamento tra le righe """ sel = self.visualizzazione_filter_treeview.get_selection() (model, iterator) = sel.get_selected() if iterator is None: #print 'visualizzazione.on_filter_treeview_cursor_changed(): FIXME: iterator is None!' return self.dao = model.get_value(iterator, 0) def on_confirm_button_clicked(self, widget): """ Riga confermata """ self.visualizzazione_window.hide() def on_visualizzazione_window_close(self, widget, event=None): """ Uscita """ self.destroy() return None