From af57942ad8d27749af5a69352301d71fed453aa6 Mon Sep 17 00:00:00 2001 From: luxick Date: Fri, 23 Feb 2018 17:11:53 +0100 Subject: [PATCH] Add function for adding base data and data reloading. --- dsst/dsst_gtk3/dialogs.py | 75 +- dsst/dsst_gtk3/gtk_ui.py | 46 +- dsst/dsst_gtk3/handlers/center_handlers.py | 10 + dsst/dsst_gtk3/handlers/dialog_handlers.py | 37 + dsst/dsst_gtk3/handlers/handlers.py | 10 +- ...nd_episodes.py => left_column_handlers.py} | 21 +- dsst/dsst_gtk3/handlers/players.py | 13 +- dsst/dsst_gtk3/resources/glade/dialogs.glade | 469 --------- dsst/dsst_gtk3/resources/glade/window.glade | 963 +++++++++++++++++- dsst/dsst_gtk3/util.py | 2 +- dsst/dsst_sql/core.py | 2 +- dsst/dsst_sql/sql.py | 50 +- dsst/dsst_sql/sql_func.py | 22 + 13 files changed, 1154 insertions(+), 566 deletions(-) create mode 100644 dsst/dsst_gtk3/handlers/center_handlers.py create mode 100644 dsst/dsst_gtk3/handlers/dialog_handlers.py rename dsst/dsst_gtk3/handlers/{season_and_episodes.py => left_column_handlers.py} (51%) create mode 100644 dsst/dsst_sql/sql_func.py diff --git a/dsst/dsst_gtk3/dialogs.py b/dsst/dsst_gtk3/dialogs.py index b437dd3..2356ed8 100644 --- a/dsst/dsst_gtk3/dialogs.py +++ b/dsst/dsst_gtk3/dialogs.py @@ -1,6 +1,7 @@ import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk +from datetime import datetime from dsst_sql import sql @@ -28,28 +29,52 @@ def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str: return value -def show_episode_dialog(builder: Gtk.Builder, title: str, episode: sql.Episode=None): +def show_episode_dialog(builder: Gtk.Builder, title: str, season_id: int, episode: sql.Episode=None): + """ Shows a dialog to edit an episode + :param builder: GtkBuilder with loaded 'dialogs.glade' + :param title: Title of the dialog window + :param season_id: Season to witch the episode should be added + :param episode: (Optional) Existing episode to edit + :return True if changes where saved False if discarded + """ + # Set up the dialog dialog = builder.get_object("edit_episode_dialog") # type: Gtk.Dialog dialog.set_transient_for(builder.get_object("main_window")) dialog.set_title(title) - if episode: + with sql.connection.atomic(): + if not episode: + nxt_number = len(sql.Season.get_by_id(season_id).episodes) + 1 + episode = sql.Episode.create(seq_number=nxt_number, number=nxt_number, date=datetime.today(), + season=season_id) + # Set episode number builder.get_object("episode_no_spin_button").set_value(episode.number) - ep_players = sql.Player.select().join(sql.EpisodePlayer).join(sql.Episode).get() + # Set episode date + builder.get_object('episode_calendar').select_month(episode.date.month, episode.date.year) + builder.get_object('episode_calendar').select_day(episode.date.day) + # Set participants for the episode + builder.get_object('episode_players_store').clear() + for player in episode.players: + builder.get_object('episode_players_store').append([player.id, player.name, player.hex_id]) - result = dialog.run() - dialog.hide() + result = dialog.run() + dialog.hide() - if result == Gtk.ResponseType.OK: + if result != Gtk.ResponseType.OK: + sql.connection.rollback() + return False + + # Save all changes to Database player_ids = [row[0] for row in builder.get_object('episode_players_store')] - query = sql.EpisodePlayer\ - .delete()\ - .wher(sql.EpisodePlayer.episode == episode.id)\ - .where(sql.EpisodePlayer.player.not_in(player_ids)) - #query = sql.EpisodePlayer.get_or_create(episode=episode.id, player=pl) - - return episode - else: - return None + # Insert new Players + episode.players = sql.Player.select().where(sql.Player.id << player_ids) + # Update Date of the Episode + cal_value = builder.get_object('episode_calendar').get_date() + selected_date = datetime(*cal_value).date() + query = sql.Episode.update(date=selected_date, + number=int(builder.get_object("episode_no_spin_button").get_value()))\ + .where(sql.Episode.id == episode.id) + query.execute() + return True def show_manage_players_dialog(builder: Gtk.Builder, title: str): @@ -61,4 +86,22 @@ def show_manage_players_dialog(builder: Gtk.Builder, title: str): dialog.hide() if result == Gtk.ResponseType.OK: - pass \ No newline at end of file + pass + + +def show_manage_enemies_dialog(builder: Gtk.Builder, season_id: int): + dialog = builder.get_object("manage_enemies_dialog") # type: Gtk.Dialog + dialog.set_transient_for(builder.get_object("main_window")) + + result = dialog.run() + dialog.hide() + + return result + + +def show_manage_drinks_dialog(builder: Gtk.Builder): + dialog = builder.get_object("manage_drinks_dialog") # type: Gtk.Dialog + dialog.set_transient_for(builder.get_object("main_window")) + result = dialog.run() + dialog.hide() + return result diff --git a/dsst/dsst_gtk3/gtk_ui.py b/dsst/dsst_gtk3/gtk_ui.py index 3406d55..9f524af 100644 --- a/dsst/dsst_gtk3/gtk_ui.py +++ b/dsst/dsst_gtk3/gtk_ui.py @@ -4,12 +4,14 @@ import os gi.require_version('Gtk', '3.0') from gi.repository import Gtk from dsst_gtk3.handlers import handlers +from dsst_gtk3 import util -from dsst_sql import sql +from dsst_sql import sql, sql_func class DSSTGtkUi: """ The main UI class """ + def __init__(self): # Load Glade UI files self.ui = Gtk.Builder() @@ -23,19 +25,57 @@ class DSSTGtkUi: # Create database if not exists sql.create_tables() - self.reload_view_data() + self.reload_base_data() + self.reload_seasons() - def reload_view_data(self): + def reload_base_data(self): # Rebuild all players store self.ui.get_object('all_players_store').clear() for player in sql.Player.select(): self.ui.get_object('all_players_store').append([player.id, player.name, player.hex_id]) + # Rebuild drink store + self.ui.get_object('drink_store').clear() + for drink in sql.Drink.select(): + self.ui.get_object('drink_store').append([drink.id, drink.name, str(drink.vol)]) + + def reload_seasons(self): # Rebuild seasons store store = self.ui.get_object('seasons_store') store.clear() for season in sql.Season.select().order_by(sql.Season.number): store.append([season.id, season.game_name]) + def reload_for_season(self, season_id): + if season_id is None or season_id == -1: + return + # Rebuild episodes store + store = self.ui.get_object('episodes_store') + store.clear() + for episode in sql_func.get_episodes_for_season(season_id): + store.append([episode.id, episode.number, str(episode.date)]) + # Load player stats for season + player_stats = {} + for episode in sql_func.get_episodes_for_season(season_id): + for player in episode.players: + player_stats[player.name] = [sql_func.get_player_deaths_for_season(season_id, player.id), + sql_func.get_player_victories_for_season(season_id, player.id)] + store = self.ui.get_object('player_season_store') + store.clear() + for name, stats in player_stats.items(): + store.append([name, stats[0], stats[1]]) + # Load enemy stats for season + enemy_stats = {enemy.name: [0, 0] for enemy in sql.Season.get(sql.Season.id == season_id).enemies} + store = self.ui.get_object('enemy_season_store') + store.clear() + for name, stats in enemy_stats.items(): + store.append([name, stats[0], stats[1]]) + + def reload_for_episode(self, episode_id): + pass + + def get_selected_season_id(self): + season_id = util.Util.get_combo_value(self.ui.get_object('season_combo_box'), 0) + return season_id if season_id != -1 else None if __name__ == '__main__': diff --git a/dsst/dsst_gtk3/handlers/center_handlers.py b/dsst/dsst_gtk3/handlers/center_handlers.py new file mode 100644 index 0000000..6e41715 --- /dev/null +++ b/dsst/dsst_gtk3/handlers/center_handlers.py @@ -0,0 +1,10 @@ +from dsst_gtk3.gtk_ui import DSSTGtkUi +from dsst_sql import sql +from dsst_gtk3 import dialogs, util + +class CenterHandlers: + def __init__(self, app: DSSTGtkUi): + self.app = app + + def do_add_death(self, *_): + pass \ No newline at end of file diff --git a/dsst/dsst_gtk3/handlers/dialog_handlers.py b/dsst/dsst_gtk3/handlers/dialog_handlers.py new file mode 100644 index 0000000..10087d4 --- /dev/null +++ b/dsst/dsst_gtk3/handlers/dialog_handlers.py @@ -0,0 +1,37 @@ +from dsst_gtk3.gtk_ui import DSSTGtkUi +from dsst_gtk3 import dialogs, util +from dsst_sql import sql + + +class DialogHandlers: + def __init__(self, app: DSSTGtkUi): + self.app = app + + def do_add_player_to_episode(self, combo): + """ Signal Handler for Add Player to Episode Button in Manage Episode Dialog + :param combo: Combo box with all the available players + """ + player_id = util.Util.get_combo_value(combo, 0) + if player_id: + self.app.ui.get_object('add_player_combo_box').set_active(-1) + player = sql.Player.get(sql.Player.id == player_id) + store = self.app.ui.get_object('episode_players_store') + if not any(row[0] == player_id for row in store): + store.append([player_id, player.name, player.hex_id]) + + def do_add_enemy(self, entry): + if entry.get_text: + store = self.app.ui.get_object('enemy_season_store') + enemy = sql.Enemy.create(name=entry.get_text(), season=self.app.get_selected_season_id()) + store.append([enemy.name, False, 0]) + entry.set_text('') + + def do_manage_drinks(self, *_): + result = dialogs.show_manage_drinks_dialog(self.app.ui) + + def do_add_drink(self, entry): + if entry.get_text: + store = self.app.ui.get_object('drink_store') + drink = sql.Drink.create(name=entry.get_text(), vol='0') + store.append([drink.id, drink.name, drink.vol]) + entry.set_text('') \ No newline at end of file diff --git a/dsst/dsst_gtk3/handlers/handlers.py b/dsst/dsst_gtk3/handlers/handlers.py index 4108b0a..0e9f215 100644 --- a/dsst/dsst_gtk3/handlers/handlers.py +++ b/dsst/dsst_gtk3/handlers/handlers.py @@ -1,11 +1,13 @@ import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk -from dsst_gtk3.handlers.season_and_episodes import SeasonAndEpisodesHandlers +from dsst_gtk3.handlers.left_column_handlers import LeftColumnHandlers from dsst_gtk3.handlers.players import PlayerHandlers +from dsst_gtk3.handlers.dialog_handlers import DialogHandlers +from dsst_gtk3.handlers.center_handlers import CenterHandlers -class Handlers(SeasonAndEpisodesHandlers, PlayerHandlers): +class Handlers(LeftColumnHandlers, PlayerHandlers, DialogHandlers, CenterHandlers): """ Class containing all signal handlers for the GTK GUI """ def __init__(self, app): """ Initialize handler class @@ -13,8 +15,10 @@ class Handlers(SeasonAndEpisodesHandlers, PlayerHandlers): """ self.app = app # Call constructors of superclasses - SeasonAndEpisodesHandlers.__init__(self, app) + LeftColumnHandlers.__init__(self, app) PlayerHandlers.__init__(self, app) + DialogHandlers.__init__(self, app) + CenterHandlers.__init__(self, app) @staticmethod def do_delete_event(*args): diff --git a/dsst/dsst_gtk3/handlers/season_and_episodes.py b/dsst/dsst_gtk3/handlers/left_column_handlers.py similarity index 51% rename from dsst/dsst_gtk3/handlers/season_and_episodes.py rename to dsst/dsst_gtk3/handlers/left_column_handlers.py index 5a2eff4..4f27790 100644 --- a/dsst/dsst_gtk3/handlers/season_and_episodes.py +++ b/dsst/dsst_gtk3/handlers/left_column_handlers.py @@ -1,10 +1,10 @@ +from datetime import datetime from dsst_gtk3.gtk_ui import DSSTGtkUi -from dsst_gtk3.util import Util from dsst_sql import sql -from dsst_gtk3 import dialogs +from dsst_gtk3 import dialogs, util -class SeasonAndEpisodesHandlers: +class LeftColumnHandlers: def __init__(self, app: DSSTGtkUi): self.app = app @@ -12,15 +12,14 @@ class SeasonAndEpisodesHandlers: name = dialogs.enter_string_dialog(self.app.ui, 'Name for the new Season') if name: sql.Season.create(game_name=name, number=1) - self.app.reload_view_data() + self.app.reload_seasons() def do_season_selected(self, *_): - combo = self.app.ui.get_object('season_combo_box') - season_id = Util.get_combo_value(combo, 0) - if not season_id: return - season = sql.Season.get(sql.Season.id == season_id) - for episode in season.episodes: - print(episode) + self.app.reload_for_season(self.app.get_selected_season_id()) def do_add_episode(self, *_): - episode = dialogs.show_episode_dialog(self.app.ui, 'Create new Episode') + season_id = self.app.get_selected_season_id() + if not season_id: + return + episode = dialogs.show_episode_dialog(self.app.ui, 'Create new Episode', season_id) + self.app.reload_for_season(season_id) diff --git a/dsst/dsst_gtk3/handlers/players.py b/dsst/dsst_gtk3/handlers/players.py index 87a555c..5230b47 100644 --- a/dsst/dsst_gtk3/handlers/players.py +++ b/dsst/dsst_gtk3/handlers/players.py @@ -14,14 +14,7 @@ class PlayerHandlers: if entry.get_text(): sql.Player.create(name=entry.get_text()) entry.set_text('') - self.app.reload_view_data() - - def do_add_player_to_episode(self, combo): - player_id = util.Util.get_combo_value(combo, 0) - if player_id: - self.app.ui.get_object('add_player_combo_box').set_active(-1) - player = sql.Player.get(sql.Player.id == player_id) - store = self.app.ui.get_object('episode_players_store') - if not any(row[0] == player_id for row in store): - store.append([player_id, player.name, player.hex_id]) + self.app.reload_base_data() + def do_manage_enemies(self, *_): + result = dialogs.show_manage_enemies_dialog(self.app.ui, self.app.get_selected_season_id()) \ No newline at end of file diff --git a/dsst/dsst_gtk3/resources/glade/dialogs.glade b/dsst/dsst_gtk3/resources/glade/dialogs.glade index 777a898..8b9b6ad 100644 --- a/dsst/dsst_gtk3/resources/glade/dialogs.glade +++ b/dsst/dsst_gtk3/resources/glade/dialogs.glade @@ -2,475 +2,6 @@ - - - - - - - - - - - - False - False - True - dialog - False - - - False - vertical - 4 - - - False - end - - - gtk-ok - True - True - True - True - - - True - True - 0 - - - - - gtk-cancel - True - True - True - True - - - True - True - 1 - - - - - False - False - 0 - - - - - True - False - vertical - 5 - - - True - False - 5 - - - True - False - 5 - 5 - 5 - 5 - Add Player - - - False - True - 0 - - - - - True - True - - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 5 - 5 - 5 - 5 - All Players - 0 - - - False - True - 1 - - - - - True - True - True - all_players_store - - - - - - Name - - - - 1 - - - - - - - Hex ID - - - - 2 - - - - - - - False - True - 2 - - - - - True - True - 1 - - - - - - okButtonRename2 - cancelButtonRename2 - - - - - - - all_players_store - 1 - True - True - - - - 1 - - - - - 1000000 - 1 - 10 - - - - - - - - - - - - - False - False - True - dialog - False - - - False - vertical - 4 - - - False - end - - - gtk-ok - True - True - True - True - - - True - True - 0 - - - - - gtk-cancel - True - True - True - True - - - True - True - 1 - - - - - False - False - 0 - - - - - True - False - 5 - - - True - False - vertical - 5 - - - True - False - - - True - False - Episode No. - - - False - True - 0 - - - - - True - True - digits - ep_number_ajustment - 1 - True - True - - - False - True - end - 1 - - - - - False - True - 0 - - - - - True - False - - - True - False - Player - - - False - True - 0 - - - - - True - False - all_players_store - 1 - 1 - - - - 1 - - - - - True - True - 1 - - - - - Add - True - True - True - - - - False - True - end - 2 - - - - - False - True - 1 - - - - - True - True - True - episode_players_store - - - - - - Name - - - - 1 - - - - - - - Hex ID - - - - 2 - - - - - - - False - True - 2 - - - - - False - True - 0 - - - - - True - False - vertical - - - True - False - 5 - 5 - 5 - 5 - Episode Date - 0 - - - False - True - 0 - - - - - True - True - 2018 - 1 - 22 - - - False - True - 1 - - - - - False - True - 1 - - - - - False - True - 1 - - - - - - button1 - button2 - - - - - False False diff --git a/dsst/dsst_gtk3/resources/glade/window.glade b/dsst/dsst_gtk3/resources/glade/window.glade index 52cdf1f..4a542d6 100644 --- a/dsst/dsst_gtk3/resources/glade/window.glade +++ b/dsst/dsst_gtk3/resources/glade/window.glade @@ -2,17 +2,829 @@ - - + + + + + + + + + + + + + + + + + + + + + + False + False + True + dialog + False + + + False + vertical + 4 + + + False + end + + + gtk-ok + True + True + True + True + + + True + True + 0 + + + + + gtk-cancel + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + 5 + 5 + Add Drink + + + False + True + 0 + + + + + True + True + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + All Drinks + 0 + + + False + True + 1 + + + + + True + True + True + drink_store + 0 + + + + + + Name + + + + 1 + + + + + + + Vol. + + + + 2 + + + + + + + False + True + 2 + + + + + True + True + 1 + + + + + + okButtonRename3 + cancelButtonRename3 + + + + + + + False + False + True + dialog + False + + + False + vertical + 4 + + + False + end + + + gtk-ok + True + True + True + True + + + True + True + 0 + + + + + gtk-cancel + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + 5 + + + True + False + vertical + 5 + + + True + False + + + True + False + Episode No. + + + False + True + 0 + + + + + True + True + 0 + digits + ep_number_ajustment + 1 + True + True + + + False + True + end + 1 + + + + + False + True + 0 + + + + + True + False + + + True + False + Player + + + False + True + 0 + + + + + True + False + all_players_store + 1 + 1 + + + + 1 + + + + + True + True + 1 + + + + + Add + True + True + True + + + False + True + end + 2 + + + + + False + True + 1 + + + + + True + True + True + episode_players_store + 0 + + + + + + Name + + + + 1 + + + + + + + Hex ID + + + + 2 + + + + + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + vertical + + + True + False + 5 + 5 + Episode Date + 0 + + + False + True + 0 + + + + + True + True + 2018 + 1 + 23 + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 1 + + + + + + button1 + button2 + + + + + + + + + + + + + + + + + False + Manage Enemies For This Season + False + True + dialog + False + + + False + vertical + 4 + + + False + end + + + gtk-ok + True + True + True + True + + + True + True + 0 + + + + + gtk-cancel + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + 5 + 5 + Add Enemy + + + False + True + 0 + + + + + True + True + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + All Enemies + 0 + + + False + True + 1 + + + + + True + True + True + enemy_season_store + 0 + + + + + + Name + + + + 0 + + + + + + + False + True + 2 + + + + + True + True + 1 + + + + + + okButtonRename1 + cancelButtonRename1 + + + + + + + 1000000 + 1 + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + False + True + dialog + False + + + False + vertical + 4 + + + False + end + + + gtk-ok + True + True + True + True + + + True + True + 0 + + + + + gtk-cancel + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + 5 + 5 + Add Player + + + False + True + 0 + + + + + True + True + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + 5 + All Players + 0 + + + False + True + 1 + + + + + True + True + True + all_players_store + 0 + + + + + + Name + + + + 1 + + + + + + + Hex ID + + + + 2 + + + + + + + False + True + 2 + + + + + True + True + 1 + + + + + + okButtonRename2 + cancelButtonRename2 + + + + + + + + + + + + + - @@ -68,6 +880,7 @@ False Manage Enemies True + @@ -89,10 +902,41 @@ - + True False - Players + Episode + True + + + True + False + + + True + False + Add Death + True + + + + + + True + False + Add Victory + True + + + + + + + + + True + False + Data True @@ -107,6 +951,15 @@ + + + True + False + Manage Drinks + True + + + @@ -258,6 +1111,17 @@ + + + Date + + + + 2 + + + + autosize @@ -319,7 +1183,52 @@ False vertical - + + True + True + episode_deaths_store + + + + + + Player + + + + 1 + + + + + + + Enemy + + + + 2 + + + + + + + Penalty + + + + 3 + + + + + + + True + True + 0 + @@ -382,7 +1291,7 @@ 5 5 5 - Players + Players This Season 0 @@ -396,7 +1305,7 @@ True True True - player_store + player_season_store @@ -413,7 +1322,7 @@ - Hex ID + Deaths @@ -422,6 +1331,17 @@ + + + Victories + + + + 2 + + + + False @@ -437,7 +1357,7 @@ 5 5 5 - Drinks + All Drinks 0 @@ -461,7 +1381,7 @@ - 0 + 1 @@ -472,7 +1392,7 @@ - 1 + 2 @@ -492,7 +1412,7 @@ 5 5 5 - Enemies + Enemies This Season 0 @@ -506,7 +1426,7 @@ True True True - enemy_store + enemy_season_store @@ -516,11 +1436,24 @@ + 1 0 + + + Attempts + + + + 1 + 2 + + + + False @@ -542,7 +1475,7 @@ - False + True True 1 diff --git a/dsst/dsst_gtk3/util.py b/dsst/dsst_gtk3/util.py index 7e9ef9c..5df5cd1 100644 --- a/dsst/dsst_gtk3/util.py +++ b/dsst/dsst_gtk3/util.py @@ -6,4 +6,4 @@ class Util: if tree_iter: return combo.get_model().get_value(tree_iter, index) else: - return None + return -1 diff --git a/dsst/dsst_sql/core.py b/dsst/dsst_sql/core.py index bdbbf36..eeba37b 100644 --- a/dsst/dsst_sql/core.py +++ b/dsst/dsst_sql/core.py @@ -1,4 +1,4 @@ -from dsst_sql import models, sql +from dsst_sql import sql class DSSTCore: diff --git a/dsst/dsst_sql/sql.py b/dsst/dsst_sql/sql.py index 8eb29ca..8edf43c 100644 --- a/dsst/dsst_sql/sql.py +++ b/dsst/dsst_sql/sql.py @@ -14,21 +14,22 @@ class Season(Model): database = connection -class Episode(Model): +class Player(Model): id = AutoField() - seq_number = IntegerField() - number = CharField() - date = DateTimeField(null=True) - season = ForeignKeyField(Season, backref='episodes') + name = CharField() + hex_id = CharField(null=True) class Meta: database = connection -class Player(Model): +class Episode(Model): id = AutoField() - name = CharField() - hex_id = CharField(null=True) + seq_number = IntegerField() + number = CharField() + date = DateField(null=True) + season = ForeignKeyField(Season, backref='episodes') + players = ManyToManyField(Player, backref='episodes') class Meta: database = connection @@ -46,6 +47,7 @@ class Drink(Model): class Enemy(Model): id = AutoField() name = CharField() + season = ForeignKeyField(Season, backref='enemies') class Meta: database = connection @@ -57,6 +59,7 @@ class Death(Model): player = ForeignKeyField(Player) enemy = ForeignKeyField(Enemy) penalty = ForeignKeyField(Drink) + episode = ForeignKeyField(Episode, backref='deaths') class Meta: database = connection @@ -67,41 +70,14 @@ class Victory(Model): info = CharField(null=True) player = ForeignKeyField(Player) enemy = ForeignKeyField(Enemy) - - class Meta: - database = connection - - -class EpisodePlayer(Model): - id = AutoField() - episode = ForeignKeyField(Episode) - player = ForeignKeyField(Player) - - class Meta: - database = connection - - -class EpisodeDeath(Model): - id = AutoField() - episode = ForeignKeyField(Episode) - death = ForeignKeyField(Death) - - class Meta: - database = connection - - -class EpisodeVictory(Model): - id = AutoField() - episode = ForeignKeyField(Episode) - victory = ForeignKeyField(Victory) + episode = ForeignKeyField(Episode, backref='victories') class Meta: database = connection def create_tables(): - models = [Season, Episode, Player, Drink, Enemy, Death, Victory, EpisodePlayer, EpisodeDeath, - EpisodeVictory] + models = [Season, Episode, Player, Drink, Enemy, Death, Victory, Episode.players.get_through_model()] for model in models: model.create_table() diff --git a/dsst/dsst_sql/sql_func.py b/dsst/dsst_sql/sql_func.py new file mode 100644 index 0000000..12c4031 --- /dev/null +++ b/dsst/dsst_sql/sql_func.py @@ -0,0 +1,22 @@ +from dsst_sql.sql import * + + +def get_episodes_for_season(season_id): + try: + return list(Season.get(Season.id == season_id).episodes) + except Episode.DoesNotExist: + return [] + + +def get_player_deaths_for_season(season_id: int, player_id: int) -> int: + deaths = 0 + for episode in list(Season.get(Season.id == season_id).episodes): + deaths = deaths + len([death for death in list(episode.deaths) if death.player.id == player_id]) + return deaths + + +def get_player_victories_for_season(season_id: int, player_id: int) -> int: + victories = 0 + for episode in list(Season.get(Season.id == season_id).episodes): + victories = victories + len([vic for vic in list(episode.victories) if vic.player.id == player_id]) + return victories