From 376d0b822d09ac65fa4f66f4e918ebfd26d6ab15 Mon Sep 17 00:00:00 2001 From: Christian Krakau-Louis Date: Sat, 19 Apr 2025 09:19:54 +0200 Subject: [PATCH] feat: Enhance admin dashboard layout and add model management link --- app/templates/admin/dashboard.html | 7 ++- app/views/admin.py | 79 ++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/app/templates/admin/dashboard.html b/app/templates/admin/dashboard.html index fe5fc9e..7625b9d 100644 --- a/app/templates/admin/dashboard.html +++ b/app/templates/admin/dashboard.html @@ -9,7 +9,12 @@ {% block content %}
-

Admin Dashboard

+
+

Admin Dashboard

+ + Manage All Models + +
diff --git a/app/views/admin.py b/app/views/admin.py index 4282401..0f063ef 100644 --- a/app/views/admin.py +++ b/app/views/admin.py @@ -539,6 +539,85 @@ async def delete_record( if not record: raise HTTPException(status_code=404, detail=f"Record not found") + # Special handling for different models due to foreign key constraints + if model_name == 'team': + # First clear any QR code references to this team + db.query(QRCode).filter(QRCode.redeemed_at_team == record_id).update( + {"redeemed_at_team": None}, synchronize_session=False + ) + + # Clear any team achievements + db.query(TeamAchievement).filter(TeamAchievement.team_id == record_id).delete( + synchronize_session=False + ) + + # Handle team memberships (should be auto-deleted via cascade, but just to be safe) + db.query(TeamMembership).filter(TeamMembership.team_id == record_id).delete( + synchronize_session=False + ) + + # Handle pending join requests + db.query(TeamJoinRequest).filter(TeamJoinRequest.team_id == record_id).delete( + synchronize_session=False + ) + + elif model_name == 'user': + # Clear QR code references to this user + db.query(QRCode).filter(QRCode.redeemed_by == record_id).update( + {"redeemed_by": None}, synchronize_session=False + ) + + # Handle QR sets created by this user - set created_by to NULL + db.query(QRSet).filter(QRSet.created_by == record_id).update( + {"created_by": None}, synchronize_session=False + ) + + # Handle team ownerships - could set to None or reassign + db.query(Team).filter(Team.owner_id == record_id).update( + {"owner_id": None}, synchronize_session=False + ) + + # Remove team memberships + db.query(TeamMembership).filter(TeamMembership.user_id == record_id).delete( + synchronize_session=False + ) + + # Remove team join requests + db.query(TeamJoinRequest).filter(TeamJoinRequest.user_id == record_id).delete( + synchronize_session=False + ) + + # Remove OAuth accounts + db.query(OAuthAccount).filter(OAuthAccount.user_id == record_id).delete( + synchronize_session=False + ) + + # Remove event attendance records + db.query(EventAttendee).filter(EventAttendee.user_id == record_id).delete( + synchronize_session=False + ) + + # Remove user points + db.query(UserPoints).filter(UserPoints.user_id == record_id).delete( + synchronize_session=False + ) + + elif model_name == 'event': + # Clear QR code references to this event + db.query(QRCode).filter(QRCode.event_id == record_id).update( + {"event_id": None}, synchronize_session=False + ) + + # Clear team achievements associated with this event + db.query(TeamAchievement).filter(TeamAchievement.event_id == record_id).update( + {"event_id": None}, synchronize_session=False + ) + + # Remove event attendees + db.query(EventAttendee).filter(EventAttendee.event_id == record_id).delete( + synchronize_session=False + ) + # Delete record db.delete(record) db.commit()