1010from django .utils import timezone
1111from django .utils .dateparse import parse_datetime
1212from django .db import models
13- from .models import User , Hackathon , Submission , Organization , AuditLog , PlatformSetting
13+ from accounts .models import User
14+ from hackathon .models import Hackathon , Submission
15+ from organization .models import Organization
16+ from .models import Review , AuditLog , PlatformSetting
1417from .serializers import (
1518 UserSerializer , HackathonSerializer , SubmissionSerializer ,
1619 AdminOrganizationSerializer , AuditLogSerializer , PlatformSettingSerializer
1922from .throttles import AdminRateThrottle
2023from drf_yasg .utils import swagger_auto_schema
2124from drf_yasg import openapi
22- from django .db .models import Count
23- from admin_console .models import User , Hackathon , Submission , Organization
25+ from django .db .models import Count , Avg
2426
2527
2628
@@ -175,8 +177,49 @@ def get_queryset(self):
175177 queryset = queryset .filter (start_date__gte = start_date )
176178 if end_date :
177179 queryset = queryset .filter (end_date__lte = end_date )
180+
181+ is_approved = self .request .query_params .get ('is_approved' )
182+ is_suspended = self .request .query_params .get ('is_suspended' )
183+ if is_approved is not None :
184+ queryset = queryset .filter (is_approved = is_approved .lower () == 'true' )
185+ if is_suspended is not None :
186+ queryset = queryset .filter (is_suspended = is_suspended .lower () == 'true' )
187+
178188 return queryset .order_by ("-start_date" )
179189
190+ @action (detail = True , methods = ['patch' ])
191+ def approve (self , request , pk = None ):
192+ hackathon = self .get_object ()
193+ hackathon .is_approved = True
194+ hackathon .is_suspended = False
195+ hackathon .save ()
196+ self .log_action ('APPROVE_HACKATHON' , target_id = pk )
197+ return Response ({'message' : 'Hackathon approved' })
198+
199+ @action (detail = True , methods = ['patch' ])
200+ def reject (self , request , pk = None ):
201+ hackathon = self .get_object ()
202+ hackathon .is_approved = False
203+ hackathon .save ()
204+ self .log_action ('REJECT_HACKATHON' , target_id = pk )
205+ return Response ({'message' : 'Hackathon rejected' })
206+
207+ @action (detail = True , methods = ['patch' ])
208+ def suspend (self , request , pk = None ):
209+ hackathon = self .get_object ()
210+ hackathon .is_suspended = True
211+ hackathon .save ()
212+ self .log_action ('SUSPEND_HACKATHON' , target_id = pk )
213+ return Response ({'message' : 'Hackathon suspended' })
214+
215+ @action (detail = True , methods = ['patch' ])
216+ def restore (self , request , pk = None ):
217+ hackathon = self .get_object ()
218+ hackathon .is_suspended = False
219+ hackathon .save ()
220+ self .log_action ('RESTORE_HACKATHON' , target_id = pk )
221+ return Response ({'message' : 'Hackathon restored' })
222+
180223 def log_action (self , action , target_id = None ):
181224 AuditLog .objects .create (
182225 admin = getattr (self .request , 'user' , None ),
@@ -255,6 +298,38 @@ def get_queryset(self):
255298
256299 return queryset
257300
301+ @action (detail = False , methods = ['get' ], url_path = 'score-overview' )
302+ def score_overview (self , request ):
303+ hackathon_id = request .query_params .get ('hackathon_id' )
304+ submissions = Submission .objects .all ()
305+ if hackathon_id :
306+ submissions = submissions .filter (hackathon_id = hackathon_id )
307+
308+ score_stats = submissions .aggregate (
309+ total_submissions = Count ('id' ),
310+ reviewed_submissions = Count ('id' , filter = models .Q (status = 'reviewed' )),
311+ approved_submissions = Count ('id' , filter = models .Q (status = 'approved' )),
312+ rejected_submissions = Count ('id' , filter = models .Q (status = 'rejected' )),
313+ average_overall_score = Avg ('reviews__overall_score' ),
314+ average_technical_score = Avg ('reviews__technical_score' ),
315+ average_innovation_score = Avg ('reviews__innovation_score' )
316+ )
317+
318+ submission_scores = submissions .annotate (
319+ avg_overall = Avg ('reviews__overall_score' ),
320+ avg_technical = Avg ('reviews__technical_score' ),
321+ avg_innovation = Avg ('reviews__innovation_score' ),
322+ review_count = Count ('reviews' )
323+ ).values (
324+ 'id' , 'project__title' , 'hackathon__title' , 'status' , 'approved' ,
325+ 'avg_overall' , 'avg_technical' , 'avg_innovation' , 'review_count'
326+ )
327+
328+ return Response ({
329+ 'score_stats' : score_stats ,
330+ 'submissions' : list (submission_scores )
331+ })
332+
258333 def log_action (self , action , target_id = None ):
259334 AuditLog .objects .create (
260335 admin = getattr (self .request , 'user' , None ),
@@ -268,6 +343,7 @@ def log_action(self, action, target_id=None):
268343 def approve (self , request , pk = None ):
269344 submission = self .get_object ()
270345 submission .status = "approved"
346+ submission .approved = True
271347 submission .save ()
272348 self .log_action ("APPROVE_SUBMISSION" , target_id = pk )
273349 return Response ({"message" : "Submission approved" })
@@ -276,6 +352,7 @@ def approve(self, request, pk=None):
276352 def reject (self , request , pk = None ):
277353 submission = self .get_object ()
278354 submission .status = "rejected"
355+ submission .approved = False
279356 submission .save ()
280357 self .log_action ("REJECT_SUBMISSION" , target_id = pk )
281358 return Response ({"message" : "Submission rejected" })
@@ -322,9 +399,48 @@ def get_queryset(self):
322399 queryset = queryset .filter (name__icontains = name )
323400 if is_active is not None :
324401 queryset = queryset .filter (is_active = is_active .lower () == 'true' )
402+ is_approved = self .request .query_params .get ('is_approved' )
403+ is_suspended = self .request .query_params .get ('is_suspended' )
404+ if is_approved is not None :
405+ queryset = queryset .filter (is_approved = is_approved .lower () == 'true' )
406+ if is_suspended is not None :
407+ queryset = queryset .filter (is_suspended = is_suspended .lower () == 'true' )
325408
326409 return queryset
327410
411+ @action (detail = True , methods = ['patch' ])
412+ def approve (self , request , pk = None ):
413+ organization = self .get_object ()
414+ organization .is_approved = True
415+ organization .is_suspended = False
416+ organization .save ()
417+ self .log_action ('APPROVE_ORGANIZATION' , target_id = pk )
418+ return Response ({'message' : 'Organization approved' })
419+
420+ @action (detail = True , methods = ['patch' ])
421+ def reject (self , request , pk = None ):
422+ organization = self .get_object ()
423+ organization .is_approved = False
424+ organization .save ()
425+ self .log_action ('REJECT_ORGANIZATION' , target_id = pk )
426+ return Response ({'message' : 'Organization rejected' })
427+
428+ @action (detail = True , methods = ['patch' ])
429+ def suspend (self , request , pk = None ):
430+ organization = self .get_object ()
431+ organization .is_suspended = True
432+ organization .save ()
433+ self .log_action ('SUSPEND_ORGANIZATION' , target_id = pk )
434+ return Response ({'message' : 'Organization suspended' })
435+
436+ @action (detail = True , methods = ['patch' ])
437+ def restore (self , request , pk = None ):
438+ organization = self .get_object ()
439+ organization .is_suspended = False
440+ organization .save ()
441+ self .log_action ('RESTORE_ORGANIZATION' , target_id = pk )
442+ return Response ({'message' : 'Organization restored' })
443+
328444 def log_action (self , action , target_id = None ):
329445 AuditLog .objects .create (
330446 admin = getattr (self .request , 'user' , None ),
@@ -354,8 +470,10 @@ def destroy(self, request, *args, **kwargs):
354470from rest_framework .response import Response
355471from drf_yasg .utils import swagger_auto_schema
356472from drf_yasg import openapi
357- from django .db .models import Count
358- from admin_console .models import User , Hackathon , Submission , Organization
473+ from django .db .models import Count , Avg
474+ from accounts .models import User
475+ from hackathon .models import Hackathon , Submission
476+ from organization .models import Organization
359477
360478class AnalyticsView (APIView ):
361479 permission_classes = [IsAdminUser ]
0 commit comments