From 85947878c4bd6ade54fd60872252dd9279fc813b Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 14 May 2023 20:28:48 -0500 Subject: [PATCH] Get rid of `newstyle` flag for `Form.validate()` method we always/only use "new style" now --- tailbone/api/batch/receiving.py | 2 +- tailbone/api/common.py | 2 +- tailbone/forms/core.py | 81 +++++++++++++------------- tailbone/views/auth.py | 4 +- tailbone/views/batch/core.py | 6 +- tailbone/views/batch/inventory.py | 2 +- tailbone/views/common.py | 2 +- tailbone/views/features.py | 4 +- tailbone/views/master.py | 12 ++-- tailbone/views/people.py | 6 +- tailbone/views/products.py | 4 +- tailbone/views/projects.py | 4 +- tailbone/views/purchasing/costing.py | 2 +- tailbone/views/purchasing/receiving.py | 6 +- tailbone/views/reports.py | 4 +- tailbone/views/settings.py | 2 +- tailbone/views/shifts/lib.py | 4 +- 17 files changed, 75 insertions(+), 72 deletions(-) diff --git a/tailbone/api/batch/receiving.py b/tailbone/api/batch/receiving.py index 53d5f98a..9a6864db 100644 --- a/tailbone/api/batch/receiving.py +++ b/tailbone/api/batch/receiving.py @@ -407,7 +407,7 @@ class ReceivingBatchRowViews(APIBatchRowView): form = forms.Form(schema=schema, request=self.request) # TODO: this seems hacky, but avoids "complex" date value parsing form.set_widget('expiration_date', dfwidget.TextInputWidget()) - if not form.validate(newstyle=True): + if not form.validate(): log.debug("form did not validate: %s", form.make_deform_form().error) return {'error': "Form did not validate"} diff --git a/tailbone/api/common.py b/tailbone/api/common.py index 6d8e9344..cd663d53 100644 --- a/tailbone/api/common.py +++ b/tailbone/api/common.py @@ -89,7 +89,7 @@ class CommonView(APIView): # identical; perhaps should merge somehow? schema = Feedback().bind(session=Session()) form = forms.Form(schema=schema, request=self.request) - if form.validate(newstyle=True): + if form.validate(): data = dict(form.validated) # figure out who the sending user is, if any diff --git a/tailbone/forms/core.py b/tailbone/forms/core.py index 9f30512b..04cbb64a 100644 --- a/tailbone/forms/core.py +++ b/tailbone/forms/core.py @@ -26,6 +26,7 @@ Forms Core import json import logging +import warnings from collections import OrderedDict import sqlalchemy as sa @@ -1167,49 +1168,51 @@ class Form(object): return self.defaults[field_name] def validate(self, *args, **kwargs): - if kwargs.pop('newstyle', False): - # yay, new behavior! - if hasattr(self, 'validated'): - del self.validated - if self.request.method != 'POST': - return False + """ + Try to validate the form. - controls = get_form_data(self.request).items() + This should work whether data was submitted as classic POST + data, or as JSON body. - # unfortunately the normal form logic (i.e. peppercorn) is - # expecting all values to be strings, whereas if our data - # came from JSON body, may have given us some Pythonic - # objects. so here we must convert them *back* to strings - # TODO: this seems like a hack, i must be missing something - # TODO: also this uses same "JSON" check as get_form_data() - if self.request.is_xhr and not self.request.POST: - controls = [[key, val] for key, val in controls] - for i in range(len(controls)): - key, value = controls[i] - if value is None: - controls[i][1] = '' - elif value is True: - controls[i][1] = 'true' - elif value is False: - controls[i][1] = 'false' - elif not isinstance(value, str): - controls[i][1] = str(value) + :returns: ``True`` if form data is valid, otherwise ``False``. + """ + if 'newstyle' in kwargs: + warnings.warn("the `newstyle` kwarg is no longer used " + "for Form.validate()", + DeprecationWarning, stacklevel=2) - dform = self.make_deform_form() - try: - self.validated = dform.validate(controls) - return True - except deform.ValidationFailure: - return False + if hasattr(self, 'validated'): + del self.validated + if self.request.method != 'POST': + return False - else: # legacy behavior - raise_error = kwargs.pop('raise_error', True) - dform = self.make_deform_form() - try: - return dform.validate(*args, **kwargs) - except deform.ValidationFailure: - if raise_error: - raise + controls = get_form_data(self.request).items() + + # unfortunately the normal form logic (i.e. peppercorn) is + # expecting all values to be strings, whereas if our data + # came from JSON body, may have given us some Pythonic + # objects. so here we must convert them *back* to strings + # TODO: this seems like a hack, i must be missing something + # TODO: also this uses same "JSON" check as get_form_data() + if self.request.is_xhr and not self.request.POST: + controls = [[key, val] for key, val in controls] + for i in range(len(controls)): + key, value = controls[i] + if value is None: + controls[i][1] = '' + elif value is True: + controls[i][1] = 'true' + elif value is False: + controls[i][1] = 'false' + elif not isinstance(value, str): + controls[i][1] = str(value) + + dform = self.make_deform_form() + try: + self.validated = dform.validate(controls) + return True + except deform.ValidationFailure: + return False class FieldList(list): diff --git a/tailbone/views/auth.py b/tailbone/views/auth.py index fbae397b..f8d71d34 100644 --- a/tailbone/views/auth.py +++ b/tailbone/views/auth.py @@ -105,7 +105,7 @@ class AuthenticationView(View): form.auto_disable = False # TODO: deprecate / remove this form.show_reset = True form.show_cancel = False - if form.validate(newstyle=True): + if form.validate(): user = self.authenticate_user(form.validated['username'], form.validated['password']) if user: @@ -185,7 +185,7 @@ class AuthenticationView(View): schema = ChangePassword().bind(user=self.request.user, request=self.request) form = forms.Form(schema=schema, request=self.request) - if form.validate(newstyle=True): + if form.validate(): set_user_password(self.request.user, form.validated['new_password']) self.request.session.flash("Your password has been changed.") return self.redirect(self.request.get_referrer()) diff --git a/tailbone/views/batch/core.py b/tailbone/views/batch/core.py index 2ba7e6da..e2eeeda4 100644 --- a/tailbone/views/batch/core.py +++ b/tailbone/views/batch/core.py @@ -566,7 +566,7 @@ class BatchMasterView(MasterView): self.request.session.flash("Request ignored, since batch has already been executed") else: form = forms.Form(schema=ToggleComplete(), request=self.request) - if form.validate(newstyle=True): + if form.validate(): if form.validated['complete']: self.mark_batch_complete(batch) else: @@ -1273,7 +1273,7 @@ class BatchMasterView(MasterView): batch = self.get_instance() self.executing = True form = self.make_execute_form(batch) - if form.validate(newstyle=True): + if form.validate(): kwargs = dict(form.validated) # cache options to use as defaults next time @@ -1344,7 +1344,7 @@ class BatchMasterView(MasterView): indicator page. """ form = self.make_execute_form() - if form.validate(newstyle=True): + if form.validate(): kwargs = dict(form.validated) # cache options to use as defaults next time diff --git a/tailbone/views/batch/inventory.py b/tailbone/views/batch/inventory.py index b41a995e..92f0b2d4 100644 --- a/tailbone/views/batch/inventory.py +++ b/tailbone/views/batch/inventory.py @@ -234,7 +234,7 @@ class InventoryBatchView(BatchMasterView): schema = DesktopForm().bind(session=self.Session()) form = forms.Form(schema=schema, request=self.request) if self.request.method == 'POST': - if form.validate(newstyle=True): + if form.validate(): product = self.Session.get(model.Product, form.validated['product']) diff --git a/tailbone/views/common.py b/tailbone/views/common.py index 3882f357..e8d37904 100644 --- a/tailbone/views/common.py +++ b/tailbone/views/common.py @@ -161,7 +161,7 @@ class CommonView(View): model = self.model schema = Feedback().bind(session=Session()) form = forms.Form(schema=schema, request=self.request) - if form.validate(newstyle=True): + if form.validate(): data = dict(form.validated) if data['user']: data['user'] = Session.get(model.User, data['user']) diff --git a/tailbone/views/features.py b/tailbone/views/features.py index 39f683d3..d9417452 100644 --- a/tailbone/views/features.py +++ b/tailbone/views/features.py @@ -62,7 +62,7 @@ class GenerateFeatureView(View): result = rendered_result = None feature_type = 'new-report' if self.request.method == 'POST': - if app_form.validate(newstyle=True): + if app_form.validate(): feature_type = self.request.POST['feature_type'] feature = self.handler.get_feature(feature_type) @@ -70,7 +70,7 @@ class GenerateFeatureView(View): raise ValueError("Unknown feature type: {}".format(feature_type)) feature_form = feature_forms[feature.feature_key] - if feature_form.validate(newstyle=True): + if feature_form.validate(): context = dict(app_form.validated) context.update(feature_form.validated) result = self.handler.do_generate(feature, **context) diff --git a/tailbone/views/master.py b/tailbone/views/master.py index ed0ed009..5e2f539c 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -723,7 +723,7 @@ class MasterView(View): form = forms.Form(schema=schema, request=self.request) form.save_label = "Upload" form.cancel_url = self.get_index_url() - if form.validate(newstyle=True): + if form.validate(): uploads = self.normalize_uploads(form) filepath = uploads['filename']['temp_path'] @@ -1408,7 +1408,7 @@ class MasterView(View): pass def validate_quick_row_form(self, form): - return form.validate(newstyle=True) + return form.validate() def make_default_row_grid_tools(self, obj): if self.rows_creatable: @@ -2301,7 +2301,7 @@ class MasterView(View): factory = self.get_form_factory() form = factory(schema=schema, request=self.request) - if not form.validate(newstyle=True): + if not form.validate(): return {'error': "Form did not validate"} # nb. self.Session may differ, so use tailbone.db.Session @@ -2334,7 +2334,7 @@ class MasterView(View): factory = self.get_form_factory() form = factory(schema=schema, request=self.request) - if not form.validate(newstyle=True): + if not form.validate(): return {'error': "Form did not validate"} # nb. self.Session may differ, so use tailbone.db.Session @@ -4057,7 +4057,7 @@ class MasterView(View): supp.configure_form(form) def validate_form(self, form): - if form.validate(newstyle=True): + if form.validate(): self.form_deserialized = form.validated return True return False @@ -4514,7 +4514,7 @@ class MasterView(View): self.configure_field_product_key(form) def validate_row_form(self, form): - if form.validate(newstyle=True): + if form.validate(): self.form_deserialized = form.validated return True return False diff --git a/tailbone/views/people.py b/tailbone/views/people.py index 3761941a..c0d0c86f 100644 --- a/tailbone/views/people.py +++ b/tailbone/views/people.py @@ -1000,7 +1000,7 @@ class PersonView(MasterView): def profile_add_note(self): person = self.get_instance() form = self.make_note_form('create', person) - if form.validate(newstyle=True): + if form.validate(): note = self.create_note(person, form) self.Session.flush() return self.profile_add_note_success(note) @@ -1025,7 +1025,7 @@ class PersonView(MasterView): def profile_edit_note(self): person = self.get_instance() form = self.make_note_form('edit', person) - if form.validate(newstyle=True): + if form.validate(): note = self.update_note(person, form) self.Session.flush() return self.profile_edit_note_success(note) @@ -1047,7 +1047,7 @@ class PersonView(MasterView): def profile_delete_note(self): person = self.get_instance() form = self.make_note_form('delete', person) - if form.validate(newstyle=True): + if form.validate(): self.delete_note(person, form) self.Session.flush() return self.profile_delete_note_success(person) diff --git a/tailbone/views/products.py b/tailbone/views/products.py index ebec578e..9700424b 100644 --- a/tailbone/views/products.py +++ b/tailbone/views/products.py @@ -1972,7 +1972,7 @@ class ProductView(MasterView): params_forms[key] = forms.Form(schema=schema, request=self.request) if self.request.method == 'POST': - if form.validate(newstyle=True): + if form.validate(): data = form.validated fully_validated = True @@ -1985,7 +1985,7 @@ class ProductView(MasterView): # collect batch-type-specific params pform = params_forms.get(batch_key) if pform: - if pform.validate(newstyle=True): + if pform.validate(): pdata = pform.validated for field in pform.schema: param_name = pform.schema[field.name].param_name diff --git a/tailbone/views/projects.py b/tailbone/views/projects.py index a412c388..99103101 100644 --- a/tailbone/views/projects.py +++ b/tailbone/views/projects.py @@ -65,7 +65,7 @@ class GeneratedProjectView(MasterView): project_type = self.request.matchdict.get('project_type') if project_type: form = self.make_project_form(project_type) - if form.validate(newstyle=True): + if form.validate(): zipped = self.generate_project(project_type, form) return self.file_response(zipped) @@ -83,7 +83,7 @@ class GeneratedProjectView(MasterView): # if form validates, then user has chosen a project type, so # we redirect to the appropriate "generate project" page - if form.validate(newstyle=True): + if form.validate(): raise self.redirect(self.request.route_url( 'generate_specific_project', project_type=form.validated['project_type'])) diff --git a/tailbone/views/purchasing/costing.py b/tailbone/views/purchasing/costing.py index d5c86908..294b29ef 100644 --- a/tailbone/views/purchasing/costing.py +++ b/tailbone/views/purchasing/costing.py @@ -225,7 +225,7 @@ class CostingBatchView(PurchasingBatchView): # if form validates, that means user has chosen a creation type, so we # just redirect to the appropriate "new batch of type X" page - if form.validate(newstyle=True): + if form.validate(): workflow_key = form.validated['workflow'] vendor_uuid = form.validated['vendor'] url = self.request.route_url('{}.create_workflow'.format(route_prefix), diff --git a/tailbone/views/purchasing/receiving.py b/tailbone/views/purchasing/receiving.py index 4632723d..cdc69fe5 100644 --- a/tailbone/views/purchasing/receiving.py +++ b/tailbone/views/purchasing/receiving.py @@ -358,7 +358,7 @@ class ReceivingBatchView(PurchasingBatchView): # if form validates, that means user has chosen a creation type, so we # just redirect to the appropriate "new batch of type X" page - if form.validate(newstyle=True): + if form.validate(): workflow_key = form.validated['workflow'] vendor_uuid = form.validated['vendor'] url = self.request.route_url('{}.create_workflow'.format(route_prefix), @@ -1196,7 +1196,7 @@ class ReceivingBatchView(PurchasingBatchView): # TODO: what is this one about again? form.remove_field('quick_receive') - if form.validate(newstyle=True): + if form.validate(): # handler takes care of the row receiving logic for us kwargs = dict(form.validated) @@ -1382,7 +1382,7 @@ class ReceivingBatchView(PurchasingBatchView): # expiration_date form.set_type('expiration_date', 'date_jquery') - if form.validate(newstyle=True): + if form.validate(): # handler takes care of the row receiving logic for us kwargs = dict(form.validated) diff --git a/tailbone/views/reports.py b/tailbone/views/reports.py index 5ded5c5f..a1c737b6 100644 --- a/tailbone/views/reports.py +++ b/tailbone/views/reports.py @@ -373,7 +373,7 @@ class ReportOutputView(ExportMasterView): # if form validates, that means user has chosen a report type, so we # just redirect to the appropriate "new report" page - if form.validate(newstyle=True): + if form.validate(): raise self.redirect(self.request.route_url('generate_specific_report', type_key=form.validated['report_type'])) @@ -465,7 +465,7 @@ class ReportOutputView(ExportMasterView): form.set_default(param.name, value) # if form validates, start generating new report output; show progress page - if form.validate(newstyle=True): + if form.validate(): key = 'report_output.generate' progress = self.make_progress(key) kwargs = {'progress': progress} diff --git a/tailbone/views/settings.py b/tailbone/views/settings.py index 472ea199..47cca0c5 100644 --- a/tailbone/views/settings.py +++ b/tailbone/views/settings.py @@ -274,7 +274,7 @@ class AppSettingsView(View): form = self.make_form(settings) form.cancel_url = self.request.current_route_url() - if form.validate(newstyle=True): + if form.validate(): self.save_form(form) group = self.request.POST.get('settings-group') if group is not None: diff --git a/tailbone/views/shifts/lib.py b/tailbone/views/shifts/lib.py index 8cb75f33..d32a1309 100644 --- a/tailbone/views/shifts/lib.py +++ b/tailbone/views/shifts/lib.py @@ -164,7 +164,7 @@ class TimeSheetView(View): Process a "shift filter" form if one was in fact POST'ed. If it was then we store new context in session and redirect to display as normal. """ - if form.validate(newstyle=True): + if form.validate(): store = form.validated['store'] self.request.session['timesheet.{}.store'.format(self.key)] = store.uuid if store else None department = form.validated['department'] @@ -178,7 +178,7 @@ class TimeSheetView(View): Process an "employee shift filter" form if one was in fact POST'ed. If it was then we store new context in session and redirect to display as normal. """ - if form.validate(newstyle=True): + if form.validate(): employee = form.validated['employee'] self.request.session['timesheet.{}.employee'.format(self.key)] = employee.uuid if employee else None date = form.validated['date']