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 @@
-
@@ -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
+ 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