From a1b05540bed9e301de9936d67ff4722ce684bc9e Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 10 Apr 2024 12:24:13 -0500 Subject: [PATCH 001/338] Avoid uncaught error when updating order batch row quantities --- tailbone/api/batch/ordering.py | 41 ++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/tailbone/api/batch/ordering.py b/tailbone/api/batch/ordering.py index 1661d06f..1b11194e 100644 --- a/tailbone/api/batch/ordering.py +++ b/tailbone/api/batch/ordering.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2023 Lance Edgar +# Copyright © 2010-2024 Lance Edgar # # This file is part of Rattail. # @@ -28,18 +28,23 @@ API. """ import datetime +import logging -from rattail.db import model -from rattail.util import pretty_quantity +import sqlalchemy as sa + +from rattail.db.model import PurchaseBatch, PurchaseBatchRow from cornice import Service from tailbone.api.batch import APIBatchView, APIBatchRowView +log = logging.getLogger(__name__) + + class OrderingBatchViews(APIBatchView): - model_class = model.PurchaseBatch + model_class = PurchaseBatch default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler' route_prefix = 'orderingbatchviews' permission_prefix = 'ordering' @@ -55,12 +60,13 @@ class OrderingBatchViews(APIBatchView): Adds a condition to the query, to ensure only purchase batches with "ordering" mode are returned. """ - query = super(OrderingBatchViews, self).base_query() + model = self.model + query = super().base_query() query = query.filter(model.PurchaseBatch.mode == self.enum.PURCHASE_BATCH_MODE_ORDERING) return query def normalize(self, batch): - data = super(OrderingBatchViews, self).normalize(batch) + data = super().normalize(batch) data['vendor_uuid'] = batch.vendor.uuid data['vendor_display'] = str(batch.vendor) @@ -81,7 +87,7 @@ class OrderingBatchViews(APIBatchView): """ data = dict(data) data['mode'] = self.enum.PURCHASE_BATCH_MODE_ORDERING - batch = super(OrderingBatchViews, self).create_object(data) + batch = super().create_object(data) return batch def worksheet(self): @@ -221,7 +227,7 @@ class OrderingBatchViews(APIBatchView): class OrderingBatchRowViews(APIBatchRowView): - model_class = model.PurchaseBatchRow + model_class = PurchaseBatchRow default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler' route_prefix = 'ordering.rows' permission_prefix = 'ordering' @@ -231,8 +237,9 @@ class OrderingBatchRowViews(APIBatchRowView): editable = True def normalize(self, row): + data = super().normalize(row) + app = self.get_rattail_app() batch = row.batch - data = super(OrderingBatchRowViews, self).normalize(row) data['item_id'] = row.item_id data['upc'] = str(row.upc) @@ -252,8 +259,8 @@ class OrderingBatchRowViews(APIBatchRowView): data['case_quantity'] = row.case_quantity data['cases_ordered'] = row.cases_ordered data['units_ordered'] = row.units_ordered - data['cases_ordered_display'] = pretty_quantity(row.cases_ordered or 0, empty_zero=False) - data['units_ordered_display'] = pretty_quantity(row.units_ordered or 0, empty_zero=False) + data['cases_ordered_display'] = app.render_quantity(row.cases_ordered or 0, empty_zero=False) + data['units_ordered_display'] = app.render_quantity(row.units_ordered or 0, empty_zero=False) data['po_unit_cost'] = row.po_unit_cost data['po_unit_cost_display'] = "${:0.2f}".format(row.po_unit_cost) if row.po_unit_cost is not None else None @@ -281,7 +288,17 @@ class OrderingBatchRowViews(APIBatchRowView): if not self.batch_handler.is_mutable(row.batch): return {'error': "Batch is not mutable"} - self.batch_handler.update_row_quantity(row, **data) + try: + self.batch_handler.update_row_quantity(row, **data) + self.Session.flush() + except Exception as error: + log.warning("update_row_quantity failed", exc_info=True) + if isinstance(error, sa.exc.DataError) and hasattr(error, 'orig'): + error = str(error.orig) + else: + error = str(error) + return {'error': error} + return row From de8751b86c6dffb5c32ca9e01d01139ef8de18b6 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Thu, 11 Apr 2024 14:14:27 -0500 Subject: [PATCH 002/338] Try to return JSON error when receiving API call fails although in my testing, the error still got raised somehow in the tweens or something? client then sees it as a 500 response and gets no JSON --- tailbone/api/batch/receiving.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tailbone/api/batch/receiving.py b/tailbone/api/batch/receiving.py index f8ce4a33..daa4290f 100644 --- a/tailbone/api/batch/receiving.py +++ b/tailbone/api/batch/receiving.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2023 Lance Edgar +# Copyright © 2010-2024 Lance Edgar # # This file is part of Rattail. # @@ -27,6 +27,7 @@ Tailbone Web API - Receiving Batches import logging import humanize +import sqlalchemy as sa from rattail.db import model from rattail.util import pretty_quantity @@ -440,9 +441,17 @@ class ReceivingBatchRowViews(APIBatchRowView): # handler takes care of the row receiving logic for us kwargs = dict(form.validated) del kwargs['row'] - self.batch_handler.receive_row(row, **kwargs) + try: + self.batch_handler.receive_row(row, **kwargs) + self.Session.flush() + except Exception as error: + log.warning("receive() failed", exc_info=True) + if isinstance(error, sa.exc.DataError) and hasattr(error, 'orig'): + error = str(error.orig) + else: + error = str(error) + return {'error': error} - self.Session.flush() return self._get(obj=row) @classmethod From aa500351edd6fa610c3395cdb08900bb0876a7ab Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Thu, 11 Apr 2024 16:37:55 -0500 Subject: [PATCH 003/338] Avoid error for tax field when creating new department someday should fix that for real.. --- tailbone/views/departments.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tailbone/views/departments.py b/tailbone/views/departments.py index a062b183..01d6f520 100644 --- a/tailbone/views/departments.py +++ b/tailbone/views/departments.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2023 Lance Edgar +# Copyright © 2010-2024 Lance Edgar # # This file is part of Rattail. # @@ -111,9 +111,13 @@ class DepartmentView(MasterView): f.set_type('personnel', 'boolean') # tax - f.set_renderer('tax', self.render_tax) - # TODO: make this editable - f.set_readonly('tax') + if self.creating: + # TODO: make this editable instead + f.remove('tax') + else: + f.set_renderer('tax', self.render_tax) + # TODO: make this editable + f.set_readonly('tax') # default_custorder_discount f.set_type('default_custorder_discount', 'percent') From cbbd77c49c403e827c540ca21b1302ca0a18db08 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Thu, 11 Apr 2024 16:58:12 -0500 Subject: [PATCH 004/338] Show toast msg instead of silent error, when grid fetch fails specifically, if a user clicks "Save defaults" for the grid filters, but they aren't currently logged in, error will ensue. this is a bit of an edge case which IIUC would require multiple tabs etc. but still is worth avoiding an error email from it. --- tailbone/templates/grids/buefy.mako | 32 +++++++++++++++-------- tailbone/views/master.py | 40 +++++++++++++++++++---------- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/tailbone/templates/grids/buefy.mako b/tailbone/templates/grids/buefy.mako index a3e6e229..cbe33062 100644 --- a/tailbone/templates/grids/buefy.mako +++ b/tailbone/templates/grids/buefy.mako @@ -584,16 +584,28 @@ this.loading = true this.$http.get(`${'$'}{this.ajaxDataUrl}?${'$'}{params}`).then(({ data }) => { - ${grid.component_studly}CurrentData = data.data - this.data = ${grid.component_studly}CurrentData - this.rowStatusMap = data.row_status_map - this.total = data.total_items - this.firstItem = data.first_item - this.lastItem = data.last_item - this.loading = false - this.checkedRows = this.locateCheckedRows(data.checked_rows) - if (success) { - success() + if (!data.error) { + ${grid.component_studly}CurrentData = data.data + this.data = ${grid.component_studly}CurrentData + this.rowStatusMap = data.row_status_map + this.total = data.total_items + this.firstItem = data.first_item + this.lastItem = data.last_item + this.loading = false + this.checkedRows = this.locateCheckedRows(data.checked_rows) + if (success) { + success() + } + } else { + this.$buefy.toast.open({ + message: data.error, + type: 'is-danger', + duration: 2000, // 4 seconds + }) + this.loading = false + if (failure) { + failure() + } } }) .catch((error) => { diff --git a/tailbone/views/master.py b/tailbone/views/master.py index cc2adcaf..c9d6cd7c 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2023 Lance Edgar +# Copyright © 2010-2024 Lance Edgar # # This file is part of Rattail. # @@ -42,8 +42,7 @@ from sqlalchemy_utils.functions import get_primary_keys, get_columns from rattail.db import model, Session as RattailSession from rattail.db.continuum import model_transaction_query -from rattail.util import prettify, simple_error, get_class_hierarchy -from rattail.time import localtime +from rattail.util import simple_error, get_class_hierarchy from rattail.threads import Thread from rattail.csvutil import UnicodeDictWriter from rattail.files import temp_path @@ -324,6 +323,13 @@ class MasterView(View): string, then the view will return the rendered grid only. Otherwise returns the full page. """ + # nb. normally this "save defaults" flag is checked within make_grid() + # but it returns JSON data so we can't just do a redirect when there + # is no user; must return JSON error message instead + if (self.request.GET.get('save-current-filters-as-defaults') == 'true' + and not self.request.user): + return self.json_response({'error': "User is not currently logged in"}) + self.listing = True grid = self.make_grid() @@ -1465,6 +1471,7 @@ class MasterView(View): """ View showing diff details of a particular object version. """ + app = self.get_rattail_app() instance = self.get_instance() model_class = self.get_model_class() route_prefix = self.get_route_prefix() @@ -1512,7 +1519,7 @@ class MasterView(View): 'instance_title_normal': instance_title, 'instance_url': self.get_action_url('versions', instance), 'transaction': transaction, - 'changed': localtime(self.rattail_config, transaction.issued_at, from_utc=True), + 'changed': app.localtime(transaction.issued_at, from_utc=True), 'version_diffs': version_diffs, 'show_prev_next': True, 'prev_url': prev_url, @@ -3502,14 +3509,14 @@ class MasterView(View): Normalize the given object into a data dict, for use when writing to the results file for download. """ + app = self.get_rattail_app() data = {} for field in fields: value = getattr(obj, field, None) # make timestamps zone-aware if isinstance(value, datetime.datetime): - value = localtime(self.rattail_config, value, - from_utc=not self.has_local_times) + value = app.localtime(value, from_utc=not self.has_local_times) data[field] = value @@ -3539,13 +3546,14 @@ class MasterView(View): Coerce the given data dict record, to a "row" dict suitable for use when writing directly to XLSX file. """ + app = self.get_rattail_app() data = dict(data) for key in data: value = data[key] # make timestamps local, "zone-naive" if isinstance(value, datetime.datetime): - value = localtime(self.rattail_config, value, tzinfo=False) + value = app.localtime(value, tzinfo=False) data[key] = value @@ -4001,14 +4009,14 @@ class MasterView(View): Normalize the given row object into a data dict, for use when writing to the results file for download. """ + app = self.get_rattail_app() data = {} for field in fields: value = getattr(row, field, None) # make timestamps zone-aware if isinstance(value, datetime.datetime): - value = localtime(self.rattail_config, value, - from_utc=not self.has_local_times) + value = app.localtime(value, from_utc=not self.has_local_times) data[field] = value @@ -4038,6 +4046,7 @@ class MasterView(View): Coerce the given data dict record, to a "row" dict suitable for use when writing directly to XLSX file. """ + app = self.get_rattail_app() data = dict(data) for key in data: value = data[key] @@ -4048,7 +4057,7 @@ class MasterView(View): # make timestamps local, "zone-naive" elif isinstance(value, datetime.datetime): - value = localtime(self.rattail_config, value, tzinfo=False) + value = app.localtime(value, tzinfo=False) data[key] = value @@ -4099,6 +4108,7 @@ class MasterView(View): """ Return a dict for use when writing the row's data to XLSX download. """ + app = self.get_rattail_app() xlrow = {} for field in fields: value = getattr(row, field, None) @@ -4111,9 +4121,9 @@ class MasterView(View): # but we should make sure they're in "local" time zone effectively. # note however, this assumes a "naive" time value is in UTC zone! if value.tzinfo: - value = localtime(self.rattail_config, value, tzinfo=False) + value = app.localtime(value, tzinfo=False) else: - value = localtime(self.rattail_config, value, from_utc=True, tzinfo=False) + value = app.localtime(value, from_utc=True, tzinfo=False) xlrow[field] = value return xlrow @@ -4177,12 +4187,13 @@ class MasterView(View): """ Return a dict for use when writing the row's data to CSV download. """ + app = self.get_rattail_app() csvrow = {} for field in fields: value = getattr(obj, field, None) if isinstance(value, datetime.datetime): # TODO: this assumes value is *always* naive UTC - value = localtime(self.rattail_config, value, from_utc=True) + value = app.localtime(value, from_utc=True) csvrow[field] = '' if value is None else str(value) return csvrow @@ -4190,12 +4201,13 @@ class MasterView(View): """ Return a dict for use when writing the row's data to CSV download. """ + app = self.get_rattail_app() csvrow = {} for field in fields: value = getattr(row, field, None) if isinstance(value, datetime.datetime): # TODO: this assumes value is *always* naive UTC - value = localtime(self.rattail_config, value, from_utc=True) + value = app.localtime(value, from_utc=True) csvrow[field] = '' if value is None else str(value) return csvrow From 1973614840f30b906b81e019e7f409695f6e37cf Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 13 Apr 2024 09:09:23 -0500 Subject: [PATCH 005/338] Rename people "view_profile" template (drop buefy suffix) --- ...w_profile_buefy.mako => view_profile.mako} | 0 tailbone/views/people.py | 34 +++++++------------ 2 files changed, 12 insertions(+), 22 deletions(-) rename tailbone/templates/people/{view_profile_buefy.mako => view_profile.mako} (100%) diff --git a/tailbone/templates/people/view_profile_buefy.mako b/tailbone/templates/people/view_profile.mako similarity index 100% rename from tailbone/templates/people/view_profile_buefy.mako rename to tailbone/templates/people/view_profile.mako diff --git a/tailbone/views/people.py b/tailbone/views/people.py index 071e58b5..7b175e25 100644 --- a/tailbone/views/people.py +++ b/tailbone/views/people.py @@ -34,12 +34,9 @@ import sqlalchemy_continuum as continuum from rattail.db import api from rattail.db.model import Person, PersonNote, MergePeopleRequest -from rattail.db.util import maxlen -from rattail.time import localtime from rattail.util import simple_error import colander -from pyramid.httpexceptions import HTTPFound, HTTPNotFound from webhelpers2.html import HTML, tags from tailbone import forms, grids @@ -221,7 +218,7 @@ class PersonView(MasterView): instance = self.Session.get(model.VendorContact, key) if instance: return instance.person - raise HTTPNotFound + raise self.notfound() def is_person_protected(self, person): for user in person.users: @@ -495,7 +492,7 @@ class PersonView(MasterView): if self.request.has_perm('people_profile.view_versions'): context['revisions_grid'] = self.profile_revisions_grid(person) - return self.render_to_response('view_profile_buefy', context) + return self.render_to_response('view_profile', context) def get_context_tabchecks(self, person): app = self.get_rattail_app() @@ -558,28 +555,21 @@ class PersonView(MasterView): """ return kwargs - def template_kwargs_view_profile_buefy(self, **kwargs): - """ - Note that any subclass should not need to define this method. - It by default invokes :meth:`template_kwargs_view_profile()` - and returns that result. - """ - return self.template_kwargs_view_profile(**kwargs) - def get_max_lengths(self): + app = self.get_rattail_app() model = self.model lengths = { - 'person_first_name': maxlen(model.Person.first_name), - 'person_middle_name': maxlen(model.Person.middle_name), - 'person_last_name': maxlen(model.Person.last_name), - 'address_street': maxlen(model.PersonMailingAddress.street), - 'address_street2': maxlen(model.PersonMailingAddress.street2), - 'address_city': maxlen(model.PersonMailingAddress.city), - 'address_state': maxlen(model.PersonMailingAddress.state), - 'address_zipcode': maxlen(model.PersonMailingAddress.zipcode), + 'person_first_name': app.maxlen(model.Person.first_name), + 'person_middle_name': app.maxlen(model.Person.middle_name), + 'person_last_name': app.maxlen(model.Person.last_name), + 'address_street': app.maxlen(model.PersonMailingAddress.street), + 'address_street2': app.maxlen(model.PersonMailingAddress.street2), + 'address_city': app.maxlen(model.PersonMailingAddress.city), + 'address_state': app.maxlen(model.PersonMailingAddress.state), + 'address_zipcode': app.maxlen(model.PersonMailingAddress.zipcode), } if self.people_handler.should_use_preferred_first_name(): - lengths['person_preferred_first_name'] = maxlen(model.Person.preferred_first_name) + lengths['person_preferred_first_name'] = app.maxlen(model.Person.preferred_first_name) return lengths def get_phone_type_options(self): From cd7c1bba21292bc9d255e03d65694586bfbbd698 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 13 Apr 2024 09:21:48 -0500 Subject: [PATCH 006/338] Rename template for grid filters (drop buefy suffix) also remove some deprecated functions --- tailbone/config.py | 21 +---- tailbone/templates/grids/buefy.mako | 2 +- tailbone/templates/grids/filters.mako | 98 ++++++++++++++------- tailbone/templates/grids/filters_buefy.mako | 70 --------------- 4 files changed, 67 insertions(+), 124 deletions(-) delete mode 100644 tailbone/templates/grids/filters_buefy.mako diff --git a/tailbone/config.py b/tailbone/config.py index 6106e87e..9326a3cb 100644 --- a/tailbone/config.py +++ b/tailbone/config.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2023 Lance Edgar +# Copyright © 2010-2024 Lance Edgar # # This file is part of Rattail. # @@ -61,25 +61,6 @@ def csrf_header_name(config): return config.get('tailbone', 'csrf_header_name', default='X-CSRF-TOKEN') -def get_buefy_version(config): - warnings.warn("get_buefy_version() is deprecated; please use " - "tailbone.util.get_libver() instead", - DeprecationWarning, stacklevel=2) - - version = config.get('tailbone', 'libver.buefy') - if version: - return version - - return config.get('tailbone', 'buefy_version', - default='latest') - - -def get_buefy_0_8(config, version=None): - warnings.warn("get_buefy_0_8() is no longer supported", - DeprecationWarning, stacklevel=2) - return False - - def global_help_url(config): return config.get('tailbone', 'global_help_url') diff --git a/tailbone/templates/grids/buefy.mako b/tailbone/templates/grids/buefy.mako index cbe33062..73c7e415 100644 --- a/tailbone/templates/grids/buefy.mako +++ b/tailbone/templates/grids/buefy.mako @@ -136,7 +136,7 @@
% if grid.filterable: ## TODO: stop using |n filter - ${grid.render_filters(template='/grids/filters_buefy.mako', allow_save_defaults=allow_save_defaults)|n} + ${grid.render_filters(allow_save_defaults=allow_save_defaults)|n} % endif
diff --git a/tailbone/templates/grids/filters.mako b/tailbone/templates/grids/filters.mako index 857f53b1..5e1fef9b 100644 --- a/tailbone/templates/grids/filters.mako +++ b/tailbone/templates/grids/filters.mako @@ -1,38 +1,70 @@ ## -*- coding: utf-8; -*- -
- ${h.form(form.action_url, method='get')} - ${h.hidden('reset-to-default-filters', value='false')} - ${h.hidden('save-current-filters-as-defaults', value='false')} +
-
- Filters - % for filtr in form.iter_filters(): - - % endfor -
+ + -
- - - - - % if allow_save_defaults and request.user: - - % endif -
+ - ${h.end_form()} -
+ + Apply Filters + + + + Add Filter + + + + + + + Default View + + + + No Filters + + + % if allow_save_defaults and request.user: + + Save Defaults + + % endif + + + + diff --git a/tailbone/templates/grids/filters_buefy.mako b/tailbone/templates/grids/filters_buefy.mako deleted file mode 100644 index 5e1fef9b..00000000 --- a/tailbone/templates/grids/filters_buefy.mako +++ /dev/null @@ -1,70 +0,0 @@ -## -*- coding: utf-8; -*- - -
- - - - - - - - Apply Filters - - - - Add Filter - - - - - - - Default View - - - - No Filters - - - % if allow_save_defaults and request.user: - - Save Defaults - - % endif - - - -
From 1103b09a767936f69c02c5714717cf5d1d28bee9 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 13 Apr 2024 09:45:10 -0500 Subject: [PATCH 007/338] Rename forms/deform template (drop buefy suffix) for now, deprecate `form.render()` method and just use `render_deform()` - but probably should change that to something else eventually..? --- tailbone/forms/core.py | 17 ++++++++--------- tailbone/templates/batch/view.mako | 4 ++-- tailbone/templates/form.mako | 2 +- .../forms/{deform_buefy.mako => deform.mako} | 0 tailbone/templates/forms/form.mako | 2 -- tailbone/templates/products/batch.mako | 2 +- 6 files changed, 12 insertions(+), 15 deletions(-) rename tailbone/templates/forms/{deform_buefy.mako => deform.mako} (100%) delete mode 100644 tailbone/templates/forms/form.mako diff --git a/tailbone/forms/core.py b/tailbone/forms/core.py index e04126a3..aee85330 100644 --- a/tailbone/forms/core.py +++ b/tailbone/forms/core.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2023 Lance Edgar +# Copyright © 2010-2024 Lance Edgar # # This file is part of Rattail. # @@ -794,12 +794,11 @@ class Form(object): def set_vuejs_field_converter(self, field, converter): self.vuejs_field_converters[field] = converter - def render(self, template=None, **kwargs): - if not template: - template = '/forms/form.mako' - context = kwargs - context['form'] = self - return render(template, context) + def render(self, **kwargs): + warnings.warn("Form.render() is deprecated (for now?); " + "please use Form.render_deform() instead", + DeprecationWarning, stacklevel=2) + return self.render_deform(**kwargs) def make_deform_form(self): if not hasattr(self, 'deform_form'): @@ -841,14 +840,14 @@ class Form(object): def render_deform(self, dform=None, template=None, **kwargs): if not template: - template = '/forms/deform_buefy.mako' + template = '/forms/deform.mako' if dform is None: dform = self.make_deform_form() # TODO: would perhaps be nice to leverage deform's default rendering # someday..? i.e. using Chameleon *.pt templates - # return form.render() + # return dform.render() context = kwargs context['form'] = self diff --git a/tailbone/templates/batch/view.mako b/tailbone/templates/batch/view.mako index fa8fa19f..aa9677b7 100644 --- a/tailbone/templates/batch/view.mako +++ b/tailbone/templates/batch/view.mako @@ -150,8 +150,8 @@ <%def name="render_form()"> ## TODO: should use self.render_form_buttons() - ## ${form.render(form_id='batch-form', buttons=capture(self.render_form_buttons))|n} - ${form.render(form_id='batch-form', buttons=capture(buttons))|n} + ## ${form.render_deform(form_id='batch-form', buttons=capture(self.render_form_buttons))|n} + ${form.render_deform(form_id='batch-form', buttons=capture(buttons))|n} <%def name="render_this_page()"> diff --git a/tailbone/templates/form.mako b/tailbone/templates/form.mako index 5878e030..c225bd3a 100644 --- a/tailbone/templates/form.mako +++ b/tailbone/templates/form.mako @@ -6,7 +6,7 @@ <%def name="render_form_buttons()"> <%def name="render_form()"> - ${form.render(buttons=capture(self.render_form_buttons))|n} + ${form.render_deform(buttons=capture(self.render_form_buttons))|n} <%def name="render_buefy_form()"> diff --git a/tailbone/templates/forms/deform_buefy.mako b/tailbone/templates/forms/deform.mako similarity index 100% rename from tailbone/templates/forms/deform_buefy.mako rename to tailbone/templates/forms/deform.mako diff --git a/tailbone/templates/forms/form.mako b/tailbone/templates/forms/form.mako deleted file mode 100644 index cd8fecc8..00000000 --- a/tailbone/templates/forms/form.mako +++ /dev/null @@ -1,2 +0,0 @@ -## -*- coding: utf-8; -*- -${form.render_deform(buttons=buttons)|n} diff --git a/tailbone/templates/products/batch.mako b/tailbone/templates/products/batch.mako index 81af729b..868ad9b1 100644 --- a/tailbone/templates/products/batch.mako +++ b/tailbone/templates/products/batch.mako @@ -64,7 +64,7 @@ ${parent.modify_this_page_vars()} diff --git a/tailbone/templates/batch/importer/view_row.mako b/tailbone/templates/batch/importer/view_row.mako index 9e08cf43..7d6f121f 100644 --- a/tailbone/templates/batch/importer/view_row.mako +++ b/tailbone/templates/batch/importer/view_row.mako @@ -68,7 +68,7 @@ % endif -<%def name="render_buefy_form()"> +<%def name="render_form()">

