diff --git a/byceps/blueprints/admin/webhook/forms.py b/byceps/blueprints/admin/webhook/forms.py index bcf0dc6156..bc8b761033 100644 --- a/byceps/blueprints/admin/webhook/forms.py +++ b/byceps/blueprints/admin/webhook/forms.py @@ -21,23 +21,38 @@ class CreateForm(LocalizedForm): url = StringField(lazy_gettext('URL'), [InputRequired()]) -def assemble_create_form_with_events( +def assemble_create_form(event_names: Set[str]) -> Type[LocalizedForm]: + return _extend_form_for_event_types(CreateForm, event_names) + + +def _extend_form_for_event_types( + form_class, event_names: Set[str], ) -> Type[LocalizedForm]: - """Dynamically add a checkbox per event type to the creation form.""" + """Dynamically add a checkbox per event type to the form.""" + + class FormWithEventTypes(form_class): + pass - class FormWithEvents(CreateForm): + _add_event_field_getter_to_form(FormWithEventTypes) + _add_event_fields_to_form(FormWithEventTypes, event_names) - def get_field_for_event_name(self, event_name: str): - field_name = _create_event_field_name(event_name) - return getattr(self, field_name) + return FormWithEventTypes + +def _add_event_field_getter_to_form(form_class) -> None: + def get_field_for_event_name(self, event_name: str): + field_name = _create_event_field_name(event_name) + return getattr(self, field_name) + + form_class.get_field_for_event_name = get_field_for_event_name + + +def _add_event_fields_to_form(form_class, event_names: Set[str]) -> None: for event_name in event_names: field_name = _create_event_field_name(event_name) field = BooleanField() - setattr(FormWithEvents, field_name, field) - - return FormWithEvents + setattr(form_class, field_name, field) def _create_event_field_name(event_name: str) -> str: diff --git a/byceps/blueprints/admin/webhook/views.py b/byceps/blueprints/admin/webhook/views.py index dc54ad2985..b7a66a12ba 100644 --- a/byceps/blueprints/admin/webhook/views.py +++ b/byceps/blueprints/admin/webhook/views.py @@ -20,7 +20,7 @@ from ....util.views import permission_required, redirect_to, respond_no_content from .authorization import WebhookPermission -from .forms import assemble_create_form_with_events +from .forms import assemble_create_form blueprint = create_blueprint('webhook_admin', __name__) @@ -52,9 +52,9 @@ def index(): def create_form(erroneous_form=None): """Show form to create a webhook.""" event_names = WEBHOOK_EVENT_NAMES - CreateFormWithEvents = assemble_create_form_with_events(event_names) + CreateForm = assemble_create_form(event_names) - form = erroneous_form if erroneous_form else CreateFormWithEvents() + form = erroneous_form if erroneous_form else CreateForm() return { 'form': form, @@ -67,9 +67,9 @@ def create_form(erroneous_form=None): def create(): """Create a webhook.""" event_names = WEBHOOK_EVENT_NAMES - CreateFormWithEvents = assemble_create_form_with_events(event_names) + CreateForm = assemble_create_form(event_names) - form = CreateFormWithEvents(request.form) + form = CreateForm(request.form) if not form.validate(): return create_form(form)