Broad refactor to improve customization of purchase order form etc.

* add dropdown alternative for autocomplete renderer
* auto-enhance some common dropdowns
* refactor new purchase batch, order form view/templates
This commit is contained in:
Lance Edgar 2017-03-24 17:22:12 -05:00
parent e71204dcec
commit d373eb9ac1
9 changed files with 260 additions and 148 deletions

View file

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2016 Lance Edgar
# Copyright © 2010-2017 Lance Edgar
#
# This file is part of Rattail.
#
@ -92,7 +92,14 @@ class AutocompleteFieldRenderer(fa.FieldRenderer):
def service_url(self):
return self.request.route_url(self.service_route)
def render(self, **kwargs):
def render(self, options=None, **kwargs):
if kwargs.pop('autocomplete', True):
return self.render_autocomplete(**kwargs)
# 'selected' is a kwarg for autocomplete template *and* select tag
kwargs.pop('selected', None)
return self.render_dropdown(options, **kwargs)
def render_autocomplete(self, **kwargs):
kwargs.setdefault('field_name', self.name)
kwargs.setdefault('field_value', self.field_value)
kwargs.setdefault('field_display', self.field_display)
@ -100,6 +107,22 @@ class AutocompleteFieldRenderer(fa.FieldRenderer):
kwargs.setdefault('width', self.width)
return render('/forms/field_autocomplete.mako', kwargs)
def render_dropdown(self, options, **kwargs):
# NOTE: this logic copied from formalchemy.fields.SelectFieldRenderer.render()
kwargs.setdefault('auto-enhance', 'true')
if callable(options):
L = fa_fields._normalized_options(options(self.field.parent))
if not self.field.is_required() and not self.field.is_collection:
L.insert(0, self.field._null_option)
else:
L = list(options)
if len(L) > 0:
if len(L[0]) == 2:
L = [(k, self.stringify_value(v)) for k, v in L]
else:
L = [fa_fields._stringify(k) for k in L]
return fa_fields.h.select(self.name, self.value, L, **kwargs)
def render_readonly(self, **kwargs):
value = self.field_display
if value is None:

View file

@ -108,6 +108,10 @@ class DepartmentFieldRenderer(SelectFieldRenderer):
Shows the department number as well as the name.
"""
def render(self, **kwargs):
kwargs.setdefault('auto-enhance', 'true')
return super(DepartmentFieldRenderer, self).render(**kwargs)
def render_readonly(self, **kwargs):
department = self.raw_value
if not department:

View file

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2015 Lance Edgar
# Copyright © 2010-2017 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,9 +24,10 @@
Store Field Renderers
"""
from __future__ import unicode_literals
from __future__ import unicode_literals, absolute_import
from formalchemy.fields import SelectFieldRenderer
from webhelpers.html import tags
class StoreFieldRenderer(SelectFieldRenderer):
@ -34,8 +35,15 @@ class StoreFieldRenderer(SelectFieldRenderer):
Renderer for :class:`rattail.db.model.Store` instance fields.
"""
def render(self, **kwargs):
kwargs.setdefault('auto-enhance', 'true')
return super(StoreFieldRenderer, self).render(**kwargs)
def render_readonly(self, **kwargs):
store = self.raw_value
if not store:
return ''
return '{0} - {1}'.format(store.id, store.name)
return ""
text = "({}) {}".format(store.id, store.name)
if kwargs.get('hyperlink', True):
return tags.link_to(text, self.request.route_url('stores.view', uuid=store.uuid))
return text

View file

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2016 Lance Edgar
# Copyright © 2010-2017 Lance Edgar
#
# This file is part of Rattail.
#
@ -41,8 +41,11 @@ class VendorFieldRenderer(AutocompleteFieldRenderer):
def render_readonly(self, **kwargs):
vendor = self.raw_value
if not vendor:
return ''
return tags.link_to(vendor, self.request.route_url('vendors.view', uuid=vendor.uuid))
return ""
text = "({}) {}".format(vendor.id, vendor.name)
if kwargs.get('hyperlink', True):
return tags.link_to(text, self.request.route_url('vendors.view', uuid=vendor.uuid))
return text
class PurchaseFieldRenderer(SelectFieldRenderer):