Skip to content

Commit e546952

Browse files
committed
fix: fix bulk achievement issue 500 error
1 parent 103bce7 commit e546952

File tree

1 file changed

+104
-94
lines changed

1 file changed

+104
-94
lines changed

api/dashboard/achievement/achievement_views.py

Lines changed: 104 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -280,115 +280,125 @@ def post(self, request):
280280

281281

282282
class AchievementIssueBulkAPIView(APIView):
283+
from rest_framework.parsers import MultiPartParser, FormParser
284+
parser_classes = [MultiPartParser, FormParser]
285+
283286
def post(self, request):
284-
user_id = JWTUtils.fetch_user_id(request)
285-
if not user_id:
286-
return CustomResponse(
287-
general_message="Invalid or missing token"
288-
).get_failure_response()
287+
try:
288+
user_id = JWTUtils.fetch_user_id(request)
289+
if not user_id:
290+
return CustomResponse(
291+
general_message="Invalid or missing token"
292+
).get_failure_response()
289293

290-
user = User.objects.filter(id=user_id).first()
291-
if not user:
292-
return CustomResponse(
293-
general_message="User Not Exists"
294-
).get_failure_response()
294+
user = User.objects.filter(id=user_id).first()
295+
if not user:
296+
return CustomResponse(
297+
general_message="User Not Exists"
298+
).get_failure_response()
295299

296-
achievement_id = request.data.get("achievement_id")
297-
if not achievement_id:
298-
return CustomResponse(
299-
general_message="Achievement ID is required"
300-
).get_failure_response()
300+
achievement_id = request.data.get("achievement_id")
301+
if not achievement_id:
302+
return CustomResponse(
303+
general_message="Achievement ID is required"
304+
).get_failure_response()
301305

302-
try:
303-
achievement = Achievement.objects.get(id=achievement_id)
304-
except Achievement.DoesNotExist:
305-
return CustomResponse(
306-
general_message="Achievement not found"
307-
).get_failure_response()
306+
try:
307+
achievement = Achievement.objects.get(id=achievement_id)
308+
except Achievement.DoesNotExist:
309+
return CustomResponse(
310+
general_message="Achievement not found"
311+
).get_failure_response()
308312

309-
try:
310-
file_obj = request.FILES["file"]
311-
except KeyError:
312-
return CustomResponse(
313-
general_message="File not found"
314-
).get_failure_response()
313+
try:
314+
file_obj = request.FILES["file"]
315+
except KeyError:
316+
return CustomResponse(
317+
general_message="File not found"
318+
).get_failure_response()
315319

316-
excel_data = ImportCSV()
317-
try:
318-
excel_data = excel_data.read_excel_file(file_obj)
319-
except Exception as e:
320-
return CustomResponse(
321-
general_message="Error reading Excel file", response=str(e)
322-
).get_failure_response()
320+
excel_data = ImportCSV()
321+
try:
322+
excel_data = excel_data.read_excel_file(file_obj)
323+
except Exception as e:
324+
return CustomResponse(
325+
general_message="Error reading Excel file", response=str(e)
326+
).get_failure_response()
323327

324-
if not excel_data:
325-
return CustomResponse(
326-
general_message="Empty Excel file"
327-
).get_failure_response()
328+
if not excel_data:
329+
return CustomResponse(
330+
general_message="Empty Excel file"
331+
).get_failure_response()
328332

329-
# Assuming the first row is header and contains 'muid'
330-
# ImportCSV.read_excel_file returns a list of dictionaries where keys are headers
331-
332-
# Validate headers
333-
header_keys = excel_data[0].keys()
334-
if "muid" not in [key.lower() for key in header_keys if key]:
335-
return CustomResponse(
336-
general_message="Excel file must contain 'muid' column"
337-
).get_failure_response()
333+
# Assuming the first row is header and contains 'muid'
334+
# ImportCSV.read_excel_file returns a list of dictionaries where keys are headers
335+
336+
# Validate headers
337+
header_keys = excel_data[0].keys()
338+
if "muid" not in [key.lower() for key in header_keys if key]:
339+
return CustomResponse(
340+
general_message="Excel file must contain 'muid' column"
341+
).get_failure_response()
338342

