Finalize migration to SQLAlchemy.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from flask import render_template, request, redirect
|
||||
from flask import render_template, request, redirect, url_for
|
||||
|
||||
from estusshots import app
|
||||
from estusshots import forms, models, orm
|
||||
@@ -18,11 +18,12 @@ def enemy_list():
|
||||
|
||||
@app.route("/enemy/new", methods=["GET"])
|
||||
@authorize
|
||||
def enemy_new(preselect_season=None):
|
||||
def enemy_new():
|
||||
form = forms.EnemyForm()
|
||||
|
||||
if preselect_season:
|
||||
form.season_id.default = preselect_season
|
||||
if "preselect" in request.args:
|
||||
form.season_id.process_data(request.args['preselect'])
|
||||
form.is_boss.data = True
|
||||
|
||||
model = models.GenericFormModel(
|
||||
page_title="Enemies",
|
||||
@@ -64,9 +65,8 @@ def enemy_edit(enemy_id: int):
|
||||
enemy.populate_from_form(form)
|
||||
db.commit()
|
||||
if form.submit_continue_button.data:
|
||||
form.name.data = None
|
||||
return enemy_new(preselect_season=enemy.season_id)
|
||||
return redirect("/enemy")
|
||||
return redirect(url_for("enemy_new", preselect=form.season_id.data))
|
||||
return redirect(url_for("enemy_list"))
|
||||
|
||||
model.form_title = "Incorrect Data"
|
||||
return render_template("generic_form.html", model=model, form=form)
|
||||
|
||||
@@ -1,45 +1,24 @@
|
||||
from typing import List
|
||||
|
||||
from flask import render_template, request, redirect
|
||||
from flask import render_template, request, redirect, url_for
|
||||
|
||||
from estusshots import app
|
||||
from estusshots import forms, models, db
|
||||
from estusshots import forms, models, orm
|
||||
from estusshots.util import authorize
|
||||
from estusshots.orm import Season, Episode, Player, Event
|
||||
|
||||
|
||||
@app.route("/season/<season_id>/episode/<episode_id>")
|
||||
@authorize
|
||||
def episode_detail(season_id: int, episode_id: int):
|
||||
sql, args = db.load_season(season_id)
|
||||
season = db.query_db(sql, args, one=True, cls=models.Season)
|
||||
sql, args = db.load_episode(episode_id)
|
||||
episode = db.query_db(sql, args, one=True, cls=models.Episode)
|
||||
sql, args = db.load_episode_players(episode_id)
|
||||
ep_players = db.query_db(sql, args, cls=models.Player)
|
||||
sql, args = db.load_events(episode_id)
|
||||
ep_events: List[models.Event] = db.query_db(sql, args, cls=models.Event)
|
||||
sql, args = db.load_enemies(season_id)
|
||||
enemies = db.query_db(sql, args, cls=models.Enemy)
|
||||
|
||||
deaths = [ev for ev in ep_events if ev.type == models.EventType.Death]
|
||||
entries = []
|
||||
for death in deaths:
|
||||
entries.append({
|
||||
"time": death.time.time(),
|
||||
"type": death.type,
|
||||
"player_name": [p.name for p in ep_players if p.id == death.player_id],
|
||||
"enemy_name": [e.name for e in enemies if e.id == death.enemy_id]
|
||||
})
|
||||
events = None
|
||||
if ep_events:
|
||||
events = {"entries": death, "victory_count": 0, "defeat_count": 0}
|
||||
db = orm.new_session()
|
||||
episode: Episode = db.query(Episode).get(episode_id)
|
||||
deaths = [event for event in episode.events if event.type == orm.EventType.Death]
|
||||
|
||||
model = {
|
||||
"title": f"{season.code}{episode.code}",
|
||||
"title": f"{episode.season.code}{episode.code}",
|
||||
"episode": episode,
|
||||
"season": season,
|
||||
"players": ep_players,
|
||||
"events": events,
|
||||
"season": episode.season,
|
||||
"players": episode.players,
|
||||
"deaths": sorted(deaths, key=lambda x: x.time),
|
||||
}
|
||||
|
||||
return render_template("episode_details.html", model=model)
|
||||
@@ -48,12 +27,9 @@ def episode_detail(season_id: int, episode_id: int):
|
||||
@app.route("/season/<season_id>/episode", methods=["GET"])
|
||||
@authorize
|
||||
def episode_list(season_id: int):
|
||||
sql, args = db.load_season(season_id)
|
||||
season = db.query_db(sql, args, one=True, cls=models.Season)
|
||||
sql, args = db.load_episodes(season_id)
|
||||
episodes = db.query_db(sql, args, cls=models.Episode)
|
||||
|
||||
model = {"season_id": season_id, "season_code": season.code}
|
||||
db = orm.new_session()
|
||||
season = db.query(Season).filter(Season.id == season_id).first()
|
||||
model = {"season_id": season.id, "season_code": season.code}
|
||||
return render_template("episode_list.html", model=model)
|
||||
|
||||
|
||||
@@ -65,7 +41,6 @@ def episode_new(season_id: int):
|
||||
form_title="Create New Episode",
|
||||
post_url=f"/season/{season_id}/episode/null/edit",
|
||||
)
|
||||
|
||||
form = forms.EpisodeForm(request.form)
|
||||
form.season_id.data = season_id
|
||||
return render_template("generic_form.html", model=model, form=form)
|
||||
@@ -79,15 +54,10 @@ def episode_edit(season_id: int, episode_id: int):
|
||||
form_title="Edit Episode",
|
||||
post_url=f"/season/{season_id}/episode/{episode_id}/edit",
|
||||
)
|
||||
|
||||
form = forms.EpisodeForm()
|
||||
db = orm.new_session()
|
||||
episode: Episode = db.query(Episode).get(episode_id)
|
||||
if request.method == "GET":
|
||||
sql, args = db.load_episode(episode_id)
|
||||
episode: models.Episode = db.query_db(sql, args, one=True, cls=models.Episode)
|
||||
|
||||
sql, args = db.load_episode_players(episode_id)
|
||||
ep_players = db.query_db(sql, args, cls=models.Player)
|
||||
|
||||
form = forms.EpisodeForm()
|
||||
form.season_id.data = episode.season_id
|
||||
form.episode_id.data = episode.id
|
||||
form.code.data = episode.code
|
||||
@@ -95,43 +65,24 @@ def episode_edit(season_id: int, episode_id: int):
|
||||
form.start.data = episode.start
|
||||
form.end.data = episode.end
|
||||
form.title.data = episode.title
|
||||
form.players.data = [p.id for p in ep_players]
|
||||
|
||||
form.players.data = [p.id for p in episode.players]
|
||||
model.form_title = f"Edit Episode '{episode.code}: {episode.title}'"
|
||||
return render_template("generic_form.html", model=model, form=form)
|
||||
else:
|
||||
form = forms.EpisodeForm()
|
||||
|
||||
if not form.validate_on_submit():
|
||||
model.errors = form.errors
|
||||
return render_template("generic_form.html", model=model, form=form)
|
||||
|
||||
errors = False
|
||||
episode = models.Episode.from_form(form)
|
||||
sql, args = db.save_episode(episode)
|
||||
|
||||
last_key = db.update_db(sql, args, return_key=True)
|
||||
|
||||
episode_id = episode.id if episode.id else last_key
|
||||
|
||||
form_ids = form.players.data
|
||||
|
||||
sql, args = db.load_episode_players(episode_id)
|
||||
ep_players = db.query_db(sql, args, cls=models.Player)
|
||||
pids = [p.id for p in ep_players]
|
||||
|
||||
new_ids = [pid for pid in form_ids if pid not in pids]
|
||||
removed_ids = [pid for pid in pids if pid not in form_ids]
|
||||
|
||||
if removed_ids:
|
||||
sql, args = db.remove_episode_player(episode_id, removed_ids)
|
||||
errors = db.update_db(sql, args)
|
||||
|
||||
if new_ids:
|
||||
sql, args = db.save_episode_players(episode_id, new_ids)
|
||||
errors = db.update_db(sql, args)
|
||||
|
||||
if not episode:
|
||||
episode = Episode()
|
||||
db.add(episode)
|
||||
season: Season = db.query(Season).get(season_id)
|
||||
episode.populate_from_form(form)
|
||||
episode.season = season
|
||||
player_ids = list(form.players.data)
|
||||
players = db.query(Player).filter(Player.id.in_(player_ids)).all()
|
||||
episode.players = players
|
||||
errors = db.commit()
|
||||
if errors:
|
||||
model.errors = {"Error saving episode": [errors]}
|
||||
return render_template("generic_form.html", model=model, form=form)
|
||||
return redirect(url_for("season_overview", season_id=season_id))
|
||||
return redirect(url_for("episode_detail", season_id=season_id, episode_id=episode_id))
|
||||
|
||||
@@ -2,9 +2,10 @@ from collections import namedtuple
|
||||
|
||||
from flask import render_template, request, redirect
|
||||
|
||||
from estusshots import app
|
||||
from estusshots import forms, models, db, choices
|
||||
from estusshots import app, orm
|
||||
from estusshots import forms, models, choices
|
||||
from estusshots.util import authorize
|
||||
from estusshots.orm import new_session, EventType, Event, Episode, Enemy, Penalty
|
||||
|
||||
|
||||
@app.route("/season/<s_id>/episode/<ep_id>/event/new", methods=["GET"])
|
||||
@@ -15,19 +16,16 @@ def event_new(s_id: int, ep_id: int):
|
||||
"form_title": "Create New Event",
|
||||
"post_url": f"/season/{s_id}/episode/{ep_id}/event/null/edit",
|
||||
}
|
||||
sql, args = db.load_episode(ep_id)
|
||||
episode: models.Episode = db.query_db(sql, args, one=True, cls=models.Episode)
|
||||
|
||||
sql, args = db.load_episode_players(ep_id)
|
||||
ep_players = db.query_db(sql, args, cls=models.Player)
|
||||
db = new_session()
|
||||
episode: Episode = db.query(Episode).get(ep_id)
|
||||
|
||||
form = forms.EventForm()
|
||||
form.episode_id.data = ep_id
|
||||
form.enemy.choices = choices.enemy_choice_for_season(s_id)
|
||||
form.event_type.data = 1
|
||||
form.event_type.data = EventType.Death.value
|
||||
|
||||
Penalty = namedtuple("Penalty", ["penalty_id", "player_id", "player", "drink"])
|
||||
for player in ep_players:
|
||||
for player in episode.players:
|
||||
form.penalties.append_entry(Penalty(None, player.id, player.name, 1))
|
||||
|
||||
return render_template("event_editor.html", model=model, form=form)
|
||||
@@ -41,16 +39,43 @@ def event_edit(s_id: int, ep_id: int, ev_id: int):
|
||||
"form_title": "Edit Event",
|
||||
"post_url": f"/season/{s_id}/episode/{ep_id}/event/{ev_id}/edit",
|
||||
}
|
||||
db = new_session()
|
||||
event: Event = db.query(Event).get(ev_id)
|
||||
form = forms.EventForm()
|
||||
form.enemy.choices = choices.enemy_choice_for_season(s_id)
|
||||
|
||||
if request.method == "GET":
|
||||
form.episode_id.process_data(event.episode_id)
|
||||
form.event_type.process_data(event.type.value)
|
||||
form.enemy.process_data(event.enemy_id)
|
||||
form.player.process_data(event.player_id)
|
||||
form.time.process_data(event.time)
|
||||
form.comment.process_data(event.comment)
|
||||
Penalty = namedtuple("Penalty", ["penalty_id", "player_id", "player", "drink"])
|
||||
for penalty in event.penalties:
|
||||
form.penalties.append_entry(Penalty(penalty.id, penalty.player_id, penalty.player.name, penalty.drink_id))
|
||||
return render_template("event_editor.html", model=model)
|
||||
else:
|
||||
form = forms.EventForm()
|
||||
form.enemy.choices = choices.enemy_choice_for_season(s_id)
|
||||
if not form.validate_on_submit():
|
||||
model["errors"] = form.errors
|
||||
return render_template("event_editor.html", model=model, form=form)
|
||||
if not event:
|
||||
event = Event()
|
||||
for entry in form.penalties:
|
||||
penalty = orm.Penalty()
|
||||
penalty.player_id = entry.player_id.data
|
||||
penalty.drink_id = entry.drink.data
|
||||
db.add(penalty)
|
||||
event.penalties.append(penalty)
|
||||
db.add(event)
|
||||
else:
|
||||
for event in event.penalties:
|
||||
penalty = next((p for p in form.penalties.data if p["penalty_id"] == event.id), None)
|
||||
if not penalty:
|
||||
continue
|
||||
penalty.player_id = form.player_id.data
|
||||
penalty.drink_id = form.drink.data
|
||||
|
||||
event = models.Event.from_form(form)
|
||||
sql, args = db.save_event(event)
|
||||
errors = db.update_db(sql, args)
|
||||
event.populate_from_form(form)
|
||||
db.commit()
|
||||
return redirect(f"/season/{s_id}/episode/{ep_id}")
|
||||
|
||||
Reference in New Issue
Block a user