Add function for adding base data and data reloading.
This commit is contained in:
@@ -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
|
||||
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
|
||||
|
||||
@@ -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__':
|
||||
|
||||
10
dsst/dsst_gtk3/handlers/center_handlers.py
Normal file
10
dsst/dsst_gtk3/handlers/center_handlers.py
Normal file
@@ -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
|
||||
37
dsst/dsst_gtk3/handlers/dialog_handlers.py
Normal file
37
dsst/dsst_gtk3/handlers/dialog_handlers.py
Normal file
@@ -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('')
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
@@ -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())
|
||||
@@ -2,475 +2,6 @@
|
||||
<!-- Generated with glade 3.20.3 -->
|
||||
<interface>
|
||||
<requires lib="gtk+" version="3.20"/>
|
||||
<object class="GtkListStore" id="all_players_store">
|
||||
<columns>
|
||||
<!-- column-name id -->
|
||||
<column type="gint"/>
|
||||
<!-- column-name name -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name hex_id -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkDialog" id="manage_players_dialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">4</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="okButtonRename2">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="cancelButtonRename2">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">5</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="label" translatable="yes">Add Player</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="manage_add_player_entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<signal name="activate" handler="do_add_player" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">5</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="label" translatable="yes">All Players</property>
|
||||
<property name="xalign">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="manage_all_players_tree_view">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="model">all_players_store</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn">
|
||||
<property name="title" translatable="yes">Name</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn">
|
||||
<property name="title" translatable="yes">Hex ID</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<attributes>
|
||||
<attribute name="text">2</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="-5">okButtonRename2</action-widget>
|
||||
<action-widget response="-6">cancelButtonRename2</action-widget>
|
||||
</action-widgets>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkEntryCompletion" id="search_player_completion">
|
||||
<property name="model">all_players_store</property>
|
||||
<property name="text_column">1</property>
|
||||
<property name="inline_completion">True</property>
|
||||
<property name="inline_selection">True</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="completion_renderer1"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkAdjustment" id="ep_number_ajustment">
|
||||
<property name="upper">1000000</property>
|
||||
<property name="step_increment">1</property>
|
||||
<property name="page_increment">10</property>
|
||||
</object>
|
||||
<object class="GtkListStore" id="episode_players_store">
|
||||
<columns>
|
||||
<!-- column-name id -->
|
||||
<column type="gint"/>
|
||||
<!-- column-name name -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name hex_id -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkDialog" id="edit_episode_dialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">4</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="button1">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button2">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Episode No.</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSpinButton" id="episode_no_spin_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="input_purpose">digits</property>
|
||||
<property name="adjustment">ep_number_ajustment</property>
|
||||
<property name="climb_rate">1</property>
|
||||
<property name="snap_to_ticks">True</property>
|
||||
<property name="numeric">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Player</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBox" id="add_player_combo_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="model">all_players_store</property>
|
||||
<property name="entry_text_column">1</property>
|
||||
<property name="id_column">1</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="label" translatable="yes">Add</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="do_add_player_to_episode" object="add_player_combo_box" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="episode_players_tree_view">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="model">episode_players_store</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn">
|
||||
<property name="title" translatable="yes">Name</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn">
|
||||
<property name="title" translatable="yes">Hex ID</property>
|
||||
<child>
|
||||
<object class="GtkCellRendererText"/>
|
||||
<attributes>
|
||||
<attribute name="text">2</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">5</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="label" translatable="yes">Episode Date</property>
|
||||
<property name="xalign">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCalendar">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="year">2018</property>
|
||||
<property name="month">1</property>
|
||||
<property name="day">22</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="-5">button1</action-widget>
|
||||
<action-widget response="-6">button2</action-widget>
|
||||
</action-widgets>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkDialog" id="nameEnterDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,4 +6,4 @@ class Util:
|
||||
if tree_iter:
|
||||
return combo.get_model().get_value(tree_iter, index)
|
||||
else:
|
||||
return None
|
||||
return -1
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from dsst_sql import models, sql
|
||||
from dsst_sql import sql
|
||||
|
||||
|
||||
class DSSTCore:
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
22
dsst/dsst_sql/sql_func.py
Normal file
22
dsst/dsst_sql/sql_func.py
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user