112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
import os
|
|
from peewee import Model, CharField, DateTimeField, TextField, ForeignKeyField, DateField, fn
|
|
from playhouse.sqlite_ext import CSqliteExtDatabase, FTS5Model, AutoIncrementField, SearchField, RowIDField, JSONField
|
|
import platform
|
|
|
|
if 'windows' in platform.system().lower():
|
|
user_dir = os.path.abspath(os.environ['APPDATA'])
|
|
else:
|
|
user_dir = os.path.abspath(os.environ['HOME'])
|
|
|
|
var_dir = os.path.join(user_dir, '.eldoc')
|
|
db_dir = os.path.join(var_dir, 'db')
|
|
db_file = os.path.join(db_dir, 'eldoc.sqlite3')
|
|
|
|
if not os.path.exists(var_dir):
|
|
os.mkdir(var_dir)
|
|
if not os.path.exists(db_dir):
|
|
os.mkdir(db_dir)
|
|
|
|
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 = 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 List(BaseModel):
|
|
id = AutoIncrementField()
|
|
name = TextField()
|
|
system_id = TextField()
|
|
class ListRecord(BaseModel):
|
|
id = AutoIncrementField()
|
|
list = ForeignKeyField(List, backref='list_records', on_delete='CASCADE')
|
|
text = TextField()
|
|
class ListRecordIndex(BaseFTSModel):
|
|
rowid = RowIDField()
|
|
text = SearchField()
|
|
class Catalog(BaseModel):
|
|
id = AutoIncrementField()
|
|
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')
|
|
)
|
|
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'))
|
|
db.create_tables([
|
|
Patient,
|
|
PatientIndex,
|
|
List,
|
|
ListRecord,
|
|
ListRecordIndex,
|
|
Catalog,
|
|
CatalogIndex,
|
|
CatalogRecord,
|
|
CatalogRecordIndex,
|
|
Reception,
|
|
ReceptionDiagnosis,
|
|
ReceptionAnamnesis,
|
|
Settings
|
|
])
|