Skip to content

Commit

Permalink
Separate webhook create form from event type field addition
Browse files Browse the repository at this point in the history
  • Loading branch information
homeworkprod committed Feb 20, 2021
1 parent aa1beaf commit 21f6a2a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 14 deletions.
33 changes: 24 additions & 9 deletions byceps/blueprints/admin/webhook/forms.py
Expand Up @@ -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:
Expand Down
10 changes: 5 additions & 5 deletions byceps/blueprints/admin/webhook/views.py
Expand Up @@ -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__)
Expand Down Expand Up @@ -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,
Expand All @@ -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)
Expand Down

0 comments on commit 21f6a2a

Please sign in to comment.