Use clientele handler to populate customer dropdown widget

This commit is contained in:
Lance Edgar 2023-12-01 19:50:07 -06:00
parent faeb2cb7e2
commit 3e4bbf7092
3 changed files with 41 additions and 18 deletions

View file

@ -0,0 +1,6 @@
``tailbone.forms.widgets``
==========================
.. automodule:: tailbone.forms.widgets
:members:

View file

@ -46,6 +46,7 @@ Package API:
api/api/batch/ordering
api/diffs
api/forms
api/forms.widgets
api/grids
api/grids.core
api/progress

View file

@ -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