class ProductSearch(SearchEditor): title = _('Product Search') table = Product size = (775, 450) search_table = ProductFullWithClosedStockView editor_class = ProductEditor footer_ok_label = _('Add products') searchbar_result_strings = (_('product'), _('products')) def __init__(self, store, hide_footer=True, hide_toolbar=False, selection_mode=gtk.SELECTION_BROWSE, hide_cost_column=False, use_product_statuses=None, hide_price_column=False): """ Create a new ProductSearch object. :param store: a store :param hide_footer: do I have to hide the dialog footer? :param hide_toolbar: do I have to hide the dialog toolbar? :param selection_mode: the kiwi list selection mode :param hide_cost_column: if it's True, no need to show the column 'cost' :param use_product_statuses: a list instance that, if provided, will overwrite the statuses list defined in get_filter_slave method :param hide_price_column: if it's True no need to show the column 'price' """ self.use_product_statuses = use_product_statuses self.hide_cost_column = hide_cost_column self.hide_price_column = hide_price_column SearchEditor.__init__(self, store, hide_footer=hide_footer, hide_toolbar=hide_toolbar, selection_mode=selection_mode) self.set_searchbar_labels(_('matching')) self._setup_print_slave() def _setup_print_slave(self): self._print_slave = SearchDialogPrintSlave() change_button_appearance(self._print_slave.print_price_button, gtk.STOCK_PRINT, _("_Price table")) self.attach_slave('print_holder', self._print_slave) self._print_slave.connect('print', self.on_print_price_button_clicked) self._print_slave.print_price_button.set_sensitive(False) self.results.connect('has-rows', self._has_rows) def on_print_button_clicked(self, button): print_report(ProductReport, self.results, list(self.results), filters=self.search.get_search_filters()) def on_print_price_button_clicked(self, button): print_report(ProductPriceReport, list(self.results), filters=self.search.get_search_filters(), branch_name=self.branch_filter.combo.get_active_text()) def _has_rows(self, results, obj): SearchEditor._has_rows(self, results, obj) self._print_slave.print_price_button.set_sensitive(obj) # # SearchDialog Hooks # def setup_widgets(self): self.csv_button = self.add_button(label=_('Export to spreadsheet...')) self.csv_button.connect('clicked', self._on_export_csv_button__clicked) self.csv_button.show() self.csv_button.set_sensitive(False) self.results.connect('has_rows', self._on_results__has_rows) def create_filters(self): self.set_text_field_columns(['description', 'barcode', 'category_description']) self.executer.set_query(self.executer_query) # Branch branch_filter = self.create_branch_filter(_('In branch:')) branch_filter.select(None) self.add_filter(branch_filter, columns=[]) self.branch_filter = branch_filter # Status statuses = [(desc, id) for id, desc in Sellable.statuses.items()] statuses.insert(0, (_('Any'), None)) status_filter = ComboSearchFilter(_('with status:'), statuses) status_filter.select(None) self.add_filter(status_filter, columns=['status'], position=SearchFilterPosition.TOP) self.status_filter = status_filter # # SearchEditor Hooks # def get_editor_model(self, product_full_stock_view): return product_full_stock_view.product def get_columns(self): cols = [SearchColumn('code', title=_('Code'), data_type=str, sort_func=sort_sellable_code, sorted=True), SearchColumn('barcode', title=_('Barcode'), data_type=str), SearchColumn('category_description', title=_(u'Category'), data_type=str, width=120), SearchColumn('description', title=_(u'Description'), expand=True, data_type=str), SearchColumn('manufacturer', title=_('Manufacturer'), data_type=str, visible=False), SearchColumn('model', title=_('Model'), data_type=str, visible=False), SearchColumn('location', title=_('Location'), data_type=str, visible=False)] # The price/cost columns must be controlled by hide_cost_column and # hide_price_column. Since the product search will be available across # the applications, it's important to restrict such columns depending # of the context. if not self.hide_cost_column: cols.append(SearchColumn('cost', _('Cost'), data_type=currency, format_func=get_formatted_cost, width=90)) if not self.hide_price_column: cols.append(Column('price', title=_('Price'), data_type=currency, width=90)) cols.append(Column('stock', title=_('Stock'), format_func=format_quantity, data_type=Decimal, width=80)) return cols def executer_query(self, store): branch_id = self.branch_filter.get_state().value if branch_id is None: branch = None else: branch = store.get(Branch, branch_id) results = self.search_table.find_by_branch(store, branch) return results.find(Product.is_composed == False) # # Callbacks # def _on_export_csv_button__clicked(self, widget): sse = SpreadSheetExporter() sse.export(object_list=self.results, name=_('Product'), filename_prefix=_('product')) def _on_results__has_rows(self, widget, has_rows): self.csv_button.set_sensitive(has_rows)
class ServiceSearch(SearchEditor): title = _('Service Search') table = Service search_table = ServiceView size = (-1, 450) editor_class = ServiceEditor model_list_lookup_attr = 'service_id' footer_ok_label = _('Add services') searchbar_result_strings = (_('service'), _('services')) def __init__(self, store, hide_footer=True, hide_toolbar=False, selection_mode=gtk.SELECTION_BROWSE, hide_cost_column=False, use_product_statuses=None, hide_price_column=False): self.hide_cost_column = hide_cost_column self.hide_price_column = hide_price_column self.use_product_statuses = use_product_statuses SearchEditor.__init__(self, store, hide_footer=hide_footer, hide_toolbar=hide_toolbar, selection_mode=selection_mode) self.set_searchbar_labels(_('matching')) self._setup_print_slave() def _setup_print_slave(self): self._print_slave = SearchDialogPrintSlave() change_button_appearance(self._print_slave.print_price_button, gtk.STOCK_PRINT, _("Price table")) self.attach_slave('print_holder', self._print_slave) self._print_slave.connect('print', self.on_print_price_button_clicked) self._print_slave.print_price_button.set_sensitive(False) self.results.connect('has-rows', self._has_rows) def _has_rows(self, results, obj): SearchEditor._has_rows(self, results, obj) self._print_slave.print_price_button.set_sensitive(obj) # # SearchDialog Hooks # def create_filters(self): self.set_text_field_columns(['description', 'barcode']) items = [(v, k) for k, v in Sellable.statuses.items()] items.insert(0, (_('Any'), None)) service_filter = ComboSearchFilter(_('Show services'), items) service_filter.select(None) self.executer.add_query_callback(self._get_query) self.add_filter(service_filter, SearchFilterPosition.TOP, ['status']) # # SearchEditor Hooks # @argcheck(ServiceView) def get_editor_model(self, model): return Service.get(model.service_id, store=self.store) def get_columns(self): columns = [SearchColumn('code', title=_('Code'), data_type=str, sorted=True, sort_func=sort_sellable_code, width=130), SearchColumn('barcode', title=_('Barcode'), data_type=str, visible=True, width=130), SearchColumn('description', title=_('Description'), data_type=str, expand=True)] if not self.hide_cost_column: columns.append(SearchColumn('cost', _('Cost'), data_type=currency, width=80)) if not self.hide_price_column: columns.append(SearchColumn('price', title=_('Price'), data_type=currency, width=80)) return columns def _get_query(self, states): return ServiceView.service_id != None def on_print_button_clicked(self, button): print_report(ServiceReport, self.results, list(self.results), filters=self.search.get_search_filters()) def on_print_price_button_clicked(self, button): print_report(ServicePriceReport, list(self.results), filters=self.search.get_search_filters())