@@ -200,26 +200,32 @@ def update_dojo(dojo, update_code=None):
200200 db .session .rollback ()
201201 error = str (e )
202202 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 )
203+
204+ if not match :
205+ print (f"ERROR: Dojo update failed with unparsed IntegrityError for { dojo } " , file = sys .stderr , flush = True )
218206 traceback .print_exc (file = sys .stderr )
219- return {"success" : False , "error" : "Database integrity error" }, 400
207+ return {"success" : False , "error" : "Database integrity error: A challenge ID is likely duplicated." }, 400
208+
209+ module_index_str , challenge_id = match .groups ()
210+ module_index = int (module_index_str )
211+ challenge_id = challenge_id .strip ()
212+
213+ if module_index >= len (dojo .modules ):
214+ print (f"ERROR: IntegrityError for { dojo } references out-of-bounds module_index { module_index } " , file = sys .stderr , flush = True )
215+ return {"success" : False , "error" : "Database integrity error: Inconsistent module data." }, 400
216+
217+ module = dojo .modules [module_index ]
218+ challenge = next ((c for c in module .challenges if c .id == challenge_id ), None )
219+
220+ module_name = module .name
221+ challenge_name = challenge .name if challenge else challenge_id
222+ error_message = f"Duplicate ID '{ challenge_id } ' used in module '{ module_name } '."
223+
224+ return {"success" : False , "error" : error_message }, 400
225+
220226 except Exception as e :
221227 db .session .rollback ()
222- print (f"ERROR: Dojo failed for { dojo } " , file = sys .stderr , flush = True )
228+ print (f"ERROR: Dojo update failed for { dojo } " , file = sys .stderr , flush = True )
223229 traceback .print_exc (file = sys .stderr )
224230 return {"success" : False , "error" : str (e )}, 400
225231 return {"success" : True }
0 commit comments