endoreg-db 0.3.3__py3-none-any.whl → 0.3.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- endoreg_db/data/__init__.py +50 -1
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +8 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +6 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/event/cardiology.yaml +28 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +49 -0
- endoreg_db/data/gender/data.yaml +18 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +31 -0
- endoreg_db/data/lab_value/coagulation.yaml +49 -0
- endoreg_db/data/lab_value/electrolytes.yaml +190 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +121 -0
- endoreg_db/data/lab_value/hematology.yaml +169 -0
- endoreg_db/data/lab_value/hormones.yaml +53 -0
- endoreg_db/data/lab_value/lipids.yaml +44 -0
- endoreg_db/data/lab_value/misc.yaml +30 -0
- endoreg_db/data/lab_value/renal_function.yaml +11 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +120 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +92 -0
- endoreg_db/data/unit/length.yaml +4 -4
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +13 -0
- endoreg_db/data/unit/volume.yaml +13 -4
- endoreg_db/data/unit/weight.yaml +11 -4
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/forms/__init__.py +2 -1
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/management/commands/load_base_db_data.py +58 -1
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +40 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_g_play_data.py +113 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +133 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +41 -0
- endoreg_db/management/commands/load_medication_indication_data.py +63 -0
- endoreg_db/management/commands/load_medication_indication_type_data.py +41 -0
- endoreg_db/management/commands/load_medication_intake_time_data.py +41 -0
- endoreg_db/management/commands/load_medication_schedule_data.py +55 -0
- endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +59 -0
- endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +27 -0
- endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +42 -0
- endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +166 -0
- endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +38 -0
- endoreg_db/migrations/0028_alter_unit_abbreviation.py +18 -0
- endoreg_db/migrations/0029_medicationintaketime_and_more.py +75 -0
- endoreg_db/migrations/0030_medicationindicationtype_and_more.py +101 -0
- endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +38 -0
- endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +18 -0
- endoreg_db/migrations/0033_medicationindication_sources.py +18 -0
- endoreg_db/migrations/0034_alter_rawpdffile_file.py +20 -0
- endoreg_db/migrations/0035_alter_medicationindication_sources.py +18 -0
- endoreg_db/migrations/0036_alter_rawpdffile_file.py +20 -0
- endoreg_db/migrations/0037_alter_medicationindication_sources.py +18 -0
- endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +164 -0
- endoreg_db/migrations/0039_referenceproduct_name.py +19 -0
- endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +50 -0
- endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +40 -0
- endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +74 -0
- endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +23 -0
- endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +23 -0
- endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +19 -0
- endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +18 -0
- endoreg_db/migrations/0047_casetemplaterule_target_model.py +18 -0
- endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +22 -0
- endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +17 -0
- endoreg_db/migrations/0050_casetemplaterule_rule_values.py +18 -0
- endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +27 -0
- endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +18 -0
- endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +38 -0
- endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +69 -0
- endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +59 -0
- endoreg_db/migrations/0056_datevaluedistribution_and_more.py +32 -0
- endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +72 -0
- endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +28 -0
- endoreg_db/migrations/0059_casetemplaterule_rule_values.py +18 -0
- endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +44 -0
- endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +24 -0
- endoreg_db/migrations/0062_labvalue_numeric_precision.py +18 -0
- endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +18 -0
- endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +23 -0
- endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +58 -0
- endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +29 -0
- endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +19 -0
- endoreg_db/models/__init__.py +30 -11
- endoreg_db/models/case_template/__init__.py +6 -0
- endoreg_db/models/case_template/case_template.py +81 -0
- endoreg_db/models/case_template/case_template_rule.py +276 -0
- endoreg_db/models/case_template/case_template_rule_value.py +73 -0
- endoreg_db/models/case_template/case_template_type.py +28 -0
- endoreg_db/models/center/__init__.py +4 -0
- endoreg_db/models/center/center_product.py +34 -0
- endoreg_db/models/center/center_resource.py +19 -0
- endoreg_db/models/center/center_waste.py +11 -0
- endoreg_db/models/data_file/import_classes/raw_pdf.py +4 -1
- endoreg_db/models/data_file/metadata/video_meta.py +4 -3
- endoreg_db/models/disease.py +56 -0
- endoreg_db/models/emission/__init__.py +1 -0
- endoreg_db/models/emission/emission_factor.py +20 -0
- endoreg_db/models/event.py +22 -0
- endoreg_db/models/information_source.py +7 -0
- endoreg_db/models/laboratory/__init__.py +1 -0
- endoreg_db/models/laboratory/lab_value.py +102 -0
- endoreg_db/models/medication/__init__.py +1 -0
- endoreg_db/models/medication/medication.py +148 -0
- endoreg_db/models/other/__init__.py +5 -0
- endoreg_db/models/other/distribution.py +215 -0
- endoreg_db/models/other/material.py +16 -0
- endoreg_db/models/other/resource.py +18 -0
- endoreg_db/models/other/transport_route.py +21 -0
- endoreg_db/models/other/waste.py +20 -0
- endoreg_db/models/persons/__init__.py +3 -2
- endoreg_db/models/persons/gender.py +22 -0
- endoreg_db/models/persons/patient/__init__.py +8 -0
- endoreg_db/models/persons/patient/case/__init__.py +0 -0
- endoreg_db/models/persons/patient/case/case.py +30 -0
- endoreg_db/models/persons/patient/patient.py +216 -0
- endoreg_db/models/persons/patient/patient_disease.py +16 -0
- endoreg_db/models/persons/patient/patient_event.py +22 -0
- endoreg_db/models/persons/patient/patient_lab_sample.py +106 -0
- endoreg_db/models/persons/patient/patient_lab_value.py +176 -0
- endoreg_db/models/persons/patient/patient_medication.py +44 -0
- endoreg_db/models/persons/patient/patient_medication_schedule.py +28 -0
- endoreg_db/models/persons/person.py +1 -4
- endoreg_db/models/persons/portal_user_information.py +0 -2
- endoreg_db/models/product/__init__.py +5 -0
- endoreg_db/models/product/product.py +97 -0
- endoreg_db/models/product/product_group.py +19 -0
- endoreg_db/models/product/product_material.py +24 -0
- endoreg_db/models/product/product_weight.py +26 -0
- endoreg_db/models/product/reference_product.py +99 -0
- endoreg_db/models/questionnaires/__init__.py +114 -0
- endoreg_db/models/quiz/__init__.py +2 -0
- endoreg_db/models/quiz/quiz_answer.py +41 -0
- endoreg_db/models/quiz/quiz_question.py +54 -0
- endoreg_db/models/rules/__init__.py +5 -0
- endoreg_db/models/rules/rule.py +24 -0
- endoreg_db/models/rules/rule_applicator.py +224 -0
- endoreg_db/models/rules/rule_attribute_dtype.py +19 -0
- endoreg_db/models/rules/rule_type.py +22 -0
- endoreg_db/models/rules/ruleset.py +19 -0
- endoreg_db/models/unit.py +6 -4
- endoreg_db/utils/dataloader.py +13 -106
- {endoreg_db-0.3.3.dist-info → endoreg_db-0.3.5.dist-info}/METADATA +1 -1
- endoreg_db-0.3.5.dist-info/RECORD +357 -0
- {endoreg_db-0.3.3.dist-info → endoreg_db-0.3.5.dist-info}/WHEEL +1 -1
- endoreg_db/models/persons/patient.py +0 -58
- endoreg_db/models.py +0 -3
- endoreg_db-0.3.3.dist-info/RECORD +0 -180
- /endoreg_db/models/{center.py → center/center.py} +0 -0
- {endoreg_db-0.3.3.dist-info → endoreg_db-0.3.5.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class CaseTemplateRuleValueTypeManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class CaseTemplateRuleValueType(models.Model):
|
|
8
|
+
"""
|
|
9
|
+
A class representing a case template rule value type.
|
|
10
|
+
|
|
11
|
+
Attributes:
|
|
12
|
+
name (str): The name of the case template rule value type.
|
|
13
|
+
distribution_type: One of "single_categorical", "multiple_categorical", "numeric"
|
|
14
|
+
description (str): A description of the case template rule value type.
|
|
15
|
+
"""
|
|
16
|
+
DISTRIBUTION_TYPES = [
|
|
17
|
+
("single_categorical", "single_categorical"),
|
|
18
|
+
("multiple_categorical", "multiple_categorical"),
|
|
19
|
+
("numeric", "numeric")
|
|
20
|
+
]
|
|
21
|
+
objects = CaseTemplateRuleValueTypeManager()
|
|
22
|
+
|
|
23
|
+
name = models.CharField(max_length=255)
|
|
24
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
25
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
26
|
+
description = models.TextField(blank=True, null=True)
|
|
27
|
+
|
|
28
|
+
distribution_type = models.CharField(max_length=255, choices=DISTRIBUTION_TYPES)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def natural_key(self):
|
|
32
|
+
return (self.name,)
|
|
33
|
+
|
|
34
|
+
def __str__(self):
|
|
35
|
+
return self.name
|
|
36
|
+
|
|
37
|
+
class CaseTemplateRuleValueManager(models.Manager):
|
|
38
|
+
def get_by_natural_key(self, name):
|
|
39
|
+
return self.get(name=name)
|
|
40
|
+
|
|
41
|
+
class CaseTemplateRuleValue(models.Model):
|
|
42
|
+
"""
|
|
43
|
+
A class representing a case template rule value.
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
value (str): The value of the case template rule value.
|
|
47
|
+
case_template_rule (CaseTemplateRule): The case template rule of the case template rule value.
|
|
48
|
+
case_template (CaseTemplate): The case template of the case template rule value.
|
|
49
|
+
"""
|
|
50
|
+
objects = CaseTemplateRuleValueManager()
|
|
51
|
+
|
|
52
|
+
name = models.CharField(max_length=255)
|
|
53
|
+
description = models.TextField(blank=True, null=True)
|
|
54
|
+
|
|
55
|
+
fk_value = models.CharField(max_length=255, null=True, blank=True)
|
|
56
|
+
numeric_value = models.FloatField(null=True, blank=True)
|
|
57
|
+
text_value = models.CharField(max_length=255, null=True, blank=True)
|
|
58
|
+
|
|
59
|
+
def natural_key(self):
|
|
60
|
+
return (self.name,)
|
|
61
|
+
|
|
62
|
+
def __str__(self):
|
|
63
|
+
return self.name
|
|
64
|
+
|
|
65
|
+
def get_value(self):
|
|
66
|
+
if self.fk_value:
|
|
67
|
+
return self.fk_value
|
|
68
|
+
elif self.numeric_value:
|
|
69
|
+
return self.numeric_value
|
|
70
|
+
elif self.text_value:
|
|
71
|
+
return self.text_value
|
|
72
|
+
else:
|
|
73
|
+
return None
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class CaseTemplateTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
class CaseTemplateType(models.Model):
|
|
9
|
+
"""
|
|
10
|
+
A class representing a case template type.
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
name (str): The name of the case template type.
|
|
14
|
+
description (str): A description of the case template type.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
name = models.CharField(max_length=255)
|
|
18
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
19
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
20
|
+
description = models.TextField(blank=True, null=True)
|
|
21
|
+
|
|
22
|
+
objects = CaseTemplateTypeManager()
|
|
23
|
+
|
|
24
|
+
def natural_key(self):
|
|
25
|
+
return (self.name,)
|
|
26
|
+
|
|
27
|
+
def __str__(self):
|
|
28
|
+
return self.name
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from itertools import product
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
class CenterProduct(models.Model):
|
|
5
|
+
product = models.ForeignKey("Product", on_delete=models.CASCADE)
|
|
6
|
+
date_used = models.DateField()
|
|
7
|
+
center = models.ForeignKey("Center", on_delete=models.CASCADE)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_product_group(self):
|
|
11
|
+
product = self.product
|
|
12
|
+
product_group = product.product_group
|
|
13
|
+
|
|
14
|
+
return product_group
|
|
15
|
+
|
|
16
|
+
def get_reference_product(self):
|
|
17
|
+
product_group = self.get_product_group()
|
|
18
|
+
reference_product = product_group.reference_product
|
|
19
|
+
|
|
20
|
+
return reference_product
|
|
21
|
+
|
|
22
|
+
def get_product_weight(self):
|
|
23
|
+
product = self.product
|
|
24
|
+
weight, unit = product.get_product_weight()
|
|
25
|
+
|
|
26
|
+
return weight, unit
|
|
27
|
+
|
|
28
|
+
def get_package_weight(self):
|
|
29
|
+
product = self.product
|
|
30
|
+
weight, unit = product.get_package_weight()
|
|
31
|
+
|
|
32
|
+
return weight, unit
|
|
33
|
+
|
|
34
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from os import name
|
|
2
|
+
from django.db import models
|
|
3
|
+
|
|
4
|
+
class CenterResource(models.Model):
|
|
5
|
+
name = models.CharField(max_length=255, null=True)
|
|
6
|
+
center = models.ForeignKey("Center", on_delete=models.CASCADE)
|
|
7
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
8
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
9
|
+
quantity = models.FloatField()
|
|
10
|
+
resource = models.ForeignKey("Resource", on_delete=models.CASCADE)
|
|
11
|
+
transport_emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True,
|
|
12
|
+
related_name="center_resource_transport_emission_factor")
|
|
13
|
+
use_emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True,
|
|
14
|
+
related_name="center_resource_use_emission_factor")
|
|
15
|
+
year = models.IntegerField()
|
|
16
|
+
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
17
|
+
|
|
18
|
+
def __str__(self):
|
|
19
|
+
return self.center.name + " - " + self.resource.name + " (" + str(self.year) + ")"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class CenterWaste(models.Model):
|
|
4
|
+
center = models.ForeignKey("Center", on_delete=models.CASCADE)
|
|
5
|
+
year = models.IntegerField()
|
|
6
|
+
waste = models.ForeignKey("Waste", on_delete=models.CASCADE)
|
|
7
|
+
quantity = models.FloatField()
|
|
8
|
+
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
9
|
+
emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
|
|
10
|
+
|
|
11
|
+
|
|
@@ -25,11 +25,14 @@ logger = logging.getLogger('pdf_import')
|
|
|
25
25
|
|
|
26
26
|
import shutil
|
|
27
27
|
|
|
28
|
+
# get pdf location from settings, default to ~/erc_data/raw_pdf and create if not exists
|
|
29
|
+
PSEUDO_DIR_RAW_PDF = getattr(settings, 'PSEUDO_DIR_RAW_PDF', settings.BASE_DIR / 'erc_data/raw_pdf')
|
|
30
|
+
|
|
28
31
|
class RawPdfFile(models.Model):
|
|
29
32
|
file = models.FileField(
|
|
30
33
|
upload_to='raw_pdf/',
|
|
31
34
|
validators=[FileExtensionValidator(allowed_extensions=['pdf'])],
|
|
32
|
-
storage=FileSystemStorage(location=
|
|
35
|
+
storage=FileSystemStorage(location=PSEUDO_DIR_RAW_PDF.resolve().as_posix()),
|
|
33
36
|
)
|
|
34
37
|
|
|
35
38
|
pdf_hash = models.CharField(max_length=255, unique=True)
|
|
@@ -79,9 +79,10 @@ class FFMpegMeta(models.Model):
|
|
|
79
79
|
def create_from_file(cls, file_path: Path):
|
|
80
80
|
"""Creates an FFMpegMeta instance from a video file using ffmpeg probe."""
|
|
81
81
|
try:
|
|
82
|
-
probe = ffmpeg.probe(
|
|
83
|
-
except ffmpeg.Error as e:
|
|
84
|
-
print(e.stderr)
|
|
82
|
+
probe = ffmpeg.probe(file_path.resolve().as_posix())
|
|
83
|
+
except: # ffmpeg.Error as e:
|
|
84
|
+
# print(e.stderr)
|
|
85
|
+
print(f"Error while probing {file_path}")
|
|
85
86
|
return None
|
|
86
87
|
|
|
87
88
|
video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class DiseaseManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class Disease(models.Model):
|
|
8
|
+
name = models.CharField(max_length=255, unique=True)
|
|
9
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
10
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
11
|
+
|
|
12
|
+
objects = DiseaseManager()
|
|
13
|
+
|
|
14
|
+
def natural_key(self):
|
|
15
|
+
return (self.name,)
|
|
16
|
+
|
|
17
|
+
def __str__(self):
|
|
18
|
+
return self.name
|
|
19
|
+
|
|
20
|
+
class DiseaseClassificationManager(models.Manager):
|
|
21
|
+
def get_by_natural_key(self, name):
|
|
22
|
+
return self.get(name=name)
|
|
23
|
+
|
|
24
|
+
class DiseaseClassification(models.Model):
|
|
25
|
+
name = models.CharField(max_length=255, unique=True)
|
|
26
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
27
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
28
|
+
|
|
29
|
+
disease = models.ForeignKey(Disease, on_delete=models.CASCADE)
|
|
30
|
+
|
|
31
|
+
objects = DiseaseClassificationManager()
|
|
32
|
+
|
|
33
|
+
def natural_key(self):
|
|
34
|
+
return (self.name,)
|
|
35
|
+
|
|
36
|
+
def __str__(self):
|
|
37
|
+
return self.name
|
|
38
|
+
|
|
39
|
+
class DiseaseClassificationChoiceManager(models.Manager):
|
|
40
|
+
def get_by_natural_key(self, name):
|
|
41
|
+
return self.get(name=name)
|
|
42
|
+
|
|
43
|
+
class DiseaseClassificationChoice(models.Model):
|
|
44
|
+
name = models.CharField(max_length=255, unique=True)
|
|
45
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
46
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
47
|
+
|
|
48
|
+
disease_classification = models.ForeignKey(DiseaseClassification, on_delete=models.CASCADE)
|
|
49
|
+
|
|
50
|
+
objects = DiseaseClassificationChoiceManager()
|
|
51
|
+
|
|
52
|
+
def natural_key(self):
|
|
53
|
+
return (self.name,)
|
|
54
|
+
|
|
55
|
+
def __str__(self):
|
|
56
|
+
return self.name
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .emission_factor import EmissionFactor
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class EmissionFactorManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class EmissionFactor(models.Model):
|
|
8
|
+
objects = EmissionFactorManager()
|
|
9
|
+
|
|
10
|
+
name = models.CharField(max_length=255)
|
|
11
|
+
name_de = models.CharField(max_length=255, null=True)
|
|
12
|
+
name_en = models.CharField(max_length=255, null=True)
|
|
13
|
+
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
14
|
+
value = models.FloatField()
|
|
15
|
+
|
|
16
|
+
def natural_key(self):
|
|
17
|
+
return (self.name,)
|
|
18
|
+
|
|
19
|
+
def __str__(self):
|
|
20
|
+
return self.name
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class Event(models.Model):
|
|
4
|
+
"""
|
|
5
|
+
A class representing an event.
|
|
6
|
+
|
|
7
|
+
Attributes:
|
|
8
|
+
name (str): The name of the event.
|
|
9
|
+
name_de (str): The German name of the event.
|
|
10
|
+
name_en (str): The English name of the event.
|
|
11
|
+
description (str): A description of the event.
|
|
12
|
+
"""
|
|
13
|
+
name = models.CharField(max_length=100, unique=True)
|
|
14
|
+
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
15
|
+
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
16
|
+
description = models.TextField(blank=True, null=True)
|
|
17
|
+
|
|
18
|
+
def natural_key(self):
|
|
19
|
+
return (self.name,)
|
|
20
|
+
|
|
21
|
+
def __str__(self):
|
|
22
|
+
return self.name
|
|
@@ -18,5 +18,12 @@ class InformationSource(models.Model):
|
|
|
18
18
|
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
19
19
|
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
20
20
|
|
|
21
|
+
url = models.URLField(blank=True, null=True)
|
|
22
|
+
description = models.TextField(blank=True, null=True)
|
|
23
|
+
date = models.DateField(blank=True, null=True)
|
|
24
|
+
|
|
25
|
+
def natural_key(self):
|
|
26
|
+
return (self.name,)
|
|
27
|
+
|
|
21
28
|
def __str__(self):
|
|
22
29
|
return self.name
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .lab_value import LabValue
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
import warnings
|
|
3
|
+
|
|
4
|
+
LANG = "de"
|
|
5
|
+
|
|
6
|
+
class LabValueManager(models.Manager):
|
|
7
|
+
def get_by_natural_key(self, name):
|
|
8
|
+
return self.get(name=name)
|
|
9
|
+
|
|
10
|
+
class LabValue(models.Model):
|
|
11
|
+
name = models.CharField(max_length=255, unique=True)
|
|
12
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
13
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
14
|
+
abbreviation = models.CharField(max_length=10, blank=True, null=True)
|
|
15
|
+
default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE, blank=True, null=True)
|
|
16
|
+
numeric_precision = models.IntegerField(default=3)
|
|
17
|
+
default_single_categorical_value_distribution = models.ForeignKey(
|
|
18
|
+
'SingleCategoricalValueDistribution',
|
|
19
|
+
on_delete=models.CASCADE,
|
|
20
|
+
blank=True, null=True,
|
|
21
|
+
related_name='default_single_categorical_value_distribution'
|
|
22
|
+
)
|
|
23
|
+
default_numerical_value_distribution = models.ForeignKey(
|
|
24
|
+
'NumericValueDistribution',
|
|
25
|
+
on_delete=models.CASCADE,
|
|
26
|
+
blank=True, null=True,
|
|
27
|
+
related_name='default_numerical_value_distribution'
|
|
28
|
+
)
|
|
29
|
+
default_multiple_categorical_value_distribution = models.ForeignKey(
|
|
30
|
+
'MultipleCategoricalValueDistribution',
|
|
31
|
+
on_delete=models.CASCADE,
|
|
32
|
+
blank=True, null=True,
|
|
33
|
+
related_name='default_multiple_categorical_value_distribution'
|
|
34
|
+
)
|
|
35
|
+
default_date_value_distribution = models.ForeignKey(
|
|
36
|
+
'DateValueDistribution',
|
|
37
|
+
on_delete=models.CASCADE,
|
|
38
|
+
blank=True, null=True,
|
|
39
|
+
related_name='default_date_value_distribution'
|
|
40
|
+
)
|
|
41
|
+
default_normal_range = models.JSONField(blank=True, null=True)
|
|
42
|
+
normal_range_age_dependent = models.BooleanField(default=False)
|
|
43
|
+
normal_range_gender_dependent = models.BooleanField(default=False)
|
|
44
|
+
normal_range_special_case = models.BooleanField(default=False)
|
|
45
|
+
objects = LabValueManager()
|
|
46
|
+
|
|
47
|
+
def natural_key(self):
|
|
48
|
+
return (self.name,)
|
|
49
|
+
|
|
50
|
+
def __str__(self):
|
|
51
|
+
return self.name
|
|
52
|
+
|
|
53
|
+
def get_default_default_distribution(self):
|
|
54
|
+
if self.default_single_categorical_value_distribution:
|
|
55
|
+
return self.default_single_categorical_value_distribution
|
|
56
|
+
elif self.default_numerical_value_distribution:
|
|
57
|
+
return self.default_numerical_value_distribution
|
|
58
|
+
elif self.default_multiple_categorical_value_distribution:
|
|
59
|
+
return self.default_multiple_categorical_value_distribution
|
|
60
|
+
elif self.default_date_value_distribution:
|
|
61
|
+
return self.default_date_value_distribution
|
|
62
|
+
else:
|
|
63
|
+
warnings.warn("No default distribution set for lab value")
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
def get_normal_range(self, age=None, gender=None):
|
|
67
|
+
age_dependent = self.normal_range_age_dependent
|
|
68
|
+
gender_dependent = self.normal_range_gender_dependent
|
|
69
|
+
special_case = self.normal_range_special_case
|
|
70
|
+
|
|
71
|
+
min_value = None
|
|
72
|
+
max_value = None
|
|
73
|
+
|
|
74
|
+
if not age_dependent and \
|
|
75
|
+
not gender_dependent and \
|
|
76
|
+
not special_case:
|
|
77
|
+
min_value = self.default_normal_range.get('min', None)
|
|
78
|
+
max_value = self.default_normal_range.get('max', None)
|
|
79
|
+
|
|
80
|
+
if age_dependent:
|
|
81
|
+
# get normal range for age)
|
|
82
|
+
warnings.warn("Age dependent normal range not implemented yet")
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
if gender_dependent:
|
|
86
|
+
if not gender:
|
|
87
|
+
warnings.warn("Calling get_normal_range with gender_dependent=True requires gender to be set, choosing by random")
|
|
88
|
+
# set gender to either "male" or "female"
|
|
89
|
+
from random import choice
|
|
90
|
+
choices = ["male", "female"]
|
|
91
|
+
gender = choice(choices)
|
|
92
|
+
|
|
93
|
+
default_range_dict = self.default_normal_range.get(gender, {})
|
|
94
|
+
min_value = default_range_dict.get('min', None)
|
|
95
|
+
max_value = default_range_dict.get('max', None)
|
|
96
|
+
|
|
97
|
+
if special_case:
|
|
98
|
+
# get normal range for special case
|
|
99
|
+
warnings.warn("Special case normal range not implemented yet")
|
|
100
|
+
|
|
101
|
+
return min_value, max_value
|
|
102
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .medication import *
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class MedicationManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class Medication(models.Model):
|
|
8
|
+
name = models.CharField(max_length=255, unique=True)
|
|
9
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
10
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
11
|
+
adapt_to_renal_function = models.BooleanField(default = False)
|
|
12
|
+
adapt_to_hepatic_function = models.BooleanField(default=False)
|
|
13
|
+
adapt_to_indication = models.BooleanField(default=False)
|
|
14
|
+
adapt_to_age = models.BooleanField(default=False)
|
|
15
|
+
adapt_to_weight = models.BooleanField(default=False)
|
|
16
|
+
adapt_to_risk = models.BooleanField(default=False)
|
|
17
|
+
default_unit = models.ForeignKey('Unit', on_delete=models.CASCADE)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
objects = MedicationManager()
|
|
21
|
+
|
|
22
|
+
def natural_key(self):
|
|
23
|
+
return (self.name,)
|
|
24
|
+
|
|
25
|
+
def __str__(self):
|
|
26
|
+
return self.name
|
|
27
|
+
|
|
28
|
+
class MedicationScheduleManager(models.Manager):
|
|
29
|
+
def get_by_natural_key(self, name):
|
|
30
|
+
return self.get(name=name)
|
|
31
|
+
|
|
32
|
+
class MedicationSchedule(models.Model):
|
|
33
|
+
name = models.CharField(max_length=255)
|
|
34
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
35
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
36
|
+
description = models.TextField(blank=True, null=True)
|
|
37
|
+
medication = models.ForeignKey("Medication", on_delete=models.CASCADE)
|
|
38
|
+
unit = models.ForeignKey("Unit", on_delete=models.CASCADE)
|
|
39
|
+
therapy_duration_d = models.FloatField(blank=True, null=True)
|
|
40
|
+
dose = models.FloatField()
|
|
41
|
+
intake_times = models.ManyToManyField(
|
|
42
|
+
"MedicationIntakeTime",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
objects = MedicationScheduleManager()
|
|
46
|
+
|
|
47
|
+
def natural_key(self):
|
|
48
|
+
return (self.name,)
|
|
49
|
+
|
|
50
|
+
def __str__(self):
|
|
51
|
+
return self.name
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class MedicationIntakeTimeManager(models.Manager):
|
|
55
|
+
def get_by_natural_key(self, name):
|
|
56
|
+
return self.get(name=name)
|
|
57
|
+
|
|
58
|
+
class MedicationIntakeTime(models.Model):
|
|
59
|
+
name = models.CharField(max_length=255)
|
|
60
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
61
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
62
|
+
repeats = models.CharField(max_length=20, default = "daily")
|
|
63
|
+
time = models.TimeField()
|
|
64
|
+
|
|
65
|
+
objects = MedicationIntakeTimeManager()
|
|
66
|
+
|
|
67
|
+
def natural_key(self):
|
|
68
|
+
return (self.name,)
|
|
69
|
+
|
|
70
|
+
def __str__(self):
|
|
71
|
+
return self.name
|
|
72
|
+
|
|
73
|
+
# IMPLEMENT MEDICATION INDICATION TYPE
|
|
74
|
+
class MedicationIndicationTypeManager(models.Manager):
|
|
75
|
+
def get_by_natural_key(self, name):
|
|
76
|
+
return self.get(name=name)
|
|
77
|
+
|
|
78
|
+
class MedicationIndicationType(models.Model):
|
|
79
|
+
name = models.CharField(max_length=255, unique=True)
|
|
80
|
+
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
81
|
+
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
82
|
+
|
|
83
|
+
objects = MedicationIndicationTypeManager()
|
|
84
|
+
|
|
85
|
+
def natural_key(self):
|
|
86
|
+
return (self.name,)
|
|
87
|
+
|
|
88
|
+
def __str__(self):
|
|
89
|
+
return self.name
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def get_random_indication_by_type(cls, name) -> "MedicationIndication":
|
|
93
|
+
return cls.objects.get(name=name).medication_indications.order_by('?').first()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def get_random_medication_indication(self):
|
|
97
|
+
from endoreg_db.models import MedicationIndication
|
|
98
|
+
return MedicationIndication.objects.filter(indication_type=self).order_by('?').first()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class MedicationIndicationManager(models.Manager):
|
|
102
|
+
def get_by_natural_key(self, name):
|
|
103
|
+
return self.get(name=name)
|
|
104
|
+
|
|
105
|
+
class MedicationIndication(models.Model):
|
|
106
|
+
name = models.CharField(max_length=255, unique=True)
|
|
107
|
+
indication_type = models.ForeignKey(
|
|
108
|
+
"MedicationIndicationType", on_delete=models.CASCADE, related_name="medication_indications"
|
|
109
|
+
)
|
|
110
|
+
medication_schedules = models.ManyToManyField(
|
|
111
|
+
"MedicationSchedule"
|
|
112
|
+
)
|
|
113
|
+
diseases = models.ManyToManyField(
|
|
114
|
+
"Disease"
|
|
115
|
+
)
|
|
116
|
+
events = models.ManyToManyField(
|
|
117
|
+
"Event"
|
|
118
|
+
)
|
|
119
|
+
classification_choices = models.ManyToManyField(
|
|
120
|
+
"DiseaseClassificationChoice"
|
|
121
|
+
)
|
|
122
|
+
sources = models.ManyToManyField(
|
|
123
|
+
"InformationSource"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def get_indication_links(self):
|
|
127
|
+
links = {
|
|
128
|
+
"medication_schedules": self.medication_schedules,
|
|
129
|
+
"diseases": self.diseases,
|
|
130
|
+
"events": self.events,
|
|
131
|
+
"classification_choices": self.classification_choices
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
objects = MedicationIndicationManager()
|
|
135
|
+
|
|
136
|
+
def natural_key(self):
|
|
137
|
+
return (self.name,)
|
|
138
|
+
|
|
139
|
+
def __str__(self):
|
|
140
|
+
return self.name
|
|
141
|
+
|
|
142
|
+
def create_patient_medication_schedules(self, patient):
|
|
143
|
+
from endoreg_db.models import PatientMedicationSchedule
|
|
144
|
+
for medication_schedule in self.medication_schedules.all():
|
|
145
|
+
PatientMedicationSchedule.objects.create(
|
|
146
|
+
patient=patient,
|
|
147
|
+
medication_schedule=medication_schedule
|
|
148
|
+
)
|