diff --git a/tailbone/templates/batch/inventory/desktop_form.mako b/tailbone/templates/batch/inventory/desktop_form.mako index 9f13cbf9..7e4795a8 100644 --- a/tailbone/templates/batch/inventory/desktop_form.mako +++ b/tailbone/templates/batch/inventory/desktop_form.mako @@ -34,7 +34,7 @@ -<%def name="render_form()"> +<%def name="render_form_template()"> @@ -113,7 +113,7 @@ }, data() { return { - groupPermissions: ${json.dumps(buefy_perms.get(selected_group, {}).get('permissions', []))|n}, + groupPermissions: ${json.dumps(perms_data.get(selected_group, {}).get('permissions', []))|n}, permissionGroupTerm: '', permissionTerm: '', selectedGroup: ${json.dumps(selected_group)|n}, diff --git a/tailbone/templates/products/batch.mako b/tailbone/templates/products/batch.mako index 868ad9b1..e0b93bd6 100644 --- a/tailbone/templates/products/batch.mako +++ b/tailbone/templates/products/batch.mako @@ -54,7 +54,7 @@ ${h.end_form()} -<%def name="render_form()"> +<%def name="render_form_template()"> diff --git a/tailbone/templates/products/view.mako b/tailbone/templates/products/view.mako index 5de6d099..c4da08ba 100644 --- a/tailbone/templates/products/view.mako +++ b/tailbone/templates/products/view.mako @@ -108,7 +108,7 @@ <%def name="lookup_codes_grid()"> - ${lookup_codes['grid'].render_buefy_table_element(data_prop='lookupCodesData')|n} + ${lookup_codes['grid'].render_table_element(data_prop='lookupCodesData')|n} <%def name="lookup_codes_panel()"> @@ -121,7 +121,7 @@ <%def name="sources_grid()"> - ${vendor_sources['grid'].render_buefy_table_element(data_prop='vendorSourcesData')|n} + ${vendor_sources['grid'].render_table_element(data_prop='vendorSourcesData')|n} <%def name="sources_panel()"> @@ -175,7 +175,7 @@