endoreg-db 0.8.8.0__py3-none-any.whl → 0.8.9.2__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/data/__init__.py +22 -8
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +0 -1
- 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/{colonoscopy_bowel_preparation.yaml → 02_colonoscopy_baseline.yaml} +35 -20
- 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/{_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml → finding_classification_choice/02_colonoscopy_generic.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
- endoreg_db/data/{_examples/finding_classification_choice/colonoscopy_location.yaml → finding_classification_choice/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/{_examples/finding_classification_choice/colon_lesion_paris.yaml → finding_classification_choice/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_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +0 -2
- endoreg_db/data/requirement_set/90_coloreg.yaml +20 -8
- endoreg_db/exceptions.py +0 -1
- endoreg_db/forms/examination_form.py +1 -1
- endoreg_db/helpers/data_loader.py +124 -52
- 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 +496 -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/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/pseudonymization/pseudonymize.py +0 -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/import_report.py +130 -65
- endoreg_db/management/commands/import_video_with_classification.py +1 -1
- 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_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 +14 -20
- 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/start_filewatcher.py +46 -37
- endoreg_db/management/commands/validate_video_files.py +1 -5
- endoreg_db/migrations/0001_initial.py +1360 -1812
- endoreg_db/models/administration/person/patient/patient.py +72 -46
- endoreg_db/models/label/__init__.py +2 -2
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +18 -26
- endoreg_db/models/label/label_video_segment/label_video_segment.py +23 -1
- endoreg_db/models/media/pdf/raw_pdf.py +136 -64
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +34 -10
- 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/create_from_file.py +101 -31
- endoreg_db/models/media/video/video_file.py +125 -105
- endoreg_db/models/media/video/video_file_io.py +31 -26
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/examination/examination.py +28 -8
- endoreg_db/models/medical/examination/examination_indication.py +13 -79
- endoreg_db/models/medical/examination/examination_time.py +8 -3
- endoreg_db/models/medical/finding/finding.py +5 -12
- endoreg_db/models/medical/finding/finding_classification.py +18 -37
- endoreg_db/models/medical/finding/finding_intervention.py +7 -9
- endoreg_db/models/medical/hardware/endoscope.py +6 -0
- endoreg_db/models/medical/patient/medication_examples.py +5 -1
- endoreg_db/models/medical/patient/patient_finding.py +1 -1
- endoreg_db/models/metadata/pdf_meta.py +22 -10
- endoreg_db/models/metadata/sensitive_meta.py +3 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +200 -124
- endoreg_db/models/other/information_source.py +27 -6
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +6 -0
- endoreg_db/models/requirement/requirement.py +59 -399
- endoreg_db/models/requirement/requirement_operator.py +86 -98
- endoreg_db/models/state/audit_ledger.py +4 -5
- endoreg_db/models/state/raw_pdf.py +69 -30
- endoreg_db/models/state/video.py +65 -49
- endoreg_db/models/upload_job.py +33 -9
- endoreg_db/models/utils.py +27 -23
- endoreg_db/queries/__init__.py +3 -1
- endoreg_db/schemas/examination_evaluation.py +1 -1
- endoreg_db/serializers/__init__.py +2 -8
- endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
- endoreg_db/serializers/meta/__init__.py +1 -6
- 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/video/video_file_list.py +65 -34
- endoreg_db/services/__old/pdf_import.py +1487 -0
- endoreg_db/services/__old/video_import.py +1306 -0
- endoreg_db/services/anonymization.py +63 -26
- endoreg_db/services/lookup_service.py +28 -28
- endoreg_db/services/lookup_store.py +2 -2
- endoreg_db/services/pdf_import.py +0 -1480
- endoreg_db/services/report_import.py +10 -0
- endoreg_db/services/video_import.py +6 -1165
- endoreg_db/tasks/upload_tasks.py +79 -70
- endoreg_db/tasks/video_ingest.py +8 -4
- endoreg_db/urls/__init__.py +0 -14
- endoreg_db/urls/ai.py +32 -0
- endoreg_db/urls/media.py +21 -24
- endoreg_db/utils/dataloader.py +87 -57
- endoreg_db/utils/paths.py +110 -46
- endoreg_db/utils/pipelines/Readme.md +1 -1
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +217 -52
- endoreg_db/views/__init__.py +85 -173
- endoreg_db/views/ai/__init__.py +8 -0
- endoreg_db/views/ai/label.py +155 -0
- endoreg_db/views/anonymization/media_management.py +8 -7
- endoreg_db/views/anonymization/overview.py +97 -68
- endoreg_db/views/anonymization/validate.py +25 -21
- endoreg_db/views/media/__init__.py +5 -20
- endoreg_db/views/media/pdf_media.py +109 -65
- endoreg_db/views/media/sensitive_metadata.py +163 -148
- 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/report/__init__.py +7 -0
- endoreg_db/views/{pdf → report}/reimport.py +45 -24
- endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +40 -32
- endoreg_db/views/requirement/lookup_store.py +22 -90
- endoreg_db/views/video/__init__.py +23 -22
- 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} +75 -37
- 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.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/METADATA +2 -2
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/RECORD +217 -335
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/WHEEL +1 -1
- endoreg_db/data/_examples/disease.yaml +0 -55
- endoreg_db/data/_examples/disease_classification.yaml +0 -13
- endoreg_db/data/_examples/disease_classification_choice.yaml +0 -62
- endoreg_db/data/_examples/event.yaml +0 -64
- endoreg_db/data/_examples/examination.yaml +0 -72
- endoreg_db/data/_examples/finding/anatomy_colon.yaml +0 -128
- endoreg_db/data/_examples/finding/colonoscopy.yaml +0 -40
- endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +0 -56
- endoreg_db/data/_examples/finding/complication.yaml +0 -16
- endoreg_db/data/_examples/finding/data.yaml +0 -105
- endoreg_db/data/_examples/finding/examination_setting.yaml +0 -16
- endoreg_db/data/_examples/finding/medication_related.yaml +0 -18
- endoreg_db/data/_examples/finding/outcome.yaml +0 -12
- endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +0 -68
- endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +0 -22
- endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +0 -25
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +0 -68
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +0 -80
- endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +0 -21
- endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +0 -20
- endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +0 -26
- endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +0 -22
- endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +0 -53
- endoreg_db/data/_examples/finding_classification/complication_generic.yaml +0 -25
- endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +0 -40
- endoreg_db/data/_examples/finding_classification/histology_colo.yaml +0 -51
- endoreg_db/data/_examples/finding_classification/intervention_required.yaml +0 -26
- endoreg_db/data/_examples/finding_classification/medication_related.yaml +0 -23
- endoreg_db/data/_examples/finding_classification/visualized.yaml +0 -33
- endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +0 -78
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +0 -17
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +0 -14
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +0 -82
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +0 -15
- endoreg_db/data/_examples/finding_classification_choice/histology.yaml +0 -24
- endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +0 -20
- endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +0 -19
- endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +0 -11
- endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +0 -48
- endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +0 -43
- endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
- endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +0 -128
- endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +0 -32
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +0 -9
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +0 -36
- endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +0 -15
- endoreg_db/data/_examples/finding_type/data.yaml +0 -43
- endoreg_db/data/_examples/requirement/age.yaml +0 -26
- endoreg_db/data/_examples/requirement/gender.yaml +0 -25
- endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +0 -48
- endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +0 -57
- endoreg_db/data/_examples/requirement_set/endoscopy_bleeding_risk.yaml +0 -52
- endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
- 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_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 -38
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -49
- 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 -43
- 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_paris.yaml +0 -57
- 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_location.yaml +0 -229
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +0 -19
- 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/colonoscopy_baseline_austria.yaml +0 -45
- endoreg_db/data/requirement/disease_cardiovascular.yaml +0 -79
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +0 -41
- endoreg_db/data/requirement/disease_hepatology.yaml +0 -12
- endoreg_db/data/requirement/disease_misc.yaml +0 -12
- endoreg_db/data/requirement/disease_renal.yaml +0 -96
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +0 -59
- endoreg_db/data/requirement/event_cardiology.yaml +0 -251
- endoreg_db/data/requirement/event_requirements.yaml +0 -145
- endoreg_db/data/requirement/finding_colon_polyp.yaml +0 -50
- endoreg_db/data/requirement/gender.yaml +0 -25
- endoreg_db/data/requirement/lab_value.yaml +0 -441
- endoreg_db/data/requirement/medication.yaml +0 -93
- endoreg_db/data/requirement_operator/age.yaml +0 -13
- endoreg_db/data/requirement_operator/lab_operators.yaml +0 -129
- endoreg_db/data/requirement_operator/model_operators.yaml +0 -96
- 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_requirementset_depends_on.py +0 -18
- endoreg_db/migrations/_old/0001_initial.py +0 -1857
- endoreg_db/migrations/_old/0002_add_video_correction_models.py +0 -52
- endoreg_db/migrations/_old/0003_add_center_display_name.py +0 -30
- endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +0 -68
- endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +0 -77
- endoreg_db/migrations/_old/0005_merge_20251111_1003.py +0 -14
- endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +0 -68
- endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +0 -89
- endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +0 -27
- endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +0 -21
- 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/services/requirements_object.py +0 -147
- endoreg_db/services/storage_aware_video_processor.py +0 -370
- 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/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 -85
- 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/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/data/requirement/{colon_polyp_intervention.yaml → old/colon_polyp_intervention.yaml} +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/colonoscopy_baseline_austria.yaml +0 -0
- /endoreg_db/data/requirement/{coloreg_colon_polyp.yaml → old/coloreg_colon_polyp.yaml} +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_cardiovascular.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_classification_choice_cardiovascular.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_hepatology.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_misc.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/disease_renal.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/endoscopy_bleeding_risk.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/event_cardiology.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/event_requirements.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/finding_colon_polyp.yaml +0 -0
- /endoreg_db/{urls/sensitive_meta.py → data/requirement/old/gender.yaml} +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/lab_value.yaml +0 -0
- /endoreg_db/data/{_examples/requirement → requirement/old}/medication.yaml +0 -0
- /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/age.yaml +0 -0
- /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/lab_operators.yaml +0 -0
- /endoreg_db/data/{_examples/requirement_operator → requirement_operator/_old}/model_operators.yaml +0 -0
- /endoreg_db/{views/pdf/pdf_stream_views.py → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{model_evaluators.py → _old/model_evaluators.py} +0 -0
- {endoreg_db-0.8.8.0.dist-info → endoreg_db-0.8.9.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, List, Optional, cast
|
|
|
3
3
|
from django.db import models
|
|
4
4
|
|
|
5
5
|
if TYPE_CHECKING:
|
|
6
|
-
from endoreg_db.models import Examination, FindingIntervention, Requirement
|
|
6
|
+
from endoreg_db.models import Examination, FindingIntervention, InformationSource, Requirement
|
|
7
7
|
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
8
8
|
|
|
9
9
|
|
|
@@ -45,15 +45,15 @@ class ExaminationIndication(models.Model):
|
|
|
45
45
|
blank=True,
|
|
46
46
|
)
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
"
|
|
48
|
+
expected_interventions = models.ManyToManyField(
|
|
49
|
+
"FindingIntervention",
|
|
50
50
|
related_name="indications",
|
|
51
51
|
blank=True,
|
|
52
52
|
)
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
"
|
|
56
|
-
related_name="
|
|
54
|
+
information_sources = models.ManyToManyField(
|
|
55
|
+
"InformationSource",
|
|
56
|
+
related_name="examination_indications",
|
|
57
57
|
blank=True,
|
|
58
58
|
)
|
|
59
59
|
|
|
@@ -61,12 +61,15 @@ class ExaminationIndication(models.Model):
|
|
|
61
61
|
|
|
62
62
|
if TYPE_CHECKING:
|
|
63
63
|
classifications = cast(models.manager.RelatedManager["ExaminationIndicationClassification"], classifications)
|
|
64
|
-
examinations = cast(models.manager.RelatedManager["Examination"], examinations)
|
|
65
64
|
expected_interventions = cast(models.manager.RelatedManager["FindingIntervention"], expected_interventions)
|
|
65
|
+
information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
|
|
66
66
|
|
|
67
67
|
@property
|
|
68
68
|
def related_requirements(self) -> "models.manager.RelatedManager[Requirement]": ...
|
|
69
69
|
|
|
70
|
+
@property
|
|
71
|
+
def examinations(self) -> "models.manager.RelatedManager[Examination]": ...
|
|
72
|
+
|
|
70
73
|
@property
|
|
71
74
|
def links(self) -> "RequirementLinks":
|
|
72
75
|
"""
|
|
@@ -98,39 +101,6 @@ class ExaminationIndication(models.Model):
|
|
|
98
101
|
"""
|
|
99
102
|
return str(self.name)
|
|
100
103
|
|
|
101
|
-
def get_choices(self) -> List["ExaminationIndicationClassificationChoice"]:
|
|
102
|
-
"""
|
|
103
|
-
Retrieves all classification choices for the indication.
|
|
104
|
-
|
|
105
|
-
Aggregates and returns the choices from each classification associated with the indication.
|
|
106
|
-
|
|
107
|
-
Returns:
|
|
108
|
-
List[ExaminationIndicationClassificationChoice]: A list of classification choices.
|
|
109
|
-
"""
|
|
110
|
-
classifications = self.classifications.all()
|
|
111
|
-
choices = []
|
|
112
|
-
for classification in classifications:
|
|
113
|
-
choices.extend(classification.choices.all())
|
|
114
|
-
return choices
|
|
115
|
-
|
|
116
|
-
def get_examination(self) -> Optional["Examination"]:
|
|
117
|
-
"""
|
|
118
|
-
Returns the first examination associated with this indication, or None if no examinations exist.
|
|
119
|
-
|
|
120
|
-
Note: Since this is now a many-to-many relationship, this method returns the first examination.
|
|
121
|
-
Consider using get_examinations() for accessing all related examinations.
|
|
122
|
-
"""
|
|
123
|
-
return self.examinations.first()
|
|
124
|
-
|
|
125
|
-
def get_examinations(self) -> List["Examination"]:
|
|
126
|
-
"""
|
|
127
|
-
Returns all examinations associated with this indication.
|
|
128
|
-
|
|
129
|
-
Returns:
|
|
130
|
-
List[Examination]: A list of all examinations linked to this indication.
|
|
131
|
-
"""
|
|
132
|
-
return list(self.examinations.all())
|
|
133
|
-
|
|
134
104
|
|
|
135
105
|
class ExaminationIndicationClassificationManager(models.Manager):
|
|
136
106
|
"""
|
|
@@ -162,18 +132,14 @@ class ExaminationIndicationClassification(models.Model):
|
|
|
162
132
|
|
|
163
133
|
name = models.CharField(max_length=255, unique=True)
|
|
164
134
|
description = models.TextField(blank=True, null=True)
|
|
165
|
-
|
|
166
|
-
"
|
|
167
|
-
related_name="
|
|
135
|
+
choices = models.ManyToManyField(
|
|
136
|
+
"ExaminationIndicationClassificationChoice",
|
|
137
|
+
related_name="classifications",
|
|
168
138
|
blank=True,
|
|
169
139
|
)
|
|
170
140
|
|
|
171
141
|
objects = ExaminationIndicationClassificationManager()
|
|
172
142
|
|
|
173
|
-
if TYPE_CHECKING:
|
|
174
|
-
examinations: "models.ManyToManyField[Examination, Examination]"
|
|
175
|
-
choices: "models.QuerySet[ExaminationIndicationClassificationChoice]"
|
|
176
|
-
|
|
177
143
|
def natural_key(self) -> tuple:
|
|
178
144
|
"""
|
|
179
145
|
Returns the natural key for the classification.
|
|
@@ -192,33 +158,6 @@ class ExaminationIndicationClassification(models.Model):
|
|
|
192
158
|
"""
|
|
193
159
|
return str(self.name)
|
|
194
160
|
|
|
195
|
-
def get_choices(self) -> List["ExaminationIndicationClassificationChoice"]:
|
|
196
|
-
"""
|
|
197
|
-
Retrieves all classification choices associated with this classification.
|
|
198
|
-
|
|
199
|
-
Returns:
|
|
200
|
-
List[ExaminationIndicationClassificationChoice]: A list of classification choice instances.
|
|
201
|
-
"""
|
|
202
|
-
return list(self.choices.all())
|
|
203
|
-
|
|
204
|
-
def get_examination(self) -> Optional["Examination"]:
|
|
205
|
-
"""
|
|
206
|
-
Returns the first examination associated with this classification, or None if no examinations exist.
|
|
207
|
-
|
|
208
|
-
Note: Since this is now a many-to-many relationship, this method returns the first examination.
|
|
209
|
-
Consider using get_examinations() for accessing all related examinations.
|
|
210
|
-
"""
|
|
211
|
-
return self.examinations.first()
|
|
212
|
-
|
|
213
|
-
def get_examinations(self) -> List["Examination"]:
|
|
214
|
-
"""
|
|
215
|
-
Returns all examinations associated with this classification.
|
|
216
|
-
|
|
217
|
-
Returns:
|
|
218
|
-
List[Examination]: A list of all examinations linked to this classification.
|
|
219
|
-
"""
|
|
220
|
-
return list(self.examinations.all())
|
|
221
|
-
|
|
222
161
|
|
|
223
162
|
class ExaminationIndicationClassificationChoiceManager(models.Manager):
|
|
224
163
|
"""
|
|
@@ -252,11 +191,6 @@ class ExaminationIndicationClassificationChoice(models.Model):
|
|
|
252
191
|
name = models.CharField(max_length=255, unique=True)
|
|
253
192
|
subcategories = models.JSONField(default=dict)
|
|
254
193
|
numerical_descriptors = models.JSONField(default=dict)
|
|
255
|
-
classification = models.ForeignKey(
|
|
256
|
-
ExaminationIndicationClassification,
|
|
257
|
-
on_delete=models.CASCADE,
|
|
258
|
-
related_name="choices",
|
|
259
|
-
)
|
|
260
194
|
|
|
261
195
|
objects = ExaminationIndicationClassificationChoiceManager()
|
|
262
196
|
|
|
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, cast
|
|
|
3
3
|
from django.db import models
|
|
4
4
|
|
|
5
5
|
if TYPE_CHECKING:
|
|
6
|
-
from endoreg_db.models import ExaminationTimeType
|
|
6
|
+
from endoreg_db.models import ExaminationTimeType, InformationSource
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class ExaminationTimeManager(models.Manager):
|
|
@@ -27,13 +27,18 @@ class ExaminationTime(models.Model):
|
|
|
27
27
|
"""
|
|
28
28
|
|
|
29
29
|
name = models.CharField(max_length=100, unique=True)
|
|
30
|
-
start_time = models.TimeField(blank=True, null=True)
|
|
31
30
|
time_types = models.ManyToManyField("ExaminationTimeType", blank=True)
|
|
32
|
-
end_time = models.TimeField(blank=True, null=True)
|
|
33
31
|
objects = ExaminationTimeManager()
|
|
34
32
|
|
|
33
|
+
information_sources = models.ManyToManyField(
|
|
34
|
+
"InformationSource",
|
|
35
|
+
related_name="examination_times",
|
|
36
|
+
blank=True,
|
|
37
|
+
)
|
|
38
|
+
|
|
35
39
|
if TYPE_CHECKING:
|
|
36
40
|
time_types = cast(models.manager.RelatedManager["ExaminationTimeType"], time_types)
|
|
41
|
+
information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
|
|
37
42
|
|
|
38
43
|
def __str__(self) -> str:
|
|
39
44
|
"""
|
|
@@ -12,11 +12,11 @@ class FindingManager(models.Manager):
|
|
|
12
12
|
class Finding(models.Model):
|
|
13
13
|
name = models.CharField(max_length=100, unique=True)
|
|
14
14
|
description = models.TextField(blank=True, null=True)
|
|
15
|
-
examinations = models.ManyToManyField("Examination", blank=True, related_name="findings")
|
|
16
15
|
finding_types = models.ManyToManyField("FindingType", blank=True, related_name="findings")
|
|
17
|
-
|
|
18
16
|
finding_interventions = models.ManyToManyField("FindingIntervention", blank=True, related_name="findings")
|
|
19
|
-
|
|
17
|
+
caused_by_interventions = models.ManyToManyField("FindingIntervention", blank=True, related_name="causes_findings")
|
|
18
|
+
finding_classifications = models.ManyToManyField("FindingClassification", blank=True, related_name="findings")
|
|
19
|
+
information_sources = models.ManyToManyField("InformationSource", blank=True, related_name="findings")
|
|
20
20
|
objects = FindingManager()
|
|
21
21
|
|
|
22
22
|
if TYPE_CHECKING:
|
|
@@ -26,20 +26,13 @@ class Finding(models.Model):
|
|
|
26
26
|
FindingClassificationType,
|
|
27
27
|
FindingIntervention,
|
|
28
28
|
FindingType,
|
|
29
|
+
InformationSource,
|
|
29
30
|
PatientFindingClassification,
|
|
30
31
|
)
|
|
31
32
|
|
|
32
33
|
finding_types = cast(models.manager.RelatedManager["FindingType"], finding_types)
|
|
33
|
-
examinations = cast(models.manager.RelatedManager["Examination"], examinations)
|
|
34
34
|
finding_interventions = cast(models.manager.RelatedManager["FindingIntervention"], finding_interventions)
|
|
35
|
-
|
|
36
|
-
@property
|
|
37
|
-
def finding_classifications(self) -> "models.manager.RelatedManager[FindingClassification]": ...
|
|
38
|
-
|
|
39
|
-
# finding_classifications: models.QuerySet["FindingClassification"]
|
|
40
|
-
# examinations: models.QuerySet[Examination]
|
|
41
|
-
# finding_types: models.QuerySet[FindingType]
|
|
42
|
-
# finding_interventions: models.QuerySet[FindingIntervention]
|
|
35
|
+
finding_classifications = cast(models.manager.RelatedManager["FindingClassification"], finding_classifications)
|
|
43
36
|
|
|
44
37
|
def natural_key(self):
|
|
45
38
|
"""
|
|
@@ -11,7 +11,6 @@ class FindingClassificationTypeManager(models.Manager):
|
|
|
11
11
|
class FindingClassificationType(models.Model):
|
|
12
12
|
name = models.CharField(max_length=255, unique=True)
|
|
13
13
|
description = models.TextField(blank=True)
|
|
14
|
-
|
|
15
14
|
objects = FindingClassificationTypeManager()
|
|
16
15
|
|
|
17
16
|
def natural_key(self):
|
|
@@ -20,14 +19,6 @@ class FindingClassificationType(models.Model):
|
|
|
20
19
|
def __str__(self):
|
|
21
20
|
return str(self.name)
|
|
22
21
|
|
|
23
|
-
@classmethod
|
|
24
|
-
def get_required_classifications_for_finding(cls, finding):
|
|
25
|
-
"""
|
|
26
|
-
Returns all required finding classification types for a given finding.
|
|
27
|
-
"""
|
|
28
|
-
required_classification_types = [_ for _ in finding.required_morphology_classification_types.all()]
|
|
29
|
-
return required_classification_types
|
|
30
|
-
|
|
31
22
|
|
|
32
23
|
class FindingClassificationManager(models.Manager):
|
|
33
24
|
def get_by_natural_key(self, name):
|
|
@@ -37,26 +28,37 @@ class FindingClassificationManager(models.Manager):
|
|
|
37
28
|
class FindingClassification(models.Model):
|
|
38
29
|
name = models.CharField(max_length=255, unique=True)
|
|
39
30
|
description = models.TextField(blank=True)
|
|
31
|
+
finding_types = models.ManyToManyField("FindingType", blank=True, related_name="finding_classifications")
|
|
32
|
+
choices = models.ManyToManyField("FindingClassificationChoice", related_name="classifications", blank=True)
|
|
33
|
+
|
|
40
34
|
classification_types = models.ManyToManyField(
|
|
41
35
|
to=FindingClassificationType,
|
|
42
36
|
# on_delete=models.CASCADE
|
|
43
37
|
)
|
|
44
|
-
|
|
38
|
+
information_sources = models.ManyToManyField(
|
|
39
|
+
"InformationSource",
|
|
40
|
+
related_name="finding_classifications",
|
|
41
|
+
blank=True,
|
|
42
|
+
)
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
examinations
|
|
48
|
-
|
|
44
|
+
@property
|
|
45
|
+
def examinations(self):
|
|
46
|
+
from endoreg_db.models import Examination
|
|
47
|
+
|
|
48
|
+
return Examination.objects.filter(findings__finding_classifications=self)
|
|
49
49
|
|
|
50
50
|
objects = FindingClassificationManager()
|
|
51
51
|
|
|
52
52
|
if TYPE_CHECKING:
|
|
53
|
-
from endoreg_db.models import Examination, Finding, FindingType, PatientFindingClassification
|
|
53
|
+
from endoreg_db.models import Examination, Finding, FindingType, InformationSource, PatientFindingClassification
|
|
54
54
|
|
|
55
55
|
classification_types = cast(models.manager.RelatedManager["FindingClassificationType"], classification_types)
|
|
56
56
|
choices = cast(models.manager.RelatedManager["FindingClassificationChoice"], choices)
|
|
57
|
-
examinations = cast(models.manager.RelatedManager["Examination"], examinations)
|
|
58
|
-
findings = cast(models.manager.RelatedManager["Finding"], findings)
|
|
59
57
|
finding_types = cast(models.manager.RelatedManager["FindingType"], finding_types)
|
|
58
|
+
information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def findings(self) -> "models.manager.RelatedManager[Finding]": ...
|
|
60
62
|
|
|
61
63
|
def natural_key(self):
|
|
62
64
|
return (self.name,)
|
|
@@ -73,20 +75,6 @@ class FindingClassification(models.Model):
|
|
|
73
75
|
"""
|
|
74
76
|
return self.choices.all()
|
|
75
77
|
|
|
76
|
-
@property
|
|
77
|
-
def is_morphology(self):
|
|
78
|
-
"""
|
|
79
|
-
Return True if any related classification type has the name "morphology" (case-insensitive).
|
|
80
|
-
"""
|
|
81
|
-
return self.classification_types.filter(name__iexact="morphology").exists()
|
|
82
|
-
|
|
83
|
-
@property
|
|
84
|
-
def is_location(self):
|
|
85
|
-
"""
|
|
86
|
-
Returns True if any related classification type has the name "location" (case-insensitive).
|
|
87
|
-
"""
|
|
88
|
-
return self.classification_types.filter(name__iexact="location").exists()
|
|
89
|
-
|
|
90
78
|
|
|
91
79
|
class FindingClassificationChoiceManager(models.Manager):
|
|
92
80
|
def get_by_natural_key(self, name):
|
|
@@ -105,15 +93,8 @@ class FindingClassificationChoiceManager(models.Manager):
|
|
|
105
93
|
class FindingClassificationChoice(models.Model):
|
|
106
94
|
name = models.CharField(max_length=255, unique=True)
|
|
107
95
|
description = models.TextField(blank=True)
|
|
108
|
-
# classifications = models.ManyToManyField(
|
|
109
|
-
# "FindingClassification",
|
|
110
|
-
# related_name='choices'
|
|
111
|
-
# )
|
|
112
|
-
|
|
113
96
|
subcategories = models.JSONField(default=dict)
|
|
114
|
-
|
|
115
97
|
numerical_descriptors = models.JSONField(default=dict)
|
|
116
|
-
|
|
117
98
|
objects = FindingClassificationChoiceManager()
|
|
118
99
|
|
|
119
100
|
if TYPE_CHECKING:
|
|
@@ -11,21 +11,19 @@ class FindingInterventionManager(models.Manager):
|
|
|
11
11
|
class FindingIntervention(models.Model):
|
|
12
12
|
name = models.CharField(max_length=100, unique=True)
|
|
13
13
|
description = models.TextField(blank=True, null=True)
|
|
14
|
-
|
|
15
14
|
intervention_types = models.ManyToManyField("FindingInterventionType", blank=True, related_name="interventions")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
information_sources = models.ManyToManyField(
|
|
16
|
+
"InformationSource",
|
|
17
|
+
related_name="finding_interventions",
|
|
18
|
+
blank=True,
|
|
19
|
+
)
|
|
21
20
|
objects = FindingInterventionManager()
|
|
22
21
|
|
|
23
22
|
if TYPE_CHECKING:
|
|
24
|
-
from endoreg_db.models import Contraindication, FindingInterventionType, LabValue
|
|
23
|
+
from endoreg_db.models import Contraindication, FindingInterventionType, InformationSource, LabValue
|
|
25
24
|
|
|
26
25
|
intervention_types = cast(models.manager.RelatedManager["FindingInterventionType"], intervention_types)
|
|
27
|
-
|
|
28
|
-
contraindications = cast(models.manager.RelatedManager["Contraindication"], contraindications)
|
|
26
|
+
information_sources = cast(models.manager.RelatedManager["InformationSource"], information_sources)
|
|
29
27
|
|
|
30
28
|
def natural_key(self):
|
|
31
29
|
return (self.name,)
|
|
@@ -33,6 +33,12 @@ class Endoscope(models.Model):
|
|
|
33
33
|
verbose_name = "Endoscope"
|
|
34
34
|
verbose_name_plural = "Endoscopes"
|
|
35
35
|
|
|
36
|
+
@property
|
|
37
|
+
def center_safe(self) -> "Center":
|
|
38
|
+
if self.center is None:
|
|
39
|
+
raise ValueError("Endoscope has no associated center.")
|
|
40
|
+
return self.center
|
|
41
|
+
|
|
36
42
|
|
|
37
43
|
class EndoscopeTypeManager(models.Manager):
|
|
38
44
|
def get_by_natural_key(self, name):
|
|
@@ -28,7 +28,11 @@ daily_night = MedicationIntakeTime.dn()
|
|
|
28
28
|
mi = MedicationIndication.objects.order_by('?').first()
|
|
29
29
|
|
|
30
30
|
# Alternatively, we can use a specific indication type
|
|
31
|
-
|
|
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()
|
|
32
36
|
|
|
33
37
|
patient = generate_patient()
|
|
34
38
|
|
|
@@ -54,7 +54,7 @@ class PatientFinding(models.Model):
|
|
|
54
54
|
fields=["patient_examination", "finding"], condition=models.Q(is_active=True), name="unique_active_finding_per_examination"
|
|
55
55
|
),
|
|
56
56
|
models.CheckConstraint(
|
|
57
|
-
|
|
57
|
+
condition=models.Q( # called .check in future?
|
|
58
58
|
deactivated_at__isnull=True, deactivated_by__isnull=True
|
|
59
59
|
)
|
|
60
60
|
| models.Q(deactivated_at__isnull=False, deactivated_by__isnull=False, is_active=False),
|
|
@@ -9,20 +9,28 @@ if TYPE_CHECKING:
|
|
|
9
9
|
|
|
10
10
|
class PdfType(models.Model):
|
|
11
11
|
"""
|
|
12
|
-
Defines a specific type or format of
|
|
12
|
+
Defines a specific type or format of report report, linking to flags used for parsing.
|
|
13
13
|
|
|
14
|
-
Used to configure how different
|
|
14
|
+
Used to configure how different report report layouts are processed.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
17
|
name = models.CharField(max_length=255)
|
|
18
18
|
|
|
19
|
-
patient_info_line = models.ForeignKey(
|
|
19
|
+
patient_info_line = models.ForeignKey(
|
|
20
|
+
"ReportReaderFlag",
|
|
21
|
+
related_name="pdf_type_patient_info_line",
|
|
22
|
+
on_delete=models.CASCADE,
|
|
23
|
+
)
|
|
20
24
|
endoscope_info_line = models.ForeignKey(
|
|
21
25
|
"ReportReaderFlag",
|
|
22
26
|
related_name="pdf_type_endoscopy_info_line",
|
|
23
27
|
on_delete=models.CASCADE,
|
|
24
28
|
)
|
|
25
|
-
examiner_info_line = models.ForeignKey(
|
|
29
|
+
examiner_info_line = models.ForeignKey(
|
|
30
|
+
"ReportReaderFlag",
|
|
31
|
+
related_name="pdf_type_examiner_info_line",
|
|
32
|
+
on_delete=models.CASCADE,
|
|
33
|
+
)
|
|
26
34
|
cut_off_above_lines = models.ManyToManyField(
|
|
27
35
|
"ReportReaderFlag",
|
|
28
36
|
related_name="pdf_type_cut_off_above_lines",
|
|
@@ -37,11 +45,15 @@ class PdfType(models.Model):
|
|
|
37
45
|
endoscope_info_line: models.ForeignKey["ReportReaderFlag"]
|
|
38
46
|
examiner_info_line: models.ForeignKey["ReportReaderFlag"]
|
|
39
47
|
|
|
40
|
-
cut_off_above_lines = cast(
|
|
41
|
-
|
|
48
|
+
cut_off_above_lines = cast(
|
|
49
|
+
models.manager.RelatedManager["ReportReaderFlag"], cut_off_above_lines
|
|
50
|
+
)
|
|
51
|
+
cut_off_below_lines = cast(
|
|
52
|
+
models.manager.RelatedManager["ReportReaderFlag"], cut_off_below_lines
|
|
53
|
+
)
|
|
42
54
|
|
|
43
55
|
def __str__(self):
|
|
44
|
-
"""Returns a string summary of the
|
|
56
|
+
"""Returns a string summary of the report type and its associated flags."""
|
|
45
57
|
summary = f"{self.name}"
|
|
46
58
|
# add lines to summary
|
|
47
59
|
summary += f"\nPatient Info Line: {self.patient_info_line.value}"
|
|
@@ -60,7 +72,7 @@ class PdfType(models.Model):
|
|
|
60
72
|
|
|
61
73
|
class PdfMeta(models.Model):
|
|
62
74
|
"""
|
|
63
|
-
Stores metadata associated with a specific
|
|
75
|
+
Stores metadata associated with a specific report document file.
|
|
64
76
|
"""
|
|
65
77
|
|
|
66
78
|
pdf_type = models.ForeignKey(PdfType, on_delete=models.CASCADE)
|
|
@@ -69,13 +81,13 @@ class PdfMeta(models.Model):
|
|
|
69
81
|
pdf_hash = models.CharField(max_length=255, unique=True)
|
|
70
82
|
|
|
71
83
|
def __str__(self):
|
|
72
|
-
"""Returns the
|
|
84
|
+
"""Returns the report hash as its string representation."""
|
|
73
85
|
return str(self.pdf_hash)
|
|
74
86
|
|
|
75
87
|
@classmethod
|
|
76
88
|
def create_from_file(cls, pdf_file):
|
|
77
89
|
"""
|
|
78
|
-
Creates a PdfMeta instance from a
|
|
90
|
+
Creates a PdfMeta instance from a report file object.
|
|
79
91
|
Note: This implementation seems incomplete; it doesn't extract hash, date, time, or type.
|
|
80
92
|
"""
|
|
81
93
|
pdf_file = File(pdf_file)
|