Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion app/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
AttendeeRelationshipRequired, AttendeeListPost
from app.api.bootstrap import api
from app.api.custom_forms import CustomFormList, CustomFormListPost, CustomFormDetail, CustomFormRelationshipRequired
from app.api.custom_form_options import CustomFormOptionList, CustomFormOptionDetail, CustomFormOptionRelationship
from app.api.custom_placeholders import CustomPlaceholderList, CustomPlaceholderDetail, CustomPlaceholderRelationship
from app.api.custom_system_roles import CustomSystemRoleList, CustomSystemRoleDetail, CustomSystemRoleRelationship
from app.api.discount_codes import DiscountCodeList, DiscountCodeDetail, DiscountCodeRelationshipOptional, \
Expand Down Expand Up @@ -575,10 +576,17 @@
api.route(CustomFormListPost, 'custom_form_list_post', '/custom-forms')
api.route(CustomFormList, 'custom_form_list', '/events/<int:event_id>/custom-forms',
'/events/<event_identifier>/custom-forms')
api.route(CustomFormDetail, 'custom_form_detail', '/custom-forms/<int:id>')
api.route(CustomFormDetail, 'custom_form_detail', '/custom-forms/<int:id>',
'/custom-form-options/<int:custom_form_option_id>/custom-form')
api.route(CustomFormRelationshipRequired, 'custom_form_event',
'/custom-forms/<int:id>/relationships/event')

# custom form options
api.route(CustomFormOptionList, 'custom_form_option_list', '/custom-forms/<int:custom_form_id>/custom-form-options')
api.route(CustomFormOptionDetail, 'custom_form_option_detail', '/custom-form-options/<int:id>')
api.route(CustomFormOptionRelationship, 'custom_form_option_form',
'/custom-form-options/<int:id>/relationships/custom-form')

