From 437f418f49202fd0ca5d2f12a607ca980d8a06c9 Mon Sep 17 00:00:00 2001 From: luxick Date: Mon, 12 Mar 2018 20:09:04 +0100 Subject: [PATCH] Add create episode function. --- dsst/dsst_gtk3/dialogs.py | 99 +- dsst/dsst_gtk3/gtk_ui.py | 13 + dsst/dsst_gtk3/handlers/base_data_handlers.py | 4 +- dsst/dsst_gtk3/handlers/dialog_handlers.py | 14 +- dsst/dsst_gtk3/handlers/season_handlers.py | 6 +- dsst/dsst_gtk3/resources/glade/window.glade | 2177 +++++++++-------- dsst/dsst_server/func_write.py | 16 + 7 files changed, 1172 insertions(+), 1157 deletions(-) diff --git a/dsst/dsst_gtk3/dialogs.py b/dsst/dsst_gtk3/dialogs.py index 15919b5..3364eba 100644 --- a/dsst/dsst_gtk3/dialogs.py +++ b/dsst/dsst_gtk3/dialogs.py @@ -4,6 +4,7 @@ This module contains UI functions for displaying different dialogs import datetime from gi.repository import Gtk from common import models +from dsst_gtk3 import gtk_ui def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str: @@ -56,78 +57,44 @@ def edit_season(builder: 'Gtk.Builder', season: 'models.Season'=None): return season -def show_episode_dialog(builder: Gtk.Builder, title: str, season_id: int, episode): - """ 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 +def edit_episode(app: 'gtk_ui.GtkUi', season_id: int, episode: 'models.Episode'=None): + """Show an dialog to create or edit episodes + :param app: Reference to main UI application + :param season_id: Is of the season in which the episode appears + :param episode: Existing episode object to edit + :return: Edited episode object, or None if the process was canceled """ - pass - # # 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) - # with sql.db.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) - # # 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() - # - # if result != Gtk.ResponseType.OK: - # sql.db.rollback() - # return False - # - # # Save all changes to Database - # player_ids = [row[0] for row in builder.get_object('episode_players_store')] - # # 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() - # episode.date = selected_date, - # episode.number = int(builder.get_object("episode_no_spin_button").get_value()) - # episode.name = builder.get_object("episode_name_entry").get_text() - # episode.save() - # return True + if not episode: + episode = models.Episode() + episode.date = datetime.datetime.today() + episode.number = 1 + episode.name = '' + episode.players = [] + app.ui.get_object('episode_name_entry').set_text(episode.name) + app.ui.get_object('episode_no_spin_button').set_value(episode.number) + app.ui.get_object('episode_calendar').select_month(episode.date.month, episode.date.year) + app.ui.get_object('episode_calendar').select_day(episode.date.day) + app.ui.get_object('episode_players_store').clear() + for player in episode.players: + app.ui.get_object('episode_players_store').append([player.id, player.name, player.hex_id]) -def show_manage_players_dialog(builder: Gtk.Builder, title: str): - """Show a dialog for managing player base data. - :param builder: Gtk.Builder object - :param title: Title for the dialog - """ - dialog = builder.get_object("manage_players_dialog") # type: Gtk.Dialog - dialog.set_transient_for(builder.get_object("main_window")) - dialog.run() + dialog = app.ui.get_object('edit_episode_dialog') # type: Gtk.Dialog + result = dialog.run() dialog.hide() + if result != Gtk.ResponseType.OK: + return None -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")) - dialog.run() - dialog.hide() - - -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")) - dialog.run() - dialog.hide() + episode.name = app.ui.get_object('episode_name_entry').get_text() + episode.number = app.ui.get_object('episode_no_spin_button').get_value() + cal_value = app.ui.get_object('episode_calendar').get_date() + selected_date = datetime.datetime(*cal_value).date() + episode.date = selected_date + player_ids = [row[0] for row in app.ui.get_object('episode_players_store')] + episode.players = [app.get_by_id(app.players, player_id) for player_id in player_ids] + episode.season = season_id + return episode def show_edit_death_dialog(builder: Gtk.Builder, episode_id: int, death): diff --git a/dsst/dsst_gtk3/gtk_ui.py b/dsst/dsst_gtk3/gtk_ui.py index d19b341..61fd257 100644 --- a/dsst/dsst_gtk3/gtk_ui.py +++ b/dsst/dsst_gtk3/gtk_ui.py @@ -75,6 +75,12 @@ class GtkUi: self.data_client.send_request('update_season', season) self.seasons.valid = False + def update_episode(self, episode: 'models.Episode'): + with util.network_operation(self): + self.data_client.send_request('update_episode', episode) + self.episodes.valid = False + self.season_stats.valid = False + def update_status_bar_meta(self): self.ui.get_object('connection_label').set_text(self.meta.get('connection')) self.ui.get_object('db_label').set_text(self.meta.get('database') or '') @@ -93,6 +99,13 @@ class GtkUi: (model, tree_iter) = self.ui.get_object('episodes_tree_view').get_selection().get_selected() return model.get_value(tree_iter, 0) if tree_iter else None + @staticmethod + def get_by_id(cache: 'util.Cache', object_id: int): + try: + return [x for x in cache.data if x.id == object_id][0] + except KeyError: + return None + def main(): if not os.path.isfile(util.CONFIG_PATH): diff --git a/dsst/dsst_gtk3/handlers/base_data_handlers.py b/dsst/dsst_gtk3/handlers/base_data_handlers.py index 5efa887..9fa56de 100644 --- a/dsst/dsst_gtk3/handlers/base_data_handlers.py +++ b/dsst/dsst_gtk3/handlers/base_data_handlers.py @@ -7,7 +7,7 @@ class BaseDataHandlers: self.app = app def do_manage_players(self, *_): - dialogs.show_manage_players_dialog(self.app.ui, 'Manage Players') + dialogs.run_management_dialog(self.app.ui, 'manage_players_dialog') def do_add_player(self, entry): if entry.get_text(): @@ -16,7 +16,7 @@ class BaseDataHandlers: self.app.reload() def do_manage_enemies(self, *_): - dialogs.show_manage_enemies_dialog(self.app.ui, self.app.get_selected_season_id()) + dialogs.run_management_dialog(self.app.ui, 'manage_enemies_dialog') def on_player_name_edited(self, _, index, value): row = self.app.ui.get_object('all_players_store')[index] diff --git a/dsst/dsst_gtk3/handlers/dialog_handlers.py b/dsst/dsst_gtk3/handlers/dialog_handlers.py index c4be4f3..a144db3 100644 --- a/dsst/dsst_gtk3/handlers/dialog_handlers.py +++ b/dsst/dsst_gtk3/handlers/dialog_handlers.py @@ -9,6 +9,11 @@ class DialogHandlers: def __init__(self, app: 'gtk_ui.GtkUi'): self.app = app + @staticmethod + def do_run_manage_dialog(dialog: 'Gtk.Dialog'): + dialog.run() + dialog.hide() + 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 @@ -16,10 +21,10 @@ class DialogHandlers: player_id = 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) + player = self.app.get_by_id(self.app.players, 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]) + 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(): @@ -28,9 +33,6 @@ class DialogHandlers: # store.append([enemy.name, False, 0, enemy.id]) entry.set_text('') - def do_manage_drinks(self, *_): - result = dialogs.show_manage_drinks_dialog(self.app.ui) - def do_show_date_picker(self, entry: 'Gtk.Entry', *_): dialog = self.app.ui.get_object('date_picker_dialog') result = dialog.run() diff --git a/dsst/dsst_gtk3/handlers/season_handlers.py b/dsst/dsst_gtk3/handlers/season_handlers.py index 591a920..e4756cf 100644 --- a/dsst/dsst_gtk3/handlers/season_handlers.py +++ b/dsst/dsst_gtk3/handlers/season_handlers.py @@ -21,8 +21,10 @@ class SeasonHandlers: season_id = self.app.get_selected_season_id() if not season_id: return - dialogs.show_episode_dialog(self.app.ui, 'Create new Episode', season_id) - self.app.reload() + ep = dialogs.edit_episode(self.app, season_id) + if ep: + self.app.update_episode(ep) + self.app.reload() def on_selected_episode_changed(self, *_): reload.reload_episode_stats(self.app) diff --git a/dsst/dsst_gtk3/resources/glade/window.glade b/dsst/dsst_gtk3/resources/glade/window.glade index 7c2e35e..7ae3f77 100644 --- a/dsst/dsst_gtk3/resources/glade/window.glade +++ b/dsst/dsst_gtk3/resources/glade/window.glade @@ -12,174 +12,6 @@ - - False - Manage Players - False - True - 300 - dialog - False - - - False - vertical - 4 - - - False - end - - - - - - gtk-ok - 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 - in - - - True - True - True - all_players_store - 0 - - - - - - Name - - - True - - - - 1 - - - - - - - Hex ID - - - True - - - - 2 - - - - - - - - - True - True - 2 - - - - - True - True - 1 - - - - - - okButtonRename2 - - - - - @@ -190,174 +22,6 @@ - - False - Manage Drinks - False - True - 300 - dialog - False - - - False - vertical - 4 - - - False - end - - - - - - gtk-ok - 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 - in - - - True - True - True - drink_store - 0 - - - - - - Name - - - True - - - - 1 - - - - - - - Vol. - - - True - - - - 2 - - - - - - - - - True - True - 2 - - - - - True - True - 1 - - - - - - okButtonRename3 - - - - - @@ -370,157 +34,6 @@ - - False - Manage Enemies For This Season - False - True - 300 - dialog - False - - - False - vertical - 4 - - - False - end - - - - - - gtk-ok - 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 - in - - - True - True - True - enemy_season_store - 0 - - - - - - Name - - - - 0 - - - - - - - - - True - True - 2 - - - - - True - True - 1 - - - - - - okButtonRename1 - - - - - 1000000 1 @@ -548,312 +61,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 - 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 - Episode Name - - - False - True - 0 - - - - - True - True - - - False - True - end - 1 - - - - - False - True - 1 - - - - - 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 - 2 - - - - - True - True - in - - - True - True - True - episode_players_store - 0 - - - - - - Name - - - - 1 - - - - - - - Hex ID - - - - 2 - - - - - - - - - True - True - 3 - - - - - 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 Edit Victory Event @@ -1088,291 +295,6 @@ - - False - Edit Death Event - 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 - Enemy - - - False - True - 0 - - - - - True - False - enemy_season_store - - - - 0 - - - - - True - True - end - 1 - - - - - False - True - 0 - - - - - True - False - - - True - False - 5 - 5 - 5 - 5 - Player - - - False - True - 0 - - - - - True - False - episode_players_store - - - - 1 - - - - - True - True - end - 1 - - - - - False - True - 1 - - - - - True - False - - - True - False - 5 - 5 - 5 - 5 - Drink Size - - - False - True - 0 - - - - - True - True - - - False - True - end - 1 - - - - - False - True - 2 - - - - - True - False - - - True - False - Comment - - - False - True - 0 - - - - - True - True - - - True - True - end - 1 - - - - - False - True - 3 - - - - - 100 - True - True - True - player_penalties_store - 0 - - - - - - Player - - - - 1 - - - - - - - Penalty - - - True - False - drink_store - 1 - - - - 2 - - - - - - - True - True - 4 - - - - - True - True - 1 - - - - - - okButtonRename4 - cancelButtonRename4 - - - - - @@ -1426,6 +348,15 @@ + + + True + False + Add Episode + True + + + True @@ -1438,7 +369,7 @@ False Manage Enemies True - + @@ -1510,7 +441,7 @@ False Manage Players True - + @@ -1519,7 +450,7 @@ False Manage Drinks True - + @@ -2655,6 +1586,600 @@ + + False + Edit Death Event + False + True + dialog + False + main_window + + + 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 + Enemy + + + False + True + 0 + + + + + True + False + enemy_season_store + + + + 0 + + + + + True + True + end + 1 + + + + + False + True + 0 + + + + + True + False + + + True + False + 5 + 5 + 5 + 5 + Player + + + False + True + 0 + + + + + True + False + episode_players_store + + + + 1 + + + + + True + True + end + 1 + + + + + False + True + 1 + + + + + True + False + + + True + False + 5 + 5 + 5 + 5 + Drink Size + + + False + True + 0 + + + + + True + True + + + False + True + end + 1 + + + + + False + True + 2 + + + + + True + False + + + True + False + Comment + + + False + True + 0 + + + + + True + True + + + True + True + end + 1 + + + + + False + True + 3 + + + + + 100 + True + True + True + player_penalties_store + 0 + + + + + + Player + + + + 1 + + + + + + + Penalty + + + True + False + drink_store + 1 + + + + 2 + + + + + + + True + True + 4 + + + + + True + True + 1 + + + + + + okButtonRename4 + cancelButtonRename4 + + + + + + + False + Edit Episode + False + True + dialog + False + main_window + + + 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 + Episode Name + + + False + True + 0 + + + + + True + True + + + False + True + end + 1 + + + + + False + True + 1 + + + + + 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 + 2 + + + + + True + True + in + + + True + True + True + episode_players_store + 0 + + + + + + Name + + + + 1 + + + + + + + Hex ID + + + + 2 + + + + + + + + + True + True + 3 + + + + + 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 Edit Season @@ -2876,4 +2401,494 @@ + + False + Manage Drinks + False + True + 300 + dialog + False + main_window + + + False + vertical + 4 + + + False + end + + + + + + gtk-ok + 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 + in + + + True + True + True + drink_store + 0 + + + + + + Name + + + True + + + + 1 + + + + + + + Vol. + + + True + + + + 2 + + + + + + + + + True + True + 2 + + + + + True + True + 1 + + + + + + okButtonRename3 + + + + + + + False + Manage Enemies For This Season + False + True + 300 + dialog + False + main_window + + + False + vertical + 4 + + + False + end + + + + + + gtk-ok + 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 + in + + + True + True + True + enemy_season_store + 0 + + + + + + Name + + + + 0 + + + + + + + + + True + True + 2 + + + + + True + True + 1 + + + + + + okButtonRename1 + + + + + + + False + Manage Players + False + True + 300 + dialog + False + main_window + + + False + vertical + 4 + + + False + end + + + + + + gtk-ok + 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 + in + + + True + True + True + all_players_store + 0 + + + + + + Name + + + True + + + + 1 + + + + + + + Hex ID + + + True + + + + 2 + + + + + + + + + True + True + 2 + + + + + True + True + 1 + + + + + + okButtonRename2 + + + + + diff --git a/dsst/dsst_server/func_write.py b/dsst/dsst_server/func_write.py index 7fe4891..7545d25 100644 --- a/dsst/dsst_server/func_write.py +++ b/dsst/dsst_server/func_write.py @@ -18,3 +18,19 @@ class WriteFunctions: sql.Season.start_date: season.start_date, sql.Season.end_date: season.end_date}) .execute()) + + @staticmethod + def update_episode(episode: 'models.Episode', *_): + players = list(sql.Player.select().where(sql.Player.id << [player.id for player in episode.players])) + new_ep_id = (sql.Episode + .insert(id=episode.id, number=episode.number, seq_number=episode.number, name=episode.name, + date=episode.date, season=episode.season) + .on_conflict(update={sql.Episode.name: episode.name, + sql.Episode.seq_number: episode.seq_number, + sql.Episode.number: episode.number, + sql.Episode.date: episode.date, + sql.Episode.season: episode.season}) + .execute()) + db_episode = sql.Episode.get(sql.Episode.id == new_ep_id) + db_episode.players = players + db_episode.save()