diff --git a/dsst/common/models.py b/dsst/common/models.py index 09958a0..55dd14c 100644 --- a/dsst/common/models.py +++ b/dsst/common/models.py @@ -76,6 +76,7 @@ class Victory: self.player = arg.get('player') self.enemy = arg.get('enemy') self.episode = arg.get('episode') + self.time = arg.get('time') class SeasonStats: diff --git a/dsst/dsst_gtk3/dialogs.py b/dsst/dsst_gtk3/dialogs.py index 26f4702..3986e1c 100644 --- a/dsst/dsst_gtk3/dialogs.py +++ b/dsst/dsst_gtk3/dialogs.py @@ -97,47 +97,11 @@ def edit_episode(app: 'gtk_ui.GtkUi', season_id: int, episode: 'models.Episode'= return episode -def edit_death(app: 'gtk_ui.GtkUi', death: 'models.Death'=None): - """Show a dialog to create or edit death events for an episode +def create_death(app: 'gtk_ui.GtkUi'): + """Show a dialog to create death events for an episode :param app: Main Gtk application - :param death: (Optional) Existing death object to edit :return: Death object or None if dialog was canceled """ - if not death: - death = models.Death() - death.episode = app.get_selected_episode_id() - death.info = "" - death.penalties = [] - death.time = datetime.time(0, 0) - hour_spin = app.ui.get_object('death_hour_spin') - min_spin = app.ui.get_object('death_min_spin') - # Set time of death - hour_spin.set_value(death.time.hour) - min_spin.set_value(death.time.minute) - # Set Enemy - if death.enemy: - index = util.get_index_of_combo_model(app.ui.get_object('edit_death_enemy_combo'), 0, death.enemy.id) - app.ui.get_object('edit_death_enemy_combo').set_active(index) - # Set player - if death.player: - index = util.get_index_of_combo_model(app.ui.get_object('edit_death_player_combo'), 0, death.player.id) - app.ui.get_object('edit_death_player_combo').set_active(index) - # Set shot size - if death.penalties: - app.ui.get_object('edit_death_size_spin').set_value(death.penalties[0].size) - # Set info comment - app.ui.get_object('edit_death_comment_entry').set_text(death.info) - # Set penalties - default_drink = app.drinks.data[0].name - store = app.ui.get_object('player_penalties_store') - store.clear() - if death.penalties: - for penalty in death.penalties: - store.append([penalty.id, penalty.player.name, penalty.drink.name, penalty.player.id]) - else: - for player in app.ui.get_object('episode_players_store'): - store.append([None, player[1], default_drink, player[0]]) - # Run the dialog dialog = app.ui.get_object("edit_death_dialog") # type: Gtk.Dialog result = dialog.run() @@ -145,14 +109,18 @@ def edit_death(app: 'gtk_ui.GtkUi', death: 'models.Death'=None): if result != Gtk.ResponseType.OK: return None + death = models.Death() + hour_spin = app.ui.get_object('death_hour_spin') + min_spin = app.ui.get_object('death_min_spin') # Parse the inputs death.time = datetime.time(int(hour_spin.get_value()), int(min_spin.get_value())) death.enemy = util.get_combo_value(app.ui.get_object('edit_death_enemy_combo'), 4) death.player = util.get_combo_value(app.ui.get_object('edit_death_player_combo'), 0) death.info = app.ui.get_object('edit_death_comment_entry').get_text() + death.episode = app.get_selected_episode_id() store = app.ui.get_object('player_penalties_store') size = app.ui.get_object('edit_death_size_spin').get_value() - death.penalties.clear() + death.penalties = [] for entry in store: drink_id = [drink.id for drink in app.drinks.data if drink.name == entry[2]][0] penalty = models.Penalty({'id': entry[0], 'size': size, 'drink': drink_id, 'player': entry[3]}) @@ -161,43 +129,24 @@ def edit_death(app: 'gtk_ui.GtkUi', death: 'models.Death'=None): return death -def show_edit_victory_dialog(builder: Gtk.Builder, episode_id: int, victory): - pass - # """Show a dialog for editing or creating victory events. - # :param builder: A Gtk.Builder object - # :param episode_id: ID to witch the victory event belongs to - # :param victory: (Optional) Victory event witch should be edited - # :return: Gtk.ResponseType of the dialog - # """ - # dialog = builder.get_object("edit_victory_dialog") # type: Gtk.Dialog - # dialog.set_transient_for(builder.get_object("main_window")) - # with sql.db.atomic(): - # if victory: - # infos = [['edit_victory_player_combo', victory.player.id], - # ['edit_victory_enemy_combo', victory.enemy.id]] - # for info in infos: - # combo = builder.get_object(info[0]) - # index = util.get_index_of_combo_model(combo, 0, info[1]) - # combo.set_active(index) - # builder.get_object('victory_comment_entry').set_text(victory.info) - # - # # Run the dialog - # result = dialog.run() - # dialog.hide() - # if result != Gtk.ResponseType.OK: - # sql.db.rollback() - # return result - # - # # Collect info from widgets and save to database - # player_id = util.get_combo_value(builder.get_object('edit_victory_player_combo'), 0) - # enemy_id = util.get_combo_value(builder.get_object('edit_victory_enemy_combo'), 3) - # comment = builder.get_object('victory_comment_entry').get_text() - # if not victory: - # sql.Victory.create(episode=episode_id, player=player_id, enemy=enemy_id, info=comment) - # else: - # victory.player = player_id - # victory.enemy = enemy_id - # victory.info = comment - # victory.save() - # - # return result +def create_victory(app: 'gtk_ui.GtkUi'): + """Show a dialog for creating victory events + :param app: Reference to main gtk ui object + :return: Created victory object or None, if canceled + """ + dialog = app.ui.get_object('edit_victory_dialog') + result = dialog.run() + dialog.hide() + if result != Gtk.ResponseType.OK: + return None + + hour_spin = app.ui.get_object('vic_hour_spin') + min_spin = app.ui.get_object('vic_min_spin') + victory = models.Victory() + victory.episode = app.get_selected_episode_id() + victory.info = app.ui.get_object('victory_comment_entry').get_text() + victory.player = util.get_combo_value(app.ui.get_object('edit_victory_player_combo'), 0) + victory.enemy = util.get_combo_value(app.ui.get_object('edit_victory_enemy_combo'), 4) + victory.time = datetime.time(int(hour_spin.get_value()), int(min_spin.get_value())) + + return victory diff --git a/dsst/dsst_gtk3/gtk_ui.py b/dsst/dsst_gtk3/gtk_ui.py index e8e3408..abd54b9 100644 --- a/dsst/dsst_gtk3/gtk_ui.py +++ b/dsst/dsst_gtk3/gtk_ui.py @@ -65,22 +65,27 @@ class GtkUi: def update_enemy(self, enemy: 'models.Enemy'): with util.network_operation(self): self.data_client.send_request('update_enemy', enemy) - self.full_reload() + self.full_reload() def update_player(self, player: 'models.Player'): with util.network_operation(self): self.data_client.send_request('update_player', player) - self.full_reload() + self.full_reload() def update_drink(self, drink: 'models.Drink'): with util.network_operation(self): self.data_client.send_request('update_drink', drink) - self.full_reload() + self.full_reload() def save_death(self, death: 'models.Death'): with util.network_operation(self): self.data_client.send_request('save_death', death) - self.full_reload() + self.full_reload() + + def save_victory(self, victory: 'models.Victory'): + with util.network_operation(self): + self.data_client.send_request('save_victory', victory) + self.full_reload() def update_season(self, season: 'models.Season'): with util.network_operation(self): diff --git a/dsst/dsst_gtk3/handlers/death_handlers.py b/dsst/dsst_gtk3/handlers/death_handlers.py index 50f7f30..0522c4e 100644 --- a/dsst/dsst_gtk3/handlers/death_handlers.py +++ b/dsst/dsst_gtk3/handlers/death_handlers.py @@ -11,7 +11,7 @@ class DeathHandlers: ep_id = self.app.get_selected_episode_id() if not ep_id: return - death = dialogs.edit_death(self.app) + death = dialogs.create_death(self.app) if death: self.app.save_death(death) diff --git a/dsst/dsst_gtk3/handlers/victory_handlers.py b/dsst/dsst_gtk3/handlers/victory_handlers.py index 6359e2f..3b47122 100644 --- a/dsst/dsst_gtk3/handlers/victory_handlers.py +++ b/dsst/dsst_gtk3/handlers/victory_handlers.py @@ -1,5 +1,5 @@ from gi.repository import Gtk -from dsst_gtk3 import dialogs +from dsst_gtk3 import dialogs, gtk_ui class VictoryHandlers: @@ -11,6 +11,6 @@ class VictoryHandlers: ep_id = self.app.get_selected_episode_id() if not ep_id: return - result = dialogs.show_edit_victory_dialog(self.app.ui, ep_id) - if result == Gtk.ResponseType.OK: - self.app.full_reload() + victory = dialogs.create_victory(self.app) + if victory: + self.app.save_victory(victory) diff --git a/dsst/dsst_gtk3/reload.py b/dsst/dsst_gtk3/reload.py index 98c01e5..bc1d386 100644 --- a/dsst/dsst_gtk3/reload.py +++ b/dsst/dsst_gtk3/reload.py @@ -81,13 +81,14 @@ def reload_episode_stats(app: 'gtk_ui.GtkUi'): penalties = [x.drink.name for x in death.penalties] penalties = ['{}x {}'.format(number, drink) for drink, number in Counter(penalties).items()] penalty_string = ', '.join(penalties) - time_string = '{}:{}'.format(death.time.hour, death.time.minute) + time_string = '{:02d}:{:02d}'.format(death.time.hour, death.time.minute) store.append([death.id, death.player.name, death.enemy.name, penalty_string, time_string]) # Reload victory store for notebook view store = app.ui.get_object('episode_victories_store') store.clear() for victory in episode.victories: - store.append([victory.id, victory.player.name, victory.enemy.name, victory.info]) + time_string = '{:02d}:{:02d}'.format(victory.time.hour, victory.time.minute) + store.append([victory.id, victory.player.name, victory.enemy.name, victory.info, time_string]) # Stat grid app.ui.get_object('ep_stat_title').set_text('Stats for episode {}\n{}'.format(episode.number, episode.name)) diff --git a/dsst/dsst_gtk3/resources/glade/window.glade b/dsst/dsst_gtk3/resources/glade/window.glade index 17e3648..c058222 100644 --- a/dsst/dsst_gtk3/resources/glade/window.glade +++ b/dsst/dsst_gtk3/resources/glade/window.glade @@ -65,204 +65,6 @@ - - False - Edit Victory 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 - Player - - - False - True - 0 - - - - - True - False - episode_players_store - - - - 1 - - - - - True - True - end - 1 - - - - - False - True - 1 - - - - - True - False - - - True - False - Comment - - - False - True - 0 - - - - - True - True - - - True - True - end - 1 - - - - - False - True - 2 - - - - - True - True - 1 - - - - - - okButtonRename5 - cancelButtonRename1 - - - - - @@ -273,6 +75,8 @@ + + @@ -613,6 +417,7 @@ True True episodes_store + False 0 @@ -1069,6 +874,17 @@ + + + Time + + + + 4 + + + + Player @@ -2140,6 +1956,289 @@ + + False + Create Victory 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 + Time + + + False + True + 0 + + + + + True + False + + + True + True + 2 + 0 + number + hour_adjustment + True + if-valid + + + False + True + 0 + + + + + True + False + : + + + False + True + 1 + + + + + True + True + 2 + 0 + number + minute_adjustment + True + if-valid + + + False + True + 2 + + + + + True + True + end + 1 + + + + + False + True + 1 + + + + + True + False + 5 + + + True + False + 5 + 5 + Enemy + + + False + True + 0 + + + + + True + False + enemy_season_store + + + + 0 + + + + + True + True + end + 1 + + + + + False + True + 1 + + + + + True + False + + + True + False + 5 + 5 + Player + + + False + True + 0 + + + + + True + False + episode_players_store + + + + 1 + + + + + True + True + end + 1 + + + + + False + True + 2 + + + + + True + False + + + True + False + Comment + + + False + True + 0 + + + + + True + True + + + True + True + end + 1 + + + + + False + True + 3 + + + + + True + True + 1 + + + + + + okButtonRename5 + cancelButtonRename1 + + + + + False Manage Drinks @@ -2794,7 +2893,7 @@ - True + False True end 1 diff --git a/dsst/dsst_server/data_access/sql.py b/dsst/dsst_server/data_access/sql.py index c5ae0f6..90949d9 100644 --- a/dsst/dsst_server/data_access/sql.py +++ b/dsst/dsst_server/data_access/sql.py @@ -95,6 +95,7 @@ class Penalty(Model): class Victory(Model): id = AutoField() info = CharField(null=True) + time = TimeField(default=datetime.time(0, 0)) player = ForeignKeyField(Player) enemy = ForeignKeyField(Enemy) episode = ForeignKeyField(Episode, backref='victories') diff --git a/dsst/dsst_server/func_write.py b/dsst/dsst_server/func_write.py index a74aacb..5aebaa4 100644 --- a/dsst/dsst_server/func_write.py +++ b/dsst/dsst_server/func_write.py @@ -42,6 +42,13 @@ class WriteFunctions: for penalty in death.penalties: sql.Penalty.create(death=created_id, size=penalty.size, drink=penalty.drink, player=penalty.player) + @staticmethod + def save_victory(victory: 'models.Victory'): + (sql.Victory + .insert(info=victory.info, player=victory.player, enemy=victory.enemy, time=victory.time, + episode=victory.episode, id=victory.id) + .execute()) + @staticmethod def update_season(season: 'models.Season', *_): (sql.Season