def __init__(self, store, columns=None, editor_class=None, klist_objects=None, visual_mode=False, restore_name=None): """ Creates a new AdditionListSlave object :param store: a store :param columns: column definitions :type columns: sequence of :class:`kiwi.ui.widgets.list.Columns` :param editor_class: the window that is going to be open when user clicks on add_button or edit_button. :type: editor_class: a :class:`stoqlib.gui.editors.BaseEditor` subclass :param klist_objects: initial objects to insert into the list :param visual_mode: if we are working on visual mode, that means, not possible to edit the model on this object type visual_mode: bool :param restore_name: the name used to save and restore the columns on a cache system (e.g. pickle) :type restore_name: basestring """ columns = columns or self.get_columns() StoqlibSearchSlaveDelegate.__init__(self, columns=columns, restore_name=restore_name) if not self._columns: raise StoqlibError("columns must be specified") self.visual_mode = visual_mode self.store = store self.set_editor(editor_class) self._can_edit = True self._callback_id = None if self.visual_mode: self.hide_add_button() self.hide_edit_button() self.hide_del_button() items = klist_objects or self.get_items() self._setup_klist(items) self._update_sensitivity()
def setup_slaves(self): self.search = StoqlibSearchSlaveDelegate(self._get_columns(), restore_name=self.__class__.__name__) self.search.enable_advanced_search() self.attach_slave('place_holder', self.search) self.executer = StoqlibQueryExecuter(self.store) self.search.set_query_executer(self.executer) self.executer.set_table(LoanView) self.executer.add_query_callback(self.get_extra_query) self._create_filters() self.search.results.connect('selection-changed', self._on_results_selection_changed) self.search.focus_search_entry()
def _setup_slaves(self): self.search = StoqlibSearchSlaveDelegate(self._get_columns(), restore_name=self.__class__.__name__) self.attach_slave('search_group_holder', self.search) executer = StoqlibQueryExecuter(self.store) executer.set_table(QuotationView) self.search.set_query_executer(executer) self.search.set_text_field_columns(['supplier_name']) filter = self.search.get_primary_filter() filter.set_label(_(u'Supplier:')) self.search.focus_search_entry() self.search.results.connect('selection-changed', self._on_searchlist__selection_changed) self.search.results.connect('row-activated', self._on_searchlist__row_activated) date_filter = DateSearchFilter(_('Date:')) self.search.add_filter(date_filter, columns=['open_date', 'deadline']) self.edit_button.set_sensitive(False) self.remove_button.set_sensitive(False)
class LoanSelectionStep(BaseWizardStep): gladefile = 'HolderTemplate' def __init__(self, wizard, store): BaseWizardStep.__init__(self, store, wizard) self.setup_slaves() def _create_filters(self): self.search.set_text_field_columns(['client_name']) def _get_columns(self): return [SearchColumn('identifier', title=_('#'), sorted=True, data_type=int), SearchColumn('responsible_name', title=_(u'Responsible'), data_type=str, expand=True), SearchColumn('client_name', title=_(u'Client'), data_type=str, expand=True), SearchColumn('open_date', title=_(u'Opened'), data_type=datetime.date), SearchColumn('expire_date', title=_(u'Expire'), data_type=datetime.date), Column('loaned', title=_(u'Loaned'), data_type=Decimal), ] def _refresh_next(self, value=None): has_selected = self.search.results.get_selected() is not None self.wizard.refresh_next(has_selected) def get_extra_query(self, states): return LoanView.status == Loan.STATUS_OPEN def setup_slaves(self): self.search = StoqlibSearchSlaveDelegate(self._get_columns(), restore_name=self.__class__.__name__) self.search.enable_advanced_search() self.attach_slave('place_holder', self.search) self.executer = StoqlibQueryExecuter(self.store) self.search.set_query_executer(self.executer) self.executer.set_table(LoanView) self.executer.add_query_callback(self.get_extra_query) self._create_filters() self.search.results.connect('selection-changed', self._on_results_selection_changed) self.search.focus_search_entry() # # WizardStep # def has_previous_step(self): return False def post_init(self): self.register_validate_function(self._refresh_next) self.force_validation() def next_step(self): loan = self.search.results.get_selected().loan # FIXME: For some reason, the loan isn't in self.store self.wizard.model = self.store.fetch(loan) return LoanItemSelectionStep(self.wizard, self, self.store, self.wizard.model) # # Callbacks # def _on_results_selection_changed(self, widget, selection): self._refresh_next()
class QuoteGroupSelectionStep(BaseWizardStep): gladefile = 'QuoteGroupSelectionStep' def __init__(self, wizard, store): self._next_step = None BaseWizardStep.__init__(self, store, wizard) self._setup_slaves() def _setup_slaves(self): self.search = StoqlibSearchSlaveDelegate(self._get_columns(), restore_name=self.__class__.__name__) self.attach_slave('search_group_holder', self.search) executer = StoqlibQueryExecuter(self.store) executer.set_table(QuotationView) self.search.set_query_executer(executer) self.search.set_text_field_columns(['supplier_name']) filter = self.search.get_primary_filter() filter.set_label(_(u'Supplier:')) self.search.focus_search_entry() self.search.results.connect('selection-changed', self._on_searchlist__selection_changed) self.search.results.connect('row-activated', self._on_searchlist__row_activated) date_filter = DateSearchFilter(_('Date:')) self.search.add_filter(date_filter, columns=['open_date', 'deadline']) self.edit_button.set_sensitive(False) self.remove_button.set_sensitive(False) def _get_columns(self): return [Column('identifier', title=_('Quote'), sorted=True, data_type=int, format="%04d"), Column('group_identifier', title=_('Group'), data_type=int, format="%04d"), Column('supplier_name', title=_('Supplier'), data_type=str, width=300), Column('open_date', title=_('Open date'), data_type=datetime.date), Column('deadline', title=_('Deadline'), data_type=datetime.date)] def _can_purchase(self, item): return item.cost > currency(0) and item.quantity > Decimal(0) def _can_order(self, quotation): if quotation is None: return False for item in quotation.purchase.get_items(): if not self._can_purchase(item): return False return True def _update_view(self): selected = self.search.results.get_selected() has_selected = selected is not None self.edit_button.set_sensitive(has_selected) self.remove_button.set_sensitive(has_selected) self.wizard.refresh_next(self._can_order(selected)) def _run_quote_editor(self): store = api.new_store() selected = store.fetch(self.search.results.get_selected().purchase) retval = run_dialog(QuoteFillingDialog, self.wizard, selected, store) store.confirm(retval) store.close() self._update_view() def _remove_quote(self): q = self.search.results.get_selected().quotation msg = _('Are you sure you want to remove "%s" ?') % q.get_description() if not yesno(msg, gtk.RESPONSE_NO, _("Remove quote"), _("Don't remove")): return store = api.new_store() group = store.fetch(q.group) quote = store.fetch(q) group.remove_item(quote) # there is no reason to keep the group if there's no more quotes if group.get_items().count() == 0: QuoteGroup.delete(group.id, store=store) store.confirm(True) store.close() self.search.refresh() # # WizardStep hooks # def next_step(self): self.search.save_columns() selected = self.search.results.get_selected() if selected is None: return return QuoteGroupItemsSelectionStep(self.wizard, self.store, selected.group, self) # # Callbacks # def _on_searchlist__selection_changed(self, widget, item): self._update_view() def _on_searchlist__row_activated(self, widget, item): self._run_quote_editor() def on_edit_button__clicked(self, widget): self._run_quote_editor() def on_remove_button__clicked(self, widget): self._remove_quote()