Finish implementing data saving/loading
This commit is contained in:
@ -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)
|
||||
|
29
formula10.py
29
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("/")
|
||||
|
||||
|
43
model.py
43
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
|
||||
|
||||
|
Reference in New Issue
Block a user