Skip to content

Commit 38c8372

Browse files
authored
Merge pull request #2389 from gtech-mulearn/dev
Dev Server
2 parents 2bc32ea + 5a35c72 commit 38c8372

File tree

6 files changed

+136
-129
lines changed

6 files changed

+136
-129
lines changed

api/dashboard/achievement/achievement_serializer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rest_framework import serializers
2-
from db.achievement import Achievement, UserAchievements
2+
from db.achievement import Achievement, UserAchievementsLog
33
# from db.user import User
44

55
class AchievementSerializer(serializers.ModelSerializer):
@@ -13,11 +13,11 @@ class AchievementBasicSerializer(serializers.ModelSerializer):
1313

1414
class Meta:
1515
model = Achievement
16-
fields = ['id', 'achievement_name', 'description', 'icon', 'level_based', 'tags', 'template_id']
16+
fields = ['id', 'achievement_name', 'description', 'icon', 'level_id', 'tags', 'template_id']
1717

1818
class UserAchievementsSerializer(serializers.ModelSerializer):
1919
achievement = AchievementBasicSerializer(source='achievement_id', read_only=True)
2020

2121
class Meta:
22-
model = UserAchievements
22+
model = UserAchievementsLog
2323
fields = ['id', 'user_id', 'achievement', 'is_issued', 'vc_url']
Lines changed: 80 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,44 @@
11
from rest_framework.generics import get_object_or_404
22
from rest_framework.views import APIView
33
from . import achievement_serializer
4-
from db.achievement import Achievement, UserAchievements
4+
from db.achievement import Achievement, UserAchievementsLog
55
from utils.response import CustomResponse
66
from utils.permission import JWTUtils
77
from db.user import User
8+
from db.task import Level
89
import uuid
910
from django.utils.timezone import now
1011
from django.core.exceptions import ObjectDoesNotExist, ValidationError
11-
12-
1312
class AchievementListAPIView(APIView):
1413
def get(self, request):
1514
user_id = JWTUtils.fetch_user_id(request)
1615

1716
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()
2118

2219
user = User.objects.filter(id=user_id).first()
2320

2421
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()
2823

2924
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)
3726

27+
return CustomResponse(response=achievements_serializer.data).get_success_response()
3828

3929
class AchievementCreateAPIView(APIView):
4030
def post(self, request):
4131
user_id = JWTUtils.fetch_user_id(request)
4232

4333
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()
4735

4836
user = User.objects.filter(id=user_id).first()
4937
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()
5339

5440
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"]
6442

6543
missing_fields = [field for field in required_fields if field not in data]
6644
if missing_fields:
@@ -69,9 +47,14 @@ def post(self, request):
6947
).get_failure_response()
7048

7149
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()
7558

7659
achievement = Achievement.objects.create(
7760
id=str(uuid.uuid4()),
@@ -80,7 +63,7 @@ def post(self, request):
8063
icon=data["icon"],
8164
tags=data["tags"],
8265
type=data["type"],
83-
level_based=data["level_based"],
66+
level_id=level,
8467
has_vc=data["has_vc"],
8568
template_id=data.get("template_id"),
8669
created_by=user,
@@ -89,158 +72,138 @@ def post(self, request):
8972
updated_at=now(),
9073
)
9174

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()
9577

9678

9779
class AchievementUpdateAPIView(APIView):
9880
def put(self, request, achievement_id=None):
9981
user_id = JWTUtils.fetch_user_id(request)
10082

10183
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()
10585

10686
user = User.objects.filter(id=user_id).first()
10787
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()
11189

11290
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()
11692

11793
try:
11894
achievement = Achievement.objects.get(id=achievement_id)
11995
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()
12397

12498
data = request.data.copy()
12599
data["updated_by"] = user_id
126100

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)
130112

131113
if serializer.is_valid():
132114
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()
140118

141119

142120
class AchievementDeleteAPIView(APIView):
143121
def delete(self, request, achievement_id):
144122
user_id = JWTUtils.fetch_user_id(request)
145123

146124
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()
150126

151127
user = User.objects.filter(id=user_id).first()
152128
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()
156130

157131
try:
158132
achievement = Achievement.objects.get(id=achievement_id)
159133
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()
163135

164136
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()
169138

170139
class UserAchievementsListAPIView(APIView):
171140
def get(self, request, muid):
172141
try:
173142
user = get_object_or_404(User, muid=muid)
174143

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+
)
178150

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()
182151

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)
187157
return CustomResponse(response=serializer.data).get_success_response()
188158

189159
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()
193161

194162
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()
198164

199165

200166
class UserAchievementsIssueAPIView(APIView):
201167
def post(self, request):
202168
user_id = JWTUtils.fetch_user_id(request)
203169
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()
207171

208172
achievement_id = request.data.get("achievement_id")
209173
vc_url = request.data.get("vc_url")
210174

211175
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()
215177

216178
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()
220180

221181
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()
225183

226184
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()
234188

235189
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+
239208

240-
UserAchievements.objects.filter(
241-
user_id=user_id, achievement_id=achievement_id
242-
).update(is_issued=True, vc_url=vc_url)
243209

244-
return CustomResponse(
245-
general_message="Achievement issued successfully"
246-
).get_success_response()

api/dashboard/profile/profile_serializer.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,9 +490,38 @@ def update(self, instance, validated_data):
490490
return instance
491491

492492

493+
493494
class ResetPasswordSerialzier(serializers.Serializer):
494495
current_password = serializers.CharField(required=True, allow_null=False)
495496
password = serializers.CharField(required=True, allow_null=False)
496497

497498
class Meta:
498499
fields = ("current_password", "password")
500+
501+
502+
class UserPermuteSerializer(serializers.ModelSerializer):
503+
full_name = serializers.CharField()
504+
user_domains = serializers.SerializerMethodField()
505+
college_name = serializers.SerializerMethodField()
506+
507+
class Meta:
508+
model = User
509+
fields = ["full_name", "user_domains", "college_name"]
510+
511+
def get_user_domains(self, obj):
512+
return obj.user_domains.values_list("domain_name", flat=True)
513+
514+
def _get_user_org_link(self, obj, org_type):
515+
if not hasattr(self, "user_org_link"):
516+
self.user_org_link = obj.user_organization_link_user.filter(
517+
org__org_type=org_type
518+
).first()
519+
return self.user_org_link
520+
521+
def _get_org_type(self, obj):
522+
return OrganizationType.COLLEGE.value
523+
524+
def get_college_name(self, obj):
525+
org_type = self._get_org_type(obj)
526+
user_org_link = self._get_user_org_link(obj, org_type)
527+
return user_org_link.org.title if user_org_link and user_org_link.org else None

0 commit comments

Comments
 (0)