diff --git a/database_utils.py b/database_utils.py index e5c57c8..40b5682 100644 --- a/database_utils.py +++ b/database_utils.py @@ -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) diff --git a/formula10.py b/formula10.py index 2f37c14..cf4367c 100644 --- a/formula10.py +++ b/formula10.py @@ -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("/") diff --git a/model.py b/model.py index 48a0fc8..4201273 100644 --- a/model.py +++ b/model.py @@ -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