Skip to content

Commit 5ae00ff

Browse files
shreyanshdwivediiamareebjamal
authored andcommitted
feat: implement checks on session rating (#6070)
1 parent cf03f65 commit 5ae00ff

File tree

5 files changed

+74
-35
lines changed

5 files changed

+74
-35
lines changed

app/api/feedbacks.py

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship
22
from flask_rest_jsonapi.exceptions import ObjectNotFound
3+
from flask_jwt import current_identity as current_user
34

45
from app.api.bootstrap import api
56
from app.api.helpers.db import safe_query
6-
from app.api.helpers.exceptions import UnprocessableEntity
7+
from app.api.helpers.exceptions import UnprocessableEntity, ForbiddenException
78
from app.api.helpers.permission_manager import has_access
89
from app.api.helpers.permissions import jwt_required
910
from app.api.helpers.query import event_query
@@ -12,6 +13,7 @@
1213
from app.models import db
1314
from app.models.feedback import Feedback
1415
from app.models.event import Event
16+
from app.models.session import Session
1517

1618

1719
class 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

4863
class 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

101134
class FeedbackRelationship(ResourceRelationship):

app/api/schema/feedbacks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Meta:
3737
self_view_kwargs={'id': '<id>'},
3838
related_view='v1.session_detail',
3939
related_view_kwargs={'feedback_id': '<id>'},
40-
schema='SessionsSchema',
40+
schema='SessionSchema',
4141
type_='session')
4242
user = Relationship(attribute='user',
4343
self_view='v1.feedback_user',

app/factories/feedback.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import factory
22

3-
from app.factories.event import EventFactoryBasic
3+
from app.factories.session import SessionFactory
44
from app.factories.user import UserFactory
55
from app.models.feedback import db, Feedback
66

@@ -11,9 +11,9 @@ class Meta:
1111
model = Feedback
1212
sqlalchemy_session = db.session
1313

14-
event = factory.RelatedFactory(EventFactoryBasic)
14+
session = factory.RelatedFactory(SessionFactory)
1515
user = factory.RelatedFactory(UserFactory)
1616
rating = "4"
17-
comment = "Awesome event."
18-
event_id = 1
19-
user_id = 2
17+
comment = "Awesome session."
18+
session_id = 1
19+
user_id = 1

docs/api/api_blueprint.apib

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21351,26 +21351,26 @@ Create a new feedback with event_id.
2135121351

2135221352
{
2135321353
"data": {
21354-
"type": "feedback",
2135521354
"relationships": {
21356-
"event": {
21357-
"data": {
21358-
"type": "event",
21359-
"id": "1"
21360-
}
21361-
},
21362-
"user": {
21363-
"data": {
21364-
"type": "user",
21365-
"id": "1"
21366-
}
21367-
}
21368-
},
21369-
"attributes": {
21370-
"rating": "4",
21371-
"comment": "Awesome event."
21355+
"session": {
21356+
"data": {
21357+
"type": "session",
21358+
"id": "1"
2137221359
}
21373-
}
21360+
},
21361+
"user": {
21362+
"data": {
21363+
"type": "user",
21364+
"id": "1"
21365+
}
21366+
}
21367+
},
21368+
"attributes": {
21369+
"rating": 4,
21370+
"comment": "Awesome session."
21371+
},
21372+
"type": "feedback"
21373+
}
2137421374
}
2137521375

2137621376

@@ -21379,9 +21379,9 @@ Create a new feedback with event_id.
2137921379
{
2138021380
"data": {
2138121381
"relationships": {
21382-
"event": {
21382+
"session": {
2138321383
"links": {
21384-
"self": "/v1/feedbacks/1/relationships/event",
21384+
"self": "/v1/feedbacks/1/relationships/session",
2138521385
"related": "/v1/feedbacks/1/event"
2138621386
}
2138721387
},
@@ -21390,12 +21390,18 @@ Create a new feedback with event_id.
2139021390
"self": "/v1/feedbacks/1/relationships/user",
2139121391
"related": "/v1/feedbacks/1/user"
2139221392
}
21393+
},
21394+
"event": {
21395+
"links": {
21396+
"self": "/v1/feedbacks/1/relationships/event",
21397+
"related": "/v1/feedbacks/1/event"
21398+
}
2139321399
}
2139421400
},
2139521401
"attributes": {
21396-
"rating": "4",
21402+
"rating": 4.0,
2139721403
"deleted-at": null,
21398-
"comment": "Awesome event"
21404+
"comment": "Awesome session."
2139921405
},
2140021406
"type": "feedback",
2140121407
"id": 1,
@@ -21480,7 +21486,7 @@ Update a single feedback with `id`.
2148021486
"type": "feedback",
2148121487
"attributes": {
2148221488
"rating": "5",
21483-
"comment": "Awesome event"
21489+
"comment": "Awesome session"
2148421490
},
2148521491
"id": "1"
2148621492
}

tests/hook_main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -734,8 +734,8 @@ def feedback_post(transaction):
734734
:return:
735735
"""
736736
with stash['app'].app_context():
737-
event = EventFactoryBasic()
738-
db.session.add(event)
737+
session = SessionFactory()
738+
db.session.add(session)
739739
db.session.commit()
740740

741741

0 commit comments

Comments
 (0)