Skip to content

Commit 2256c34

Browse files
prathamgupta36robwaz
authored andcommitted
This gives specific error for duplicate challenge IDs
This change now catches the specific database error to provide a precise message, identifying the conflicting module and challenge.
1 parent 7be74b9 commit 2256c34

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

dojo_plugin/pages/dojo.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)