1
1
from rest_framework .generics import get_object_or_404
2
2
from rest_framework .views import APIView
3
3
from . import achievement_serializer
4
- from db .achievement import Achievement , UserAchievements
4
+ from db .achievement import Achievement , UserAchievementsLog
5
5
from utils .response import CustomResponse
6
6
from utils .permission import JWTUtils
7
7
from db .user import User
8
+ from db .task import Level
8
9
import uuid
9
10
from django .utils .timezone import now
10
11
from django .core .exceptions import ObjectDoesNotExist , ValidationError
11
-
12
-
13
12
class AchievementListAPIView (APIView ):
14
13
def get (self , request ):
15
14
user_id = JWTUtils .fetch_user_id (request )
16
15
17
16
if not user_id :
18
- return CustomResponse (
19
- general_message = "Invalid or missing token"
20
- ).get_failure_response ()
17
+ return CustomResponse (general_message = "Invalid or missing token" ).get_failure_response ()
21
18
22
19
user = User .objects .filter (id = user_id ).first ()
23
20
24
21
if not user :
25
- return CustomResponse (
26
- general_message = "User Not Exists"
27
- ).get_failure_response ()
22
+ return CustomResponse (general_message = "User Not Exists" ).get_failure_response ()
28
23
29
24
achievements = Achievement .objects .all ()
30
- achievements_serializer = achievement_serializer .AchievementSerializer (
31
- achievements , many = True
32
- )
33
-
34
- return CustomResponse (
35
- response = achievements_serializer .data
36
- ).get_success_response ()
25
+ achievements_serializer = achievement_serializer .AchievementSerializer (achievements , many = True )
37
26
27
+ return CustomResponse (response = achievements_serializer .data ).get_success_response ()
38
28
39
29
class AchievementCreateAPIView (APIView ):
40
30
def post (self , request ):
41
31
user_id = JWTUtils .fetch_user_id (request )
42
32
43
33
if not user_id :
44
- return CustomResponse (
45
- general_message = "Invalid or missing token"
46
- ).get_failure_response ()
34
+ return CustomResponse (general_message = "Invalid or missing token" ).get_failure_response ()
47
35
48
36
user = User .objects .filter (id = user_id ).first ()
49
37
if not user :
50
- return CustomResponse (
51
- general_message = "User Not Exists"
52
- ).get_failure_response ()
38
+ return CustomResponse (general_message = "User Not Exists" ).get_failure_response ()
53
39
54
40
data = request .data
55
- required_fields = [
56
- "name" ,
57
- "description" ,
58
- "icon" ,
59
- "tags" ,
60
- "type" ,
61
- "level_based" ,
62
- "has_vc" ,
63
- ]
41
+ required_fields = ["name" , "description" , "icon" , "tags" , "type" , "has_vc" ]
64
42
65
43
missing_fields = [field for field in required_fields if field not in data ]
66
44
if missing_fields :
@@ -69,9 +47,14 @@ def post(self, request):
69
47
).get_failure_response ()
70
48
71
49
if Achievement .objects .filter (name = data ["name" ]).exists ():
72
- return CustomResponse (
73
- general_message = "Name already exists"
74
- ).get_failure_response ()
50
+ return CustomResponse (general_message = "Name already exists" ).get_failure_response ()
51
+
52
+ level = None
53
+ if "level_id" in data and data ["level_id" ]:
54
+ try :
55
+ level = Level .objects .get (id = data ["level_id" ])
56
+ except Level .DoesNotExist :
57
+ return CustomResponse (general_message = "Invalid level_id" ).get_failure_response ()
75
58
76
59
achievement = Achievement .objects .create (
77
60
id = str (uuid .uuid4 ()),
@@ -80,7 +63,7 @@ def post(self, request):
80
63
icon = data ["icon" ],
81
64
tags = data ["tags" ],
82
65
type = data ["type" ],
83
- level_based = data [ "level_based" ] ,
66
+ level_id = level ,
84
67
has_vc = data ["has_vc" ],
85
68
template_id = data .get ("template_id" ),
86
69
created_by = user ,
@@ -89,158 +72,138 @@ def post(self, request):
89
72
updated_at = now (),
90
73
)
91
74
92
- # Serialize and return success response
93
- serializer = achievement_serializer .AchievementSerializer (achievement )
94
- return CustomResponse (response = serializer .data ).get_success_response ()
75
+ return CustomResponse (
76
+ general_message = f"Achievement '{ achievement .name } ' created successfully!" ).get_success_response ()
95
77
96
78
97
79
class AchievementUpdateAPIView (APIView ):
98
80
def put (self , request , achievement_id = None ):
99
81
user_id = JWTUtils .fetch_user_id (request )
100
82
101
83
if not user_id :
102
- return CustomResponse (
103
- general_message = "Invalid or missing token"
104
- ).get_failure_response ()
84
+ return CustomResponse (general_message = "Invalid or missing token" ).get_failure_response ()
105
85
106
86
user = User .objects .filter (id = user_id ).first ()
107
87
if not user :
108
- return CustomResponse (
109
- general_message = "User Not Exists"
110
- ).get_failure_response ()
88
+ return CustomResponse (general_message = "User Not Exists" ).get_failure_response ()
111
89
112
90
if not achievement_id :
113
- return CustomResponse (
114
- general_message = "Achievement ID is required"
115
- ).get_failure_response ()
91
+ return CustomResponse (general_message = "Achievement ID is required" ).get_failure_response ()
116
92
117
93
try :
118
94
achievement = Achievement .objects .get (id = achievement_id )
119
95
except Achievement .DoesNotExist :
120
- return CustomResponse (
121
- general_message = "Achievement not found"
122
- ).get_failure_response ()
96
+ return CustomResponse (general_message = "Achievement not found" ).get_failure_response ()
123
97
124
98
data = request .data .copy ()
125
99
data ["updated_by" ] = user_id
126
100
127
- serializer = achievement_serializer .AchievementSerializer (
128
- achievement , data = data , partial = True
129
- )
101
+ if "level_id" in data :
102
+ if data ["level_id" ]:
103
+ try :
104
+ level = Level .objects .get (id = data ["level_id" ])
105
+ data ["level_id" ] = level .id
106
+ except Level .DoesNotExist :
107
+ return CustomResponse (general_message = "Invalid level_id" ).get_failure_response ()
108
+ else :
109
+ data ["level_id" ] = None
110
+
111
+ serializer = achievement_serializer .AchievementSerializer (achievement , data = data , partial = True )
130
112
131
113
if serializer .is_valid ():
132
114
serializer .save ()
133
- return CustomResponse (
134
- response = serializer .data ,
135
- general_message = "Achievement updated successfully" ,
136
- ).get_success_response ()
137
- return CustomResponse (
138
- general_message = "Invalid Data" , response = serializer .errors
139
- ).get_failure_response ()
115
+ return CustomResponse (general_message = "Achievement updated successfully" ).get_success_response ()
116
+
117
+ return CustomResponse (general_message = "Invalid Data" , response = serializer .errors ).get_failure_response ()
140
118
141
119
142
120
class AchievementDeleteAPIView (APIView ):
143
121
def delete (self , request , achievement_id ):
144
122
user_id = JWTUtils .fetch_user_id (request )
145
123
146
124
if not user_id :
147
- return CustomResponse (
148
- general_message = "Invalid or missing token"
149
- ).get_failure_response ()
125
+ return CustomResponse (general_message = "Invalid or missing token" ).get_failure_response ()
150
126
151
127
user = User .objects .filter (id = user_id ).first ()
152
128
if not user :
153
- return CustomResponse (
154
- general_message = "User Not Exists"
155
- ).get_failure_response ()
129
+ return CustomResponse (general_message = "User Not Exists" ).get_failure_response ()
156
130
157
131
try :
158
132
achievement = Achievement .objects .get (id = achievement_id )
159
133
except Achievement .DoesNotExist :
160
- return CustomResponse (
161
- general_message = "Achievement not found"
162
- ).get_failure_response ()
134
+ return CustomResponse (general_message = "Achievement not found" ).get_failure_response ()
163
135
164
136
achievement .delete ()
165
- return CustomResponse (
166
- general_message = "Achievement deleted successfully"
167
- ).get_success_response ()
168
-
137
+ return CustomResponse (general_message = "Achievement deleted successfully" ).get_success_response ()
169
138
170
139
class UserAchievementsListAPIView (APIView ):
171
140
def get (self , request , muid ):
172
141
try :
173
142
user = get_object_or_404 (User , muid = muid )
174
143
175
- user_achievements = UserAchievements .objects .filter (
176
- user_id = user .id
177
- ).select_related ("achievement_id" )
144
+ user_achievements = (
145
+ UserAchievementsLog .objects
146
+ .filter (user_id = user .id )
147
+ .select_related ('achievement_id' )
148
+ .only ('id' , 'user_id' , 'achievement_id' , 'is_issued' , 'vc_url' , 'achievement_id__name' , 'achievement_id__description' )
149
+ )
178
150
179
- # If no achievements found
180
- # if not user_achievements.exists():
181
- # return CustomResponse(general_message="No achievements found for this user").get_failure_response()
182
151
183
- # Serialize and return response
184
- serializer = achievement_serializer .UserAchievementsSerializer (
185
- user_achievements , many = True
186
- )
152
+ if not user_achievements .exists ():
153
+ return CustomResponse (general_message = "No achievements found for this user" ).get_failure_response ()
154
+
155
+
156
+ serializer = achievement_serializer .UserAchievementsSerializer (user_achievements , many = True )
187
157
return CustomResponse (response = serializer .data ).get_success_response ()
188
158
189
159
except ValidationError :
190
- return CustomResponse (
191
- general_message = "Invalid format for muid"
192
- ).get_failure_response ()
160
+ return CustomResponse (general_message = "Invalid format for muid" ).get_failure_response ()
193
161
194
162
except Exception as e :
195
- return CustomResponse (
196
- general_message = f"An unexpected error occurred: { str (e )} "
197
- ).get_failure_response ()
163
+ return CustomResponse (general_message = f"An unexpected error occurred: { str (e )} " ).get_failure_response ()
198
164
199
165
200
166
class UserAchievementsIssueAPIView (APIView ):
201
167
def post (self , request ):
202
168
user_id = JWTUtils .fetch_user_id (request )
203
169
if not user_id :
204
- return CustomResponse (
205
- general_message = "Invalid or missing token"
206
- ).get_failure_response ()
170
+ return CustomResponse (general_message = "Invalid or missing token" ).get_failure_response ()
207
171
208
172
achievement_id = request .data .get ("achievement_id" )
209
173
vc_url = request .data .get ("vc_url" )
210
174
211
175
if not achievement_id :
212
- return CustomResponse (
213
- general_message = "Achievement ID is required"
214
- ).get_failure_response ()
176
+ return CustomResponse (general_message = "Achievement ID is required" ).get_failure_response ()
215
177
216
178
if not vc_url :
217
- return CustomResponse (
218
- general_message = "VC URL is required"
219
- ).get_failure_response ()
179
+ return CustomResponse (general_message = "VC URL is required" ).get_failure_response ()
220
180
221
181
if not User .objects .filter (id = user_id ).exists ():
222
- return CustomResponse (
223
- general_message = "User Not Exists"
224
- ).get_failure_response ()
182
+ return CustomResponse (general_message = "User Not Exists" ).get_failure_response ()
225
183
226
184
try :
227
- user_achievement = UserAchievements .objects .get (
228
- user_id = user_id , achievement_id = achievement_id
229
- )
230
- except UserAchievements .DoesNotExist :
231
- return CustomResponse (
232
- general_message = "Achievement record not found"
233
- ).get_failure_response ()
185
+ user_achievement = UserAchievementsLog .objects .get (user_id = user_id , achievement_id = achievement_id )
186
+ except UserAchievementsLog .DoesNotExist :
187
+ return CustomResponse (general_message = "Achievement record not found" ).get_failure_response ()
234
188
235
189
if user_achievement .is_issued :
236
- return CustomResponse (
237
- general_message = "This achievement has already been issued"
238
- ).get_failure_response ()
190
+ return CustomResponse (general_message = "This achievement has already been issued" ).get_failure_response ()
191
+
192
+ UserAchievementsLog .objects .filter (user_id = user_id , achievement_id = achievement_id ).update (is_issued = True , vc_url = vc_url )
193
+
194
+ return CustomResponse (general_message = "Achievement issued successfully" ).get_success_response ()
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
239
208
240
- UserAchievements .objects .filter (
241
- user_id = user_id , achievement_id = achievement_id
242
- ).update (is_issued = True , vc_url = vc_url )
243
209
244
- return CustomResponse (
245
- general_message = "Achievement issued successfully"
246
- ).get_success_response ()
0 commit comments