@@ -196,7 +196,29 @@ def update_dojo(dojo, update_code=None):
196196 try :
197197 dojo_update (dojo )
198198 db .session .commit ()
199+ except IntegrityError as e :
200+ db .session .rollback ()
201+ error = str (e )
202+ match = re .search (r"Key \(dojo_id, module_index, id\)=\(.*?,\s*(\d+),\s*([^\)]+)\)" , error )
203+ if match :
204+ module_index , challenge_id = match .groups ()
205+ module_index = int (module_index )
206+ challenge_id = challenge_id .strip ()
207+ try :
208+ module = dojo .modules [module_index ]
209+ challenge = next ((c for c in module .challenges if c .id == challenge_id ), None )
210+ module_name = module .name
211+ challenge_name = challenge .name if challenge else challenge_id
212+ error_message = f"Duplicate ID used in Module: { module_name } , for Challenge: { challenge_name } ."
213+ return {"success" : False , "error" : error_message }, 400
214+ except (IndexError , StopIteration ):
215+ return {"success" : False , "error" : "Database integrity error: Could not parse module/challenge." }, 400
216+ else :
217+ print (f"ERROR: Dojo failed for { dojo } " , file = sys .stderr , flush = True )
218+ traceback .print_exc (file = sys .stderr )
219+ return {"success" : False , "error" : "Database integrity error" }, 400
199220 except Exception as e :
221+ db .session .rollback ()
200222 print (f"ERROR: Dojo failed for { dojo } " , file = sys .stderr , flush = True )
201223 traceback .print_exc (file = sys .stderr )
202224 return {"success" : False , "error" : str (e )}, 400
0 commit comments