1- from rest_framework . generics import get_object_or_404
2- from rest_framework . views import APIView
3- from django . http import FileResponse
1+ import json
2+ import os
3+ import uuid
44from io import BytesIO
5+
56import openpyxl
6- from db . achievement import Achievement , UserAchievementsLog
7- from db . user import User
7+ from django . conf import settings
8+ from django . core . exceptions import ValidationError
89from django .db .models import Q
9- from utils .types import RoleType
10+ from django .http import FileResponse
11+ from django .utils .timezone import now
12+ from rest_framework .generics import get_object_or_404
13+ from rest_framework .parsers import FormParser , MultiPartParser
14+ from rest_framework .views import APIView
15+
16+ from db .achievement import (
17+ Achievement ,
18+ AchievementAuditLog ,
19+ AchievementRule ,
20+ UserAchievementsLog ,
21+ )
22+ from db .task import Level
23+ from db .user import User
24+ from utils .permission import JWTUtils
25+ from utils .response import CustomResponse
1026from utils .utils import CommonUtils
1127from . import achievement_serializer
12- from db .achievement import Achievement , UserAchievementsLog , AchievementRule , AchievementAuditLog
13- from utils .response import CustomResponse
14- from utils .permission import JWTUtils
15- from db .user import User
16- from db .task import Level
17- import uuid
18- from django .utils .timezone import now
19- from django .core .exceptions import ObjectDoesNotExist , ValidationError
20- from utils .utils import ImportCSV
2128
2229
2330class AchievementListAPIView (APIView ):
@@ -47,9 +54,8 @@ def get(self, request):
4754
4855
4956class AchievementCreateAPIView (APIView ):
50- from rest_framework .parsers import MultiPartParser , FormParser
5157 parser_classes = [MultiPartParser , FormParser ]
52-
58+
5359 def post (self , request ):
5460 user_id = JWTUtils .fetch_user_id (request )
5561
@@ -81,10 +87,8 @@ def post(self, request):
8187 if isinstance (has_vc_value , str ):
8288 has_vc_value = has_vc_value .lower () in ("true" , "1" , "yes" )
8389
84- # Parse tags from JSON string to list (FormData sends strings)
8590 tags_value = data .get ("tags" , [])
8691 if isinstance (tags_value , str ):
87- import json
8892 try :
8993 tags_value = json .loads (tags_value )
9094 except json .JSONDecodeError :
@@ -107,9 +111,6 @@ def post(self, request):
107111 # Handle icon file upload
108112 icon_path = icon_url # Default to URL if provided
109113 if icon_file :
110- import os
111- from django .conf import settings
112-
113114 # Validate file type
114115 allowed_extensions = ['jpg' , 'jpeg' , 'png' , 'gif' , 'webp' , 'svg' ]
115116 file_ext = icon_file .name .split ('.' )[- 1 ].lower ()
@@ -162,9 +163,8 @@ def post(self, request):
162163
163164
164165class AchievementUpdateAPIView (APIView ):
165- from rest_framework .parsers import MultiPartParser , FormParser
166166 parser_classes = [MultiPartParser , FormParser ]
167-
167+
168168 def put (self , request , achievement_id = None ):
169169 user_id = JWTUtils .fetch_user_id (request )
170170
@@ -202,9 +202,6 @@ def put(self, request, achievement_id=None):
202202 # Handle icon file upload
203203 icon_file = request .FILES .get ("icon" )
204204 if icon_file :
205- import os
206- from django .conf import settings
207-
208205 # Validate file type
209206 allowed_extensions = ['jpg' , 'jpeg' , 'png' , 'gif' , 'webp' , 'svg' ]
210207 file_ext = icon_file .name .split ('.' )[- 1 ].lower ()
@@ -260,7 +257,6 @@ def put(self, request, achievement_id=None):
260257 if "tags" in data :
261258 tags_value = data .get ("tags" , [])
262259 if isinstance (tags_value , str ):
263- import json
264260 try :
265261 data ["tags" ] = json .loads (tags_value )
266262 except json .JSONDecodeError :
@@ -290,8 +286,7 @@ def delete(self, request, achievement_id):
290286 general_message = "Invalid or missing token"
291287 ).get_failure_response ()
292288
293- user = User .objects .filter (id = user_id ).first ()
294- if not user :
289+ if not User .objects .filter (id = user_id ).exists ():
295290 return CustomResponse (
296291 general_message = "User Not Exists"
297292 ).get_failure_response ()
@@ -522,12 +517,11 @@ class AchievementRuleCreateAPIView(APIView):
522517 """Create a new achievement rule (admin)"""
523518
524519 def post (self , request ):
525- try :
526- user_id = JWTUtils .fetch_user_id (request )
527- if not user_id :
528- return CustomResponse (
529- general_message = "Invalid or missing token"
530- ).get_failure_response ()
520+ user_id = JWTUtils .fetch_user_id (request )
521+ if not user_id :
522+ return CustomResponse (
523+ general_message = "Invalid or missing token"
524+ ).get_failure_response ()
531525
532526 data = request .data
533527 required_fields = ["achievement_id" , "rule_type" , "conditions" ]
@@ -875,7 +869,7 @@ def post(self, request):
875869 required_headers = ['muid' , 'achievement_id' ]
876870
877871 if not all (h in headers for h in required_headers ):
878- return CustomResponse (
872+ return CustomResponse (
879873 general_message = f"Missing required headers. Required: { required_headers } "
880874 ).get_failure_response ()
881875
@@ -892,14 +886,14 @@ def post(self, request):
892886 achievement_id = row [ach_idx ]
893887
894888 if not muid or not achievement_id :
895- continue
889+ continue
896890
897891 try :
898892 user = User .objects .filter (muid = muid ).first ()
899893 if not user :
900- failed_rows .append ({"row" : i , "muid" : muid , "reason" : "User not found" })
901- continue
902-
894+ failed_rows .append ({"row" : i , "muid" : muid , "reason" : "User not found" })
895+ continue
896+
903897 result = manual_issue_achievement (
904898 user_id = str (user .id ),
905899 achievement_id = str (achievement_id ),
@@ -948,7 +942,7 @@ class AchievementLogListAPIView(APIView):
948942 def get (self , request ):
949943 user_id = JWTUtils .fetch_user_id (request )
950944 if not user_id :
951- return CustomResponse (
945+ return CustomResponse (
952946 general_message = "Invalid or missing token"
953947 ).get_failure_response ()
954948
@@ -963,15 +957,15 @@ def get(self, request):
963957
964958 data = []
965959 for log in paginated_queryset .get ('queryset' ):
966- data .append ({
967- "id" : str (log .id ),
968- "muid" : log .user .muid ,
969- "user_name" : log .user .full_name ,
970- "achievement_name" : log .achievement_id .name ,
971- "is_issued" : log .is_issued ,
972- "created_at" : log .created_at .isoformat () if log .created_at else None ,
973- "issued_by" : log .updated_by .full_name if log .updated_by else None
974- })
960+ data .append ({
961+ "id" : str (log .id ),
962+ "muid" : log .user .muid ,
963+ "user_name" : log .user .full_name ,
964+ "achievement_name" : log .achievement_id .name ,
965+ "is_issued" : log .is_issued ,
966+ "created_at" : log .created_at .isoformat () if log .created_at else None ,
967+ "issued_by" : log .updated_by .full_name if log .updated_by else None
968+ })
975969
976970 return CustomResponse ().paginated_response (
977971 data = data ,
0 commit comments