Finish implementing data saving/loading

This commit is contained in:
2024-02-15 23:34:01 +01:00
parent c422477778
commit 33972bf210
3 changed files with 105 additions and 33 deletions

View File

@ -1,17 +1,26 @@
import csv
import os.path
from model import *
def load_csv(filename):
with open("init_data/" + filename + ".csv", "r", newline="") as file:
if not os.path.exists(filename):
print(f"Could not load data from file {filename}, as it doesn't exist!")
return []
with open(filename, "r", newline="") as file:
reader = csv.reader(file, delimiter=",")
next(reader, None) # skip header
return list(reader)
# @todo CSV-Writer
def write_csv(filename, objects):
with open("dynamic_data/" + filename + ".csv", "w", newline="") as file:
if len(objects) == 0:
print(f"Could not write objects to file {filename}, as no objects were given!")
return
with open(filename, "w", newline="") as file:
writer = csv.writer(file, delimiter=",")
writer.writerow(objects[0].__csv_header__)
for obj in objects:
@ -31,28 +40,59 @@ def reload_static_data(db):
User.query.delete()
# Reload static data
for row in load_csv("teams"):
for row in load_csv("static_data/teams.csv"):
db.session.add(Team().from_csv(row))
for row in load_csv("drivers"):
for row in load_csv("static_data/drivers.csv"):
db.session.add(Driver().from_csv(row))
for row in load_csv("races"):
for row in load_csv("static_data/races.csv"):
db.session.add(Race().from_csv(row))
for row in load_csv("users"):
for row in load_csv("static_data/users.csv"):
db.session.add(User().from_csv(row))
db.session.commit()
def reload_dynamic_data(db):
print("Initializing Database with Dynamic Values...")
# Clear dynamic data
User.query.delete()
RaceResult.query.delete()
RaceGuess.query.delete()
TeamWinners.query.delete()
PodiumDrivers.query.delete()
SeasonGuess.query.delete()
# Reload dynamic data
for row in load_csv("dynamic_data/users.csv"):
db.session.add(User().from_csv(row))
for row in load_csv("dynamic_data/raceresults.csv"):
db.session.add(RaceResult().from_csv(row))
for row in load_csv("dynamic_data/raceguesses.csv"):
db.session.add(RaceGuess().from_csv(row))
for row in load_csv("dynamic_data/teamwinners.csv"):
db.session.add(TeamWinners().from_csv(row))
for row in load_csv("dynamic_data/podiumdrivers.csv"):
db.session.add(PodiumDrivers().from_csv(row))
for row in load_csv("dynamic_data/seasonguesses.csv"):
db.session.add(SeasonGuess().from_csv(row))
db.session.commit()
def export_dynamic_data():
print("Exporting Userdata...")
users = User.query.all()
raceresults = RaceResult.query.all()
raceguesses = RaceGuess.query.all()
teamwinners = TeamWinners.query.all()
podiumdrivers = PodiumDrivers.query.all()
seasonguesses = SeasonGuess.query.all()
if len(raceresults) > 0:
write_csv("raceresults", raceresults)
if len(raceguesses) > 0:
write_csv("raceguesses", raceguesses)
if len(seasonguesses) > 0:
write_csv("seasonguesses", seasonguesses)
write_csv("dynamic_data/users.csv", users)
write_csv("dynamic_data/raceresults.csv", raceresults)
write_csv("dynamic_data/raceguesses.csv", raceguesses)
write_csv("dynamic_data/teamwinners.csv", teamwinners)
write_csv("dynamic_data/podiumdrivers.csv", podiumdrivers)
write_csv("dynamic_data/seasonguesses.csv", seasonguesses)

View File

@ -3,7 +3,7 @@ from typing import List
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from model import *
from database_utils import reload_static_data, export_dynamic_data
from database_utils import reload_static_data, reload_dynamic_data, export_dynamic_data
app = Flask(__name__)
@ -28,14 +28,35 @@ def index():
return redirect("/race")
@app.route("/reload")
@app.route("/loadall")
def load():
reload_static_data(db)
reload_dynamic_data(db)
return redirect("/")
@app.route("/reloadall")
def reload():
export_dynamic_data()
reload_static_data(db)
reload_dynamic_data(db)
return redirect("/")
@app.route("/reloadstatic")
def reloadstatic():
reload_static_data(db)
return redirect("/")
@app.route("/save")
def save():
@app.route("/reloaddynamic")
def reloaddynamic():
reload_dynamic_data(db)
return redirect("/")
@app.route("/savedynamic")
def savedynamic():
export_dynamic_data()
return redirect("/")

View File

@ -8,15 +8,9 @@ import json
db = SQLAlchemy()
class User(db.Model):
__tablename__ = "user"
def from_csv(self, row):
self.name = str(row[0])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
#
# Static Data (Defined in Backend)
#
class Race(db.Model):
@ -66,6 +60,27 @@ class Driver(db.Model):
team: Mapped["Team"] = relationship("Team", foreign_keys=[team_id])
#
# Dynamic Data (Defined in Frontend)
#
class User(db.Model):
__tablename__ = "user"
__csv_header__ = ["name"]
def from_csv(self, row):
self.name = str(row[0])
return self
def to_csv(self):
return [
self.name
]
name: Mapped[str] = mapped_column(String(32), primary_key=True)
class RaceResult(db.Model):
__tablename__ = "raceresult"
__csv_header__ = ["id", "race_id", "pxx_id", "dnf_id"]
@ -74,7 +89,7 @@ class RaceResult(db.Model):
self.id = int(row[0])
self.race_id = int(row[1])
self.pxx_id = str(row[2])
self.dnf_id = str(row[22])
self.dnf_id = str(row[3])
return self
def to_csv(self):
@ -130,17 +145,13 @@ class RaceGuess(db.Model):
dnf: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf_id])
# Per season guesses: Hot, P2 Constructor, Most overtakes, Most DNFs, Team winner,
# At least 1 podium
class TeamWinners(db.Model):
__tablename__ = "teamwinners"
__csv_header__ = ["id", "user_id", "winner_ids_json"]
def from_csv(self, row):
self.id = int(row[0])
self.user_id = int(row[1])
self.user_id = str(row[1])
self.winner_ids_json = str(row[2])
return self
@ -183,7 +194,7 @@ class PodiumDrivers(db.Model):
def from_csv(self, row):
self.id = int(row[0])
self.user_id = int(row[1])
self.user_id = str(row[1])
self.podium_ids_json = str(row[2])
return self