From fbafb5b5eefc876461a8a8b5c25477c7ad8a69b5 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, 19 Nov 2019 15:37:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D1=8B=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 41 +++++--- mods/catalogs.py | 32 +++--- mods/db.py | 183 +++++++++++++++------------------- mods/settings.py | 16 +-- res/ui/edit_patient_win.glade | 1 + res/ui/main_win.glade | 18 +++- res/ui/new_patient_win.glade | 1 + res/ui/open_patient_win.glade | 10 ++ 8 files changed, 162 insertions(+), 140 deletions(-) diff --git a/app.py b/app.py index 7f9dc56..41ebfcc 100644 --- a/app.py +++ b/app.py @@ -2,7 +2,7 @@ import gi import os gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GObject, Gdk -from mods.db import store_patient_index, update_patient_index, search_patients, dbo +from mods.db import store_patient_index, update_patient_index, search_patients, db, Patient, Reception, Catalog from mods.settings import s_get_reception_list, s_set_reception_list from mods.catalogs import add_catalog, search_catalogs from datetime import date, datetime, timedelta @@ -173,9 +173,20 @@ class MainWinHandler: for p in patients: pl.add(build_patient_row(p)) pl.show_all()''' + def catalog_list_selected(self, *a): + open_button = builder.get_object('catalog_open_button') + rename_button = builder.get_object('catalog_rename_button') + open_button.set_sensitive(True) + rename_button.set_sensitive(True) + def catalog_list_unselected(self, *a): + open_button = builder.get_object('catalog_open_button') + rename_button = builder.get_object('catalog_rename_button') + open_button.set_sensitive(False) + rename_button.set_sensitive(False) def catalog_filter_changed(self, filter_widget): cl = builder.get_object('catalog_list') cl.unselect_all() + self.catalog_list_unselected() cl.invalidate_filter() def build_catalog_row(catalog): @@ -198,8 +209,8 @@ def build_reception_row(reception_datetime): box = b.get_object('reception_box') b.get_object('hour').set_text(reception_datetime.strftime('%H')) b.get_object('minute').set_text(reception_datetime.strftime('%M')) - with dbo.db.atomic(): - reception = dbo._Reception.select().where(dbo._Reception.time == reception_datetime) # @UndefinedVariable + with db.atomic(): + reception = Reception.select().where(Reception.time == reception_datetime) row = ReceptionRow() if len(reception): row.props.scheduled = True @@ -273,15 +284,15 @@ redraw_reception_list(datetime.now()) patient_list = builder.get_object('patient_list') patient_list.set_sort_func(patient_sort_func) patient_list.set_filter_func(patient_filter_func) -with dbo.db.atomic(): - for p in dbo._Patient.select(): # @UndefinedVariable +with db.atomic(): + for p in Patient.select(): patient_list.add(build_patient_row(p)) ##### catalog_list = builder.get_object('catalog_list') catalog_list.set_sort_func(catalog_sort_func) catalog_list.set_filter_func(catalog_filter_func) -with dbo.db.atomic(): - for c in dbo._Catalog.select(): # @UndefinedVariable +with db.atomic(): + for c in Catalog.select(): catalog_list.add(build_catalog_row(c)) def show_msg(text, sec_text='', level='info'): @@ -343,8 +354,8 @@ def get_patient_win_values(b): 'notes': notes } def set_patient_win_values(patient_id, b, edit=False): - with dbo.db.atomic(): - pat = dbo._Patient.select().where(dbo._Patient.id == patient_id).get() # @UndefinedVariable + with db.atomic(): + pat = Patient.select().where(Patient.id == patient_id).get() b.get_object('last_name').set_text(pat.last_name) b.get_object('first_name').set_text(pat.first_name) b.get_object('middle_name').set_text(pat.middle_name) @@ -399,12 +410,12 @@ def create_edit_patient_win(patient_id): values = get_patient_win_values(b) if not values: return - with dbo.db.atomic(): + with db.atomic(): try: - dbo._Patient.update(**values).where(dbo._Patient.id == patient_id).execute() # @UndefinedVariable + Patient.update(**values).where(Patient.id == patient_id).execute() except peewee.IntegrityError: return show_msg('Данный пациент уже существует', 'Другой пациент с указанными фамилией, именем\nи датой рождения уже есть с базе данных', level='warn') - patient = dbo._Patient.select().where(dbo._Patient.id == patient_id).get() # @UndefinedVariable + patient = Patient.select().where(Patient.id == patient_id).get() update_patient_index(patient) cur_row = list(filter(lambda x: x.props.db_id == patient_id, patient_list.get_children()))[0] patient_list.remove(cur_row) @@ -430,9 +441,9 @@ def create_new_patient_win(): values = get_patient_win_values(b) if not values: return - with dbo.db.atomic(): + with db.atomic(): try: - patient = dbo._Patient.create(**values) # @UndefinedVariable + patient = Patient.create(**values) except peewee.IntegrityError: return show_msg('Данный пациент уже существует', 'Пациент с указанными фамилией, именем\nи датой рождения уже есть с базе данных', level='warn') store_patient_index(patient) @@ -476,7 +487,7 @@ def create_new_catalog_win(): catname = re.sub(r'\s+', ' ', b.get_object('catalog_name').get_text()).strip() if not len(catname): return show_msg('Не указано имя справочника', 'Данное поле должно быть заполнено', level='warn') - with dbo.db.atomic(): + with db.atomic(): try: catalog = add_catalog(catname) except peewee.IntegrityError: diff --git a/mods/catalogs.py b/mods/catalogs.py index b56ad95..b51563a 100644 --- a/mods/catalogs.py +++ b/mods/catalogs.py @@ -1,4 +1,4 @@ -from mods.db import dbo +from mods.db import db, Catalog, CatalogIndex sys_catalogs = { 'diagnoz': 'Диагноз', @@ -8,26 +8,26 @@ sys_catalogs = { } def add_catalog(name, system_id = ''): - catalog = dbo._Catalog.create(name=name, system_id=system_id) # @UndefinedVariable - dbo._CatalogIndex.insert( # @UndefinedVariable + catalog = Catalog.create(name=name, system_id=system_id) + CatalogIndex.insert( { - dbo._CatalogIndex.rowid: catalog.id, - dbo._CatalogIndex.text: name + CatalogIndex.rowid: catalog.id, + CatalogIndex.text: name } - ).execute() # @UndefinedVariable + ).execute() return catalog def search_catalogs(q): - with dbo.db.atomic(): - return (dbo._Catalog.select() # @UndefinedVariable - .join( # @UndefinedVariable - dbo._CatalogIndex, - on=(dbo._Catalog.id == dbo._CatalogIndex.rowid)) - .where(dbo._CatalogIndex.match(q)) # @UndefinedVariable - .order_by(dbo._CatalogIndex.bm25())) # @UndefinedVariable + with db.atomic(): + return (Catalog.select() + .join( + CatalogIndex, + on=(Catalog.id == CatalogIndex.rowid)) + .where(CatalogIndex.match(q)) + .order_by(CatalogIndex.bm25())) for s_id in sys_catalogs: - with dbo.db.atomic(): - q = dbo._Catalog.select().where(dbo._Catalog.system_id == s_id) # @UndefinedVariable + with db.atomic(): + q = Catalog.select().where(Catalog.system_id == s_id) if not len(q): - add_catalog(sys_catalogs[s_id], s_id) # @UndefinedVariable + add_catalog(sys_catalogs[s_id], s_id) diff --git a/mods/db.py b/mods/db.py index f3c189a..993cf0a 100644 --- a/mods/db.py +++ b/mods/db.py @@ -11,127 +11,110 @@ if not os.path.exists(var_dir): if not os.path.exists(db_dir): os.mkdir(db_dir) -class DBO: - def __init__(self): - self.db = CSqliteExtDatabase(db_file, pragmas={ +db = CSqliteExtDatabase(db_file, pragmas={ 'journal_mode': 'wal', 'cache_size': -1 * 64000, # 64MB 'foreign_keys': 'on', 'ignore_check_constraints': 'off', 'synchronous': 'off'}) - class BaseModel(Model): - 'Базовая таблица' - class Meta: - database = self.db - class BaseFTSModel(FTS5Model): - class Meta: - database = self.db - options = {'tokenize': 'porter'} - class Patient(BaseModel): - id = AutoIncrementField() - last_name = TextField() - first_name = TextField() - middle_name = TextField(null=True) - birth_date = DateField() - gender = CharField(6) - doc_type = CharField(32, null=True) - doc_serial = TextField(null=True) - doc_number = TextField(null=True) - policy_number = TextField(null=True) - policy_company = TextField(null=True) - snils_number = TextField(null=True) - notes = TextField(null=True) - class Catalog(BaseModel): - id = AutoIncrementField() - system_id = TextField(null=True) - name = TextField() - class CatalogIndex(BaseFTSModel): - rowid = RowIDField() - text = SearchField() - class CatalogRecord(BaseModel): - id = AutoIncrementField() - catalog = ForeignKeyField(Catalog, backref='catalog_records', on_delete='CASCADE') - text = TextField() - class CatalogRecordIndex(BaseFTSModel): - rowid = RowIDField() - text = SearchField() - class Reception(BaseModel): - id = AutoIncrementField() - patient = ForeignKeyField(Patient, backref='receptions', on_delete='CASCADE') - time = DateTimeField() - class ReceptionDiagnosis(BaseModel): - id = AutoIncrementField() - reception = ForeignKeyField(Reception, backref='reception_diagnosisses', on_delete='CASCADE') - diagnosis = ForeignKeyField(CatalogRecord, backref='reception_diagnosisses', on_delete='CASCADE') - class ReceptionAnamnesis(BaseModel): - id = AutoIncrementField() - reception = ForeignKeyField(Reception, backref='reception_anamnesisses', on_delete='CASCADE') - text = TextField() - class PatientIndex(BaseFTSModel): - rowid = RowIDField() - fio = SearchField() - ### Настройки - class Settings(BaseModel): - key = TextField() - val = JSONField() - ### - self._Patient = Patient - self._Catalog = Catalog - self._CatalogIndex = CatalogIndex - self._CatalogRecord = CatalogRecord - self._CatalogRecordIndex = CatalogRecordIndex - self._Reception = Reception - self._ReceptionDiagnosis = ReceptionDiagnosis - self._ReceptionAnamnesis = ReceptionAnamnesis - self._PatientIndex = PatientIndex - self._Settings = Settings - self.db.connect() - def create(self): - self._Patient.add_index( - self._Patient.index(fn.lower(self._Patient.last_name), fn.lower(self._Patient.first_name), self._Patient.birth_date, unique=True, name='patient_first_last_name_birth_date_unique') +class BaseModel(Model): + 'Базовая таблица' + class Meta: + database = db +class BaseFTSModel(FTS5Model): + class Meta: + database = db + options = {'tokenize': 'porter'} +class Patient(BaseModel): + id = AutoIncrementField() + last_name = TextField() + first_name = TextField() + middle_name = TextField(null=True) + birth_date = DateField() + gender = CharField(6) + doc_type = CharField(32, null=True) + doc_serial = TextField(null=True) + doc_number = TextField(null=True) + policy_number = TextField(null=True) + policy_company = TextField(null=True) + snils_number = TextField(null=True) + notes = TextField(null=True) +class Catalog(BaseModel): + id = AutoIncrementField() + system_id = TextField(null=True) + name = TextField() +class CatalogIndex(BaseFTSModel): + rowid = RowIDField() + text = SearchField() +class CatalogRecord(BaseModel): + id = AutoIncrementField() + catalog = ForeignKeyField(Catalog, backref='catalog_records', on_delete='CASCADE') + text = TextField() +class CatalogRecordIndex(BaseFTSModel): + rowid = RowIDField() + text = SearchField() +class Reception(BaseModel): + id = AutoIncrementField() + patient = ForeignKeyField(Patient, backref='receptions', on_delete='CASCADE') + time = DateTimeField() +class ReceptionDiagnosis(BaseModel): + id = AutoIncrementField() + reception = ForeignKeyField(Reception, backref='reception_diagnosisses', on_delete='CASCADE') + diagnosis = ForeignKeyField(CatalogRecord, backref='reception_diagnosisses', on_delete='CASCADE') +class ReceptionAnamnesis(BaseModel): + id = AutoIncrementField() + reception = ForeignKeyField(Reception, backref='reception_anamnesisses', on_delete='CASCADE') + text = TextField() +class PatientIndex(BaseFTSModel): + rowid = RowIDField() + fio = SearchField() +### Настройки +class Settings(BaseModel): + key = TextField() + val = JSONField() +### +Patient.add_index( + Patient.index(fn.lower(Patient.last_name), fn.lower(Patient.first_name), Patient.birth_date, unique=True, name='patient_first_last_name_birth_date_unique') ) - self._Catalog.add_index(self._Catalog.index(fn.lower(self._Catalog.name), unique=True, name='catalog_name_unique')) - self.db.create_tables([ - self._Patient, - self._PatientIndex, - self._Catalog, - self._CatalogIndex, - self._CatalogRecord, - self._CatalogRecordIndex, - self._Reception, - self._ReceptionDiagnosis, - self._ReceptionAnamnesis, - self._Settings +Catalog.add_index(Catalog.index(fn.lower(Catalog.name), unique=True, name='catalog_name_unique')) +db.create_tables([ + Patient, + PatientIndex, + Catalog, + CatalogIndex, + CatalogRecord, + CatalogRecordIndex, + Reception, + ReceptionDiagnosis, + ReceptionAnamnesis, + Settings ]) def search_patients(q): - with dbo.db.atomic(): - return (dbo._Patient.select() + with db.atomic(): + return (Patient.select() .join( - dbo._PatientIndex, - on=(dbo._Patient.id == dbo._PatientIndex.rowid)) - .where(dbo._PatientIndex.match(q)) - .order_by(dbo._PatientIndex.bm25())) + PatientIndex, + on=(Patient.id == PatientIndex.rowid)) + .where(PatientIndex.match(q)) + .order_by(PatientIndex.bm25())) def store_patient_index(pat): fio_list = [pat.last_name, pat.first_name] if pat.middle_name: fio_list.append(pat.middle_name) - dbo._PatientIndex.insert( + PatientIndex.insert( { - dbo._PatientIndex.rowid: pat.id, - dbo._PatientIndex.fio: ' '.join(fio_list) + PatientIndex.rowid: pat.id, + PatientIndex.fio: ' '.join(fio_list) } ).execute() def update_patient_index(pat): fio_list = [pat.last_name, pat.first_name] if pat.middle_name: fio_list.append(pat.middle_name) - dbo._PatientIndex.update( + PatientIndex.update( { - dbo._PatientIndex.fio: ' '.join(fio_list) + PatientIndex.fio: ' '.join(fio_list) } - ).where(dbo._PatientIndex.rowid == pat.id).execute() + ).where(PatientIndex.rowid == pat.id).execute() - -dbo = DBO() -dbo.create() diff --git a/mods/settings.py b/mods/settings.py index db9b765..8714206 100644 --- a/mods/settings.py +++ b/mods/settings.py @@ -1,4 +1,4 @@ -from mods.db import dbo +from mods.db import db, Settings # Имена ключей параметров S_KEY_RECEPTION_LIST = 'reception_list' @@ -12,7 +12,7 @@ def s_get_reception_list(): day_start = None day_end = None interval = None - s = dbo._Settings.get(dbo._Settings.key == S_KEY_RECEPTION_LIST).val # @UndefinedVariable + s = Settings.get(Settings.key == S_KEY_RECEPTION_LIST).val o = RLSettings() o.day_start = s[S_RECEPTION_LIST_DAY_START] o.day_end = s[S_RECEPTION_LIST_DAY_END] @@ -25,16 +25,16 @@ def s_set_reception_list(dstart, dend, interval): S_RECEPTION_LIST_DAY_END: dend, S_RECEPTION_LIST_INTERVAL: interval } - with dbo.db.atomic(): - q = dbo._Settings.select().where(dbo._Settings.key == S_KEY_RECEPTION_LIST) # @UndefinedVariable + with db.atomic(): + q = Settings.select().where(Settings.key == S_KEY_RECEPTION_LIST) if not len(q): - dbo._Settings.create(key=S_KEY_RECEPTION_LIST, val=v) # @UndefinedVariable + Settings.create(key=S_KEY_RECEPTION_LIST, val=v) else: - dbo._Settings.update(val=v).where(dbo._Settings.key == S_KEY_RECEPTION_LIST).execute() # @UndefinedVariable + Settings.update(val=v).where(Settings.key == S_KEY_RECEPTION_LIST).execute() ### Инициализация начальных значений параметров # Начальный график приёмов -with dbo.db.atomic(): - q = dbo._Settings.select().where(dbo._Settings.key == S_KEY_RECEPTION_LIST) # @UndefinedVariable +with db.atomic(): + q = Settings.select().where(Settings.key == S_KEY_RECEPTION_LIST) if not len(q): s_set_reception_list([8,0], [17,0], 30) diff --git a/res/ui/edit_patient_win.glade b/res/ui/edit_patient_win.glade index 4ca8bc9..eeffebb 100644 --- a/res/ui/edit_patient_win.glade +++ b/res/ui/edit_patient_win.glade @@ -7,6 +7,7 @@ False True center + dialog diff --git a/res/ui/main_win.glade b/res/ui/main_win.glade index 3e5e97d..fb7e71f 100644 --- a/res/ui/main_win.glade +++ b/res/ui/main_win.glade @@ -353,8 +353,23 @@ - + True + False + False + Открыть + True + gtk-open + + + False + True + + + + + True + False False Переименовать True @@ -385,6 +400,7 @@ True False + diff --git a/res/ui/new_patient_win.glade b/res/ui/new_patient_win.glade index fa4eb34..10b854e 100644 --- a/res/ui/new_patient_win.glade +++ b/res/ui/new_patient_win.glade @@ -7,6 +7,7 @@ False True center + dialog True diff --git a/res/ui/open_patient_win.glade b/res/ui/open_patient_win.glade index 716dd25..af18491 100644 --- a/res/ui/open_patient_win.glade +++ b/res/ui/open_patient_win.glade @@ -7,6 +7,7 @@ False True center + dialog True @@ -90,6 +91,9 @@ True False 0 + + + False @@ -102,6 +106,9 @@ True False 0 + + + False @@ -114,6 +121,9 @@ True False 0 + + + False