2019-10-26 21:13:07 +03:00
|
|
|
|
import gi
|
|
|
|
|
import os
|
|
|
|
|
gi.require_version('Gtk', '3.0')
|
2019-11-08 21:18:38 +03:00
|
|
|
|
from gi.repository import Gtk, GObject, Gdk
|
2019-12-04 17:16:40 +03:00
|
|
|
|
from mods.db import db, Patient, Reception, Catalog, List
|
2019-11-12 19:30:17 +03:00
|
|
|
|
from mods.settings import s_get_reception_list, s_set_reception_list
|
2019-11-12 21:39:26 +03:00
|
|
|
|
from mods.catalogs import add_catalog, search_catalogs
|
2019-12-04 17:16:40 +03:00
|
|
|
|
from mods.patients import build_patient_row, patient_sort_func, patient_filter_func_factory, create_new_patient_win, create_open_patient_win
|
|
|
|
|
from mods.receptions import create_new_reception_win, build_reception_row
|
2019-12-01 16:22:43 +03:00
|
|
|
|
from mods.lists import create_open_list_win
|
2019-11-23 23:36:26 +03:00
|
|
|
|
from mods.files import list_row_ui_str
|
2019-12-04 17:16:40 +03:00
|
|
|
|
from mods.utils import show_msg, ConditionalFilter, enable_widget, disable_widget
|
|
|
|
|
from datetime import datetime, timedelta
|
2019-10-30 20:17:14 +03:00
|
|
|
|
import peewee
|
2019-11-12 21:39:26 +03:00
|
|
|
|
import re
|
2019-10-26 21:13:07 +03:00
|
|
|
|
|
2019-11-05 19:40:50 +03:00
|
|
|
|
# Variables
|
2019-10-26 21:13:07 +03:00
|
|
|
|
resource_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'res')
|
2019-10-28 21:30:21 +03:00
|
|
|
|
ui_dir = os.path.join(resource_dir, 'ui')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
|
2019-10-28 21:30:21 +03:00
|
|
|
|
main_win_file = os.path.join(ui_dir, 'main_win.glade')
|
2019-11-12 19:30:17 +03:00
|
|
|
|
reception_list_settings_win_file = os.path.join(ui_dir, 'reception_list_settings.glade')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
|
2019-11-12 21:39:26 +03:00
|
|
|
|
new_catalog_win_file = os.path.join(ui_dir, 'new_catalog_win.glade')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
|
2019-11-12 19:30:17 +03:00
|
|
|
|
catalog_row_file = os.path.join(ui_dir, 'catalog_list_row.glade')
|
|
|
|
|
with open(catalog_row_file, 'r') as f:
|
|
|
|
|
catalog_row_ui_str = f.read()
|
2019-12-04 17:16:40 +03:00
|
|
|
|
|
2019-11-05 19:40:50 +03:00
|
|
|
|
############
|
2019-10-28 21:30:21 +03:00
|
|
|
|
|
2019-10-30 20:17:14 +03:00
|
|
|
|
builder = Gtk.Builder()
|
|
|
|
|
|
2019-11-08 21:18:38 +03:00
|
|
|
|
def get_reception_timelist(rec_date):
|
2019-11-12 19:30:17 +03:00
|
|
|
|
s = s_get_reception_list()
|
|
|
|
|
dstart = datetime(rec_date.year, rec_date.month, rec_date.day, s.day_start[0], s.day_start[1])
|
|
|
|
|
dend = datetime(rec_date.year, rec_date.month, rec_date.day, s.day_end[0], s.day_end[1])
|
2019-11-08 21:18:38 +03:00
|
|
|
|
work_day_minutes_total = (dend.hour - dstart.hour) * 60 + dend.minute - dstart.minute
|
2019-11-12 19:30:17 +03:00
|
|
|
|
shift_minutes_range = range(0, work_day_minutes_total, s.interval)
|
|
|
|
|
return [dstart + timedelta(minutes=x) for x in shift_minutes_range]
|
2019-11-08 21:18:38 +03:00
|
|
|
|
|
2019-10-28 21:30:21 +03:00
|
|
|
|
|
2019-12-04 17:16:40 +03:00
|
|
|
|
catalog_filter = ConditionalFilter(search_catalogs)
|
2019-11-08 21:18:38 +03:00
|
|
|
|
|
2019-11-12 19:30:17 +03:00
|
|
|
|
class CatalogRow(Gtk.ListBoxRow):
|
|
|
|
|
@GObject.Property
|
|
|
|
|
def db_id(self):
|
|
|
|
|
return self._db_id
|
|
|
|
|
@db_id.setter
|
|
|
|
|
def db_id_setter(self, value):
|
|
|
|
|
self._db_id = value
|
2019-11-12 21:39:26 +03:00
|
|
|
|
@GObject.Property
|
|
|
|
|
def name(self):
|
|
|
|
|
return self._name
|
|
|
|
|
@name.setter
|
|
|
|
|
def name_setter(self, value):
|
|
|
|
|
self._name = value
|
2019-11-23 23:36:26 +03:00
|
|
|
|
class ListRow(Gtk.ListBoxRow):
|
|
|
|
|
@GObject.Property
|
|
|
|
|
def db_id(self):
|
|
|
|
|
return self._db_id
|
|
|
|
|
@db_id.setter
|
|
|
|
|
def db_id_setter(self, value):
|
|
|
|
|
self._db_id = value
|
|
|
|
|
@GObject.Property
|
|
|
|
|
def name(self):
|
|
|
|
|
return self._name
|
|
|
|
|
@name.setter
|
|
|
|
|
def name_setter(self, value):
|
|
|
|
|
self._name = value
|
2019-11-12 19:30:17 +03:00
|
|
|
|
|
2019-10-28 21:30:21 +03:00
|
|
|
|
class MainWinHandler:
|
|
|
|
|
def main_win_close(self, *args):
|
|
|
|
|
Gtk.main_quit()
|
2019-11-12 19:30:17 +03:00
|
|
|
|
def set_reception_list_today(self, *a):
|
|
|
|
|
cal = builder.get_object('reception_cal')
|
|
|
|
|
d = datetime.now()
|
|
|
|
|
cal.select_month(d.month - 1, d.year)
|
|
|
|
|
cal.select_day(d.day)
|
|
|
|
|
redraw_reception_list(d)
|
|
|
|
|
def change_reception_list_day(self, *a):
|
|
|
|
|
cal = builder.get_object('reception_cal')
|
|
|
|
|
cal_date = cal.get_date()
|
|
|
|
|
d = datetime(cal_date.year, cal_date.month + 1, cal_date.day)
|
|
|
|
|
redraw_reception_list(d)
|
|
|
|
|
def show_reception_list_settings_win(self, button):
|
|
|
|
|
reception_list_settings_win = create_reception_list_settings_win()
|
|
|
|
|
reception_list_settings_win.show_all()
|
2019-12-04 17:16:40 +03:00
|
|
|
|
def show_new_reception_win(self, button):
|
|
|
|
|
new_reception_win = create_new_reception_win(builder)
|
|
|
|
|
new_reception_win.show_all()
|
2019-10-28 21:30:21 +03:00
|
|
|
|
def show_new_patient_win(self, button):
|
2019-12-04 17:16:40 +03:00
|
|
|
|
new_patient_win = create_new_patient_win(patient_list)
|
2019-10-28 21:30:21 +03:00
|
|
|
|
new_patient_win.show_all()
|
2019-11-05 19:40:50 +03:00
|
|
|
|
def show_open_patient_win(self, button):
|
|
|
|
|
pl = builder.get_object('patient_list')
|
|
|
|
|
row = pl.get_selected_row()
|
2019-12-04 17:16:40 +03:00
|
|
|
|
open_patient_win = create_open_patient_win(row.props.db_id, patient_list)
|
2019-11-05 19:40:50 +03:00
|
|
|
|
open_patient_win.show_all()
|
2019-11-23 23:36:26 +03:00
|
|
|
|
def show_open_list_win(self, button):
|
|
|
|
|
ll = builder.get_object('list_list')
|
|
|
|
|
row = ll.get_selected_row()
|
|
|
|
|
open_list_win = create_open_list_win(row.props.db_id)
|
|
|
|
|
open_list_win.show_all()
|
2019-11-12 21:39:26 +03:00
|
|
|
|
def show_new_catalog_win(self, button):
|
|
|
|
|
new_catalog_win = create_new_catalog_win()
|
|
|
|
|
new_catalog_win.show_all()
|
2019-12-04 17:16:40 +03:00
|
|
|
|
def reception_list_selected(self, *a):
|
|
|
|
|
rl = builder.get_object('reception_list')
|
|
|
|
|
new_button = builder.get_object('new_reception_button')
|
|
|
|
|
edit_button = builder.get_object('edit_reception_button')
|
|
|
|
|
row = rl.get_selected_row()
|
|
|
|
|
if row.props.scheduled:
|
|
|
|
|
enable_widget([edit_button])
|
|
|
|
|
disable_widget([new_button])
|
|
|
|
|
else:
|
|
|
|
|
enable_widget([new_button])
|
|
|
|
|
disable_widget([edit_button])
|
2019-11-05 19:40:50 +03:00
|
|
|
|
def patient_list_selected(self, *a):
|
|
|
|
|
button = builder.get_object('patient_open_button')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
enable_widget([button])
|
2019-11-05 19:40:50 +03:00
|
|
|
|
def patient_list_unselected(self, *a):
|
|
|
|
|
button = builder.get_object('patient_open_button')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
disable_widget([button])
|
2019-10-30 20:17:14 +03:00
|
|
|
|
def patient_filter_changed(self, filter_widget):
|
|
|
|
|
pl = builder.get_object('patient_list')
|
|
|
|
|
pl.unselect_all()
|
2019-11-05 19:40:50 +03:00
|
|
|
|
self.patient_list_unselected()
|
2019-10-30 20:17:14 +03:00
|
|
|
|
pl.invalidate_filter()
|
2019-11-23 23:36:26 +03:00
|
|
|
|
def list_list_selected(self, *a):
|
|
|
|
|
open_button = builder.get_object('list_open_button')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
enable_widget([open_button])
|
2019-11-19 15:37:53 +03:00
|
|
|
|
def catalog_list_selected(self, *a):
|
|
|
|
|
open_button = builder.get_object('catalog_open_button')
|
|
|
|
|
rename_button = builder.get_object('catalog_rename_button')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
enable_widget([open_button, rename_button])
|
2019-11-19 15:37:53 +03:00
|
|
|
|
def catalog_list_unselected(self, *a):
|
|
|
|
|
open_button = builder.get_object('catalog_open_button')
|
|
|
|
|
rename_button = builder.get_object('catalog_rename_button')
|
2019-12-04 17:16:40 +03:00
|
|
|
|
disable_widget([open_button, rename_button])
|
2019-11-12 21:39:26 +03:00
|
|
|
|
def catalog_filter_changed(self, filter_widget):
|
|
|
|
|
cl = builder.get_object('catalog_list')
|
|
|
|
|
cl.unselect_all()
|
2019-11-19 15:37:53 +03:00
|
|
|
|
self.catalog_list_unselected()
|
2019-11-12 21:39:26 +03:00
|
|
|
|
cl.invalidate_filter()
|
2019-10-30 20:17:14 +03:00
|
|
|
|
|
2019-11-23 23:36:26 +03:00
|
|
|
|
def build_list_row(list_o):
|
|
|
|
|
b = Gtk.Builder()
|
|
|
|
|
b.add_from_string(list_row_ui_str)
|
|
|
|
|
win = b.get_object('win')
|
|
|
|
|
box = b.get_object('list_box')
|
|
|
|
|
b.get_object('name').set_text(list_o.name)
|
|
|
|
|
row = ListRow()
|
|
|
|
|
row.props.db_id = list_o.id
|
|
|
|
|
row.name = list_o.name
|
|
|
|
|
win.remove(win.get_children()[0])
|
|
|
|
|
row.add(box)
|
|
|
|
|
return row
|
|
|
|
|
|
2019-11-12 19:30:17 +03:00
|
|
|
|
def build_catalog_row(catalog):
|
|
|
|
|
b = Gtk.Builder()
|
|
|
|
|
b.add_from_string(catalog_row_ui_str)
|
|
|
|
|
win = b.get_object('win')
|
|
|
|
|
box = b.get_object('catalog_box')
|
|
|
|
|
b.get_object('name').set_text(catalog.name)
|
|
|
|
|
row = CatalogRow()
|
|
|
|
|
row.props.db_id = catalog.id
|
2019-11-12 21:39:26 +03:00
|
|
|
|
row.name = catalog.name
|
2019-11-12 19:30:17 +03:00
|
|
|
|
win.remove(win.get_children()[0])
|
|
|
|
|
row.add(box)
|
|
|
|
|
return row
|
|
|
|
|
|
2019-11-08 21:18:38 +03:00
|
|
|
|
|
2019-12-04 17:16:40 +03:00
|
|
|
|
|
|
|
|
|
|
2019-11-23 23:36:26 +03:00
|
|
|
|
def list_sort_func(row1, row2, *a):
|
|
|
|
|
text1 = row1.props.name
|
|
|
|
|
text2 = row2.props.name
|
|
|
|
|
return (text1 > text2) - (text1 < text2)
|
2019-11-12 21:39:26 +03:00
|
|
|
|
def catalog_sort_func(row1, row2, *a):
|
|
|
|
|
text1 = row1.props.name
|
|
|
|
|
text2 = row2.props.name
|
|
|
|
|
return (text1 > text2) - (text1 < text2)
|
|
|
|
|
def catalog_filter_func(row):
|
|
|
|
|
fstr = builder.get_object('catalog_filter').get_text().strip()
|
|
|
|
|
if not fstr:
|
|
|
|
|
catalog_filter.reset()
|
|
|
|
|
return True
|
|
|
|
|
return row.props.db_id in catalog_filter.filter(fstr)
|
2019-10-26 21:13:07 +03:00
|
|
|
|
|
2019-11-08 21:18:38 +03:00
|
|
|
|
def redraw_reception_list(selected_date):
|
|
|
|
|
reception_timelist = get_reception_timelist(selected_date)
|
|
|
|
|
reception_list = builder.get_object('reception_list')
|
2019-11-12 19:30:17 +03:00
|
|
|
|
for c in reception_list.get_children():
|
|
|
|
|
reception_list.remove(c)
|
2019-11-08 21:18:38 +03:00
|
|
|
|
for d in reception_timelist:
|
|
|
|
|
reception_list.add(build_reception_row(d))
|
2019-11-12 19:30:17 +03:00
|
|
|
|
reception_list.show_all()
|
2019-11-08 21:18:38 +03:00
|
|
|
|
|
2019-10-28 21:30:21 +03:00
|
|
|
|
builder.add_from_file(main_win_file)
|
|
|
|
|
builder.connect_signals(MainWinHandler())
|
2019-11-08 21:18:38 +03:00
|
|
|
|
#####
|
|
|
|
|
redraw_reception_list(datetime.now())
|
|
|
|
|
#####
|
2019-10-30 20:17:14 +03:00
|
|
|
|
patient_list = builder.get_object('patient_list')
|
|
|
|
|
patient_list.set_sort_func(patient_sort_func)
|
2019-12-04 17:16:40 +03:00
|
|
|
|
patient_list.set_filter_func(patient_filter_func_factory(builder))
|
2019-11-19 15:37:53 +03:00
|
|
|
|
with db.atomic():
|
|
|
|
|
for p in Patient.select():
|
2019-10-30 20:17:14 +03:00
|
|
|
|
patient_list.add(build_patient_row(p))
|
2019-11-12 19:30:17 +03:00
|
|
|
|
#####
|
2019-11-23 23:36:26 +03:00
|
|
|
|
list_list = builder.get_object('list_list')
|
|
|
|
|
list_list.set_sort_func(list_sort_func)
|
|
|
|
|
with db.atomic():
|
|
|
|
|
for l in List.select():
|
|
|
|
|
list_list.add(build_list_row(l))
|
|
|
|
|
#####
|
2019-11-12 19:30:17 +03:00
|
|
|
|
catalog_list = builder.get_object('catalog_list')
|
2019-11-12 21:39:26 +03:00
|
|
|
|
catalog_list.set_sort_func(catalog_sort_func)
|
|
|
|
|
catalog_list.set_filter_func(catalog_filter_func)
|
2019-11-19 15:37:53 +03:00
|
|
|
|
with db.atomic():
|
|
|
|
|
for c in Catalog.select():
|
2019-11-12 19:30:17 +03:00
|
|
|
|
catalog_list.add(build_catalog_row(c))
|
2019-10-30 20:17:14 +03:00
|
|
|
|
|
2019-12-01 16:22:43 +03:00
|
|
|
|
|
2019-10-30 20:17:14 +03:00
|
|
|
|
|
2019-11-05 19:40:50 +03:00
|
|
|
|
|
2019-10-26 21:13:07 +03:00
|
|
|
|
|
2019-11-12 19:30:17 +03:00
|
|
|
|
def create_reception_list_settings_win():
|
|
|
|
|
b = Gtk.Builder()
|
|
|
|
|
class ReceptionListSettingsHandler:
|
|
|
|
|
def save_settings(self, *a):
|
|
|
|
|
start_hour = int(b.get_object('start_hour').get_value())
|
|
|
|
|
start_minute = int(b.get_object('start_minute').get_value())
|
|
|
|
|
end_hour = int(b.get_object('end_hour').get_value())
|
|
|
|
|
end_minute = int(b.get_object('end_minute').get_value())
|
|
|
|
|
interval = int(b.get_object('interval').get_value())
|
|
|
|
|
s_set_reception_list([start_hour, start_minute], [end_hour, end_minute], interval)
|
|
|
|
|
redraw_reception_list(datetime.now())
|
|
|
|
|
b.get_object('reception_list_settings_win').close()
|
|
|
|
|
b.add_from_file(reception_list_settings_win_file)
|
|
|
|
|
b.connect_signals(ReceptionListSettingsHandler())
|
|
|
|
|
s = s_get_reception_list()
|
|
|
|
|
b.get_object('start_hour').set_value(s.day_start[0])
|
|
|
|
|
b.get_object('start_minute').set_value(s.day_start[1])
|
|
|
|
|
b.get_object('end_hour').set_value(s.day_end[0])
|
|
|
|
|
b.get_object('end_minute').set_value(s.day_end[1])
|
|
|
|
|
b.get_object('interval').set_value(s.interval)
|
|
|
|
|
w = b.get_object('reception_list_settings_win')
|
|
|
|
|
return w
|
|
|
|
|
|
2019-11-12 21:39:26 +03:00
|
|
|
|
def create_new_catalog_win():
|
|
|
|
|
b = Gtk.Builder()
|
|
|
|
|
class NewCatalogHandler:
|
|
|
|
|
def save_catalog(self, *a):
|
|
|
|
|
catname = re.sub(r'\s+', ' ', b.get_object('catalog_name').get_text()).strip()
|
|
|
|
|
if not len(catname):
|
|
|
|
|
return show_msg('Не указано имя справочника', 'Данное поле должно быть заполнено', level='warn')
|
2019-11-23 23:36:26 +03:00
|
|
|
|
try:
|
|
|
|
|
catalog = add_catalog(catname)
|
|
|
|
|
except peewee.IntegrityError:
|
|
|
|
|
return show_msg('Данный справочник уже существует', 'Справочник с указанным названием уже есть с базе данных', level='warn')
|
2019-11-12 21:39:26 +03:00
|
|
|
|
row = build_catalog_row(catalog)
|
|
|
|
|
catalog_list.add(row)
|
|
|
|
|
catalog_list.select_row(row)
|
|
|
|
|
catalog_list.show_all()
|
|
|
|
|
b.get_object('new_catalog_window').close()
|
|
|
|
|
b.add_from_file(new_catalog_win_file)
|
|
|
|
|
b.connect_signals(NewCatalogHandler())
|
|
|
|
|
w = b.get_object('new_catalog_window')
|
|
|
|
|
return w
|
|
|
|
|
|
2019-10-26 21:13:07 +03:00
|
|
|
|
main_win = builder.get_object('main_window')
|
|
|
|
|
main_win.show_all()
|
|
|
|
|
Gtk.main()
|