Use clientele handler to populate customer dropdown widget
This commit is contained in:
parent
faeb2cb7e2
commit
3e4bbf7092
6
docs/api/forms.widgets.rst
Normal file
6
docs/api/forms.widgets.rst
Normal file
|
@ -0,0 +1,6 @@
|
|||
|
||||
``tailbone.forms.widgets``
|
||||
==========================
|
||||
|
||||
.. automodule:: tailbone.forms.widgets
|
||||
:members:
|
|
@ -46,6 +46,7 @@ Package API:
|
|||
api/api/batch/ordering
|
||||
api/diffs
|
||||
api/forms
|
||||
api/forms.widgets
|
||||
api/grids
|
||||
api/grids.core
|
||||
api/progress
|
||||
|
|
|
@ -40,6 +40,7 @@ class ReadonlyWidget(dfwidget.HiddenWidget):
|
|||
readonly = True
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
if cstruct in (colander.null, None):
|
||||
cstruct = ''
|
||||
# TODO: is this hacky?
|
||||
|
@ -77,15 +78,17 @@ class PercentInputWidget(dfwidget.TextInputWidget):
|
|||
autocomplete = 'off'
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
if cstruct not in (colander.null, None):
|
||||
# convert "traditional" value to "human-friendly"
|
||||
value = decimal.Decimal(cstruct) * 100
|
||||
value = value.quantize(decimal.Decimal('0.001'))
|
||||
cstruct = str(value)
|
||||
return super(PercentInputWidget, self).serialize(field, cstruct, **kw)
|
||||
return super().serialize(field, cstruct, **kw)
|
||||
|
||||
def deserialize(self, field, pstruct):
|
||||
pstruct = super(PercentInputWidget, self).deserialize(field, pstruct)
|
||||
""" """
|
||||
pstruct = super().deserialize(field, pstruct)
|
||||
if pstruct is colander.null:
|
||||
return colander.null
|
||||
# convert "human-friendly" value to "traditional"
|
||||
|
@ -108,6 +111,7 @@ class CasesUnitsWidget(dfwidget.Widget):
|
|||
one_amount_only = False
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
if cstruct in (colander.null, None):
|
||||
cstruct = ''
|
||||
readonly = kw.get('readonly', self.readonly)
|
||||
|
@ -118,6 +122,7 @@ class CasesUnitsWidget(dfwidget.Widget):
|
|||
return field.renderer(template, **values)
|
||||
|
||||
def deserialize(self, field, pstruct):
|
||||
""" """
|
||||
from tailbone.forms.types import ProductQuantity
|
||||
|
||||
if pstruct is colander.null:
|
||||
|
@ -166,7 +171,7 @@ class CustomSelectWidget(dfwidget.SelectWidget):
|
|||
self.extra_template_values.update(kw)
|
||||
|
||||
def get_template_values(self, field, cstruct, kw):
|
||||
values = super(CustomSelectWidget, self).get_template_values(field, cstruct, kw)
|
||||
values = super().get_template_values(field, cstruct, kw)
|
||||
if hasattr(self, 'extra_template_values'):
|
||||
values.update(self.extra_template_values)
|
||||
return values
|
||||
|
@ -209,6 +214,7 @@ class JQueryDateWidget(dfwidget.DateInputWidget):
|
|||
)
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
if cstruct in (colander.null, None):
|
||||
cstruct = ''
|
||||
readonly = kw.get('readonly', self.readonly)
|
||||
|
@ -243,12 +249,14 @@ class FalafelDateTimeWidget(dfwidget.DateTimeInputWidget):
|
|||
template = 'datetime_falafel'
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
readonly = kw.get('readonly', self.readonly)
|
||||
values = self.get_template_values(field, cstruct, kw)
|
||||
template = self.readonly_template if readonly else self.template
|
||||
return field.renderer(template, **values)
|
||||
|
||||
def deserialize(self, field, pstruct):
|
||||
""" """
|
||||
if pstruct == '':
|
||||
return colander.null
|
||||
return pstruct
|
||||
|
@ -261,6 +269,7 @@ class FalafelTimeWidget(dfwidget.TimeInputWidget):
|
|||
template = 'time_falafel'
|
||||
|
||||
def deserialize(self, field, pstruct):
|
||||
""" """
|
||||
if pstruct == '':
|
||||
return colander.null
|
||||
return pstruct
|
||||
|
@ -288,6 +297,7 @@ class JQueryAutocompleteWidget(dfwidget.AutocompleteInputWidget):
|
|||
options = None
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
if 'delay' in kw or getattr(self, 'delay', None):
|
||||
raise ValueError(
|
||||
'AutocompleteWidget does not support *delay* parameter '
|
||||
|
@ -324,6 +334,7 @@ class MultiFileUploadWidget(dfwidget.FileUploadWidget):
|
|||
requirements = ()
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
""" """
|
||||
if cstruct in (colander.null, None):
|
||||
cstruct = []
|
||||
|
||||
|
@ -339,6 +350,7 @@ class MultiFileUploadWidget(dfwidget.FileUploadWidget):
|
|||
return field.renderer(template, **values)
|
||||
|
||||
def deserialize(self, field, pstruct):
|
||||
""" """
|
||||
if pstruct is colander.null:
|
||||
return colander.null
|
||||
|
||||
|
@ -359,6 +371,7 @@ class MultiFileUploadWidget(dfwidget.FileUploadWidget):
|
|||
return files_data
|
||||
|
||||
def deserialize_upload(self, upload):
|
||||
""" """
|
||||
# nb. this logic was copied from parent class and adapted
|
||||
# to allow for multiple files. needs some more love.
|
||||
|
||||
|
@ -428,11 +441,13 @@ def make_customer_widget(request, **kwargs):
|
|||
|
||||
class CustomerAutocompleteWidget(JQueryAutocompleteWidget):
|
||||
"""
|
||||
Autocomplete widget for a Customer reference field.
|
||||
Autocomplete widget for a
|
||||
:class:`~rattail:rattail.db.model.customers.Customer` reference
|
||||
field.
|
||||
"""
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(CustomerAutocompleteWidget, self).__init__(*args, **kwargs)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.request = request
|
||||
model = self.request.rattail_config.get_model()
|
||||
|
||||
|
@ -452,7 +467,7 @@ class CustomerAutocompleteWidget(JQueryAutocompleteWidget):
|
|||
self.input_callback = input_handler
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
|
||||
""" """
|
||||
# fetch customer to provide button label, if we have a value
|
||||
if cstruct:
|
||||
model = self.request.rattail_config.get_model()
|
||||
|
@ -460,18 +475,21 @@ class CustomerAutocompleteWidget(JQueryAutocompleteWidget):
|
|||
if customer:
|
||||
self.field_display = str(customer)
|
||||
|
||||
return super(CustomerAutocompleteWidget, self).serialize(
|
||||
return super().serialize(
|
||||
field, cstruct, **kw)
|
||||
|
||||
|
||||
class CustomerDropdownWidget(dfwidget.SelectWidget):
|
||||
"""
|
||||
Dropdown widget for a Customer reference field.
|
||||
Dropdown widget for a
|
||||
:class:`~rattail:rattail.db.model.customers.Customer` reference
|
||||
field.
|
||||
"""
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(CustomerDropdownWidget, self).__init__(*args, **kwargs)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.request = request
|
||||
app = self.request.rattail_config.get_app()
|
||||
|
||||
# must figure out dropdown values, if they weren't given
|
||||
if 'values' not in kwargs:
|
||||
|
@ -483,10 +501,8 @@ class CustomerDropdownWidget(dfwidget.SelectWidget):
|
|||
customers = customers()
|
||||
|
||||
else: # default customer list
|
||||
model = self.request.rattail_config.get_model()
|
||||
customers = Session.query(model.Customer)\
|
||||
.order_by(model.Customer.name)\
|
||||
.all()
|
||||
customers = app.get_clientele_handler()\
|
||||
.get_all_customers(Session())
|
||||
|
||||
# convert customer list to option values
|
||||
self.values = [(c.uuid, c.name)
|
||||
|
@ -517,7 +533,7 @@ class DepartmentWidget(dfwidget.SelectWidget):
|
|||
values.insert(0, ('', "(none)"))
|
||||
kwargs['values'] = values
|
||||
|
||||
super(DepartmentWidget, self).__init__(**kwargs)
|
||||
super().__init__(**kwargs)
|
||||
|
||||
|
||||
def make_vendor_widget(request, **kwargs):
|
||||
|
@ -548,7 +564,7 @@ class VendorAutocompleteWidget(JQueryAutocompleteWidget):
|
|||
"""
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(VendorAutocompleteWidget, self).__init__(*args, **kwargs)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.request = request
|
||||
model = self.request.rattail_config.get_model()
|
||||
|
||||
|
@ -568,7 +584,7 @@ class VendorAutocompleteWidget(JQueryAutocompleteWidget):
|
|||
# self.input_callback = input_handler
|
||||
|
||||
def serialize(self, field, cstruct, **kw):
|
||||
|
||||
""" """
|
||||
# fetch vendor to provide button label, if we have a value
|
||||
if cstruct:
|
||||
model = self.request.rattail_config.get_model()
|
||||
|
@ -576,7 +592,7 @@ class VendorAutocompleteWidget(JQueryAutocompleteWidget):
|
|||
if vendor:
|
||||
self.field_display = str(vendor)
|
||||
|
||||
return super(VendorAutocompleteWidget, self).serialize(
|
||||
return super().serialize(
|
||||
field, cstruct, **kw)
|
||||
|
||||
|
||||
|
@ -586,7 +602,7 @@ class VendorDropdownWidget(dfwidget.SelectWidget):
|
|||
"""
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(VendorDropdownWidget, self).__init__(*args, **kwargs)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.request = request
|
||||
|
||||
# must figure out dropdown values, if they weren't given
|
||||
|
|
Loading…
Reference in a new issue