Skip to content

Commit 5e0e515

Browse files
authored
feat: create custom_form_options api (#6408)
1 parent b1fd647 commit 5e0e515

File tree

7 files changed

+163
-5
lines changed

7 files changed

+163
-5
lines changed

app/api/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
AttendeeRelationshipRequired, AttendeeListPost
1717
from app.api.bootstrap import api
1818
from app.api.custom_forms import CustomFormList, CustomFormListPost, CustomFormDetail, CustomFormRelationshipRequired
19+
from app.api.custom_form_options import CustomFormOptionList, CustomFormOptionDetail, CustomFormOptionRelationship
1920
from app.api.custom_placeholders import CustomPlaceholderList, CustomPlaceholderDetail, CustomPlaceholderRelationship
2021
from app.api.custom_system_roles import CustomSystemRoleList, CustomSystemRoleDetail, CustomSystemRoleRelationship
2122
from app.api.discount_codes import DiscountCodeList, DiscountCodeDetail, DiscountCodeRelationshipOptional, \
@@ -575,10 +576,17 @@
575576
api.route(CustomFormListPost, 'custom_form_list_post', '/custom-forms')
576577
api.route(CustomFormList, 'custom_form_list', '/events/<int:event_id>/custom-forms',
577578
'/events/<event_identifier>/custom-forms')
578-
api.route(CustomFormDetail, 'custom_form_detail', '/custom-forms/<int:id>')
579+
api.route(CustomFormDetail, 'custom_form_detail', '/custom-forms/<int:id>',
580+
'/custom-form-options/<int:custom_form_option_id>/custom-form')
579581
api.route(CustomFormRelationshipRequired, 'custom_form_event',
580582
'/custom-forms/<int:id>/relationships/event')
581583

584+
# custom form options
585+
api.route(CustomFormOptionList, 'custom_form_option_list', '/custom-forms/<int:custom_form_id>/custom-form-options')
586+
api.route(CustomFormOptionDetail, 'custom_form_option_detail', '/custom-form-options/<int:id>')
587+
api.route(CustomFormOptionRelationship, 'custom_form_option_form',
588+
'/custom-form-options/<int:id>/relationships/custom-form')
589+
582590
# FAQ
583591
api.route(FaqListPost, 'faq_list_post', '/faqs')
584592
api.route(FaqList, 'faq_list', '/events/<int:event_id>/faqs', '/events/<event_identifier>/faqs',

app/api/custom_form_options.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship
2+
from app.models import db
3+
from app.api.schema.custom_form_options import CustomFormOptionSchema
4+
from app.models.custom_form_option import CustomFormOptions
5+
6+
7+
class CustomFormOptionList(ResourceList):
8+
"""
9+
Create and List Custom Form Options
10+
"""
11+
12+
def query(self, view_kwargs):
13+
query_ = self.session.query(CustomFormOptions)
14+
if view_kwargs.get('custom_form_id'):
15+
query_ = self.session.query(CustomFormOptions).filter(
16+
getattr(CustomFormOptions, 'custom_form_id') == view_kwargs['custom_form_id'])
17+
return query_
18+
19+
schema = CustomFormOptionSchema
20+
data_layer = {'session': db.session,
21+
'model': CustomFormOptions,
22+
'methods': {
23+
'query': query
24+
}}
25+
26+
27+
class CustomFormOptionDetail(ResourceDetail):
28+
"""
29+
CustomForm Resource
30+
"""
31+
32+
schema = CustomFormOptionSchema
33+
data_layer = {'session': db.session,
34+
'model': CustomFormOptions
35+
}
36+
37+
38+
class CustomFormOptionRelationship(ResourceRelationship):
39+
"""
40+
CustomForm Resource
41+
"""
42+
43+
schema = CustomFormOptionSchema
44+
data_layer = {'session': db.session,
45+
'model': CustomFormOptions
46+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from marshmallow_jsonapi import fields
2+
from marshmallow_jsonapi.flask import Relationship
3+
4+
from app.api.helpers.utilities import dasherize
5+
from app.api.schema.base import SoftDeletionSchema
6+
from utils.common import use_defaults
7+
8+
9+
@use_defaults()
10+
class CustomFormOptionSchema(SoftDeletionSchema):
11+
"""
12+
API Schema for Custom Forms database model
13+
"""
14+
15+
class Meta:
16+
"""
17+
Meta class for CustomForm Schema
18+
"""
19+
type_ = 'custom-form-option'
20+
self_view = 'v1.custom_form_option_detail'
21+
self_view_kwargs = {'id': '<id>'}
22+
inflect = dasherize
23+
24+
id = fields.Integer(dump_only=True)
25+
value = fields.Str(required=True)
26+
custom_form = Relationship(attribute='custom_form',
27+
self_view='v1.custom_form_option_form',
28+
self_view_kwargs={'id': '<id>'},
29+
related_view='v1.custom_form_detail',
30+
related_view_kwargs={'custom_form_option_id': '<id>'},
31+
schema='CustomFormSchema',
32+
type_='custom_form')

app/api/schema/custom_forms.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ class Meta:
2727
type = fields.Str(default="text", validate=validate.OneOf(
2828
choices=["text", "checkbox", "select", "file", "image", "email",
2929
"number"]))
30+
description = fields.Str(allow_none=True)
3031
is_required = fields.Boolean(default=False)
3132
is_included = fields.Boolean(default=False)
33+
is_complex = fields.Boolean(default=False)
3234
is_fixed = fields.Boolean(default=False)
3335
event = Relationship(attribute='event',
3436
self_view='v1.custom_form_event',

app/models/custom_form.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,27 +73,34 @@ class CustomForms(SoftDeletionModel):
7373
field_identifier = db.Column(db.String, nullable=False)
7474
form = db.Column(db.String, nullable=False)
7575
type = db.Column(db.String, nullable=False)
76+
description = db.Column(db.String, nullable=True)
7677
is_required = db.Column(db.Boolean)
7778
is_included = db.Column(db.Boolean)
7879
is_fixed = db.Column(db.Boolean)
80+
is_complex = db.Column(db.Boolean)
7981
event_id = db.Column(db.Integer, db.ForeignKey('events.id', ondelete='CASCADE'))
82+
custom_form_options = db.relationship('CustomFormOptions', backref="custom_form")
8083

8184
def __init__(self,
8285
event_id=None,
8386
field_identifier=None,
8487
form=None,
8588
type=None,
86-
is_required=None,
87-
is_included=None,
88-
is_fixed=None,
89+
description=None,
90+
is_required=False,
91+
is_included=False,
92+
is_fixed=False,
93+
is_complex=False,
8994
deleted_at=None):
9095
self.event_id = event_id
9196
self.field_identifier = field_identifier
9297
self.form = form
9398
self.type = type
99+
self.description = description
94100
self.is_required = is_required
95101
self.is_included = is_included
96102
self.is_fixed = is_fixed
103+
self.is_complex = is_complex
97104
self.deleted_at = deleted_at
98105

99106
def __repr__(self):
@@ -111,7 +118,9 @@ def serialize(self):
111118
'field_identifier': self.field_identifier,
112119
'form': self.form,
113120
'type': self.type,
121+
'description': self.description,
114122
'is_required': self.is_required,
115123
'is_included': self.is_included,
116-
'is_fixed': self.is_fixed
124+
'is_fixed': self.is_fixed,
125+
'is_complex': self.is_complex
117126
}

app/models/custom_form_option.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from app.models import db
2+
from app.models.base import SoftDeletionModel
3+
4+
5+
class CustomFormOptions(SoftDeletionModel):
6+
__tablename__ = 'custom_form_options'
7+
id = db.Column(db.Integer, primary_key=True)
8+
value = db.Column(db.String, nullable=False)
9+
custom_form_id = db.Column(db.Integer, db.ForeignKey('custom_forms.id', ondelete='CASCADE'))
10+
11+
def __init__(self,
12+
custom_form_id=None,
13+
deleted_at=None,
14+
value=None):
15+
self.custom_form_id = custom_form_id
16+
self.value = value
17+
self.deleted_at = deleted_at
18+
19+
def __repr__(self):
20+
return '<CustomFormOption %r>' % self.id
21+
22+
def __str__(self):
23+
return self.__repr__()
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""empty message
2+
3+
Revision ID: ebfe89366d48
4+
Revises: 90d62fe3b5e3
5+
Create Date: 2019-08-24 20:32:00.535676
6+
7+
"""
8+
9+
from alembic import op
10+
import sqlalchemy as sa
11+
12+
# revision identifiers, used by Alembic.
13+
revision = 'ebfe89366d48'
14+
down_revision = '90d62fe3b5e3'
15+
16+
17+
def upgrade():
18+
# ### commands auto generated by Alembic - please adjust! ###
19+
op.create_table('custom_form_options',
20+
sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
21+
sa.Column('id', sa.Integer(), nullable=False),
22+
sa.Column('value', sa.String(), nullable=False),
23+
sa.Column('custom_form_id', sa.Integer(), nullable=True),
24+
sa.ForeignKeyConstraint(['custom_form_id'], ['custom_forms.id'], ondelete='CASCADE'),
25+
sa.PrimaryKeyConstraint('id')
26+
)
27+
op.add_column('custom_forms', sa.Column('description', sa.String(), nullable=True))
28+
op.add_column('custom_forms', sa.Column('is_complex', sa.Boolean(), nullable=False, server_default='False'))
29+
30+
# ### end Alembic commands ###
31+
32+
33+
def downgrade():
34+
# ### commands auto generated by Alembic - please adjust! ###
35+
op.drop_column('custom_forms', 'is_complex')
36+
op.drop_column('custom_forms', 'description')
37+
op.drop_table('custom_form_options')
38+
# ### end Alembic commands ###

0 commit comments

Comments
 (0)