66import traceback
77
88from baskerville .util .enums import FeedbackContextTypeEnum , LabelEnum
9- from baskerville_dashboard .auth import login_required
9+ from baskerville .util .helpers import get_logger
10+ from baskerville_dashboard .auth import login_required , resolve_user
1011from baskerville_dashboard .db .manager import SessionManager
1112from baskerville .db .dashboard_models import Feedback , FeedbackContext
1213from baskerville_dashboard .utils .helpers import ResponseEnvelope , \
2122
2223ES_HOST = ''
2324
25+ logger = get_logger (__name__ , output_file = 'baskerville_dashboard.log' )
26+
2427
2528@feedback_app .route ('/feedback/context' , methods = ('GET' ,))
2629@login_required
30+ @resolve_user
2731def get_feedback_context_details ():
2832 """
2933 Get all available feedback context, feedback context type and respective
@@ -34,7 +38,7 @@ def get_feedback_context_details():
3438 sm = SessionManager ()
3539 code = 200
3640 try :
37- re .data = FeedbackContextVM ().to_dict ()
41+ re .data = FeedbackContextVM (request . user ).to_dict ()
3842 re .success = True
3943 re .message = 'Feedback context details'
4044 except Exception as e :
@@ -48,6 +52,7 @@ def get_feedback_context_details():
4852
4953@feedback_app .route ('/feedback/context/<id>' , methods = ('GET' ,))
5054@login_required
55+ @resolve_user
5156def get_feedback_context_by_id (id ):
5257 """
5358 Get a specific feedback context by id
@@ -58,7 +63,20 @@ def get_feedback_context_by_id(id):
5863 sm = SessionManager ()
5964 code = 200
6065 try :
61- re .data = sm .session .query (FeedbackContext ).filter_by (id = id ).first ()
66+ feedback_context_q = sm .session .query (
67+ FeedbackContext
68+ ).filter_by (id = id )
69+ if not request .user .is_admin :
70+ feedback_context_q = feedback_context_q .filter_by (
71+ uuid_organization = request .user .organization .uuid
72+ ).filter_by (
73+ id_user = request .user .id
74+ )
75+ logger .debug (
76+ f'User { request .user .id } is not admin, filtering feedback_context'
77+ )
78+ re .data = feedback_context_q .first ()
79+
6280 if not re .data :
6381 code = 404
6482 raise ValueError (f'Could not find feedback context with id { id } ' )
@@ -76,6 +94,7 @@ def get_feedback_context_by_id(id):
7694
7795@feedback_app .route ('/feedback/context' , methods = ('POST' ,))
7896@login_required
97+ @resolve_user
7998def save_feedback_context ():
8099 re = ResponseEnvelope ()
81100 sm = SessionManager ()
@@ -86,6 +105,7 @@ def save_feedback_context():
86105 fc = FeedbackContext ()
87106 fc .reason = FeedbackContextTypeEnum [data ['reason' ].replace (' ' , '_' )]
88107 fc .uuid_organization = session ['org_uuid' ]
108+ fc .id_user = request .user .id
89109 fc .reason_descr = data ['reason_descr' ]
90110 fc .start = data ['start' ]
91111 fc .stop = data ['stop' ]
@@ -122,14 +142,15 @@ def bulk_feedback(context_id, feedback_str):
122142 data = request .get_json ()
123143 errors = []
124144 succeeded = []
125- user = get_user_by_org_uuid (session ['org_uuid' ])
145+ user = get_user_by_org_uuid (session ['org_uuid' ], session [ 'user_id' ] )
126146 if not user :
127147 code = 404
128148 re .success = False
129149 re .message = 'No user found'
130150 return response_jsonified (re , code )
131151
132152 for id in data ['rss' ]:
153+ local_created = False
133154 rs = sm .session .query (RequestSet ).filter_by (id = id ).first ()
134155 if not rs :
135156 errors .append (id )
@@ -144,6 +165,7 @@ def bulk_feedback(context_id, feedback_str):
144165 else :
145166 feedback = Feedback ()
146167 created += 1
168+ local_created = True
147169 feedback .uuid_request_set = rs .uuid_request_set
148170 feedback .id_feedback_context = context_id
149171 feedback .id_user = user .id
@@ -157,7 +179,7 @@ def bulk_feedback(context_id, feedback_str):
157179 feedback .score = rs .score
158180 feedback .attack_prediction = rs .attack_prediction or 42
159181 feedback .feedback = feedback_str
160- if not updated :
182+ if local_created :
161183 sm .session .add (feedback )
162184 if not errors :
163185 sm .session .commit ()
@@ -183,6 +205,7 @@ def bulk_feedback(context_id, feedback_str):
183205
184206@feedback_app .route ('/feedback/<context_id>/<rs_id>/<feedback_str>' , methods = ('POST' , 'PUT' ))
185207@login_required
208+ @resolve_user
186209def set_feedback_for (context_id , rs_id , feedback_str ):
187210 sm = SessionManager ()
188211 re = ResponseEnvelope ()
@@ -200,10 +223,7 @@ def set_feedback_for(context_id, rs_id, feedback_str):
200223
201224 if not rs :
202225 raise Exception ('No such request-set' )
203- user = get_user_by_org_uuid (session ['org_uuid' ])
204- if not user :
205- raise Exception ('No user found.' )
206-
226+ user = request .user
207227 feedback = sm .session .query (Feedback ).filter_by (
208228 uuid_request_set = rs .uuid_request_set
209229 ).filter_by (id_user = user .id ).first ()
@@ -222,7 +242,7 @@ def set_feedback_for(context_id, rs_id, feedback_str):
222242 feedback .low_rate = request .get_json ().get ('lowRate' )
223243 feedback .features = rs .features
224244 feedback .score = rs .score
225- feedback .attack_prediction = rs .attack_prediction or LabelEnum .unknown
245+ feedback .attack_prediction = rs .attack_prediction or LabelEnum .unknown . value
226246 feedback .feedback = feedback_str
227247 if not updated :
228248 sm .session .add (feedback )
@@ -243,6 +263,7 @@ def set_feedback_for(context_id, rs_id, feedback_str):
243263
244264@feedback_app .route ('/feedback/submit/<context_id>' , methods = ('POST' ,))
245265@login_required
266+ @resolve_user
246267def submit_feedback_for (context_id ):
247268 _q_filter = get_qparams (request )
248269 sm = SessionManager ()
@@ -251,7 +272,7 @@ def submit_feedback_for(context_id):
251272 ip_list = None
252273 data = request .get_json ()
253274 try :
254- user = get_user_by_org_uuid ( session [ 'org_uuid' ])
275+ user = request . user
255276 fc = sm .session .query (FeedbackContext ).filter_by (id = context_id ).first ()
256277 if not fc :
257278 print ('TODO: could not find Feedback Context' )
@@ -271,6 +292,52 @@ def submit_feedback_for(context_id):
271292 re .data = None
272293 re .success = True
273294 re .message = 'Feedback context details'
295+ except Exception as e :
296+ traceback .print_exc ()
297+ re .success = False
298+ message = str (e )
299+ if 'NoBrokersAvailable' in message :
300+ message = 'Kafka: NoBrokersAvailable. Please try again later.'
301+ re .message = message
302+ if code == 200 :
303+ code = 500
304+
305+ return response_jsonified (re , code )
306+
307+
308+ @feedback_app .route ('/feedback/<context_id>/count' , methods = ('GET' ,))
309+ @login_required
310+ @resolve_user
311+ def feedback_count (context_id ):
312+ _q_filter = get_qparams (request )
313+ sm = SessionManager ()
314+ re = ResponseEnvelope ()
315+ code = 200
316+ try :
317+ user = request .user
318+ fc = sm .session .query (FeedbackContext )
319+ if not user .is_admin :
320+ fc = fc .filter_by (
321+ id_user = user .id
322+ )
323+ fc = fc .filter_by (
324+ id = context_id
325+ ).first ()
326+ if not fc :
327+ code = 403
328+ raise ValueError (
329+ 'Could not find feedback context. '
330+ )
331+
332+ feedback_count = sm .session .query (Feedback ).filter_by (
333+ id_user = user .id
334+ ).filter_by (
335+ id_feedback_context = fc .id
336+ ).count ()
337+
338+ re .data = feedback_count
339+ re .success = True
340+ re .message = 'Feedback count for current feedback context'
274341 except Exception as e :
275342 traceback .print_exc ()
276343 re .success = False
0 commit comments