Add create season function.
This commit is contained in:
@@ -1,7 +1,9 @@
|
|||||||
"""
|
"""
|
||||||
This module contains UI functions for displaying different dialogs
|
This module contains UI functions for displaying different dialogs
|
||||||
"""
|
"""
|
||||||
|
import datetime
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
from common import models
|
||||||
|
|
||||||
|
|
||||||
def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str:
|
def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str:
|
||||||
@@ -28,6 +30,32 @@ def enter_string_dialog(builder: Gtk.Builder, title: str, value=None) -> str:
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def edit_season(builder: 'Gtk.Builder', season: 'models.Season'=None):
|
||||||
|
if not season:
|
||||||
|
season = models.Season()
|
||||||
|
builder.get_object('season_number_spin').set_value(season.number or 1)
|
||||||
|
builder.get_object('season_game_entry').set_text(season.game_name or '')
|
||||||
|
builder.get_object('season_start_entry').set_text(season.start_date or '')
|
||||||
|
builder.get_object('season_end_entry').set_text(season.end_date or '')
|
||||||
|
|
||||||
|
dialog = builder.get_object('edit_season_dialog')
|
||||||
|
result = dialog.run()
|
||||||
|
dialog.hide()
|
||||||
|
|
||||||
|
if result != Gtk.ResponseType.OK:
|
||||||
|
return None
|
||||||
|
|
||||||
|
season.number = builder.get_object('season_number_spin').get_value()
|
||||||
|
season.game_name = builder.get_object('season_game_entry').get_text()
|
||||||
|
start_string = builder.get_object('season_start_entry').get_text()
|
||||||
|
if start_string:
|
||||||
|
season.start_date = datetime.datetime.strptime(start_string, '%Y-%m-%d')
|
||||||
|
end_string = builder.get_object('season_end_entry').get_text()
|
||||||
|
if end_string:
|
||||||
|
season.end_date = datetime.datetime.strptime(end_string, '%Y-%m-%d')
|
||||||
|
return season
|
||||||
|
|
||||||
|
|
||||||
def show_episode_dialog(builder: Gtk.Builder, title: str, season_id: int, episode):
|
def show_episode_dialog(builder: Gtk.Builder, title: str, season_id: int, episode):
|
||||||
""" Shows a dialog to edit an episode
|
""" Shows a dialog to edit an episode
|
||||||
:param builder: GtkBuilder with loaded 'dialogs.glade'
|
:param builder: GtkBuilder with loaded 'dialogs.glade'
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import os
|
import os
|
||||||
import gi
|
import gi
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
from gi.repository import Gtk, GdkPixbuf
|
from gi.repository import Gtk
|
||||||
from dsst_gtk3.handlers import handlers
|
from dsst_gtk3.handlers import handlers
|
||||||
from dsst_gtk3 import util, reload, client
|
from dsst_gtk3 import util, reload, client
|
||||||
|
from common import models
|
||||||
|
|
||||||
class GtkUi:
|
class GtkUi:
|
||||||
""" The main UI class """
|
""" The main UI class """
|
||||||
@@ -29,34 +29,51 @@ class GtkUi:
|
|||||||
# Connect to data server
|
# Connect to data server
|
||||||
config = config['servers'][0]
|
config = config['servers'][0]
|
||||||
self.data_client = client.Access(config)
|
self.data_client = client.Access(config)
|
||||||
self.data = {}
|
# Create local data caches
|
||||||
|
self.players = util.Cache()
|
||||||
|
self.drinks = util.Cache()
|
||||||
|
self.seasons = util.Cache()
|
||||||
|
self.episodes = util.Cache()
|
||||||
|
self.enemies = util.Cache()
|
||||||
|
self.season_stats = util.Cache()
|
||||||
|
# Create meta data cache
|
||||||
self.meta = {'connection': '{}:{}'.format(config.get('host'), config.get('port'))}
|
self.meta = {'connection': '{}:{}'.format(config.get('host'), config.get('port'))}
|
||||||
self.season_changed = True
|
|
||||||
self.ep_changed = False
|
|
||||||
# Load base data and seasons
|
# Load base data and seasons
|
||||||
self.initial_load()
|
self.load_server_meta()
|
||||||
|
self.reload()
|
||||||
self.update_status_bar_meta()
|
self.update_status_bar_meta()
|
||||||
|
|
||||||
def initial_load(self):
|
def load_server_meta(self):
|
||||||
with util.network_operation(self):
|
self.meta['database'] = self.data_client.send_request('load_db_meta')
|
||||||
self.data['players'] = self.data_client.send_request('load_players')
|
|
||||||
self.data['drinks'] = self.data_client.send_request('load_drinks')
|
|
||||||
self.data['seasons'] = self.data_client.send_request('load_seasons')
|
|
||||||
self.meta['database'] = self.data_client.send_request('load_db_meta')
|
|
||||||
reload.reload_base_data(self.ui, self)
|
|
||||||
|
|
||||||
def reload(self):
|
def reload(self):
|
||||||
if self.season_changed:
|
with util.network_operation(self):
|
||||||
|
refresh_base = False
|
||||||
|
if not self.players.valid:
|
||||||
|
self.players.data = self.data_client.send_request('load_players')
|
||||||
|
refresh_base = True
|
||||||
|
if not self.drinks.valid:
|
||||||
|
self.drinks.data = self.data_client.send_request('load_drinks')
|
||||||
|
refresh_base= True
|
||||||
|
if not self.seasons.valid:
|
||||||
|
self.seasons.data = self.data_client.send_request('load_seasons')
|
||||||
|
refresh_base = True
|
||||||
|
if refresh_base:
|
||||||
|
reload.reload_base_data(self.ui, self)
|
||||||
|
|
||||||
|
if not self.episodes.valid:
|
||||||
with util.network_operation(self):
|
with util.network_operation(self):
|
||||||
season_id = self.get_selected_season_id()
|
season_id = self.get_selected_season_id()
|
||||||
self.data['episodes'] = self.data_client.send_request('load_episodes', season_id)
|
if season_id:
|
||||||
self.data['season_stats'] = self.data_client.send_request('load_season_stats', season_id)
|
self.episodes.data = self.data_client.send_request('load_episodes', season_id)
|
||||||
reload.reload_episodes(self.ui, self)
|
self.season_stats.data = self.data_client.send_request('load_season_stats', season_id)
|
||||||
reload.reload_season_stats(self)
|
reload.reload_episodes(self.ui, self)
|
||||||
self.season_changed = False
|
reload.reload_season_stats(self)
|
||||||
|
|
||||||
if self.ep_changed:
|
def update_season(self, season: 'models.Season'):
|
||||||
reload.reload_episode_stats(self)
|
with util.network_operation(self):
|
||||||
|
self.data_client.send_request('update_season', season)
|
||||||
|
self.seasons.valid = False
|
||||||
|
|
||||||
def update_status_bar_meta(self):
|
def update_status_bar_meta(self):
|
||||||
self.ui.get_object('connection_label').set_text(self.meta.get('connection'))
|
self.ui.get_object('connection_label').set_text(self.meta.get('connection'))
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
from dsst_gtk3 import dialogs, util
|
import datetime
|
||||||
|
|
||||||
|
from dsst_gtk3 import dialogs, util, gtk_ui
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
|
||||||
class DialogHandlers:
|
class DialogHandlers:
|
||||||
@@ -27,3 +30,20 @@ class DialogHandlers:
|
|||||||
|
|
||||||
def do_manage_drinks(self, *_):
|
def do_manage_drinks(self, *_):
|
||||||
result = dialogs.show_manage_drinks_dialog(self.app.ui)
|
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()
|
||||||
|
dialog.hide()
|
||||||
|
if result == Gtk.ResponseType.OK:
|
||||||
|
date = self.app.ui.get_object('date_picker_calendar').get_date()
|
||||||
|
date_string = '{}-{:02d}-{:02d}'.format(date.year, date.month +1, date.day)
|
||||||
|
entry.set_text(date_string)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def do_set_today(cal: 'Gtk.Calendar'):
|
||||||
|
"""Set date of a Gtk Calendar to today
|
||||||
|
:param cal: Gtk.Calendar
|
||||||
|
"""
|
||||||
|
cal.select_month = datetime.date.today().month
|
||||||
|
cal.select_day = datetime.date.today().day
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from dsst_gtk3 import dialogs, gtk_ui
|
from dsst_gtk3 import dialogs, gtk_ui, reload
|
||||||
|
|
||||||
|
|
||||||
class SeasonHandlers:
|
class SeasonHandlers:
|
||||||
@@ -7,12 +7,14 @@ class SeasonHandlers:
|
|||||||
self.app = app
|
self.app = app
|
||||||
|
|
||||||
def do_add_season(self, *_):
|
def do_add_season(self, *_):
|
||||||
name = dialogs.enter_string_dialog(self.app.ui, 'Name for the new Season')
|
season = dialogs.edit_season(self.app.ui)
|
||||||
if name:
|
if season:
|
||||||
|
self.app.update_season(season)
|
||||||
self.app.reload()
|
self.app.reload()
|
||||||
|
|
||||||
def do_season_selected(self, *_):
|
def do_season_selected(self, *_):
|
||||||
self.app.season_changed = True
|
self.app.episodes.valid = False
|
||||||
|
self.app.season_stats.valid = False
|
||||||
self.app.reload()
|
self.app.reload()
|
||||||
|
|
||||||
def do_add_episode(self, *_):
|
def do_add_episode(self, *_):
|
||||||
@@ -23,8 +25,7 @@ class SeasonHandlers:
|
|||||||
self.app.reload()
|
self.app.reload()
|
||||||
|
|
||||||
def on_selected_episode_changed(self, *_):
|
def on_selected_episode_changed(self, *_):
|
||||||
self.app.ep_changed = True
|
reload.reload_episode_stats(self.app)
|
||||||
self.app.reload()
|
|
||||||
|
|
||||||
def on_episode_double_click(self, *_):
|
def on_episode_double_click(self, *_):
|
||||||
self.app.ui.get_object('stats_notebook').set_current_page(1)
|
self.app.ui.get_object('stats_notebook').set_current_page(1)
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ def reload_base_data(builder: Gtk.Builder, app: 'gtk_ui.GtkUi',):
|
|||||||
"""
|
"""
|
||||||
# Rebuild all players store
|
# Rebuild all players store
|
||||||
builder.get_object('all_players_store').clear()
|
builder.get_object('all_players_store').clear()
|
||||||
for player in app.data['players']:
|
for player in app.players.data:
|
||||||
builder.get_object('all_players_store').append([player.id, player.name, player.hex_id])
|
builder.get_object('all_players_store').append([player.id, player.name, player.hex_id])
|
||||||
# Rebuild drink store
|
# Rebuild drink store
|
||||||
builder.get_object('drink_store').clear()
|
builder.get_object('drink_store').clear()
|
||||||
for drink in app.data['drinks']:
|
for drink in app.drinks.data:
|
||||||
builder.get_object('drink_store').append([drink.id, drink.name, '{:.2f}%'.format(drink.vol)])
|
builder.get_object('drink_store').append([drink.id, drink.name, '{:.2f}%'.format(drink.vol)])
|
||||||
# Rebuild seasons store
|
# Rebuild seasons store
|
||||||
combo = builder.get_object('season_combo_box') # type: Gtk.ComboBox
|
combo = builder.get_object('season_combo_box') # type: Gtk.ComboBox
|
||||||
@@ -22,7 +22,7 @@ def reload_base_data(builder: Gtk.Builder, app: 'gtk_ui.GtkUi',):
|
|||||||
with util.block_handler(combo, app.handlers.do_season_selected):
|
with util.block_handler(combo, app.handlers.do_season_selected):
|
||||||
store = builder.get_object('seasons_store')
|
store = builder.get_object('seasons_store')
|
||||||
store.clear()
|
store.clear()
|
||||||
for season in app.data['seasons']:
|
for season in app.seasons.data:
|
||||||
store.append([season.id, season.game_name])
|
store.append([season.id, season.game_name])
|
||||||
combo.set_active(active)
|
combo.set_active(active)
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ def reload_episodes(builder: Gtk.Builder, app: 'gtk_ui.GtkUi'):
|
|||||||
with util.block_handler(selection, app.handlers.on_selected_episode_changed):
|
with util.block_handler(selection, app.handlers.on_selected_episode_changed):
|
||||||
model, selected_paths = selection.get_selected_rows()
|
model, selected_paths = selection.get_selected_rows()
|
||||||
model.clear()
|
model.clear()
|
||||||
for episode in app.data['episodes']:
|
for episode in app.episodes.data:
|
||||||
model.append([episode.id, episode.name, str(episode.date), episode.number])
|
model.append([episode.id, episode.name, str(episode.date), episode.number])
|
||||||
if selected_paths:
|
if selected_paths:
|
||||||
selection.select_path(selected_paths[0])
|
selection.select_path(selected_paths[0])
|
||||||
@@ -47,7 +47,7 @@ def reload_season_stats(app: 'gtk_ui.GtkUi'):
|
|||||||
"""Load statistic data for selected season
|
"""Load statistic data for selected season
|
||||||
:param app: GtkUi instance
|
:param app: GtkUi instance
|
||||||
"""
|
"""
|
||||||
season_stats = app.data.get('season_stats')
|
season_stats = app.season_stats.data
|
||||||
# Load player kill/death data
|
# Load player kill/death data
|
||||||
store = app.ui.get_object('player_season_store')
|
store = app.ui.get_object('player_season_store')
|
||||||
store.clear()
|
store.clear()
|
||||||
@@ -65,7 +65,7 @@ def reload_episode_stats(app: 'gtk_ui.GtkUi'):
|
|||||||
"""Reload all data that is dependant on a selected episode
|
"""Reload all data that is dependant on a selected episode
|
||||||
:param app: app: GtkUi instance
|
:param app: app: GtkUi instance
|
||||||
"""
|
"""
|
||||||
episode = [ep for ep in app.data['episodes'] if ep.id == app.get_selected_episode_id()][0]
|
episode = [ep for ep in app.episodes.data if ep.id == app.get_selected_episode_id()][0]
|
||||||
store = app.ui.get_object('episode_players_store')
|
store = app.ui.get_object('episode_players_store')
|
||||||
store.clear()
|
store.clear()
|
||||||
for player in episode.players:
|
for player in episode.players:
|
||||||
@@ -75,7 +75,7 @@ def reload_episode_stats(app: 'gtk_ui.GtkUi'):
|
|||||||
store.clear()
|
store.clear()
|
||||||
for death in episode.deaths:
|
for death in episode.deaths:
|
||||||
penalties = [x.drink.name for x in death.penalties]
|
penalties = [x.drink.name for x in death.penalties]
|
||||||
penalties = [f'{number}x {drink}' for drink, number in Counter(penalties).items()]
|
penalties = ['{}x {}'.format(number, drink) for drink, number in Counter(penalties).items()]
|
||||||
penalty_string = ', '.join(penalties)
|
penalty_string = ', '.join(penalties)
|
||||||
store.append([death.id, death.player.name, death.enemy.name, penalty_string])
|
store.append([death.id, death.player.name, death.enemy.name, penalty_string])
|
||||||
# Reload victory store for notebook view
|
# Reload victory store for notebook view
|
||||||
@@ -100,7 +100,7 @@ def reload_episode_stats(app: 'gtk_ui.GtkUi'):
|
|||||||
sorted_list = Counter(enemy_list).most_common(1)
|
sorted_list = Counter(enemy_list).most_common(1)
|
||||||
if sorted_list:
|
if sorted_list:
|
||||||
enemy_name, deaths = sorted_list[0]
|
enemy_name, deaths = sorted_list[0]
|
||||||
app.ui.get_object('ep_enemy_name_label').set_text(f'{enemy_name} ({deaths} Deaths)')
|
app.ui.get_object('ep_enemy_name_label').set_text('{} ({} Deaths)'.format(enemy_name, deaths))
|
||||||
|
|
||||||
|
|
||||||
def fill_list_store(store: Gtk.ListStore, models: list):
|
def fill_list_store(store: Gtk.ListStore, models: list):
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.20.3 -->
|
<!-- Generated with glade 3.20.4 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.20"/>
|
<requires lib="gtk+" version="3.16"/>
|
||||||
<object class="GtkDialog" id="nameEnterDialog">
|
<object class="GtkDialog" id="nameEnterDialog">
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="resizable">False</property>
|
<property name="resizable">False</property>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.20.4 -->
|
<!-- Generated with glade 3.20.4 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.20"/>
|
<requires lib="gtk+" version="3.16"/>
|
||||||
<object class="GtkListStore" id="all_players_store">
|
<object class="GtkListStore" id="all_players_store">
|
||||||
<columns>
|
<columns>
|
||||||
<!-- column-name id -->
|
<!-- column-name id -->
|
||||||
@@ -1591,23 +1591,7 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="add_season_button">
|
<placeholder/>
|
||||||
<property name="label" translatable="yes">New</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</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>
|
|
||||||
<signal name="clicked" handler="do_add_season" swapped="no"/>
|
|
||||||
</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>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -1665,23 +1649,7 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="add_episode_button">
|
<placeholder/>
|
||||||
<property name="label" translatable="yes">New</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</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>
|
|
||||||
<signal name="clicked" handler="do_add_episode" swapped="no"/>
|
|
||||||
</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>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@@ -2573,4 +2541,339 @@
|
|||||||
<placeholder/>
|
<placeholder/>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkDialog" id="date_picker_dialog">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="title" translatable="yes">Pick Date</property>
|
||||||
|
<property name="resizable">False</property>
|
||||||
|
<property name="default_width">300</property>
|
||||||
|
<property name="type_hint">dialog</property>
|
||||||
|
<property name="deletable">False</property>
|
||||||
|
<property name="transient_for">main_window</property>
|
||||||
|
<child internal-child="vbox">
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="spacing">2</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="button3">
|
||||||
|
<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="button6">
|
||||||
|
<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>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Pick Date</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="date_today_buton">
|
||||||
|
<property name="label" translatable="yes">Today</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<signal name="clicked" handler="do_set_today" object="date_picker_calendar" swapped="no"/>
|
||||||
|
</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="GtkCalendar" id="date_picker_calendar">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="year">2018</property>
|
||||||
|
<property name="month">2</property>
|
||||||
|
<property name="day">9</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<action-widgets>
|
||||||
|
<action-widget response="-5">button3</action-widget>
|
||||||
|
<action-widget response="-6">button6</action-widget>
|
||||||
|
</action-widgets>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<object class="GtkDialog" id="edit_season_dialog">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="title" translatable="yes">Edit Season</property>
|
||||||
|
<property name="resizable">False</property>
|
||||||
|
<property name="type_hint">dialog</property>
|
||||||
|
<property name="deletable">False</property>
|
||||||
|
<property name="transient_for">main_window</property>
|
||||||
|
<property name="attached_to">main_window</property>
|
||||||
|
<child internal-child="vbox">
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="spacing">2</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="button4">
|
||||||
|
<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="button5">
|
||||||
|
<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>
|
||||||
|
<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">Season Number:</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="season_number_spin">
|
||||||
|
<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="numeric">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</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">Game Name:</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="season_game_entry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</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">1</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">Start Date:</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="season_start_entry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="secondary_icon_stock">gtk-edit</property>
|
||||||
|
<signal name="icon-press" handler="do_show_date_picker" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</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">2</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">End Date:</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="season_end_entry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="secondary_icon_stock">gtk-edit</property>
|
||||||
|
<signal name="icon-press" handler="do_show_date_picker" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</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">3</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">button4</action-widget>
|
||||||
|
<action-widget response="-6">button5</action-widget>
|
||||||
|
</action-widgets>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|||||||
@@ -16,11 +16,26 @@ DEFAULT_CONFIG = {
|
|||||||
'host': 'localhost',
|
'host': 'localhost',
|
||||||
'port': 12345,
|
'port': 12345,
|
||||||
'buffer_size': 1024,
|
'buffer_size': 1024,
|
||||||
'auth_token': 'a'}
|
'auth_token': ''}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Cache:
|
||||||
|
def __init__(self, data={}, valid=False):
|
||||||
|
self._data = data
|
||||||
|
self.valid = valid
|
||||||
|
|
||||||
|
@property
|
||||||
|
def data(self):
|
||||||
|
return self._data
|
||||||
|
|
||||||
|
@data.setter
|
||||||
|
def data(self, value):
|
||||||
|
self._data = value
|
||||||
|
self.valid = True
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def block_handler(widget: 'Gtk.Widget', handler_func: Callable):
|
def block_handler(widget: 'Gtk.Widget', handler_func: Callable):
|
||||||
"""Run an operation while a signal handler for a widget is blocked
|
"""Run an operation while a signal handler for a widget is blocked
|
||||||
@@ -35,7 +50,7 @@ def block_handler(widget: 'Gtk.Widget', handler_func: Callable):
|
|||||||
@contextmanager
|
@contextmanager
|
||||||
def network_operation(app: 'gtk_ui.GtkUi'):
|
def network_operation(app: 'gtk_ui.GtkUi'):
|
||||||
"""Run operation in try/except block and display exception in a dialog
|
"""Run operation in try/except block and display exception in a dialog
|
||||||
:param exception:
|
:param app: Reference to main Gtk Application
|
||||||
"""
|
"""
|
||||||
app.ui.get_object('status_bar').push(0, 'Connecting to server')
|
app.ui.get_object('status_bar').push(0, 'Connecting to server')
|
||||||
try:
|
try:
|
||||||
@@ -47,7 +62,6 @@ def network_operation(app: 'gtk_ui.GtkUi'):
|
|||||||
app.ui.get_object('status_bar').push(0, '')
|
app.ui.get_object('status_bar').push(0, '')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_combo_value(combo, index: int):
|
def get_combo_value(combo, index: int):
|
||||||
""" Retrieve the selected value of a combo box at the selected index in the model
|
""" Retrieve the selected value of a combo box at the selected index in the model
|
||||||
:param combo: Any Gtk Widget that supports 'get_active_iter()'
|
:param combo: Any Gtk Widget that supports 'get_active_iter()'
|
||||||
|
|||||||
@@ -1,8 +1,20 @@
|
|||||||
from common import models
|
from common import models
|
||||||
|
from dsst_server.data_access import sql
|
||||||
|
|
||||||
|
|
||||||
class WriteFunctions:
|
class WriteFunctions:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create_season(season: 'models.Season'):
|
def create_season(season: 'models.Season'):
|
||||||
return 'Season created.'
|
return 'Season created.'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def update_season(season: 'models.Season', *_):
|
||||||
|
(sql.Season
|
||||||
|
.insert(id=season.id, number=season.number, game_name=season.game_name, start_date=season.start_date,
|
||||||
|
end_date=season.end_date)
|
||||||
|
.on_conflict(
|
||||||
|
update={sql.Season.number: season.number,
|
||||||
|
sql.Season.game_name: season.game_name,
|
||||||
|
sql.Season.start_date: season.start_date,
|
||||||
|
sql.Season.end_date: season.end_date})
|
||||||
|
.execute())
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class DsstServer:
|
|||||||
if action_name in self.tokens[token]:
|
if action_name in self.tokens[token]:
|
||||||
action = getattr(FunctionProxy, action_name)
|
action = getattr(FunctionProxy, action_name)
|
||||||
try:
|
try:
|
||||||
value = action(request.get('args'))
|
value = action(*request.get('args'))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
response = {'success': False, 'message': 'Exception was thrown on server.\n{}'.format(e)}
|
response = {'success': False, 'message': 'Exception was thrown on server.\n{}'.format(e)}
|
||||||
util.send_msg(client, pickle.dumps(response))
|
util.send_msg(client, pickle.dumps(response))
|
||||||
|
|||||||
Reference in New Issue
Block a user