diff --git a/mods/diagnosis.py b/mods/diagnosis.py index 12bea7b..52f1b45 100644 --- a/mods/diagnosis.py +++ b/mods/diagnosis.py @@ -1,15 +1,97 @@ import gi gi.require_version('Gtk', '3.0') -from gi.repository import Gtk -from mods.files import choose_diagnosis_win_file +from gi.repository import Gtk, GObject +from mods.files import choose_diagnosis_win_file, diagnosis_row_ui_str +from mods.utils import ConditionalFilter +from mods.db import DiagnosisCategory, Diagnosis, DiagnosisIndex, db +import re +class DiagnosisFilter(ConditionalFilter): + def filter(self, cat, query): + if query != self.fstr: + self.fstr = query + self.ids = list(map(lambda x:x.id, self.search_func(cat, query))) + return self.ids +class DiagnosisRow(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 + +def cats_subcats(cat): + cats = [cat] + def append_cat(cat_obj): + cats.append(cat_obj) + for c in cat_obj.subcat: + append_cat(c) + for c in cat.subcat: + append_cat(c) + return cats + +def get_categories(parent=None): + with db.atomic(): + return DiagnosisCategory.select().where(DiagnosisCategory.parent == parent) +def get_diagnosises(cat=None): + with db.atomic(): + if cat: + d = list(Diagnosis.select().where(Diagnosis.category.in_(cats_subcats(cat))).order_by(Diagnosis.code)) + return d + else: + return Diagnosis.select() +def get_category(cat_id): + with db.atomic(): + return DiagnosisCategory.get_by_id(cat_id) +def search_diagnosises(cat, q): + q = re.sub(r'\s+', ' ', q).strip() + q = ' '.join([ f'{x}*' for x in q.split(' ')]) + with db.atomic(): + return (Diagnosis.select() + .join( + DiagnosisIndex, + on=(Diagnosis.id == DiagnosisIndex.rowid)) + .where((Diagnosis.category.in_(cats_subcats(cat))) & (DiagnosisIndex.match(q))) + .order_by(DiagnosisIndex.bm25())) +diagnosis_filter = DiagnosisFilter(search_diagnosises) +######################################################## +def build_diagnosis_row(diagnosis): + b = Gtk.Builder() + b.add_from_string(diagnosis_row_ui_str) + win = b.get_object('win') + box = b.get_object('diagnosis_box') + b.get_object('title').set_markup(f'{diagnosis.code:<8} {diagnosis.title}') + win.remove(win.get_children()[0]) + row = DiagnosisRow() + row.props.db_id = diagnosis.id + row.add(box) + return row def create_choose_diagnosis_win(reception): - class ChooseDiagnosisWinHandler: - pass b = Gtk.Builder() + class ChooseDiagnosisWinHandler: + def cat_selection_changed(self, cat_selection): + sel_iter = cat_selection.get_selected()[1] + model = cat_selection.get_tree_view().get_model() + category = get_category(model.get_value(sel_iter, 1)) + self.redraw_diagnosis_list(category) + def redraw_diagnosis_list(self, cat): + for c in diagnosis_list.get_children(): + diagnosis_list.remove(c) + for d in get_diagnosises(cat): + diagnosis_list.add(build_diagnosis_row(d)) + diagnosis_list.show_all() b.add_from_file(choose_diagnosis_win_file) b.connect_signals(ChooseDiagnosisWinHandler()) + cat_liststore = b.get_object('category_list') + def insert_cat(cat, parent=None): + cur_parent = cat_liststore.append(parent, [cat.title, cat.id]) + for c in get_categories(cat): + insert_cat(c, cur_parent) + for c in get_categories(): + insert_cat(c) + diagnosis_list = b.get_object('diagnosis_list') + diagnosis_list.set_sort_func(None, None) w = b.get_object('choose_diagnosis_window') return w diff --git a/mods/files.py b/mods/files.py index fa409e3..4865f96 100644 --- a/mods/files.py +++ b/mods/files.py @@ -26,6 +26,9 @@ with open(reception_row_file, 'r') as f: 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() +diagnosis_row_file = os.path.join(ui_dir, 'diagnosis_row.glade') +with open(diagnosis_row_file, 'r') as f: + diagnosis_row_ui_str = f.read() main_win_file = os.path.join(ui_dir, 'main_win.glade') new_patient_win_file = os.path.join(ui_dir, 'new_patient_win.glade') diff --git a/mods/receptions.py b/mods/receptions.py index 84f8afa..13442a6 100644 --- a/mods/receptions.py +++ b/mods/receptions.py @@ -4,6 +4,7 @@ from gi.repository import Gtk, GObject, Gdk from mods.db import db, Reception, Patient from mods.files import new_reception_win_file, reception_row_ui_str, reception_list_settings_win_file, open_reception_win_file from mods.settings import s_get_reception_list, s_set_reception_list +from mods.diagnosis import create_choose_diagnosis_win from mods.root import builder from datetime import datetime, timedelta @@ -85,7 +86,9 @@ def create_open_reception_win(): reception_row = reception_list.get_selected_row() reception = get_reception(reception_row.props.db_id) class OpenReceptionWinHandler: - pass + def show_choose_diagnosis_win(self, button): + choose_diagnosis_win = create_choose_diagnosis_win(reception) + choose_diagnosis_win.show_all() b.add_from_file(open_reception_win_file) b.connect_signals(OpenReceptionWinHandler()) # @@ -141,7 +144,10 @@ def create_reception_list_settings_win(): 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()) + 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) b.get_object('reception_list_settings_win').close() b.add_from_file(reception_list_settings_win_file) b.connect_signals(ReceptionListSettingsHandler()) diff --git a/res/ui/choose_diagnosis_win.glade b/res/ui/choose_diagnosis_win.glade index 546e4b5..5b5155e 100644 --- a/res/ui/choose_diagnosis_win.glade +++ b/res/ui/choose_diagnosis_win.glade @@ -2,16 +2,19 @@ - + - - + + + + 800 600 False + True center dialog @@ -45,6 +48,8 @@ 250 True True + 5 + 5 in @@ -60,7 +65,20 @@ 4 True - + + + + + + + column + + + + 0 + + + @@ -82,6 +100,8 @@ True True + 5 + 5 in diff --git a/res/ui/diagnosis_row.glade b/res/ui/diagnosis_row.glade new file mode 100644 index 0000000..e085406 --- /dev/null +++ b/res/ui/diagnosis_row.glade @@ -0,0 +1,31 @@ + + + + + + False + False + + + + + + True + False + + + True + False + label + 0 + + + True + True + 1 + + + + + + diff --git a/res/ui/open_reception_win.glade b/res/ui/open_reception_win.glade index 1a48108..a61dd7b 100644 --- a/res/ui/open_reception_win.glade +++ b/res/ui/open_reception_win.glade @@ -492,6 +492,7 @@ True True True + True