Skip to content

Commit fe3ed67

Browse files
author
Hieu Lam - TMA
authored
Feature-8470: Make attendee form ticket specific (#8891)
* fix-8740: Create migration Custom Form Ticket and update Custom Form * fix-8740: Create migration Custom Form Ticket and update Custom Form * feature-8740: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Merge code development * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * feature-8470: Make attendee form ticket specific * Fix comment: Input parameters as **agrs. Format by Black Formater * Fix comment: Add dump only back * Fix trailing-whitespace
1 parent 40c4cc4 commit fe3ed67

File tree

10 files changed

+71
-10
lines changed

10 files changed

+71
-10
lines changed

app/api/custom_forms.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,12 @@ def query(self, view_kwargs):
5757
:return:
5858
"""
5959
query_ = self.session.query(CustomForms)
60-
query_ = event_query(query_, view_kwargs)
60+
if view_kwargs.get('form_id'):
61+
events = safe_query_kwargs(Event, view_kwargs, 'event_id')
62+
query_ = self.session.query(CustomForms).filter_by(event_id=events.id)
63+
query_ = query_.filter_by(form_id=view_kwargs.get('form_id'))
64+
else:
65+
query_ = event_query(query_, view_kwargs)
6166
return query_
6267

6368
view_kwargs = True

app/api/helpers/custom_forms.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from app.api.helpers.errors import UnprocessableEntityError
66
from app.api.schema.base import TrimmedEmail
77
from app.models.custom_form import CustomForms
8+
from app.models.ticket import Ticket
89

910

1011
def object_as_dict(obj):
@@ -33,11 +34,18 @@ def get_schema(form_fields):
3334

3435

3536
def validate_custom_form_constraints(form, obj, excluded):
36-
form_fields = CustomForms.query.filter_by(
37-
form=form,
38-
event_id=obj.event_id,
39-
is_included=True,
40-
).all()
37+
"""
38+
The validate custom form constraints.
39+
"""
40+
conditions = {
41+
'form': form,
42+
'event_id': obj.event_id,
43+
'is_included': True,
44+
}
45+
if hasattr(obj, 'ticket_id'):
46+
ticket = Ticket.query.filter_by(id=obj.ticket_id).first()
47+
conditions.update({'form_id': ticket.form_id})
48+
form_fields = CustomForms.query.filter_by(**conditions).all()
4149
required_form_fields = filter(lambda field: field.is_required, form_fields)
4250
missing_required_fields = []
4351
for field in required_form_fields:
@@ -72,7 +80,12 @@ def validate_custom_form_constraints(form, obj, excluded):
7280
return data if data else None
7381

7482

75-
def validate_custom_form_constraints_request(form, schema, obj, data, excluded=[]):
83+
def validate_custom_form_constraints_request(form, schema, obj, data, excluded=None):
84+
"""
85+
The validate custom form constraints request.
86+
"""
87+
if excluded is None:
88+
excluded = []
7689
new_obj = type(obj)(**object_as_dict(obj))
7790
relationship_fields = get_relationships(schema)
7891
for key, value in data.items():

app/api/routes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,8 @@
16571657
'custom_form_list',
16581658
'/events/<int:event_id>/custom-forms',
16591659
'/events/<event_identifier>/custom-forms',
1660+
'/events/<int:event_id>/custom-forms/<string:form_id>',
1661+
'/events/<event_identifier>/custom-forms/<string:form_id>',
16601662
)
16611663
api.route(
16621664
CustomFormDetail,

app/api/schema/custom_forms.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class Meta:
5252
is_included = fields.Boolean(default=False)
5353
is_public = fields.Boolean(default=False)
5454
position = fields.Integer(allow_none=True, default=0)
55-
is_complex = fields.Boolean(dump_only=True)
55+
is_complex = fields.Boolean(dump_only=True, default=False)
5656
is_fixed = fields.Boolean(default=False)
5757
event = Relationship(
5858
self_view='v1.custom_form_event',
@@ -62,5 +62,6 @@ class Meta:
6262
schema='EventSchemaPublic',
6363
type_='event',
6464
)
65+
form_id = fields.Str(allow_none=True)
6566
min = fields.Integer(allow_none=True, default=0)
6667
max = fields.Integer(allow_none=True, default=10)

app/api/schema/tickets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ def validate_discount_code(self, data, original_data):
127127
max_order = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
128128
is_checkin_restricted = fields.Boolean(default=True)
129129
auto_checkin_enabled = fields.Boolean(default=False)
130+
form_id = fields.Str(allow_none=True)
130131
event = Relationship(
131132
self_view='v1.ticket_event',
132133
self_view_kwargs={'id': '<id>'},

app/models/custom_form.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class TYPE:
161161
__tablename__ = 'custom_forms'
162162
__table_args__ = (
163163
UniqueConstraint(
164-
'event_id', 'field_identifier', 'form', name='custom_form_identifier'
164+
'event_id', 'field_identifier', 'form', 'form_id', name='custom_form_identifier'
165165
),
166166
)
167167
id = db.Column(db.Integer, primary_key=True)
@@ -178,6 +178,7 @@ class TYPE:
178178
is_complex = db.Column(db.Boolean, nullable=False, default=False)
179179
event_id = db.Column(db.Integer, db.ForeignKey('events.id', ondelete='CASCADE'))
180180
custom_form_options = db.relationship('CustomFormOptions', backref="custom_form")
181+
form_id = db.Column(db.String)
181182
min = db.Column(db.Integer, default=0, nullable=True)
182183
max = db.Column(db.Integer, default=10, nullable=True)
183184

app/models/ticket.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class Ticket(SoftDeletionModel):
7676
discount_codes = db.relationship(
7777
'DiscountCode', secondary=discount_codes_tickets, backref="tickets"
7878
)
79+
form_id = db.Column(db.String)
7980

8081
def has_order_tickets(self):
8182
"""Returns True if ticket has already placed orders.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""empty message
2+
Revision ID: d3c32d203ef1
3+
Revises: 410e54b84481
4+
Create Date: 2023-06-15 08:53:12.741108
5+
"""
6+
7+
from alembic import op
8+
import sqlalchemy as sa
9+
10+
11+
# revision identifiers, used by Alembic.
12+
revision = 'd3c32d203ef1'
13+
down_revision = '410e54b84481'
14+
15+
16+
def upgrade():
17+
# ### commands auto generated by Alembic - please adjust! ###
18+
op.add_column('custom_forms', sa.Column('form_id', sa.String(), nullable=True))
19+
op.add_column('custom_forms', sa.Column('min', sa.Integer(), nullable=True))
20+
op.add_column('custom_forms', sa.Column('max', sa.Integer(), nullable=True))
21+
op.add_column('tickets', sa.Column('form_id', sa.String(), nullable=True))
22+
op.drop_constraint('custom_form_identifier', 'custom_forms', type_='unique')
23+
op.create_unique_constraint('custom_form_identifier', 'custom_forms', ['event_id', 'field_identifier', 'form', 'form_id'])
24+
# ### end Alembic commands ###
25+
26+
27+
def downgrade():
28+
# ### commands auto generated by Alembic - please adjust! ###
29+
op.drop_column('tickets', 'form_id')
30+
op.drop_column('custom_forms', 'form_id')
31+
op.drop_column('custom_forms', 'max')
32+
op.drop_column('custom_forms', 'min')
33+
op.drop_constraint('custom_form_identifier', 'custom_forms', type_='unique')
34+
op.create_unique_constraint('custom_form_identifier', 'custom_forms', ['event_id', 'field_identifier', 'form'])
35+
# ### end Alembic commands ###

tests/all/integration/api/custom_forms/test_custom_forms_api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_custom_form_create(db, client, user, jwt):
1919
"field-identifier": "email",
2020
"is-included": True,
2121
"is-required": True,
22-
"is-complex": True,
22+
"is-complex": False,
2323
},
2424
"relationships": {
2525
"event": {"data": {"id": str(event.id), "type": "event"}}
@@ -56,6 +56,7 @@ def test_custom_form_create(db, client, user, jwt):
5656
"name": "Vortex Tensor",
5757
"is-included": True,
5858
"is-required": True,
59+
"is-complex": True,
5960
},
6061
"relationships": {
6162
"event": {"data": {"id": str(event.id), "type": "event"}}

tests/all/integration/api/speaker/test_speaker_api.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ def get_complex_custom_form_speaker(db, user=None):
239239
type='text',
240240
is_included=True,
241241
is_required=True,
242+
is_complex=False
242243
)
243244
CustomForms(
244245
event=speaker.event,

0 commit comments

Comments
 (0)