# FAQ
api.route(FaqListPost, 'faq_list_post', '/faqs')
api.route(FaqList, 'faq_list', '/events/<int:event_id>/faqs', '/events/<event_identifier>/faqs',
Expand Down
46 changes: 46 additions & 0 deletions app/api/custom_form_options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship
from app.models import db
from app.api.schema.custom_form_options import CustomFormOptionSchema
from app.models.custom_form_option import CustomFormOptions


class CustomFormOptionList(ResourceList):
"""
Create and List Custom Form Options
"""

def query(self, view_kwargs):
query_ = self.session.query(CustomFormOptions)
if view_kwargs.get('custom_form_id'):
query_ = self.session.query(CustomFormOptions).filter(
getattr(CustomFormOptions, 'custom_form_id') == view_kwargs['custom_form_id'])
return query_

schema = CustomFormOptionSchema
data_layer = {'session': db.session,
'model': CustomFormOptions,
'methods': {
'query': query
}}


class CustomFormOptionDetail(ResourceDetail):
"""
CustomForm Resource
"""

schema = CustomFormOptionSchema
data_layer = {'session': db.session,
'model': CustomFormOptions
}


class CustomFormOptionRelationship(ResourceRelationship):
"""
CustomForm Resource
"""

schema = CustomFormOptionSchema
data_layer = {'session': db.session,
'model': CustomFormOptions
}
32 changes: 32 additions & 0 deletions app/api/schema/custom_form_options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from marshmallow_jsonapi import fields
from marshmallow_jsonapi.flask import Relationship

from app.api.helpers.utilities import dasherize
from app.api.schema.base import SoftDeletionSchema
from utils.common import use_defaults


@use_defaults()
class CustomFormOptionSchema(SoftDeletionSchema):
"""
API Schema for Custom Forms database model
"""

class Meta:
"""
Meta class for CustomForm Schema
"""
type_ = 'custom-form-option'
self_view = 'v1.custom_form_option_detail'
self_view_kwargs = {'id': '<id>'}
inflect = dasherize

id = fields.Integer(dump_only=True)
value = fields.Str(required=True)
custom_form = Relationship(attribute='custom_form',
self_view='v1.custom_form_option_form',
self_view_kwargs={'id': '<id>'},
related_view='v1.custom_form_detail',
related_view_kwargs={'custom_form_option_id': '<id>'},
schema='CustomFormSchema',
type_='custom_form')
2 changes: 2 additions & 0 deletions app/api/schema/custom_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ class Meta:
type = fields.Str(default="text", validate=validate.OneOf(
choices=["text", "checkbox", "select", "file", "image", "email",
"number"]))
description = fields.Str(allow_none=True)
is_required = fields.Boolean(default=False)
is_included = fields.Boolean(default=False)
is_complex = fields.Boolean(default=False)
is_fixed = fields.Boolean(default=False)
event = Relationship(attribute='event',
self_view='v1.custom_form_event',
Expand Down
17 changes: 13 additions & 4 deletions app/models/custom_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,27 +73,34 @@ class CustomForms(SoftDeletionModel):
field_identifier = db.Column(db.String, nullable=False)
form = db.Column(db.String, nullable=False)
type = db.Column(db.String, nullable=False)
description = db.Column(db.String, nullable=True)
is_required = db.Column(db.Boolean)
is_included = db.Column(db.Boolean)
is_fixed = db.Column(db.Boolean)
is_complex = db.Column(db.Boolean)
event_id = db.Column(db.Integer, db.ForeignKey('events.id', ondelete='CASCADE'))
custom_form_options = db.relationship('CustomFormOptions', backref="custom_form")

def __init__(self,
event_id=None,
field_identifier=None,
form=None,
type=None,
is_required=None,
is_included=None,
is_fixed=None,
description=None,
is_required=False,
is_included=False,
is_fixed=False,
is_complex=False,
deleted_at=None):
self.event_id = event_id
self.field_identifier = field_identifier
self.form = form
self.type = type
self.description = description
self.is_required = is_required
self.is_included = is_included
self.is_fixed = is_fixed
self.is_complex = is_complex
self.deleted_at = deleted_at

def __repr__(self):
Expand All @@ -111,7 +118,9 @@ def serialize(self):
'field_identifier': self.field_identifier,
'form': self.form,
'type': self.type,
'description': self.description,
'is_required': self.is_required,
'is_included': self.is_included,
'is_fixed': self.is_fixed
'is_fixed': self.is_fixed,
'is_complex': self.is_complex
}
23 changes: 23 additions & 0 deletions app/models/custom_form_option.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from app.models import db
from app.models.base import SoftDeletionModel


class CustomFormOptions(SoftDeletionModel):
__tablename__ = 'custom_form_options'
id = db.Column(db.Integer, primary_key=True)
value = db.Column(db.String, nullable=False)
custom_form_id = db.Column(db.Integer, db.ForeignKey('custom_forms.id', ondelete='CASCADE'))

def __init__(self,
custom_form_id=None,
deleted_at=None,
value=None):
self.custom_form_id = custom_form_id
self.value = value
self.deleted_at = deleted_at

def __repr__(self):
return '<CustomFormOption %r>' % self.id

def __str__(self):
return self.__repr__()
38 changes: 38 additions & 0 deletions migrations/versions/rev-2019-08-24-20:32:00-ebfe89366d48_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""empty message

Revision ID: ebfe89366d48
Revises: 90d62fe3b5e3
Create Date: 2019-08-24 20:32:00.535676

"""

from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision = 'ebfe89366d48'
down_revision = '90d62fe3b5e3'


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('custom_form_options',
sa.Column('deleted_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('value', sa.String(), nullable=False),
sa.Column('custom_form_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['custom_form_id'], ['custom_forms.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.add_column('custom_forms', sa.Column('description', sa.String(), nullable=True))
op.add_column('custom_forms', sa.Column('is_complex', sa.Boolean(), nullable=False, server_default='False'))

# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('custom_forms', 'is_complex')
op.drop_column('custom_forms', 'description')
op.drop_table('custom_form_options')
# ### end Alembic commands ###