diff --git a/tailbone_corepos/views/corepos/master.py b/tailbone_corepos/views/corepos/master.py index 283c925..faede1a 100644 --- a/tailbone_corepos/views/corepos/master.py +++ b/tailbone_corepos/views/corepos/master.py @@ -95,3 +95,11 @@ class CoreOfficeMasterView(MasterView): text = "({}) {}".format(department.dept_no, department.dept_name) url = self.request.route_url('corepos.departments.view', dept_no=department.dept_no) return tags.link_to(text, url) + + def render_corepos_vendor(self, obj, field): + vendor = getattr(obj, field) + if not vendor: + return "" + text = "({}) {}".format(vendor.abbreviation, vendor.name) + url = self.request.route_url('corepos.vendors.view', id=vendor.id) + return tags.link_to(text, url) diff --git a/tailbone_corepos/views/corepos/products.py b/tailbone_corepos/views/corepos/products.py index a29a678..c86fcfc 100644 --- a/tailbone_corepos/views/corepos/products.py +++ b/tailbone_corepos/views/corepos/products.py @@ -24,6 +24,8 @@ CORE-POS product views """ +from webhelpers2.html import HTML + from corepos.db import model as corepos from .master import CoreOfficeMasterView @@ -56,7 +58,7 @@ class ProductView(CoreOfficeMasterView): 'qttyEnforced': "Qty. Enforced", 'idEnforced': "ID Enforced", 'inUse': "In Use", - 'numflag': "Num. Flag", + 'numflag': "Flags", 'subdept': "Subdept. No.", 'default_vendor_id': "Default Vendor ID", 'current_origin_id': "Current Origin ID", @@ -79,8 +81,10 @@ class ProductView(CoreOfficeMasterView): g.set_joiner('department', lambda q: q.outerjoin(corepos.Department)) g.set_sorter('department', corepos.Department.dept_name) - g.set_joiner('vendor', lambda q: q.outerjoin(corepos.Vendor)) - g.set_sorter('vendor', corepos.Vendor.vendorName) + g.set_joiner('vendor', lambda q: q.outerjoin(corepos.Vendor, + corepos.Vendor.id == corepos.Product.default_vendor_id)) + g.set_sorter('vendor', corepos.Vendor.name) + g.set_filter('vendor', corepos.Vendor.name) g.filters['upc'].default_active = True g.filters['upc'].default_verb = 'equal' @@ -97,6 +101,10 @@ class ProductView(CoreOfficeMasterView): def configure_form(self, f): super(ProductView, self).configure_form(f) + f.set_renderer('vendor', self.render_corepos_vendor) + + f.set_renderer('numflag', self.render_flags) + f.set_type('start_date', 'datetime_local') f.set_type('end_date', 'datetime_local') f.set_type('modified', 'datetime_local') @@ -108,6 +116,49 @@ class ProductView(CoreOfficeMasterView): f.set_type('cost', 'currency') f.set_type('deposit', 'currency') + def render_flags(self, product, field): + flags = product.numflag + if not flags: + return "" + + # fetch all flags which are actually defined (supported) + supported = {} + for flag in self.Session.query(corepos.ProductFlag): + supported[flag.bit_number] = flag + + # convert product's flag value to string of bits + bflags = bin(flags)[2:] # remove '0b' prefix + bflags = reversed(bflags) # make bit #1 first in string, etc. + + # create list of items to show each "set" flag + items = [] + for i, bit in enumerate(bflags, 1): + if bit == '1': + flag = supported.get(i) + if flag: + items.append(HTML.tag('li', c=flag.description)) + else: + items.append(HTML.tag('li', c="(unsupported bit #{})".format(i))) + + return HTML.tag('ul', c=items) + + +class ProductFlagView(CoreOfficeMasterView): + """ + Master view for product flags + """ + model_class = corepos.ProductFlag + model_title = "CORE-POS Product Flag" + url_prefix = '/core-pos/product-flags' + route_prefix = 'corepos.product_flags' + + def configure_grid(self, g): + super(ProductFlagView, self).configure_grid(g) + + g.set_link('bit_number') + g.set_link('description') + def includeme(config): ProductView.defaults(config) + ProductFlagView.defaults(config) diff --git a/tailbone_corepos/views/corepos/vendors.py b/tailbone_corepos/views/corepos/vendors.py index 62a4d67..cf596a9 100644 --- a/tailbone_corepos/views/corepos/vendors.py +++ b/tailbone_corepos/views/corepos/vendors.py @@ -37,22 +37,35 @@ class VendorView(CoreOfficeMasterView): model_title = "CORE-POS Vendor" url_prefix = '/core-pos/vendors' route_prefix = 'corepos.vendors' + creatable = True + editable = True + deletable = True labels = { - 'vendorID': "ID", - 'vendorName': "Name", - 'vendorAbbreviation': "Abbreviation", - 'discountRate': "Discount Rate", + 'id': "ID", } grid_columns = [ - 'vendorID', - 'vendorName', - 'vendorAbbreviation', - 'discountRate', + 'id', + 'name', + 'abbreviation', + 'discount_rate', 'contact', ] + def configure_grid(self, g): + super(VendorView, self).configure_grid(g) + + g.set_link('id') + g.set_link('name') + g.set_link('abbreviation') + + def configure_form(self, f): + super(VendorView, self).configure_form(f) + + if self.creating: + f.remove_field('contact') + def includeme(config): VendorView.defaults(config)