From 2012391d08788eed35e6a913baeeb7c7fb73b21f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D1=80=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=A0=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD?= Date: Tue, 5 May 2020 13:49:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=B5=D0=B4=D0=B8=D0=BA=D0=B0=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B2=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/files.py | 4 + mods/medicines.py | 81 +++++++++++++++++++++ mods/receptions.py | 4 + res/ui/choose_medicine_win.glade | 121 +++++++++++++++++++++++++++++++ res/ui/medicine_row.glade | 50 +++++++++++++ res/ui/open_reception_win.glade | 3 +- 6 files changed, 262 insertions(+), 1 deletion(-) create mode 100644 mods/medicines.py create mode 100644 res/ui/choose_medicine_win.glade create mode 100644 res/ui/medicine_row.glade diff --git a/mods/files.py b/mods/files.py index 90ab108..9889b6b 100644 --- a/mods/files.py +++ b/mods/files.py @@ -35,6 +35,9 @@ with open(anamnesis_row_file, 'r') as f: observe_row_file = os.path.join(ui_dir, 'observe_row.glade') with open(observe_row_file, 'r') as f: observe_row_ui_str = f.read() +medicine_row_file = os.path.join(ui_dir, 'medicine_row.glade') +with open(medicine_row_file, 'r') as f: + medicine_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') @@ -46,3 +49,4 @@ new_catalog_win_file = os.path.join(ui_dir, 'new_catalog_win.glade') choose_patient_win_file = os.path.join(ui_dir, 'choose_patient_win.glade') open_reception_win_file = os.path.join(ui_dir, 'open_reception_win.glade') choose_diagnosis_win_file = os.path.join(ui_dir, 'choose_diagnosis_win.glade') +choose_medicine_win_file = os.path.join(ui_dir, 'choose_medicine_win.glade') diff --git a/mods/medicines.py b/mods/medicines.py new file mode 100644 index 0000000..8b259e1 --- /dev/null +++ b/mods/medicines.py @@ -0,0 +1,81 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, GObject +from mods.files import choose_medicine_win_file, medicine_row_ui_str +from mods.db import db, Rls, RlsIndex +from mods.utils import enable_widget, disable_widget +import re + +MAX_SEARCH_RESULTS = 50 + +def search_medicines(q): + q = re.sub(r'\s+', ' ', q).strip() + q = ' '.join([ f'{x}*' for x in q.split(' ')]) + with db.atomic(): + return (Rls.select() + .join( + RlsIndex, + on=(Rls.id == RlsIndex.rowid)) + .where(RlsIndex.match(q)) + .order_by(RlsIndex.bm25()) + .limit(MAX_SEARCH_RESULTS)) +def get_all_medicines(): + with db.atomic(): + return Rls.select() +######################################################## + +class MedicineRow(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 tradename(self): + return self._fio + @tradename.setter + def tradename_setter(self, value): + self._fio = value + +def build_medicine_row(medicine): + b = Gtk.Builder() + b.add_from_string(medicine_row_ui_str) + win = b.get_object('win') + box = b.get_object('medicine_box') + tradename = medicine.tradename + b.get_object('tradename').set_text(tradename) + internationalname = medicine.internationalname + b.get_object('internationalname').set_text(internationalname) + win.remove(win.get_children()[0]) + row = MedicineRow() + row.props.db_id = medicine.id + row.props.tradename = tradename + row.add(box) + return row + +def create_choose_medicine_win(reception_b): + b = Gtk.Builder() + rm_list = reception_b.get_object('medicines_list') + class ChooseMedicineWinHandler: + def medicine_filter_changed(self, filter_widget): + ml.unselect_all() + self.medicine_list_unselected() + for c in ml.get_children(): + ml.remove(c) + fstr = med_filter.get_text().strip() + if fstr: + for m in search_medicines(fstr): + ml.add(build_medicine_row(m)) + ml.show_all() + def medicine_list_selected(self, *a): + enable_widget([accept_button]) + def medicine_list_unselected(self, *a): + disable_widget([accept_button]) + b.add_from_file(choose_medicine_win_file) + b.connect_signals(ChooseMedicineWinHandler()) + accept_button = b.get_object('accept_button') + ml = b.get_object('medicine_list') + med_filter = b.get_object('medicine_filter') + w = b.get_object('choose_medicine_window') + return w diff --git a/mods/receptions.py b/mods/receptions.py index b2f8f25..7baae3f 100644 --- a/mods/receptions.py +++ b/mods/receptions.py @@ -7,6 +7,7 @@ from mods.files import new_reception_win_file, reception_row_ui_str, reception_l from mods.files import anamnesis_row_ui_str, observe_row_ui_str from mods.settings import s_get_reception_list, s_set_reception_list from mods.diagnosis import create_choose_diagnosis_win, get_giagnosis +from mods.medicines import create_choose_medicine_win from mods.lists import get_listrecord, get_list_by_system_id, create_open_list_win, ANAMNEZ_LIST, OBSERVE_LIST from mods.root import builder from datetime import datetime, timedelta @@ -200,6 +201,9 @@ def create_open_reception_win(): reception_row = reception_list.get_selected_row() reception = get_reception(reception_row.props.db_id) class OpenReceptionWinHandler: + def show_choose_medicine_win(self, button): + choose_medicine_win = create_choose_medicine_win(b) + choose_medicine_win.show_all() def show_choose_diagnosis_win(self, button): choose_diagnosis_win = create_choose_diagnosis_win(b) choose_diagnosis_win.show_all() diff --git a/res/ui/choose_medicine_win.glade b/res/ui/choose_medicine_win.glade new file mode 100644 index 0000000..9de7e30 --- /dev/null +++ b/res/ui/choose_medicine_win.glade @@ -0,0 +1,121 @@ + + + + + + 600 + 500 + False + True + center + 800 + 500 + dialog + + + True + False + Выбор лекарственного средства + True + + + True + False + True + True + + + True + False + object-select-symbolic + + + + + + + + + True + False + vertical + + + True + True + in + + + True + False + + + True + False + + + + + + + + True + True + 1 + + + + + True + False + 3 + 3 + + + True + False + + + True + True + 0 + + + + + True + True + edit-find-symbolic + False + False + + + + True + True + 1 + + + + + True + False + + + True + True + 2 + + + + + False + True + end + 2 + + + + + + diff --git a/res/ui/medicine_row.glade b/res/ui/medicine_row.glade new file mode 100644 index 0000000..0be9e1f --- /dev/null +++ b/res/ui/medicine_row.glade @@ -0,0 +1,50 @@ + + + + + + False + False + + + + + + True + False + + + True + False + label + 0 + + + + + + True + True + 0 + + + + + True + False + 5 + label + + + + + + False + True + 1 + + + + + + diff --git a/res/ui/open_reception_win.glade b/res/ui/open_reception_win.glade index 0a1dcb7..f759f02 100644 --- a/res/ui/open_reception_win.glade +++ b/res/ui/open_reception_win.glade @@ -1,5 +1,5 @@ - + @@ -643,6 +643,7 @@ True True True + True