Расписание приёмов

This commit is contained in:
Бородин Роман 2019-11-08 21:18:38 +03:00
parent 0a5634bb59
commit 1b0f6bd6c9
4 changed files with 172 additions and 7 deletions

75
app.py
View File

@ -1,11 +1,17 @@
import gi import gi
import os import os
gi.require_version('Gtk', '3.0') gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject from gi.repository import Gtk, GObject, Gdk
from mods.db import Patient, store_patient_index, update_patient_index, search_patients, db from mods.db import Patient, Reception, store_patient_index, update_patient_index, search_patients, db
from datetime import date from datetime import date, datetime, timedelta, time
import peewee import peewee
# FIXME: временно
DAY_START = time(8,0)
DAY_END = time(13,0)
TIME_INTERVAL = timedelta(minutes=30)
#
gender_dict = { gender_dict = {
'male': 'Мужской', 'male': 'Мужской',
'female': 'Женский' 'female': 'Женский'
@ -25,6 +31,9 @@ open_patient_win_file = os.path.join(ui_dir, 'open_patient_win.glade')
edit_patient_win_file = os.path.join(ui_dir, 'edit_patient_win.glade') edit_patient_win_file = os.path.join(ui_dir, 'edit_patient_win.glade')
male_patient_row_file = os.path.join(ui_dir, 'male_patient_row.glade') male_patient_row_file = os.path.join(ui_dir, 'male_patient_row.glade')
female_patient_row_file = os.path.join(ui_dir, 'female_patient_row.glade') female_patient_row_file = os.path.join(ui_dir, 'female_patient_row.glade')
reception_row_file = os.path.join(ui_dir, 'reception_row.glade')
with open(reception_row_file, 'r') as f:
reception_row_ui_str = f.read()
gender_ui_str = {} gender_ui_str = {}
with open(male_patient_row_file, 'r') as f: with open(male_patient_row_file, 'r') as f:
gender_ui_str['male'] = f.read() gender_ui_str['male'] = f.read()
@ -34,6 +43,13 @@ with open(female_patient_row_file, 'r') as f:
builder = Gtk.Builder() builder = Gtk.Builder()
def get_reception_timelist(rec_date):
dstart = datetime(rec_date.year, rec_date.month, rec_date.day, DAY_START.hour, DAY_START.minute)
dend = datetime(rec_date.year, rec_date.month, rec_date.day, DAY_END.hour, DAY_END.minute)
work_day_minutes_total = (dend.hour - dstart.hour) * 60 + dend.minute - dstart.minute
shift_minutes_range = range(0, work_day_minutes_total, int(TIME_INTERVAL.seconds / 60))
return [(dstart + timedelta(minutes=x)).time() for x in shift_minutes_range]
class PatientFilter: class PatientFilter:
def __init__(self): def __init__(self):
self.reset() self.reset()
@ -67,6 +83,26 @@ class PatientRow(Gtk.ListBoxRow):
def birth_date_setter(self, value): def birth_date_setter(self, value):
self._birth_date = value self._birth_date = value
class ReceptionRow(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 datetime(self):
return self._datetime
@datetime.setter
def datetime_setter(self, value):
self._datetime = value
@GObject.Property
def scheduled(self):
return self._scheduled
@scheduled.setter
def scheduled_setter(self, value):
self._scheduled = value
class MainWinHandler: class MainWinHandler:
def main_win_close(self, *args): def main_win_close(self, *args):
Gtk.main_quit() Gtk.main_quit()
@ -102,6 +138,30 @@ class MainWinHandler:
pl.add(build_patient_row(p)) pl.add(build_patient_row(p))
pl.show_all()''' pl.show_all()'''
def build_reception_row(reception_datetime):
b = Gtk.Builder()
b.add_from_string(reception_row_ui_str)
win = b.get_object('win')
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'))
reception = Reception.select().where(Reception.time == reception_datetime)
row = ReceptionRow()
if len(reception):
row.props.scheduled = True
reception_cont = b.get_object('reception_cont')
reception_cont.props.border_width = 2
reception_cont.override_background_color(Gtk.StateFlags(0), Gdk.RGBA(red=0.5, green=0.7, blue=0.5, alpha=1.0))
reception_patient = Gtk.Label()
reception_patient.set_text(' '.join([reception.patient.last_name, reception.patient.first_name, reception.patient.middle_name]))
reception_cont.add(reception_patient)
else:
row.props.scheduled = False
win.remove(win.get_children()[0])
row.props.datetime = reception_datetime
row.add(box)
return row
def build_patient_row(patient): def build_patient_row(patient):
b = Gtk.Builder() b = Gtk.Builder()
b.add_from_string(gender_ui_str[patient.gender]) b.add_from_string(gender_ui_str[patient.gender])
@ -131,8 +191,17 @@ def patient_filter_func(row):
return True return True
return row.props.db_id in patient_filter.filter(fstr) return row.props.db_id in patient_filter.filter(fstr)
def redraw_reception_list(selected_date):
reception_timelist = get_reception_timelist(selected_date)
reception_list = builder.get_object('reception_list')
for d in reception_timelist:
reception_list.add(build_reception_row(d))
builder.add_from_file(main_win_file) builder.add_from_file(main_win_file)
builder.connect_signals(MainWinHandler()) builder.connect_signals(MainWinHandler())
#####
redraw_reception_list(datetime.now())
#####
patient_list = builder.get_object('patient_list') patient_list = builder.get_object('patient_list')
patient_list.set_sort_func(patient_sort_func) patient_list.set_sort_func(patient_sort_func)
patient_list.set_filter_func(patient_filter_func) patient_list.set_filter_func(patient_filter_func)

View File

@ -1,5 +1,5 @@
import os import os
from peewee import Model, CharField, BigAutoField, DateTimeField, IntegerField, fn, Field, Expression, TextField, ForeignKeyField, DateField from peewee import Model, CharField, BigAutoField, DateTimeField, IntegerField, fn, Field, Expression, TextField, ForeignKeyField, DateField, TimeField
from playhouse.sqlite_ext import CSqliteExtDatabase, FTS5Model, AutoIncrementField, SearchField, RowIDField from playhouse.sqlite_ext import CSqliteExtDatabase, FTS5Model, AutoIncrementField, SearchField, RowIDField
var_dir = os.path.join(os.path.abspath(os.environ['HOME']), '.eldoc') var_dir = os.path.join(os.path.abspath(os.environ['HOME']), '.eldoc')
@ -99,5 +99,10 @@ def update_patient_index(pat):
db.connect() db.connect()
db.create_tables([ db.create_tables([
Patient, Patient,
PatientIndex PatientIndex,
Reception,
Diagnosis,
ReceptionDiagnosis,
ReceptionAnamnesis,
AnamnesisTemplate
]) ])

View File

@ -33,7 +33,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<child> <child>
<object class="GtkBox" id="schedule_page"> <object class="GtkBox" id="reception_page">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
@ -78,7 +78,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkListBox"> <object class="GtkListBox" id="reception_list">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
</object> </object>

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="win">
<property name="can_focus">False</property>
<property name="decorated">False</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkBox" id="reception_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="hour">
<property name="width_request">35</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">3</property>
<property name="margin_right">3</property>
<property name="margin_top">3</property>
<property name="margin_bottom">3</property>
<property name="label" translatable="yes">00</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="2"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="minute">
<property name="width_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">3</property>
<property name="margin_right">3</property>
<property name="margin_top">3</property>
<property name="margin_bottom">3</property>
<property name="label" translatable="yes">00</property>
<property name="yalign">0</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="underline" value="True"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">3</property>
<property name="margin_right">3</property>
<property name="margin_top">3</property>
<property name="margin_bottom">3</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkEventBox" id="reception_cont">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>