Диагноз на приёме
This commit is contained in:
parent
416d78adff
commit
1a9cd54a88
10
mods/db.py
10
mods/db.py
|
@ -118,7 +118,11 @@ class ReceptionDiagnosis(BaseModel):
|
|||
class ReceptionAnamnesis(BaseModel):
|
||||
id = AutoIncrementField()
|
||||
reception = ForeignKeyField(Reception, backref='reception_anamnesisses', on_delete='CASCADE')
|
||||
text = TextField()
|
||||
anamnesis = ForeignKeyField(ListRecord, backref='reception_anamnesisses', on_delete='CASCADE')
|
||||
class ReceptionObserve(BaseModel):
|
||||
id = AutoIncrementField()
|
||||
reception = ForeignKeyField(Reception, backref='reception_symptoms', on_delete='CASCADE')
|
||||
symptom = ForeignKeyField(ListRecord, backref='reception_symptoms', on_delete='CASCADE')
|
||||
class PatientIndex(BaseFTSModel):
|
||||
rowid = RowIDField()
|
||||
fio = SearchField()
|
||||
|
@ -132,6 +136,9 @@ Patient.add_index(
|
|||
)
|
||||
Catalog.add_index(Catalog.index(fn.lower(Catalog.name), unique=True, name='catalog_name_unique'))
|
||||
ListRecord.add_index(ListRecord.index(ListRecord.list, fn.lower(ListRecord.text), unique=True, name='listrec_unique'))
|
||||
ReceptionDiagnosis.add_index(ReceptionDiagnosis.index(ReceptionDiagnosis.reception, ReceptionDiagnosis.diagnosis, unique=True, name='reception_diagnosis_unique'))
|
||||
ReceptionAnamnesis.add_index(ReceptionAnamnesis.index(ReceptionAnamnesis.reception, ReceptionAnamnesis.anamnesis, unique=True, name='reception_anamnesis_unique'))
|
||||
ReceptionObserve.add_index(ReceptionObserve.index(ReceptionObserve.reception, ReceptionObserve.symptom, unique=True, name='reception_observe_unique'))
|
||||
db.connect()
|
||||
db.create_tables([
|
||||
Patient,
|
||||
|
@ -149,5 +156,6 @@ db.create_tables([
|
|||
Reception,
|
||||
ReceptionDiagnosis,
|
||||
ReceptionAnamnesis,
|
||||
ReceptionObserve,
|
||||
Settings
|
||||
])
|
||||
|
|
|
@ -2,15 +2,16 @@ import gi
|
|||
gi.require_version('Gtk', '3.0')
|
||||
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.utils import ConditionalFilter, enable_widget, disable_widget
|
||||
from mods.db import DiagnosisCategory, Diagnosis, DiagnosisIndex, db
|
||||
import re
|
||||
|
||||
class DiagnosisFilter(ConditionalFilter):
|
||||
def filter(self, cat, query):
|
||||
cat = None
|
||||
def filter(self, query):
|
||||
if query != self.fstr:
|
||||
self.fstr = query
|
||||
self.ids = list(map(lambda x:x.id, self.search_func(cat, query)))
|
||||
self.ids = list(map(lambda x:x.id, self.search_func(self.cat, query)))
|
||||
return self.ids
|
||||
|
||||
class DiagnosisRow(Gtk.ListBoxRow):
|
||||
|
@ -34,16 +35,19 @@ def cats_subcats(cat):
|
|||
def get_categories(parent=None):
|
||||
with db.atomic():
|
||||
return DiagnosisCategory.select().where(DiagnosisCategory.parent == parent)
|
||||
def get_diagnosises(cat=None):
|
||||
def get_reception_diagnosises(cat=None):
|
||||
with db.atomic():
|
||||
if cat:
|
||||
d = list(Diagnosis.select().where(Diagnosis.category.in_(cats_subcats(cat))).order_by(Diagnosis.code))
|
||||
d = list(Diagnosis.select().where(Diagnosis.category == 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 get_giagnosis(diag_id):
|
||||
with db.atomic():
|
||||
return Diagnosis.get_by_id(diag_id)
|
||||
def search_diagnosises(cat, q):
|
||||
q = re.sub(r'\s+', ' ', q).strip()
|
||||
q = ' '.join([ f'{x}*' for x in q.split(' ')])
|
||||
|
@ -52,7 +56,7 @@ def search_diagnosises(cat, q):
|
|||
.join(
|
||||
DiagnosisIndex,
|
||||
on=(Diagnosis.id == DiagnosisIndex.rowid))
|
||||
.where((Diagnosis.category.in_(cats_subcats(cat))) & (DiagnosisIndex.match(q)))
|
||||
.where((Diagnosis.category == cat) & (DiagnosisIndex.match(q)))
|
||||
.order_by(DiagnosisIndex.bm25()))
|
||||
diagnosis_filter = DiagnosisFilter(search_diagnosises)
|
||||
########################################################
|
||||
|
@ -68,20 +72,42 @@ def build_diagnosis_row(diagnosis):
|
|||
row.add(box)
|
||||
return row
|
||||
|
||||
def create_choose_diagnosis_win(reception):
|
||||
def create_choose_diagnosis_win(reception_b):
|
||||
b = Gtk.Builder()
|
||||
rd_list = reception_b.get_object('diagnosis_list')
|
||||
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))
|
||||
diagnosis_filter.cat = category
|
||||
diagnosis_list.unselect_all()
|
||||
self.diagnosis_row_unselected()
|
||||
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):
|
||||
for d in get_reception_diagnosises(cat):
|
||||
diagnosis_list.add(build_diagnosis_row(d))
|
||||
diagnosis_list.show_all()
|
||||
def diagnosis_row_selected(self, *a):
|
||||
enable_widget([accept_button])
|
||||
def diagnosis_row_unselected(self, *a):
|
||||
disable_widget([accept_button])
|
||||
def diagnosis_filter_changed(self, filter_widget):
|
||||
diagnosis_list.unselect_all()
|
||||
self.diagnosis_row_unselected()
|
||||
diagnosis_list.invalidate_filter()
|
||||
def submit(self, button):
|
||||
from mods.receptions import build_reception_diagnosis_row
|
||||
exist_rows = list(map(lambda x: x.props.db_id, rd_list.get_children()))
|
||||
rows = diagnosis_list.get_selected_rows()
|
||||
for row in rows:
|
||||
if row.props.db_id not in exist_rows:
|
||||
diagnosis = get_giagnosis(row.props.db_id)
|
||||
rd_list.add(build_reception_diagnosis_row(diagnosis))
|
||||
rd_list.show_all()
|
||||
w.destroy()
|
||||
b.add_from_file(choose_diagnosis_win_file)
|
||||
b.connect_signals(ChooseDiagnosisWinHandler())
|
||||
cat_liststore = b.get_object('category_list')
|
||||
|
@ -92,6 +118,16 @@ def create_choose_diagnosis_win(reception):
|
|||
for c in get_categories():
|
||||
insert_cat(c)
|
||||
diagnosis_list = b.get_object('diagnosis_list')
|
||||
diagnosis_list.set_sort_func(None, None)
|
||||
di_filter = b.get_object('diagnosis_filter')
|
||||
accept_button = b.get_object('accept_button')
|
||||
#####
|
||||
def diagnosis_filter_func(row):
|
||||
fstr = di_filter.get_text().strip()
|
||||
if not fstr:
|
||||
diagnosis_filter.reset()
|
||||
return True
|
||||
return row.props.db_id in diagnosis_filter.filter(fstr)
|
||||
#####
|
||||
diagnosis_list.set_filter_func(diagnosis_filter_func)
|
||||
w = b.get_object('choose_diagnosis_window')
|
||||
return w
|
||||
|
|
|
@ -8,11 +8,8 @@ import re
|
|||
import peewee
|
||||
|
||||
lists_map = {
|
||||
'diagnoz': 'Диагноз',
|
||||
'anamnez': 'Анамнез',
|
||||
'observ': 'Осмотр',
|
||||
'medicines': 'Медикаменты',
|
||||
'procedures': 'Процедуры'
|
||||
}
|
||||
|
||||
for s_id in lists_map:
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import gi
|
||||
from mods.utils import disable_widget, enable_widget
|
||||
gi.require_version('Gtk', '3.0')
|
||||
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.db import db, Reception, Patient, ReceptionDiagnosis
|
||||
from mods.files import new_reception_win_file, reception_row_ui_str, reception_list_settings_win_file, open_reception_win_file, diagnosis_row_ui_str
|
||||
from mods.settings import s_get_reception_list, s_set_reception_list
|
||||
from mods.diagnosis import create_choose_diagnosis_win
|
||||
from mods.diagnosis import create_choose_diagnosis_win, get_giagnosis
|
||||
from mods.root import builder
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
|
@ -47,11 +48,38 @@ class NewReceptionPatientLabel(Gtk.Label):
|
|||
@db_id.setter
|
||||
def db_id_setter(self, value):
|
||||
self._db_id = value
|
||||
class ReceptionDiagnosisRow(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 get_reception(reception_id):
|
||||
with db.atomic():
|
||||
return Reception.get_by_id(reception_id)
|
||||
def get_reception_diagnosises(reception):
|
||||
with db.atomic():
|
||||
return ReceptionDiagnosis.select().where(ReceptionDiagnosis.reception == reception)
|
||||
def delete_reception_diagnosises(reception, diag_id_list):
|
||||
if not len(diag_id_list): return
|
||||
with db.atomic():
|
||||
ReceptionDiagnosis.delete().where((ReceptionDiagnosis.reception == reception) & (ReceptionDiagnosis.diagnosis.in_(diag_id_list))).execute()
|
||||
def add_reception_diagnosises(reception, diag_id_list):
|
||||
if not len(diag_id_list): return
|
||||
with db.atomic():
|
||||
inserts = list(map(lambda x: {'reception': reception, 'diagnosis': get_giagnosis(x)}, diag_id_list))
|
||||
_ = ReceptionDiagnosis.insert_many(inserts).execute()
|
||||
def save_reception_diagnosises(reception, diag_id_list):
|
||||
exist_diags = set(map(lambda x: x.diagnosis.id, get_reception_diagnosises(reception)))
|
||||
new_diags = set(diag_id_list)
|
||||
to_del = list(exist_diags - new_diags)
|
||||
to_add = list(new_diags - exist_diags)
|
||||
delete_reception_diagnosises(reception, to_del)
|
||||
add_reception_diagnosises(reception, to_add)
|
||||
|
||||
##################################################################################
|
||||
def build_reception_row(reception_datetime):
|
||||
b = Gtk.Builder()
|
||||
b.add_from_string(reception_row_ui_str)
|
||||
|
@ -79,6 +107,17 @@ def build_reception_row(reception_datetime):
|
|||
row.props.datetime = reception_datetime
|
||||
row.add(box)
|
||||
return row
|
||||
def build_reception_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_text(f'{diagnosis.code:<8} {diagnosis.title}')
|
||||
win.remove(win.get_children()[0])
|
||||
row = ReceptionDiagnosisRow()
|
||||
row.props.db_id = diagnosis.id
|
||||
row.add(box)
|
||||
return row
|
||||
|
||||
def create_open_reception_win():
|
||||
b = Gtk.Builder()
|
||||
|
@ -87,8 +126,23 @@ def create_open_reception_win():
|
|||
reception = get_reception(reception_row.props.db_id)
|
||||
class OpenReceptionWinHandler:
|
||||
def show_choose_diagnosis_win(self, button):
|
||||
choose_diagnosis_win = create_choose_diagnosis_win(reception)
|
||||
choose_diagnosis_win = create_choose_diagnosis_win(b)
|
||||
choose_diagnosis_win.show_all()
|
||||
def remove_diagnosis(self, button):
|
||||
row = reception_diag_list.get_selected_row()
|
||||
reception_diag_list.remove(row)
|
||||
disable_widget([remove_diag_button])
|
||||
reception_diag_list.show_all()
|
||||
def diagnosis_selected(self, *s):
|
||||
enable_widget([remove_diag_button])
|
||||
def save(self, button):
|
||||
# Диагнозы
|
||||
diag_id_list = list(map(lambda x: x.props.db_id, reception_diag_list.get_children()))
|
||||
save_reception_diagnosises(reception, diag_id_list)
|
||||
#######
|
||||
|
||||
#######
|
||||
w.destroy()
|
||||
b.add_from_file(open_reception_win_file)
|
||||
b.connect_signals(OpenReceptionWinHandler())
|
||||
#
|
||||
|
@ -96,6 +150,11 @@ def create_open_reception_win():
|
|||
patient_fio.set_markup(f'<span size="x-large">{" ".join([reception.patient.last_name, reception.patient.first_name, reception.patient.middle_name])}</span>')
|
||||
reception_dt = b.get_object('reception_datetime')
|
||||
reception_dt.set_markup(f'<span size="x-large">{reception_row.props.datetime.strftime("%d.%m.%Y - %H:%M")}</span>')
|
||||
reception_diag_list = b.get_object('diagnosis_list')
|
||||
remove_diag_button = b.get_object('remove_diag_button')
|
||||
# Диагнозы
|
||||
for rd in [x.diagnosis for x in get_reception_diagnosises(reception)]:
|
||||
reception_diag_list.add(build_reception_diagnosis_row(rd))
|
||||
#
|
||||
w = b.get_object('open_reception_window')
|
||||
return w
|
||||
|
|
|
@ -24,10 +24,12 @@
|
|||
<property name="title" translatable="yes">Выбор диагноза</property>
|
||||
<property name="show_close_button">True</property>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<object class="GtkButton" id="accept_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="submit" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
|
@ -111,6 +113,9 @@
|
|||
<object class="GtkListBox" id="diagnosis_list">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="selection_mode">multiple</property>
|
||||
<property name="activate_on_single_click">False</property>
|
||||
<signal name="row-selected" handler="diagnosis_row_selected" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
@ -146,6 +151,7 @@
|
|||
<property name="primary_icon_name">edit-find-symbolic</property>
|
||||
<property name="primary_icon_activatable">False</property>
|
||||
<property name="primary_icon_sensitive">False</property>
|
||||
<signal name="changed" handler="diagnosis_filter_changed" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="save" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
|
@ -223,6 +224,7 @@
|
|||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<child>
|
||||
|
@ -361,6 +363,7 @@
|
|||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<child>
|
||||
|
@ -460,6 +463,7 @@
|
|||
<object class="GtkListBox" id="diagnosis_list">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<signal name="row-selected" handler="diagnosis_selected" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
@ -509,10 +513,12 @@
|
|||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<object class="GtkButton" id="remove_diag_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="remove_diagnosis" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="visible">True</property>
|
||||
|
@ -649,6 +655,7 @@
|
|||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<child>
|
||||
|
@ -798,6 +805,7 @@
|
|||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<child>
|
||||
|
|
Loading…
Reference in New Issue