Database transaction code adapted for more safety

This commit is contained in:
Greg 2025-05-17 02:10:49 +02:00
parent 13578db09d
commit 7dce92f5c1

52
app.py
View File

@ -76,41 +76,53 @@ def db_to_json():
def json_to_db(data): def json_to_db(data):
try: try:
# Start a single transaction for all operations
with db.session.begin():
# Clear existing attendance records
db.session.query(Attendance).delete() db.session.query(Attendance).delete()
db.session.commit()
db.session.query(GuestName).delete() db.session.query(GuestName).delete()
db.session.commit()
db.session.query(Date).delete()
db.session.commit()
db.session.query(Player).delete()
db.session.commit()
except Exception as e:
db.session.rollback()
print("Error during deletion:", e)
raise
# Insert players from JSON # Update players - keep existing ones, add new ones
existing_players = {p.name: p for p in Player.query.all()}
for name in data.get("players", []): for name in data.get("players", []):
if name not in existing_players:
db.session.add(Player(name=name)) db.session.add(Player(name=name))
db.session.commit()
# Insert dates and attendance # Update dates - keep existing ones, add new ones
existing_dates = {d.date_str: d for d in Date.query.all()}
for date_str in data.get("dates", []): for date_str in data.get("dates", []):
if date_str not in existing_dates:
date = Date(date_str=date_str) date = Date(date_str=date_str)
db.session.add(date) db.session.add(date)
db.session.commit() existing_dates[date_str] = date
# Refresh player list after potential additions
player_dict = {p.name: p for p in Player.query.all()}
# Add attendance records
for date_str in data.get("dates", []):
date = existing_dates[date_str]
for idx, player_name in enumerate(data["players"] + [data["guest"]]): for idx, player_name in enumerate(data["players"] + [data["guest"]]):
key = f"{date_str}|{idx}" key = f"{date_str}|{idx}"
status = data["attendance"].get(key) status = data["attendance"].get(key)
if status: if status and player_name in player_dict:
player = Player.query.filter_by(name=player_name).first() player = player_dict[player_name]
if player: # Convert boolean True to string 'yes'
# Save status as 'yes', 'no', or 'maybe' status_value = 'yes' if status is True else status
db.session.add(Attendance(date_id=date.id, player_id=player.id, status='yes' if status is True else status if status in ['no', 'maybe'] else None)) # Only add if status is one of the valid values
if status_value in ['yes', 'no', 'maybe']:
db.session.add(Attendance(date_id=date.id, player_id=player.id, status=status_value))
# Add guest name if present
guest_name = data.get("guestNames", {}).get(date_str) guest_name = data.get("guestNames", {}).get(date_str)
if guest_name: if guest_name:
db.session.add(GuestName(date_id=date.id, name=guest_name)) db.session.add(GuestName(date_id=date.id, name=guest_name))
db.session.commit()
# The transaction will be committed automatically if no exceptions occur
except Exception as e:
# The transaction will be rolled back automatically if an exception occurs
print("Error during database operation:", e)
raise