Skip to content

Commit 944925e

Browse files
Hieu Lam - TMAmariobehling
authored andcommitted
feature-8800: Make custom form question translatable by the organizer (#8920)
* feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer * feature-8800: Make custom form question translatable by the organizer
1 parent 1e8c6f0 commit 944925e

File tree

12 files changed

+484
-93
lines changed

12 files changed

+484
-93
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from marshmallow import Schema, fields
2+
3+
4+
class TranslationSchema(Schema):
5+
"""Translation Schema"""
6+
7+
name = fields.String(required=True)
8+
language_code = fields.String(required=True)
9+
id = fields.Integer(required=False)
10+
isDeleted = fields.Boolean(required=False, default=False)

app/api/custom_form_translates.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship
2+
from flask_rest_jsonapi.exceptions import ObjectNotFound
3+
4+
from app.api.helpers.permission_manager import has_access
5+
from app.api.helpers.permissions import jwt_required
6+
from app.api.helpers.utilities import require_relationship
7+
from app.api.schema.custom_form_translates import CustomFormTranslateSchema
8+
from app.models import db
9+
from app.models.custom_form_translate import CustomFormTranslates
10+
11+
12+
class CustomFormTranslateList(ResourceList):
13+
"""Create and List Custom Form Translates"""
14+
15+
def query(self, view_kwargs):
16+
"""
17+
query method for different view_kwargs
18+
:param view_kwargs:
19+
:return:
20+
"""
21+
query_ = self.session.query(CustomFormTranslates)
22+
if view_kwargs.get('custom_form_id'):
23+
query_ = query_.filter(custom_forms_id=view_kwargs['custom_form_id'])
24+
if view_kwargs.get('language_code'):
25+
query_ = query_.filter(language_code=view_kwargs['language_code'])
26+
return query_
27+
28+
schema = CustomFormTranslateSchema
29+
data_layer = {
30+
'session': db.session,
31+
'model': CustomFormTranslates,
32+
'methods': {'query': query},
33+
}
34+
35+
36+
class CustomFormTranslateDetail(ResourceDetail):
37+
"""CustomFormTranslate Resource Detail"""
38+
39+
schema = CustomFormTranslateSchema
40+
data_layer = {'session': db.session, 'model': CustomFormTranslates}
41+
42+
43+
class CustomFormTranslateRelationship(ResourceRelationship):
44+
"""CustomFormTranslate Relationship (Required)"""
45+
46+
decorators = (jwt_required,)
47+
methods = ['GET', 'PATCH']
48+
schema = CustomFormTranslateSchema
49+
data_layer = {'session': db.session, 'model': CustomFormTranslates}
50+
51+
52+
class CustomFormTranslateListPost(ResourceList):
53+
"""Create and List Custom Form Translates"""
54+
55+
@staticmethod
56+
def before_post(data):
57+
"""
58+
method to check for required relationship with event
59+
:param data:
60+
:return:
61+
"""
62+
require_relationship(['custom_form'], data)
63+
if not has_access('is_coorganizer', custom_form=data['custom_form']):
64+
raise ObjectNotFound(
65+
{'parameter': 'custom_form'},
66+
f"Custom Form: {data['custom_form']} not found",
67+
)
68+
69+
schema = CustomFormTranslateSchema
70+
methods = [
71+
'POST',
72+
]
73+
data_layer = {'session': db.session, 'model': CustomFormTranslates}

app/api/custom_forms.py

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from flask_rest_jsonapi.exceptions import ObjectNotFound
33

44
from app.api.bootstrap import api
5+
from app.api.data_layers.CustomFormTranslateLayer import CustomFormTranslateLayer
56
from app.api.helpers.db import safe_query, safe_query_kwargs
67
from app.api.helpers.permission_manager import has_access
78
from app.api.helpers.permissions import jwt_required
@@ -10,6 +11,7 @@
1011
from app.api.schema.custom_forms import CustomFormSchema
1112
from app.models import db
1213
from app.models.custom_form import CUSTOM_FORM_IDENTIFIER_NAME_MAP, CustomForms
14+
from app.models.custom_form_translate import CustomFormTranslates
1315
from app.models.event import Event
1416

1517

@@ -42,7 +44,11 @@ def before_post(self, args, kwargs, data):
4244
methods = [
4345
'POST',
4446
]
45-
data_layer = {'session': db.session, 'model': CustomForms}
47+
data_layer = {
48+
'class': CustomFormTranslateLayer,
49+
'session': db.session,
50+
'model': CustomForms,
51+
}
4652

4753

4854
class CustomFormList(ResourceList):
@@ -65,6 +71,26 @@ def query(self, view_kwargs):
6571
query_ = event_query(query_, view_kwargs)
6672
return query_
6773

74+
@staticmethod
75+
def after_get(custom_forms):
76+
"""
77+
query method for different view_kwargs
78+
:param view_kwargs:
79+
:return:
80+
"""
81+
for item in custom_forms['data']:
82+
translation = []
83+
if item['attributes']['is-complex']:
84+
customFormTranslates = (
85+
CustomFormTranslates.query.filter_by(custom_form_id=item['id'])
86+
.filter_by(form_id=item['attributes']['form-id'])
87+
.all()
88+
)
89+
for customFormTranslate in customFormTranslates:
90+
translation.append(customFormTranslate.convert_to_dict())
91+
item['attributes']['translations'] = translation
92+
return custom_forms
93+
6894
view_kwargs = True
6995
decorators = (jwt_required,)
7096
methods = [
@@ -74,7 +100,7 @@ def query(self, view_kwargs):
74100
data_layer = {
75101
'session': db.session,
76102
'model': CustomForms,
77-
'methods': {'query': query},
103+
'methods': {'query': query, 'after_get': after_get},
78104
}
79105

80106

@@ -104,6 +130,80 @@ def before_get_object(self, view_kwargs):
104130
custom_form = safe_query(CustomForms, 'event_id', event.id, 'event_id')
105131
view_kwargs['id'] = custom_form.id
106132

133+
@staticmethod
134+
def before_patch(_args, kwargs, data):
135+
"""
136+
before patch method
137+
:param _args:
138+
:param kwargs:
139+
:param data:
140+
:return:
141+
"""
142+
translation = data.get('translations')
143+
if translation:
144+
for translate in translation:
145+
customFormTranslate = None
146+
if 'id' in translate:
147+
customFormTranslate = (
148+
CustomFormTranslates.check_custom_form_translate(
149+
kwargs['id'], translate['id']
150+
)
151+
)
152+
if (
153+
customFormTranslate is not None
154+
and 'isDeleted' in translate
155+
and translate['isDeleted']
156+
):
157+
db.session.delete(customFormTranslate)
158+
else:
159+
if customFormTranslate:
160+
customFormTranslate.name = translate['name']
161+
customFormTranslate.language_code = translate['language_code']
162+
customFormTranslate.form_id = data['form_id']
163+
db.session.add(customFormTranslate)
164+
else:
165+
customFormTranslate = CustomFormTranslates()
166+
customFormTranslate.form_id = data['form_id']
167+
customFormTranslate.custom_form_id = kwargs['id']
168+
customFormTranslate.name = translate['name']
169+
customFormTranslate.language_code = translate['language_code']
170+
db.session.add(customFormTranslate)
171+
172+
@staticmethod
173+
def before_delete(_obj, kwargs):
174+
"""
175+
before delete method
176+
:param _obj:
177+
:param kwargs:
178+
:return:
179+
"""
180+
customFormTranslate = CustomFormTranslates.query.filter_by(
181+
custom_form_id=kwargs['id']
182+
).all()
183+
for item in customFormTranslate:
184+
db.session.delete(item)
185+
186+
@staticmethod
187+
def after_patch(custom_form):
188+
"""
189+
after patch method
190+
:param custom_form:
191+
:return:
192+
"""
193+
translation = []
194+
data = custom_form['data']
195+
attributes = data['attributes']
196+
if attributes and attributes['is-complex']:
197+
customFormTranslates = (
198+
CustomFormTranslates.query.filter_by(custom_form_id=data['id'])
199+
.filter_by(form_id=attributes['form-id'])
200+
.all()
201+
)
202+
for customFormTranslate in customFormTranslates:
203+
translation.append(customFormTranslate.convert_to_dict())
204+
attributes['translations'] = translation
205+
return custom_form
206+
107207
decorators = (
108208
api.has_permission(
109209
'is_coorganizer',
@@ -116,7 +216,12 @@ def before_get_object(self, view_kwargs):
116216
data_layer = {
117217
'session': db.session,
118218
'model': CustomForms,
119-
'methods': {'before_get_object': before_get_object},
219+
'methods': {
220+
'before_get_object': before_get_object,
221+
'before_patch': before_patch,
222+
'before_delete': before_delete,
223+
'after_patch': after_patch,
224+
},
120225
}
121226

122227

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from flask_rest_jsonapi.data_layers.base import BaseDataLayer
2+
3+
from app.api.helpers.db import save_to_db
4+
from app.models.custom_form import CustomForms
5+
from app.models.custom_form_translate import CustomFormTranslates
6+
7+
8+
class CustomFormTranslateLayer(BaseDataLayer):
9+
"""CustomFormTranslate Data Layer"""
10+
11+
@staticmethod
12+
def create_object(data, _view_kwargs):
13+
"""
14+
create_object method for the Charges layer
15+
charge the user using paypal or stripe
16+
:param data:
17+
:param _view_kwargs:
18+
:return:
19+
"""
20+
customForm = CustomForms()
21+
keys = [
22+
'description',
23+
'name',
24+
'form_id',
25+
'form',
26+
'is_fixed',
27+
'is_complex',
28+
'is_included',
29+
'is_public',
30+
'is_required',
31+
'field_identifier',
32+
'main_language',
33+
'max',
34+
'min',
35+
'type',
36+
'position',
37+
]
38+
for key in keys:
39+
if key in data:
40+
customForm.__setattr__(key, data[key])
41+
42+
customForm.event_id = data['event']
43+
save_to_db(customForm)
44+
45+
if 'translations' in data:
46+
for item in data['translations']:
47+
translation = CustomFormTranslates()
48+
translation.form_id = data['form_id']
49+
translation.custom_form_id = customForm.id
50+
translation.name = item['name']
51+
translation.language_code = item['language_code']
52+
save_to_db(translation)
53+
return customForm

app/api/routes.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131
CustomFormOptionList,
3232
CustomFormOptionRelationship,
3333
)
34+
from app.api.custom_form_translates import (
35+
CustomFormTranslateDetail,
36+
CustomFormTranslateList,
37+
CustomFormTranslateListPost,
38+
CustomFormTranslateRelationship,
39+
)
3440
from app.api.custom_forms import (
3541
CustomFormDetail,
3642
CustomFormList,
@@ -1665,6 +1671,7 @@
16651671
'custom_form_detail',
16661672
'/custom-forms/<int:id>',
16671673
'/custom-form-options/<int:custom_form_option_id>/custom-form',
1674+
'/custom-form-translates/<int:custom_form_translate_id>/custom-form',
16681675
)
16691676
api.route(
16701677
CustomFormRelationshipRequired,
@@ -1962,3 +1969,23 @@
19621969
'video_stream_moderator_stream',
19631970
'/video-stream-moderators/<int:id>/relationships/video-stream',
19641971
)
1972+
api.route(
1973+
CustomFormTranslateListPost,
1974+
'custom_form_translate_list_post',
1975+
'/custom-form-translates',
1976+
)
1977+
api.route(
1978+
CustomFormTranslateList,
1979+
'custom_form_translate_list',
1980+
'/custom-forms/<int:custom_form_id>/custom-form-translates',
1981+
)
1982+
api.route(
1983+
CustomFormTranslateDetail,
1984+
'custom_form_translate_detail',
1985+
'/custom-form-translates/<int:id>',
1986+
)
1987+
api.route(
1988+
CustomFormTranslateRelationship,
1989+
'custom_form_translate_form',
1990+
'/custom-form-translates/<int:id>/relationships/custom-form',
1991+
)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from marshmallow_jsonapi import fields
2+
from marshmallow_jsonapi.flask import Relationship, Schema
3+
4+
from app.api.helpers.utilities import dasherize
5+
from utils.common import use_defaults
6+
7+
8+
@use_defaults()
9+
class CustomFormTranslateSchema(Schema):
10+
"""API Schema for Custom Forms database model"""
11+
12+
class Meta:
13+
"""Meta class for CustomForm Schema"""
14+
15+
type_ = 'custom-form-translate'
16+
self_view = 'v1.custom_form_translate_detail'
17+
self_view_kwargs = {'id': '<id>'}
18+
inflect = dasherize
19+
20+
id = fields.Integer(dump_only=True)
21+
name = fields.Str(required=True)
22+
custom_form = Relationship(
23+
self_view='v1.custom_form_translate_form',
24+
self_view_kwargs={'id': '<id>'},
25+
related_view='v1.custom_form_detail',
26+
related_view_kwargs={'custom_form_translate_id': '<id>'},
27+
schema='CustomFormSchema',
28+
type_='custom_form',
29+
)
30+
language_code = fields.Str(required=True)
31+
form_id = fields.Str(required=True)

0 commit comments

Comments
 (0)