From 3e4bbf7092fa0937d32ba5e8659a99a0a6d45242 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 1 Dec 2023 19:50:07 -0600 Subject: [PATCH] Use clientele handler to populate customer dropdown widget --- docs/api/forms.widgets.rst | 6 +++++ docs/index.rst | 1 + tailbone/forms/widgets.py | 52 +++++++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 docs/api/forms.widgets.rst diff --git a/docs/api/forms.widgets.rst b/docs/api/forms.widgets.rst new file mode 100644 index 00000000..33316903 --- /dev/null +++ b/docs/api/forms.widgets.rst @@ -0,0 +1,6 @@ + +``tailbone.forms.widgets`` +========================== + +.. automodule:: tailbone.forms.widgets + :members: diff --git a/docs/index.rst b/docs/index.rst index 4aa22f3e..351e910d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -46,6 +46,7 @@ Package API: api/api/batch/ordering api/diffs api/forms + api/forms.widgets api/grids api/grids.core api/progress diff --git a/tailbone/forms/widgets.py b/tailbone/forms/widgets.py index 0b8d3dc9..db57f4f0 100644 --- a/tailbone/forms/widgets.py +++ b/tailbone/forms/widgets.py @@ -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