|
| 1 | +from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship |
| 2 | +from flask_rest_jsonapi.exceptions import ObjectNotFound |
| 3 | + |
| 4 | +from app.api.bootstrap import api |
| 5 | +from app.api.data_layers.BadgeFormLayer import BadgeFormLayer |
| 6 | +from app.api.helpers.db import safe_query, safe_query_kwargs |
| 7 | +from app.api.helpers.permission_manager import has_access |
| 8 | +from app.api.helpers.permissions import jwt_required |
| 9 | +from app.api.helpers.query import event_query |
| 10 | +from app.api.helpers.utilities import require_relationship |
| 11 | +from app.api.schema.badge_forms import BadgeFormSchema |
| 12 | +from app.models import db |
| 13 | +from app.models.badge_field_form import BadgeFieldForms |
| 14 | +from app.models.badge_form import BadgeForms |
| 15 | +from app.models.event import Event |
| 16 | + |
| 17 | + |
| 18 | +class BadgeFormList(ResourceList): |
| 19 | + """Create and List Custom Form Translates""" |
| 20 | + |
| 21 | + def query(self, view_kwargs): |
| 22 | + """ |
| 23 | + query method for different view_kwargs |
| 24 | + :param view_kwargs: |
| 25 | + :return: |
| 26 | + """ |
| 27 | + query_ = self.session.query(BadgeForms) |
| 28 | + if view_kwargs.get('badge_id'): |
| 29 | + events = safe_query_kwargs(Event, view_kwargs, 'event_id') |
| 30 | + query_ = self.session.query(BadgeForms).filter_by(event_id=events.id) |
| 31 | + query_ = query_.filter_by(badge_id=view_kwargs.get('badge_id')) |
| 32 | + else: |
| 33 | + query_ = event_query(query_, view_kwargs) |
| 34 | + return query_ |
| 35 | + |
| 36 | + @staticmethod |
| 37 | + def after_get(badge_forms): |
| 38 | + """ |
| 39 | + query method for different view_kwargs |
| 40 | + :param view_kwargs: |
| 41 | + :return: |
| 42 | + """ |
| 43 | + for item in badge_forms['data']: |
| 44 | + badgeFields = [] |
| 45 | + badgeFieldForms = ( |
| 46 | + BadgeFieldForms.query.filter_by(badge_form_id=item['id']) |
| 47 | + .filter_by(badge_id=item['attributes']['badge-id']) |
| 48 | + .all() |
| 49 | + ) |
| 50 | + for badgeFieldForm in badgeFieldForms: |
| 51 | + badgeFields.append(badgeFieldForm.convert_to_dict()) |
| 52 | + item['attributes']['badge-fields'] = badgeFields |
| 53 | + return badge_forms |
| 54 | + |
| 55 | + view_kwargs = True |
| 56 | + decorators = (jwt_required,) |
| 57 | + methods = [ |
| 58 | + 'GET', |
| 59 | + ] |
| 60 | + schema = BadgeFormSchema |
| 61 | + data_layer = { |
| 62 | + 'session': db.session, |
| 63 | + 'model': BadgeForms, |
| 64 | + 'methods': {'query': query, 'after_get': after_get}, |
| 65 | + } |
| 66 | + |
| 67 | + |
| 68 | +class BadgeFormDetail(ResourceDetail): |
| 69 | + """BadgeForm Resource Detail""" |
| 70 | + |
| 71 | + @staticmethod |
| 72 | + def before_get_object(view_kwargs): |
| 73 | + """ |
| 74 | + before get method |
| 75 | + :param view_kwargs: |
| 76 | + :return: |
| 77 | + """ |
| 78 | + event = None |
| 79 | + if view_kwargs.get('event_id'): |
| 80 | + event = safe_query_kwargs(Event, view_kwargs, 'event_id') |
| 81 | + elif view_kwargs.get('event_identifier'): |
| 82 | + event = safe_query_kwargs( |
| 83 | + Event, |
| 84 | + view_kwargs, |
| 85 | + 'event_identifier', |
| 86 | + 'identifier', |
| 87 | + ) |
| 88 | + |
| 89 | + if event: |
| 90 | + badge_form = safe_query(BadgeForms, 'event_id', event.id, 'event_id') |
| 91 | + view_kwargs['id'] = badge_form.id |
| 92 | + |
| 93 | + @staticmethod |
| 94 | + def before_patch(_args, kwargs, data): |
| 95 | + """ |
| 96 | + before patch method |
| 97 | + :param _args: |
| 98 | + :param kwargs: |
| 99 | + :param data: |
| 100 | + :return: |
| 101 | + """ |
| 102 | + badgeFields = data.get('badge_fields') |
| 103 | + if badgeFields: |
| 104 | + for badgeField in badgeFields: |
| 105 | + badgeFieldForm = None |
| 106 | + if 'badge_field_id' in badgeField: |
| 107 | + badgeFieldForm = BadgeFieldForms.get_badge_field_form_if_exist( |
| 108 | + badgeField['badge_field_id'], badgeField['badge_id'] |
| 109 | + ) |
| 110 | + if ( |
| 111 | + badgeFieldForm is not None |
| 112 | + and 'is_deleted' in badgeField |
| 113 | + and badgeField['is_deleted'] |
| 114 | + ): |
| 115 | + db.session.delete(badgeFieldForm) |
| 116 | + else: |
| 117 | + if badgeFieldForm: |
| 118 | + badgeFieldForm.badge_id = data['badge_id'] |
| 119 | + else: |
| 120 | + badgeFieldForm = BadgeFieldForms() |
| 121 | + badgeFieldForm.badge_id = data['badge_id'] |
| 122 | + |
| 123 | + badgeFieldForm.badge_form_id = kwargs['id'] |
| 124 | + badgeFieldForm.field_identifier = badgeField['field_identifier'] |
| 125 | + badgeFieldForm.custom_field = badgeField['custom_field'] |
| 126 | + badgeFieldForm.sample_text = badgeField['sample_text'] |
| 127 | + badgeFieldForm.font_name = badgeField['font_name'] |
| 128 | + badgeFieldForm.font_size = badgeField['font_size'] |
| 129 | + badgeFieldForm.font_color = badgeField['font_color'] |
| 130 | + badgeFieldForm.font_weight = badgeField['font_weight'] |
| 131 | + badgeFieldForm.text_rotation = badgeField['text_rotation'] |
| 132 | + badgeFieldForm.text_alignment = badgeField['text_alignment'] |
| 133 | + badgeFieldForm.text_type = badgeField['text_type'] |
| 134 | + badgeFieldForm.margin_top = badgeField['margin_top'] |
| 135 | + badgeFieldForm.margin_bottom = badgeField['margin_bottom'] |
| 136 | + badgeFieldForm.margin_left = badgeField['margin_left'] |
| 137 | + badgeFieldForm.margin_right = badgeField['margin_right'] |
| 138 | + badgeFieldForm.qr_custom_field = badgeField.get('qr_custom_field') |
| 139 | + badgeFieldForm.is_deleted = badgeField['is_deleted'] |
| 140 | + db.session.add(badgeFieldForm) |
| 141 | + |
| 142 | + @staticmethod |
| 143 | + def before_delete(_obj, kwargs): |
| 144 | + """ |
| 145 | + before delete method |
| 146 | + :param _obj: |
| 147 | + :param kwargs: |
| 148 | + :return: |
| 149 | + """ |
| 150 | + badgeFieldForm = BadgeFieldForms.query.filter_by(badge_form_id=kwargs['id']).all() |
| 151 | + for item in badgeFieldForm: |
| 152 | + db.session.delete(item) |
| 153 | + |
| 154 | + @staticmethod |
| 155 | + def after_patch(badge_form): |
| 156 | + """ |
| 157 | + after patch method |
| 158 | + :param badge_form: |
| 159 | + :return: |
| 160 | + """ |
| 161 | + badgeFields = [] |
| 162 | + data = badge_form['data'] |
| 163 | + attributes = data['attributes'] |
| 164 | + badgeFieldForms = ( |
| 165 | + BadgeFieldForms.query.filter_by(badge_form_id=data['id']) |
| 166 | + .filter_by(badge_id=attributes['badge-id']) |
| 167 | + .all() |
| 168 | + ) |
| 169 | + for badgeFieldForm in badgeFieldForms: |
| 170 | + badgeFields.append(badgeFieldForm.convert_to_dict()) |
| 171 | + attributes['badge-fields'] = badgeFields |
| 172 | + return badge_form |
| 173 | + |
| 174 | + decorators = ( |
| 175 | + api.has_permission( |
| 176 | + 'is_coorganizer', |
| 177 | + fetch='event_id', |
| 178 | + model=BadgeForms, |
| 179 | + methods="PATCH,DELETE", |
| 180 | + ), |
| 181 | + ) |
| 182 | + schema = BadgeFormSchema |
| 183 | + data_layer = { |
| 184 | + 'session': db.session, |
| 185 | + 'model': BadgeForms, |
| 186 | + 'methods': { |
| 187 | + 'before_patch': before_patch, |
| 188 | + 'before_delete': before_delete, |
| 189 | + 'after_patch': after_patch, |
| 190 | + }, |
| 191 | + } |
| 192 | + |
| 193 | + |
| 194 | +class BadgeFormRelationship(ResourceRelationship): |
| 195 | + """BadgeForm Relationship (Required)""" |
| 196 | + |
| 197 | + decorators = (jwt_required,) |
| 198 | + methods = ['GET', 'PATCH'] |
| 199 | + schema = BadgeFormSchema |
| 200 | + data_layer = {'session': db.session, 'model': BadgeForms} |
| 201 | + |
| 202 | + |
| 203 | +class BadgeFormListPost(ResourceList): |
| 204 | + """Create and List Custom Form Translates""" |
| 205 | + |
| 206 | + @staticmethod |
| 207 | + def before_post(_args, _kwargs, data): |
| 208 | + """ |
| 209 | + method to check for required relationship with event |
| 210 | + :param args: |
| 211 | + :param kwargs: |
| 212 | + :param data: |
| 213 | + :return: |
| 214 | + """ |
| 215 | + require_relationship(['event'], data) |
| 216 | + if not has_access('is_coorganizer', event_id=data['event']): |
| 217 | + raise ObjectNotFound( |
| 218 | + {'parameter': 'event_id'}, |
| 219 | + f"Event: {data['event_id']} not found", |
| 220 | + ) |
| 221 | + |
| 222 | + schema = BadgeFormSchema |
| 223 | + methods = [ |
| 224 | + 'POST', |
| 225 | + ] |
| 226 | + data_layer = {'class': BadgeFormLayer, 'session': db.session, 'model': BadgeForms} |
0 commit comments