@@ -280,115 +280,125 @@ def post(self, request):
280280
281281
282282class 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
394404class AchievementBulkImportTemplateAPIView (APIView ):
0 commit comments