11from flask_rest_jsonapi import ResourceDetail , ResourceList , ResourceRelationship
22from flask_rest_jsonapi .exceptions import ObjectNotFound
3+ from flask_jwt import current_identity as current_user
34
45from app .api .bootstrap import api
56from app .api .helpers .db import safe_query
6- from app .api .helpers .exceptions import UnprocessableEntity
7+ from app .api .helpers .exceptions import UnprocessableEntity , ForbiddenException
78from app .api .helpers .permission_manager import has_access
89from app .api .helpers .permissions import jwt_required
910from app .api .helpers .query import event_query
1213from app .models import db
1314from app .models .feedback import Feedback
1415from app .models .event import Event
16+ from app .models .session import Session
1517
1618
1719class FeedbackListPost (ResourceList ):
@@ -38,11 +40,24 @@ def before_post(self, args, kwargs, data):
3840 raise UnprocessableEntity ({'pointer' : '' },
3941 "A valid relationship with event and session is required" )
4042
43+ def before_create_object (self , data , view_kwargs ):
44+ """
45+ before create object method for FeedbackListPost Class
46+ :param data:
47+ :param view_kwargs:
48+ :return:
49+ """
50+ if data .get ('session' , None ):
51+ session = Session .query .filter_by (id = data ['session' ]).first ()
52+ if session and not has_access ('is_coorganizer' , event_id = session .event_id ):
53+ raise ForbiddenException ({'source' : '' },
54+ "Event co-organizer access required" )
55+
4156 schema = FeedbackSchema
4257 methods = ['POST' , ]
4358 data_layer = {'session' : db .session ,
44- 'model' : Feedback
45- }
59+ 'model' : Feedback ,
60+ 'methods' : { 'before_create_object' : before_create_object } }
4661
4762
4863class FeedbackList (ResourceList ):
@@ -91,11 +106,29 @@ def before_get_object(self, view_kwargs):
91106 feedback = safe_query (self , Feedback , 'event_id' , event .id , 'event_id' )
92107 view_kwargs ['id' ] = feedback .id
93108
109+ def before_update_object (self , feedback , data , view_kwargs ):
110+ """
111+ before update object method of feedback details
112+ :param feedback:
113+ :param data:
114+ :param view_kwargs:
115+ :return:
116+ """
117+ if feedback and feedback .session_id :
118+ session = Session .query .filter_by (id = feedback .session_id ).first ()
119+ if session and not current_user .id == feedback .user_id :
120+ raise ForbiddenException ({'source' : '' },
121+ "Feedback can be updated only by user himself" )
122+ if session and not has_access ('is_coorganizer' , event_id = session .event_id ):
123+ raise ForbiddenException ({'source' : '' },
124+ "Event co-organizer access required" )
125+
94126 decorators = (api .has_permission ('is_user_itself' , fetch = 'user_id' ,
95127 fetch_as = "user_id" , model = Feedback , methods = "PATCH,DELETE" ),)
96128 schema = FeedbackSchema
97129 data_layer = {'session' : db .session ,
98- 'model' : Feedback }
130+ 'model' : Feedback ,
131+ 'methods' : {'before_update_object' : before_update_object }}
99132
100133
101134class FeedbackRelationship (ResourceRelationship ):
0 commit comments