339-
created_count = 0
340-
updated_count = 0
341-
failed_muids = []
343+
created_count = 0
344+
updated_count = 0
345+
failed_muids = []
342346

343-
for row in excel_data:
344-
# Find the key that corresponds to 'muid' (case-insensitive)
345-
muid_key = next((k for k in row.keys() if k and k.lower() == 'muid'), None)
346-
muid = row.get(muid_key)
347+
for row in excel_data:
348+
# Find the key that corresponds to 'muid' (case-insensitive)
349+
muid_key = next((k for k in row.keys() if k and k.lower() == 'muid'), None)
350+
muid = row.get(muid_key)
347351

348-
if not muid:
349-
continue
352+
if not muid:
353+
continue
350354

351-
muid = str(muid).strip()
355+
muid = str(muid).strip()
352356

353-
if muid.lower() == 'muid':
354-
continue
355-
356-
try:
357-
user_to_issue = User.objects.get(muid=muid)
357+
if muid.lower() == 'muid':
358+
continue
358359

359-
# Check if already exists
360-
user_achievement, created = UserAchievementsLog.objects.get_or_create(
361-
user_id=user_to_issue,
362-
achievement_id=achievement,
363-
defaults={
364-
"id": str(uuid.uuid4()),
365-
"created_by": user,
366-
"updated_by": user,
367-
"is_issued": False, # Setting to False initially as per discussion logic (claimable)
368-
"vc_url": "" # No VC URL in bulk issuance
369-
}
370-
)
371-
372-
if created:
373-
created_count += 1
374-
else:
375-
# Optional: Update metadata if needed, for now just counting
376-
updated_count += 1
377-
378-
except User.DoesNotExist:
379-
failed_muids.append(f"{muid}: User not found")
380-
except Exception as e:
381-
failed_muids.append(f"{muid}: {str(e)}")
360+
try:
361+
user_to_issue = User.objects.get(muid=muid)
362+
363+
# Check if already exists
364+
user_achievement, created = UserAchievementsLog.objects.get_or_create(
365+
user_id=user_to_issue,
366+
achievement_id=achievement,
367+
defaults={
368+
"id": str(uuid.uuid4()),
369+
"created_by": user,
370+
"updated_by": user,
371+
"is_issued": False, # Setting to False initially as per discussion logic (claimable)
372+
"vc_url": "" # No VC URL in bulk issuance
373+
}
374+
)
375+
376+
if created:
377+
created_count += 1
378+
else:
379+
# Optional: Update metadata if needed, for now just counting
380+
updated_count += 1
381+
382+
except User.DoesNotExist:
383+
failed_muids.append(f"{muid}: User not found")
384+
except Exception as e:
385+
failed_muids.append(f"{muid}: {str(e)}")
382386

383-
return CustomResponse(
384-
general_message="Bulk issuance processed",
385-
response={
386-
"created": created_count,
387-
"updated": updated_count,
388-
"failed_count": len(failed_muids),
389-
"failed_muids": failed_muids
390-
}
391-
).get_success_response()
387+
return CustomResponse(
388+
general_message="Bulk issuance processed",
389+
response={
390+
"created": created_count,
391+
"updated": updated_count,
392+
"failed_count": len(failed_muids),
393+
"failed_muids": failed_muids
394+
}
395+
).get_success_response()
396+
except Exception as e:
397+
import traceback
398+
return CustomResponse(
399+
general_message=f"Server error: {str(e)}",
400+
response={"traceback": traceback.format_exc()}
401+
).get_failure_response(status_code=500)
392402

393403

394404
class AchievementBulkImportTemplateAPIView(APIView):

0 commit comments

Comments
 (0)