endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.9__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.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/authz/auth.py +74 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +18 -0
- endoreg_db/authz/middleware.py +83 -0
- endoreg_db/authz/permissions.py +127 -0
- endoreg_db/authz/policy.py +218 -0
- endoreg_db/authz/views_auth.py +66 -0
- endoreg_db/config/env.py +13 -8
- endoreg_db/data/__init__.py +2 -11
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +3 -3
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +114 -14
- endoreg_db/data/examination/time-type/data.yaml +0 -3
- endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/{yes_no_na.yaml → 00_generic.yaml} +5 -1
- endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
- endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
- endoreg_db/data/finding_classification_choice/{colonoscopy_not_complete_reason.yaml → 02_colonoscopy_generic.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{colonoscopy_location.yaml → 02_colonoscopy_location.yaml} +23 -4
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/{colon_lesion_paris.yaml → 02_colonoscopy_polyp_morphology.yaml} +26 -8
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_type/data.yaml +8 -12
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +29 -12
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/{endoscopy_bleeding_risk.yaml → 02_endoscopy_bleeding_risk.yaml} +0 -6
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set_type/data.yaml +21 -0
- endoreg_db/data/setup_config.yaml +4 -4
- endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
- endoreg_db/exceptions.py +4 -2
- endoreg_db/forms/examination_form.py +1 -1
- endoreg_db/helpers/data_loader.py +125 -53
- endoreg_db/helpers/default_objects.py +116 -81
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +81 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +43 -0
- endoreg_db/import_files/context/validate_directories.py +56 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +76 -0
- endoreg_db/import_files/file_storage/create_video_file.py +75 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
- endoreg_db/import_files/file_storage/state_management.py +400 -0
- endoreg_db/import_files/file_storage/storage.py +36 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +94 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +119 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
- endoreg_db/import_files/report_import_service.py +141 -0
- endoreg_db/import_files/video_import_service.py +150 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
- endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
- endoreg_db/management/commands/import_report.py +130 -65
- endoreg_db/management/commands/import_video.py +9 -10
- endoreg_db/management/commands/import_video_with_classification.py +2 -2
- endoreg_db/management/commands/list_routes.py +18 -0
- endoreg_db/management/commands/load_ai_model_data.py +5 -5
- endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
- endoreg_db/management/commands/load_base_db_data.py +5 -134
- endoreg_db/management/commands/load_center_data.py +12 -12
- endoreg_db/management/commands/load_contraindication_data.py +14 -16
- endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
- endoreg_db/management/commands/load_disease_classification_data.py +15 -18
- endoreg_db/management/commands/load_disease_data.py +25 -28
- endoreg_db/management/commands/load_endoscope_data.py +20 -27
- endoreg_db/management/commands/load_event_data.py +14 -16
- endoreg_db/management/commands/load_examination_data.py +31 -44
- endoreg_db/management/commands/load_examination_indication_data.py +20 -21
- endoreg_db/management/commands/load_finding_data.py +52 -80
- endoreg_db/management/commands/load_information_source.py +21 -23
- endoreg_db/management/commands/load_lab_value_data.py +17 -26
- endoreg_db/management/commands/load_medication_data.py +13 -12
- endoreg_db/management/commands/load_organ_data.py +15 -19
- endoreg_db/management/commands/load_pdf_type_data.py +19 -18
- endoreg_db/management/commands/load_profession_data.py +14 -17
- endoreg_db/management/commands/load_qualification_data.py +20 -23
- endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
- endoreg_db/management/commands/load_requirement_data.py +62 -39
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +7 -6
- endoreg_db/management/commands/load_shift_data.py +20 -23
- endoreg_db/management/commands/load_tag_data.py +8 -11
- endoreg_db/management/commands/load_unit_data.py +17 -19
- endoreg_db/management/commands/setup_endoreg_db.py +3 -3
- endoreg_db/management/commands/start_filewatcher.py +46 -37
- endoreg_db/management/commands/storage_management.py +271 -203
- endoreg_db/management/commands/validate_video_files.py +1 -5
- endoreg_db/migrations/0001_initial.py +297 -250
- endoreg_db/models/__init__.py +78 -123
- endoreg_db/models/administration/__init__.py +21 -42
- endoreg_db/models/administration/ai/active_model.py +2 -2
- endoreg_db/models/administration/ai/ai_model.py +7 -6
- endoreg_db/models/administration/case/__init__.py +1 -15
- endoreg_db/models/administration/case/case.py +3 -3
- endoreg_db/models/administration/case/case_template/__init__.py +2 -14
- endoreg_db/models/administration/case/case_template/case_template.py +2 -124
- endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
- endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
- endoreg_db/models/administration/center/center.py +33 -19
- endoreg_db/models/administration/center/center_product.py +12 -9
- endoreg_db/models/administration/center/center_resource.py +25 -19
- endoreg_db/models/administration/center/center_shift.py +21 -17
- endoreg_db/models/administration/center/center_waste.py +16 -8
- endoreg_db/models/administration/person/__init__.py +2 -0
- endoreg_db/models/administration/person/employee/employee.py +10 -5
- endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
- endoreg_db/models/administration/person/employee/employee_type.py +12 -6
- endoreg_db/models/administration/person/examiner/examiner.py +13 -11
- endoreg_db/models/administration/person/patient/__init__.py +2 -0
- endoreg_db/models/administration/person/patient/patient.py +129 -100
- endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
- endoreg_db/models/administration/person/person.py +4 -0
- endoreg_db/models/administration/person/profession/__init__.py +8 -4
- endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
- endoreg_db/models/administration/product/product.py +20 -15
- endoreg_db/models/administration/product/product_material.py +17 -18
- endoreg_db/models/administration/product/product_weight.py +12 -8
- endoreg_db/models/administration/product/reference_product.py +23 -55
- endoreg_db/models/administration/qualification/qualification.py +7 -3
- endoreg_db/models/administration/qualification/qualification_type.py +7 -3
- endoreg_db/models/administration/shift/scheduled_days.py +8 -5
- endoreg_db/models/administration/shift/shift.py +16 -12
- endoreg_db/models/administration/shift/shift_type.py +23 -31
- endoreg_db/models/label/__init__.py +8 -9
- endoreg_db/models/label/annotation/image_classification.py +10 -9
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +23 -28
- endoreg_db/models/label/label.py +15 -15
- endoreg_db/models/label/label_set.py +19 -6
- endoreg_db/models/label/label_type.py +1 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
- endoreg_db/models/label/label_video_segment/label_video_segment.py +98 -102
- endoreg_db/models/label/video_segmentation_label.py +4 -0
- endoreg_db/models/label/video_segmentation_labelset.py +4 -3
- endoreg_db/models/media/frame/frame.py +22 -22
- endoreg_db/models/media/pdf/raw_pdf.py +194 -194
- endoreg_db/models/media/pdf/report_file.py +25 -29
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +55 -47
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
- endoreg_db/models/media/processing_history/__init__.py +5 -0
- endoreg_db/models/media/processing_history/processing_history.py +96 -0
- endoreg_db/models/media/video/__init__.py +1 -0
- endoreg_db/models/media/video/create_from_file.py +139 -77
- endoreg_db/models/media/video/pipe_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +174 -112
- endoreg_db/models/media/video/video_file_ai.py +288 -74
- endoreg_db/models/media/video/video_file_anonymize.py +38 -38
- endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
- endoreg_db/models/media/video/video_file_io.py +113 -61
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
- endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
- endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
- endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
- endoreg_db/models/media/video/video_file_segments.py +24 -17
- endoreg_db/models/media/video/video_metadata.py +19 -35
- endoreg_db/models/media/video/video_processing.py +96 -95
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +13 -3
- endoreg_db/models/medical/disease.py +22 -16
- endoreg_db/models/medical/event.py +31 -18
- endoreg_db/models/medical/examination/__init__.py +13 -6
- endoreg_db/models/medical/examination/examination.py +39 -20
- endoreg_db/models/medical/examination/examination_indication.py +30 -95
- endoreg_db/models/medical/examination/examination_time.py +23 -8
- endoreg_db/models/medical/examination/examination_time_type.py +9 -6
- endoreg_db/models/medical/examination/examination_type.py +3 -4
- endoreg_db/models/medical/finding/finding.py +32 -40
- endoreg_db/models/medical/finding/finding_classification.py +42 -72
- endoreg_db/models/medical/finding/finding_intervention.py +25 -22
- endoreg_db/models/medical/finding/finding_type.py +13 -12
- endoreg_db/models/medical/hardware/endoscope.py +26 -26
- endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
- endoreg_db/models/medical/laboratory/lab_value.py +62 -91
- endoreg_db/models/medical/medication/medication.py +22 -10
- endoreg_db/models/medical/medication/medication_indication.py +29 -3
- endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
- endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
- endoreg_db/models/medical/medication/medication_schedule.py +27 -16
- endoreg_db/models/medical/organ/__init__.py +15 -12
- endoreg_db/models/medical/patient/medication_examples.py +6 -6
- endoreg_db/models/medical/patient/patient_disease.py +20 -23
- endoreg_db/models/medical/patient/patient_event.py +19 -22
- endoreg_db/models/medical/patient/patient_examination.py +48 -54
- endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
- endoreg_db/models/medical/patient/patient_finding.py +122 -139
- endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
- endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
- endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
- endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
- endoreg_db/models/medical/patient/patient_medication.py +27 -38
- endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
- endoreg_db/models/medical/risk/risk.py +7 -6
- endoreg_db/models/medical/risk/risk_type.py +8 -5
- endoreg_db/models/metadata/model_meta.py +60 -29
- endoreg_db/models/metadata/model_meta_logic.py +125 -18
- endoreg_db/models/metadata/pdf_meta.py +31 -24
- endoreg_db/models/metadata/sensitive_meta.py +105 -85
- endoreg_db/models/metadata/sensitive_meta_logic.py +198 -103
- endoreg_db/models/metadata/video_meta.py +51 -31
- endoreg_db/models/metadata/video_prediction_logic.py +16 -23
- endoreg_db/models/metadata/video_prediction_meta.py +29 -33
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
- endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
- endoreg_db/models/other/emission/emission_factor.py +18 -8
- endoreg_db/models/other/gender.py +10 -5
- endoreg_db/models/other/information_source.py +50 -29
- endoreg_db/models/other/material.py +9 -5
- endoreg_db/models/other/resource.py +6 -4
- endoreg_db/models/other/tag.py +10 -5
- endoreg_db/models/other/transport_route.py +13 -8
- endoreg_db/models/other/unit.py +10 -6
- endoreg_db/models/other/waste.py +6 -5
- endoreg_db/models/report/report.py +6 -0
- endoreg_db/models/requirement/requirement.py +329 -361
- endoreg_db/models/requirement/requirement_error.py +85 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
- endoreg_db/models/requirement/requirement_operator.py +103 -112
- endoreg_db/models/requirement/requirement_set.py +74 -57
- endoreg_db/models/state/__init__.py +4 -4
- endoreg_db/models/state/abstract.py +2 -2
- endoreg_db/models/state/anonymization.py +12 -0
- endoreg_db/models/state/audit_ledger.py +49 -51
- endoreg_db/models/state/label_video_segment.py +9 -0
- endoreg_db/models/state/raw_pdf.py +101 -68
- endoreg_db/models/state/sensitive_meta.py +6 -2
- endoreg_db/models/state/video.py +110 -90
- endoreg_db/models/upload_job.py +35 -34
- endoreg_db/models/utils.py +28 -25
- endoreg_db/queries/__init__.py +3 -1
- endoreg_db/root_urls.py +21 -2
- endoreg_db/schemas/examination_evaluation.py +1 -1
- endoreg_db/serializers/__init__.py +2 -10
- endoreg_db/serializers/anonymization.py +18 -10
- endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
- endoreg_db/serializers/meta/__init__.py +1 -6
- endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
- endoreg_db/serializers/misc/file_overview.py +11 -99
- endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
- endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
- endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
- endoreg_db/serializers/requirements/requirement_sets.py +92 -22
- endoreg_db/serializers/video/segmentation.py +2 -1
- endoreg_db/serializers/video/video_file_list.py +65 -34
- endoreg_db/serializers/video/video_processing_history.py +20 -5
- endoreg_db/services/__old/pdf_import.py +1487 -0
- endoreg_db/services/__old/video_import.py +1306 -0
- endoreg_db/services/anonymization.py +128 -89
- endoreg_db/services/lookup_service.py +65 -52
- endoreg_db/services/lookup_store.py +2 -2
- endoreg_db/services/pdf_import.py +0 -1382
- endoreg_db/services/report_import.py +10 -0
- endoreg_db/services/video_import.py +6 -1255
- endoreg_db/tasks/upload_tasks.py +79 -70
- endoreg_db/tasks/video_ingest.py +8 -4
- endoreg_db/urls/__init__.py +5 -32
- endoreg_db/urls/ai.py +32 -0
- endoreg_db/urls/media.py +121 -83
- endoreg_db/urls/root_urls.py +29 -0
- endoreg_db/utils/__init__.py +15 -5
- endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/dataloader.py +142 -40
- endoreg_db/utils/defaults/set_default_center.py +32 -0
- endoreg_db/utils/names.py +22 -16
- endoreg_db/utils/paths.py +110 -46
- endoreg_db/utils/permissions.py +2 -1
- endoreg_db/utils/pipelines/Readme.md +1 -1
- endoreg_db/utils/pipelines/process_video_dir.py +1 -1
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +655 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
- endoreg_db/utils/setup_config.py +8 -5
- endoreg_db/utils/storage.py +115 -0
- endoreg_db/utils/validate_endo_roi.py +8 -2
- endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
- endoreg_db/views/__init__.py +85 -183
- endoreg_db/views/ai/__init__.py +8 -0
- endoreg_db/views/ai/label.py +155 -0
- endoreg_db/views/anonymization/media_management.py +202 -166
- endoreg_db/views/anonymization/overview.py +99 -67
- endoreg_db/views/anonymization/validate.py +182 -44
- endoreg_db/views/media/__init__.py +7 -20
- endoreg_db/views/media/pdf_media.py +197 -174
- endoreg_db/views/media/sensitive_metadata.py +193 -138
- endoreg_db/views/media/video_media.py +89 -82
- endoreg_db/views/meta/__init__.py +0 -8
- endoreg_db/views/misc/__init__.py +1 -7
- endoreg_db/views/misc/upload_views.py +94 -93
- endoreg_db/views/patient/patient.py +5 -4
- endoreg_db/views/report/__init__.py +5 -7
- endoreg_db/views/{pdf → report}/reimport.py +22 -22
- endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +46 -39
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +17 -3
- endoreg_db/views/requirement/lookup_store.py +22 -90
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +23 -24
- endoreg_db/views/video/correction.py +201 -172
- endoreg_db/views/video/reimport.py +1 -1
- endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +77 -40
- endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
- endoreg_db/views/video/video_stream.py +7 -8
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +391 -413
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/WHEEL +1 -1
- endoreg_db/data/finding/anatomy_colon.yaml +0 -128
- endoreg_db/data/finding/colonoscopy.yaml +0 -40
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
- endoreg_db/data/finding/complication.yaml +0 -16
- endoreg_db/data/finding/data.yaml +0 -105
- endoreg_db/data/finding/examination_setting.yaml +0 -16
- endoreg_db/data/finding/medication_related.yaml +0 -18
- endoreg_db/data/finding/outcome.yaml +0 -12
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +0 -95
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -68
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -80
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
- endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
- endoreg_db/data/finding_classification/histology_colo.yaml +0 -51
- endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
- endoreg_db/data/finding_classification/medication_related.yaml +0 -23
- endoreg_db/data/finding_classification/visualized.yaml +0 -33
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
- endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
- endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
- endoreg_db/data/requirement/age.yaml +0 -26
- endoreg_db/data/requirement/gender.yaml +0 -25
- endoreg_db/management/commands/init_default_ai_model.py +0 -112
- endoreg_db/management/commands/reset_celery_schedule.py +0 -9
- endoreg_db/management/commands/validate_video.py +0 -204
- endoreg_db/migrations/0002_add_video_correction_models.py +0 -52
- endoreg_db/migrations/0003_add_center_display_name.py +0 -30
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- endoreg_db/models/rule/__init__.py +0 -13
- endoreg_db/models/rule/rule.py +0 -27
- endoreg_db/models/rule/rule_applicator.py +0 -224
- endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
- endoreg_db/models/rule/rule_type.py +0 -20
- endoreg_db/models/rule/ruleset.py +0 -17
- endoreg_db/renames.yml +0 -8
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
- endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
- endoreg_db/serializers/_old/video.py +0 -71
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
- endoreg_db/serializers/meta/report_meta.py +0 -53
- endoreg_db/serializers/report/__init__.py +0 -9
- endoreg_db/serializers/report/mixins.py +0 -45
- endoreg_db/serializers/report/report.py +0 -105
- endoreg_db/serializers/report/report_list.py +0 -22
- endoreg_db/serializers/report/secure_file_url.py +0 -26
- endoreg_db/serializers/video/video_metadata.py +0 -105
- endoreg_db/services/requirements_object.py +0 -147
- endoreg_db/services/storage_aware_video_processor.py +0 -344
- endoreg_db/urls/files.py +0 -6
- endoreg_db/urls/label_video_segment_validate.py +0 -33
- endoreg_db/urls/label_video_segments.py +0 -46
- endoreg_db/urls/report.py +0 -48
- endoreg_db/urls/video.py +0 -61
- endoreg_db/utils/case_generator/case_generator.py +0 -159
- endoreg_db/utils/case_generator/utils.py +0 -30
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +0 -368
- endoreg_db/views/label/__init__.py +0 -5
- endoreg_db/views/label/label.py +0 -15
- endoreg_db/views/label_video_segment/__init__.py +0 -16
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
- endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
- endoreg_db/views/label_video_segment/validate.py +0 -226
- endoreg_db/views/media/segments.py +0 -71
- endoreg_db/views/meta/available_files_list.py +0 -146
- endoreg_db/views/meta/report_meta.py +0 -53
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -148
- endoreg_db/views/misc/secure_file_serving_view.py +0 -80
- endoreg_db/views/misc/secure_file_url_view.py +0 -84
- endoreg_db/views/misc/secure_url_validate.py +0 -79
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
- endoreg_db/views/patient_finding_location/__init__.py +0 -5
- endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
- endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
- endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
- endoreg_db/views/pdf/__init__.py +0 -8
- endoreg_db/views/report/report_list.py +0 -112
- endoreg_db/views/report/report_with_secure_url.py +0 -28
- endoreg_db/views/report/start_examination.py +0 -7
- endoreg_db/views/video/segmentation.py +0 -274
- endoreg_db/views/video/task_status.py +0 -49
- endoreg_db/views/video/timeline.py +0 -46
- endoreg_db/views/video/video_analyze.py +0 -52
- endoreg_db/views.py +0 -0
- /endoreg_db/data/requirement/{colonoscopy_baseline_austria.yaml → old/colonoscopy_baseline_austria.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_cardiovascular.yaml → old/disease_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_classification_choice_cardiovascular.yaml → old/disease_classification_choice_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_hepatology.yaml → old/disease_hepatology.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_misc.yaml → old/disease_misc.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_renal.yaml → old/disease_renal.yaml} +0 -0
- /endoreg_db/data/requirement/{endoscopy_bleeding_risk.yaml → old/endoscopy_bleeding_risk.yaml} +0 -0
- /endoreg_db/data/requirement/{event_cardiology.yaml → old/event_cardiology.yaml} +0 -0
- /endoreg_db/data/requirement/{event_requirements.yaml → old/event_requirements.yaml} +0 -0
- /endoreg_db/data/requirement/{finding_colon_polyp.yaml → old/finding_colon_polyp.yaml} +0 -0
- /endoreg_db/{migrations/__init__.py → data/requirement/old/gender.yaml} +0 -0
- /endoreg_db/data/requirement/{lab_value.yaml → old/lab_value.yaml} +0 -0
- /endoreg_db/data/requirement/{medication.yaml → old/medication.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{age.yaml → _old/age.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{lab_operators.yaml → _old/lab_operators.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{model_operators.yaml → _old/model_operators.yaml} +0 -0
- /endoreg_db/{models/media/video/refactor_plan.md → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/{models/media/video/video_file_frames.py → import_files/pseudonymization/pseudonymize.py} +0 -0
- /endoreg_db/models/{metadata/frame_ocr_result.py → report/__init__.py} +0 -0
- /endoreg_db/{urls/sensitive_meta.py → models/report/images.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,39 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"""Model for medication indication type."""
|
|
2
|
+
|
|
3
3
|
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
|
+
from django.db import models
|
|
6
|
+
|
|
5
7
|
if TYPE_CHECKING:
|
|
6
8
|
from endoreg_db.models import MedicationIndication
|
|
7
9
|
|
|
10
|
+
|
|
8
11
|
class MedicationIndicationTypeManager(models.Manager):
|
|
9
|
-
|
|
12
|
+
"""Manager for the medication indication type model."""
|
|
13
|
+
|
|
10
14
|
def get_by_natural_key(self, name):
|
|
11
|
-
|
|
15
|
+
"""Retrieve a medication indication type by its natural key."""
|
|
12
16
|
return self.get(name=name)
|
|
13
17
|
|
|
18
|
+
|
|
14
19
|
class MedicationIndicationType(models.Model):
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
"""Model representing a medication indication type."""
|
|
21
|
+
|
|
22
|
+
name = models.CharField(max_length=255, unique=True)
|
|
17
23
|
|
|
18
24
|
objects = MedicationIndicationTypeManager()
|
|
19
25
|
|
|
20
26
|
if TYPE_CHECKING:
|
|
21
|
-
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def medication_indications(self) -> "models.manager.RelatedManager[MedicationIndication]": ...
|
|
22
30
|
|
|
23
31
|
def natural_key(self):
|
|
24
|
-
|
|
32
|
+
"""Return the natural key for the medication indication type."""
|
|
25
33
|
return (self.name,)
|
|
26
34
|
|
|
27
35
|
def __str__(self):
|
|
28
36
|
return str(self.name)
|
|
29
|
-
|
|
37
|
+
|
|
30
38
|
@classmethod
|
|
31
39
|
def get_random_indication_by_type(cls, name) -> "MedicationIndication":
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
"""Return a random medication indication of the given type."""
|
|
41
|
+
med_indication = cls.objects.get(name=name).medication_indications.order_by("?").first()
|
|
42
|
+
if not med_indication:
|
|
43
|
+
raise cls.DoesNotExist(f"No medication indication found for type: {name}")
|
|
44
|
+
return med_indication
|
|
35
45
|
|
|
36
46
|
def get_random_medication_indication(self):
|
|
37
|
-
|
|
47
|
+
"""Return a random medication indication of this type."""
|
|
38
48
|
from endoreg_db.models import MedicationIndication
|
|
39
|
-
|
|
49
|
+
|
|
50
|
+
return MedicationIndication.objects.filter(indication_type=self).order_by("?").first()
|
|
@@ -1,44 +1,56 @@
|
|
|
1
|
-
|
|
1
|
+
"""Model for medication intake time"""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
2
5
|
from django.db import models
|
|
3
6
|
|
|
4
7
|
|
|
5
8
|
class MedicationIntakeTimeManager(models.Manager):
|
|
6
|
-
|
|
9
|
+
"""Manager for the medication intake time model."""
|
|
10
|
+
|
|
7
11
|
def get_by_natural_key(self, name):
|
|
8
|
-
|
|
12
|
+
"""Retrieve a medication intake time by its natural key."""
|
|
9
13
|
return self.get(name=name)
|
|
10
|
-
|
|
14
|
+
|
|
15
|
+
|
|
11
16
|
class MedicationIntakeTime(models.Model):
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
"""Model representing a medication intake time."""
|
|
18
|
+
|
|
19
|
+
name = models.CharField(max_length=255, unique=True) # Made unique=True
|
|
20
|
+
repeats = models.CharField(max_length=20, default="daily")
|
|
15
21
|
time = models.TimeField()
|
|
16
22
|
|
|
17
23
|
objects = MedicationIntakeTimeManager()
|
|
18
24
|
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from endoreg_db.models import MedicationSchedule
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def medication_schedules(self) -> "models.manager.RelatedManager[MedicationSchedule]": ...
|
|
30
|
+
|
|
19
31
|
@classmethod
|
|
20
32
|
def dm(cls):
|
|
21
|
-
|
|
22
|
-
return cls.objects.get(name=
|
|
23
|
-
|
|
33
|
+
"""Return the daily morning intake time object."""
|
|
34
|
+
return cls.objects.get(name="daily-morning")
|
|
35
|
+
|
|
24
36
|
@classmethod
|
|
25
37
|
def dno(cls):
|
|
26
|
-
|
|
27
|
-
return cls.objects.get(name=
|
|
38
|
+
"""Return the daily noon intake time object."""
|
|
39
|
+
return cls.objects.get(name="daily-noon")
|
|
28
40
|
|
|
29
41
|
@classmethod
|
|
30
42
|
def de(cls):
|
|
31
|
-
|
|
32
|
-
return cls.objects.get(name=
|
|
33
|
-
|
|
43
|
+
"""Return the daily evening intake time object."""
|
|
44
|
+
return cls.objects.get(name="daily-evening")
|
|
45
|
+
|
|
34
46
|
@classmethod
|
|
35
47
|
def dn(cls):
|
|
36
|
-
|
|
37
|
-
return cls.objects.get(name=
|
|
48
|
+
"""Return the daily night intake time object."""
|
|
49
|
+
return cls.objects.get(name="daily-night")
|
|
38
50
|
|
|
39
51
|
def natural_key(self):
|
|
40
|
-
|
|
52
|
+
"""Return the natural key for the medication intake time."""
|
|
41
53
|
return (self.name,)
|
|
42
|
-
|
|
54
|
+
|
|
43
55
|
def __str__(self):
|
|
44
56
|
return self.name + " at " + str(self.time) + " (" + self.repeats + ")"
|
|
@@ -1,45 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"""Model for the medication schedule."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, List, cast
|
|
4
|
+
|
|
3
5
|
from django.db import models
|
|
4
6
|
|
|
5
7
|
if TYPE_CHECKING:
|
|
6
|
-
from endoreg_db.models import MedicationIntakeTime
|
|
8
|
+
from endoreg_db.models import Medication, MedicationIntakeTime, Unit
|
|
9
|
+
|
|
10
|
+
|
|
7
11
|
class MedicationScheduleManager(models.Manager):
|
|
8
|
-
|
|
12
|
+
"""Manager for the medication schedule model."""
|
|
13
|
+
|
|
9
14
|
def get_by_natural_key(self, name):
|
|
10
15
|
"""
|
|
11
16
|
Retrieve a MedicationSchedule instance by its name.
|
|
12
|
-
|
|
17
|
+
|
|
13
18
|
Parameters:
|
|
14
19
|
name (str): The name of the medication schedule to retrieve.
|
|
15
|
-
|
|
20
|
+
|
|
16
21
|
Returns:
|
|
17
22
|
MedicationSchedule: The matching medication schedule instance.
|
|
18
23
|
"""
|
|
19
24
|
return self.get(name=name)
|
|
20
|
-
|
|
25
|
+
|
|
26
|
+
|
|
21
27
|
class MedicationSchedule(models.Model):
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
"""Model representing a medication schedule."""
|
|
29
|
+
|
|
30
|
+
name = models.CharField(max_length=255, unique=True)
|
|
24
31
|
description = models.TextField(blank=True, null=True)
|
|
25
32
|
medication = models.ForeignKey("Medication", on_delete=models.CASCADE)
|
|
26
33
|
unit = models.ForeignKey("Unit", on_delete=models.CASCADE)
|
|
27
34
|
therapy_duration_d = models.FloatField(blank=True, null=True)
|
|
28
35
|
dose = models.FloatField()
|
|
29
36
|
intake_times = models.ManyToManyField(
|
|
30
|
-
"MedicationIntakeTime",
|
|
37
|
+
"MedicationIntakeTime",
|
|
31
38
|
)
|
|
32
39
|
|
|
33
40
|
objects = MedicationScheduleManager()
|
|
34
41
|
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
unit: models.ForeignKey["Unit"]
|
|
44
|
+
medication: models.ForeignKey["Medication"]
|
|
45
|
+
intake_times = cast("models.manager.RelatedManager[MedicationIntakeTime]", intake_times)
|
|
46
|
+
|
|
35
47
|
def natural_key(self):
|
|
36
|
-
|
|
48
|
+
"""Return the natural key for the medication schedule."""
|
|
37
49
|
return (self.name,)
|
|
38
|
-
|
|
50
|
+
|
|
39
51
|
def __str__(self):
|
|
40
52
|
return str(self.name)
|
|
41
|
-
|
|
53
|
+
|
|
42
54
|
def get_intake_times(self) -> List["MedicationIntakeTime"]:
|
|
43
|
-
|
|
44
|
-
return [_ for _ in self.intake_times.all()]
|
|
45
|
-
|
|
55
|
+
"""Return a list of all intake times for this medication schedule."""
|
|
56
|
+
return [_ for _ in self.intake_times.all()]
|
|
@@ -1,35 +1,38 @@
|
|
|
1
1
|
"""Module for Organ models."""
|
|
2
|
+
|
|
2
3
|
from django.db import models
|
|
3
4
|
|
|
5
|
+
|
|
4
6
|
class OrganManager(models.Manager):
|
|
5
7
|
"""Manager for Organ model."""
|
|
6
8
|
|
|
7
9
|
def get_by_natural_key(self, name):
|
|
8
10
|
"""Retrieve an Organ by its natural key."""
|
|
9
11
|
return self.get(name=name)
|
|
10
|
-
|
|
12
|
+
|
|
11
13
|
def all_names(self):
|
|
12
14
|
"""Return a list of all organ names."""
|
|
13
|
-
return list(self.all().values_list(
|
|
14
|
-
|
|
15
|
+
return list(self.all().values_list("name", flat=True))
|
|
16
|
+
|
|
17
|
+
|
|
15
18
|
class Organ(models.Model):
|
|
16
19
|
"""Model representing an organ."""
|
|
17
|
-
|
|
18
|
-
name = models.CharField(max_length=100, unique=True)
|
|
20
|
+
|
|
21
|
+
name = models.CharField(max_length=100, unique=True)
|
|
19
22
|
description = models.TextField(blank=True, null=True)
|
|
20
23
|
|
|
21
24
|
# Deprecated
|
|
22
|
-
location_choices = models.ManyToManyField(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
25
|
+
# location_choices = models.ManyToManyField(
|
|
26
|
+
# 'FindingClassificationChoice',
|
|
27
|
+
# blank=True, related_name='organs'
|
|
28
|
+
# )
|
|
26
29
|
|
|
27
30
|
objects = OrganManager()
|
|
28
|
-
|
|
31
|
+
|
|
29
32
|
def natural_key(self):
|
|
30
33
|
"""Return the natural key for the organ."""
|
|
31
34
|
return (self.name,)
|
|
32
|
-
|
|
35
|
+
|
|
33
36
|
def __str__(self):
|
|
34
37
|
"""Return string representation of the organ."""
|
|
35
|
-
return str(self.name)
|
|
38
|
+
return str(self.name)
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
from endoreg_db.models import (
|
|
2
|
-
Patient,
|
|
3
|
-
PatientMedication,
|
|
4
|
-
PatientMedicationSchedule,
|
|
5
2
|
Medication,
|
|
6
3
|
MedicationIndication,
|
|
7
4
|
MedicationIndicationType,
|
|
8
|
-
MedicationIntakeTime
|
|
9
|
-
MedicationSchedule
|
|
5
|
+
MedicationIntakeTime
|
|
10
6
|
)
|
|
11
7
|
from endoreg_db.helpers.default_objects import generate_patient
|
|
12
8
|
|
|
@@ -32,7 +28,11 @@ daily_night = MedicationIntakeTime.dn()
|
|
|
32
28
|
mi = MedicationIndication.objects.order_by('?').first()
|
|
33
29
|
|
|
34
30
|
# Alternatively, we can use a specific indication type
|
|
35
|
-
|
|
31
|
+
|
|
32
|
+
# FIXME MedicationIndicationType does not have a field named indication_type
|
|
33
|
+
# It does have: id, medication_indications, name
|
|
34
|
+
|
|
35
|
+
# medication_indication_type = MedicationIndicationType.objects.filter(indication_type='thromboembolism-prevention-non_valvular_af').order_by('?').first()
|
|
36
36
|
|
|
37
37
|
patient = generate_patient()
|
|
38
38
|
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, cast # Added List
|
|
2
|
+
|
|
1
3
|
from django.db import models
|
|
2
|
-
from typing import TYPE_CHECKING # Added List
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks # Added RequirementLinks
|
|
7
|
+
|
|
5
8
|
from ...administration.person.patient.patient import Patient
|
|
6
9
|
from ..disease import Disease, DiseaseClassificationChoice
|
|
7
|
-
from endoreg_db.utils.links.requirement_link import RequirementLinks # Added RequirementLinks
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
class PatientDisease(models.Model):
|
|
@@ -14,14 +16,9 @@ class PatientDisease(models.Model):
|
|
|
14
16
|
Links a patient to a disease type, optional classification choices, start/end dates,
|
|
15
17
|
and stores associated subcategory values and numerical descriptors.
|
|
16
18
|
"""
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
)
|
|
21
|
-
disease = models.ForeignKey(
|
|
22
|
-
"Disease", on_delete=models.CASCADE,
|
|
23
|
-
related_name="patient_diseases"
|
|
24
|
-
)
|
|
19
|
+
|
|
20
|
+
patient = models.ForeignKey("Patient", on_delete=models.CASCADE, related_name="diseases")
|
|
21
|
+
disease = models.ForeignKey("Disease", on_delete=models.CASCADE, related_name="patient_diseases")
|
|
25
22
|
classification_choices = models.ManyToManyField("DiseaseClassificationChoice")
|
|
26
23
|
start_date = models.DateField(blank=True, null=True)
|
|
27
24
|
end_date = models.DateField(blank=True, null=True)
|
|
@@ -31,33 +28,33 @@ class PatientDisease(models.Model):
|
|
|
31
28
|
last_update = models.DateTimeField(auto_now=True)
|
|
32
29
|
|
|
33
30
|
if TYPE_CHECKING:
|
|
34
|
-
patient: "Patient"
|
|
35
|
-
disease: "Disease"
|
|
36
|
-
|
|
31
|
+
patient: models.ForeignKey["Patient"]
|
|
32
|
+
disease: models.ForeignKey["Disease"]
|
|
33
|
+
|
|
34
|
+
classification_choices = cast(
|
|
35
|
+
"models.manager.RelatedManager[DiseaseClassificationChoice]",
|
|
36
|
+
classification_choices,
|
|
37
|
+
)
|
|
37
38
|
|
|
38
39
|
def __str__(self):
|
|
39
40
|
"""Returns a string representation including the patient and disease name."""
|
|
40
41
|
return f"{self.patient} - {self.disease}"
|
|
41
|
-
|
|
42
|
+
|
|
42
43
|
@property
|
|
43
44
|
def links(self) -> "RequirementLinks":
|
|
44
|
-
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
45
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks # Added RequirementLinks
|
|
45
46
|
|
|
46
47
|
"""
|
|
47
48
|
Aggregates and returns related model instances relevant for requirement evaluation
|
|
48
49
|
as a RequirementLinks object.
|
|
49
50
|
"""
|
|
50
|
-
links_data = {
|
|
51
|
-
"patient_diseases": [self],
|
|
52
|
-
"diseases": [],
|
|
53
|
-
"disease_classification_choices": list(self.classification_choices.all())
|
|
54
|
-
}
|
|
51
|
+
links_data = {"patient_diseases": [self], "diseases": [], "disease_classification_choices": list(self.classification_choices.all())}
|
|
55
52
|
if self.disease:
|
|
56
53
|
links_data["diseases"].append(self.disease)
|
|
57
|
-
|
|
54
|
+
|
|
58
55
|
return RequirementLinks(**links_data)
|
|
59
56
|
|
|
60
57
|
class Meta:
|
|
61
58
|
# unique_together = ('patient', 'disease', 'start_date')
|
|
62
|
-
verbose_name =
|
|
63
|
-
verbose_name_plural =
|
|
59
|
+
verbose_name = "Patient Disease"
|
|
60
|
+
verbose_name_plural = "Patient Diseases"
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
from django.db import models
|
|
2
1
|
from typing import TYPE_CHECKING
|
|
3
2
|
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
6
|
from ...administration.person.patient.patient import Patient
|
|
6
7
|
from ..event import Event, EventClassificationChoice
|
|
7
8
|
|
|
9
|
+
|
|
8
10
|
class PatientEvent(models.Model):
|
|
9
11
|
"""
|
|
10
12
|
Represents a specific event occurrence for a patient, potentially with classification details.
|
|
@@ -12,26 +14,24 @@ class PatientEvent(models.Model):
|
|
|
12
14
|
Links a patient to an event type, dates, description, and optional classification choices,
|
|
13
15
|
subcategories, and numerical descriptors.
|
|
14
16
|
"""
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
)
|
|
19
|
-
event:models.ForeignKey["Event"] = models.ForeignKey(
|
|
20
|
-
"Event", on_delete=models.CASCADE,
|
|
21
|
-
related_name="patient_events"
|
|
22
|
-
)
|
|
17
|
+
|
|
18
|
+
patient: models.ForeignKey["Patient"] = models.ForeignKey("Patient", on_delete=models.CASCADE, related_name="events")
|
|
19
|
+
event: models.ForeignKey["Event"] = models.ForeignKey("Event", on_delete=models.CASCADE, related_name="patient_events")
|
|
23
20
|
date_start = models.DateField()
|
|
24
21
|
date_end = models.DateField(blank=True, null=True)
|
|
25
22
|
description = models.TextField(blank=True, null=True)
|
|
26
|
-
classification_choice
|
|
27
|
-
"EventClassificationChoice", on_delete=models.CASCADE, blank=True, null=True
|
|
28
|
-
)
|
|
23
|
+
classification_choice = models.ForeignKey("EventClassificationChoice", on_delete=models.CASCADE, blank=True, null=True)
|
|
29
24
|
|
|
30
25
|
subcategories = models.JSONField(default=dict)
|
|
31
26
|
numerical_descriptors = models.JSONField(default=dict)
|
|
32
27
|
|
|
33
28
|
last_update = models.DateTimeField(auto_now=True)
|
|
34
29
|
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
patient: models.ForeignKey["Patient"]
|
|
32
|
+
event: models.ForeignKey["Event"]
|
|
33
|
+
classification_choice: models.ForeignKey["EventClassificationChoice|None"]
|
|
34
|
+
|
|
35
35
|
@property
|
|
36
36
|
def links(self):
|
|
37
37
|
"""
|
|
@@ -39,12 +39,9 @@ class PatientEvent(models.Model):
|
|
|
39
39
|
Currently, it only includes the patient and event.
|
|
40
40
|
"""
|
|
41
41
|
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
events=[self.event]
|
|
46
|
-
)
|
|
47
|
-
|
|
42
|
+
|
|
43
|
+
return RequirementLinks(patient_events=[self], events=[self.event])
|
|
44
|
+
|
|
48
45
|
@property
|
|
49
46
|
def date(self):
|
|
50
47
|
"""
|
|
@@ -57,19 +54,19 @@ class PatientEvent(models.Model):
|
|
|
57
54
|
Returns a string representation of the event's start date and name.
|
|
58
55
|
"""
|
|
59
56
|
return str(self.date_start) + ": " + self.event.name
|
|
60
|
-
|
|
57
|
+
|
|
61
58
|
def set_subcategories_from_classification_choice(self):
|
|
62
59
|
"""Copies subcategory definitions from the linked classification choice."""
|
|
63
60
|
if self.classification_choice:
|
|
64
61
|
self.subcategories = self.classification_choice.subcategories
|
|
65
62
|
self.save()
|
|
66
|
-
|
|
63
|
+
|
|
67
64
|
return self.subcategories
|
|
68
|
-
|
|
65
|
+
|
|
69
66
|
def set_numerical_descriptors_from_classification_choice(self):
|
|
70
67
|
"""Copies numerical descriptor definitions from the linked classification choice."""
|
|
71
68
|
if self.classification_choice:
|
|
72
69
|
self.numerical_descriptors = self.classification_choice.numerical_descriptors
|
|
73
70
|
self.save()
|
|
74
|
-
|
|
71
|
+
|
|
75
72
|
return self.numerical_descriptors
|