endoreg-db 0.6.4__py3-none-any.whl → 0.8.1__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/admin.py +26 -26
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +12 -0
- endoreg_db/data/ai_model/data.yaml +1 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/center/data.yaml +13 -12
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/misc.yaml +1 -2
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +14 -9
- endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +3 -46
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
- endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +8 -3
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
- endoreg_db/data/finding_type/data.yaml +23 -10
- endoreg_db/data/gender/data.yaml +8 -1
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/misc.yaml +43 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +3 -0
- endoreg_db/data/pdf_type/data.yaml +26 -2
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +6 -6
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
- endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
- endoreg_db/data/requirement/disease_misc.yaml +3 -3
- endoreg_db/data/requirement/disease_renal.yaml +18 -2
- endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
- endoreg_db/data/requirement/event_cardiology.yaml +17 -17
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +352 -31
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +36 -35
- endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +42 -2
- endoreg_db/data/requirement_type/requirement_types.yaml +82 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/patient_finding_intervention_form.py +4 -5
- endoreg_db/forms/patient_form.py +7 -6
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +359 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +422 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +2 -7
- endoreg_db/management/commands/load_base_db_data.py +1 -0
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +2 -3
- endoreg_db/management/commands/load_finding_data.py +49 -92
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +30 -6
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/register_ai_model.py +1 -1
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/migrations/0001_initial.py +625 -813
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/models/__init__.py +270 -307
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +3 -1
- endoreg_db/models/administration/center/center.py +61 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +45 -74
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
- endoreg_db/models/media/__init__.py +14 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +608 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +4 -0
- endoreg_db/models/media/video/create_from_file.py +336 -0
- endoreg_db/models/media/video/pipe_1.py +195 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +680 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +348 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +166 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_meta.py +11 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
- endoreg_db/models/{disease.py → medical/disease.py} +60 -52
- endoreg_db/models/{event.py → medical/event.py} +31 -54
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
- endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
- endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
- endoreg_db/models/{examination → medical/examination}/examination_type.py +1 -7
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
- endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
- endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
- endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
- endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/{risk → medical/risk}/risk_type.py +0 -4
- endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +193 -0
- endoreg_db/models/metadata/model_meta_logic.py +236 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +17 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
- endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
- endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +10 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +13 -2
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/requirement.py +556 -114
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +80 -87
- endoreg_db/models/requirement/requirement_operator.py +132 -14
- endoreg_db/models/requirement/requirement_set.py +181 -21
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/models/video_metadata.py +66 -0
- endoreg_db/models/video_processing.py +153 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +147 -10
- endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
- endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +66 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/ollama_api_docs.py +1528 -0
- endoreg_db/services/pdf_import.py +993 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +915 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/urls/__init__.py +72 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +32 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/pdf.py +0 -0
- endoreg_db/urls/report.py +78 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +36 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +119 -0
- endoreg_db/urls.py +6 -283
- endoreg_db/utils/__init__.py +66 -57
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
- endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
- endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +50 -12
- endoreg_db/utils/dates.py +21 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +2 -0
- endoreg_db/utils/paths.py +100 -82
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/db_config.py +1 -1
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +19 -6
- endoreg_db/utils/video/extract_frames.py +37 -70
- endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +282 -2
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +63 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/{views.py → auth/keycloak.py} +19 -13
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +9 -0
- endoreg_db/views/media/pdf_media.py +386 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +151 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +72 -0
- endoreg_db/views/video/correction.py +672 -0
- endoreg_db/views/video/media/__init__.py +23 -0
- endoreg_db/views/video/media/task_status.py +49 -0
- endoreg_db/views/video/media/video_analyze.py +52 -0
- endoreg_db/views/video/media/video_apply_mask.py +48 -0
- endoreg_db/views/video/media/video_correction.py +21 -0
- endoreg_db/views/video/media/video_download_processed.py +58 -0
- endoreg_db/views/video/media/video_media.py +158 -0
- endoreg_db/views/video/media/video_meta.py +29 -0
- endoreg_db/views/video/media/video_processing_history.py +24 -0
- endoreg_db/views/video/media/video_remove_frames.py +48 -0
- endoreg_db/views/video/media/video_reprocess.py +40 -0
- endoreg_db/views/video/reimport.py +192 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
- endoreg_db/views/video/video_examination_viewset.py +329 -0
- endoreg_db/views/video/video_stream.py +188 -0
- endoreg_db-0.8.1.dist-info/METADATA +384 -0
- endoreg_db-0.8.1.dist-info/RECORD +789 -0
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
- endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
- endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_logging_data.py +0 -39
- endoreg_db/management/commands/load_lx_data.py +0 -64
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
- endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
- endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
- endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
- endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
- endoreg_db/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -90
- endoreg_db/models/ai_model/lightning/__init__.py +0 -3
- endoreg_db/models/ai_model/lightning/predict.py +0 -172
- endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
- endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
- endoreg_db/models/ai_model/model_meta.py +0 -240
- endoreg_db/models/annotation/__init__.py +0 -32
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
- endoreg_db/models/annotation/image_classification.py +0 -86
- endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
- endoreg_db/models/case/__init__.py +0 -1
- endoreg_db/models/case/case.py +0 -34
- endoreg_db/models/center/center.py +0 -51
- endoreg_db/models/center/center_product.py +0 -33
- endoreg_db/models/center/center_waste.py +0 -16
- endoreg_db/models/data_file/__init__.py +0 -39
- endoreg_db/models/data_file/base_classes/__init__.py +0 -7
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -98
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
- endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
- endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
- endoreg_db/models/data_file/base_classes/utils.py +0 -58
- endoreg_db/models/data_file/frame.py +0 -29
- endoreg_db/models/data_file/import_classes/__init__.py +0 -18
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -254
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
- endoreg_db/models/data_file/metadata/video_meta.py +0 -199
- endoreg_db/models/data_file/report_file.py +0 -56
- endoreg_db/models/data_file/video/__init__.py +0 -11
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -196
- endoreg_db/models/data_file/video_segment.py +0 -214
- endoreg_db/models/examination/examination.py +0 -67
- endoreg_db/models/finding/__init__.py +0 -11
- endoreg_db/models/finding/finding.py +0 -75
- endoreg_db/models/finding/finding_location_classification.py +0 -94
- endoreg_db/models/finding/finding_morphology_classification.py +0 -89
- endoreg_db/models/finding/finding_type.py +0 -22
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/information_source.py +0 -65
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -162
- endoreg_db/models/logging/__init__.py +0 -11
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -27
- endoreg_db/models/lx/__init__.py +0 -4
- endoreg_db/models/lx/client.py +0 -57
- endoreg_db/models/lx/identity.py +0 -34
- endoreg_db/models/lx/permission.py +0 -18
- endoreg_db/models/lx/user.py +0 -16
- endoreg_db/models/network/__init__.py +0 -9
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -58
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -5
- endoreg_db/models/patient/__init__.py +0 -24
- endoreg_db/models/patient/patient_examination.py +0 -182
- endoreg_db/models/patient/patient_finding.py +0 -143
- endoreg_db/models/patient/patient_finding_location.py +0 -120
- endoreg_db/models/patient/patient_finding_morphology.py +0 -166
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -34
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -60
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/patient.py +0 -389
- endoreg_db/models/persons/patient/patient_disease.py +0 -22
- endoreg_db/models/persons/patient/patient_event.py +0 -52
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
- endoreg_db/models/persons/patient/patient_medication.py +0 -59
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -8
- endoreg_db/models/prediction/image_classification.py +0 -51
- endoreg_db/models/prediction/video_prediction_meta.py +0 -306
- endoreg_db/models/product/product.py +0 -110
- endoreg_db/models/product/product_group.py +0 -27
- endoreg_db/models/product/product_material.py +0 -28
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -9
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -14
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -9
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -33
- endoreg_db/serializers/prediction.py +0 -10
- endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -20
- endoreg_db/serializers/video_segmentation.py +0 -574
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video/transcode_videofile.py +0 -111
- endoreg_db/views/patient_views.py +0 -90
- endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
- endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
- endoreg_db/views/raw_video_meta_validation_views.py +0 -148
- endoreg_db/views/report_views.py +0 -96
- endoreg_db/views/video_segmentation_views.py +0 -166
- endoreg_db-0.6.4.dist-info/METADATA +0 -161
- endoreg_db-0.6.4.dist-info/RECORD +0 -470
- /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/__init__.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/risk.py +0 -0
- /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
- /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Optional, List, Tuple
|
|
2
|
+
from django.db import models
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from endoreg_db.models.label import LabelSet
|
|
6
|
+
|
|
7
|
+
from ..label.label_video_segment import (
|
|
8
|
+
LabelVideoSegment,
|
|
9
|
+
|
|
10
|
+
)
|
|
11
|
+
from ..utils import find_segments_in_prediction_array
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pickle
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
DEFAULT_WINDOW_SIZE_IN_SECONDS_FOR_RUNNING_MEAN = 1.5
|
|
19
|
+
DEFAULT_VIDEO_SEGMENT_LENGTH_THRESHOLD_IN_S = 1.0
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from endoreg_db.models import ModelMeta, Label
|
|
23
|
+
from ..media.video.video_file import VideoFile
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class VideoPredictionMeta(models.Model):
|
|
27
|
+
"""
|
|
28
|
+
Stores metadata about predictions made by a model for a specific video.
|
|
29
|
+
|
|
30
|
+
Must be associated with exactly one `VideoFile`.
|
|
31
|
+
"""
|
|
32
|
+
model_meta = models.ForeignKey("ModelMeta", on_delete=models.CASCADE)
|
|
33
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
34
|
+
date_modified = models.DateTimeField(auto_now=True)
|
|
35
|
+
prediction_array = models.BinaryField(blank=True, null=True)
|
|
36
|
+
|
|
37
|
+
video_file = models.ForeignKey(
|
|
38
|
+
"VideoFile",
|
|
39
|
+
on_delete=models.CASCADE,
|
|
40
|
+
related_name="video_prediction_meta",
|
|
41
|
+
null=False,
|
|
42
|
+
blank=False,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
if TYPE_CHECKING:
|
|
46
|
+
model_meta: "ModelMeta"
|
|
47
|
+
video_file: "VideoFile"
|
|
48
|
+
label_video_segments: "models.Manager[LabelVideoSegment]"
|
|
49
|
+
|
|
50
|
+
class Meta:
|
|
51
|
+
constraints = [
|
|
52
|
+
models.UniqueConstraint(fields=['model_meta', 'video_file'], name='unique_prediction_per_video_model')
|
|
53
|
+
]
|
|
54
|
+
indexes = [
|
|
55
|
+
models.Index(fields=["model_meta", "video_file"]),
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
def get_video(self) -> "VideoFile":
|
|
59
|
+
"""Returns the associated VideoFile instance."""
|
|
60
|
+
if self.video_file:
|
|
61
|
+
return self.video_file
|
|
62
|
+
else:
|
|
63
|
+
raise ValueError("VideoPredictionMeta is not associated with a VideoFile.")
|
|
64
|
+
|
|
65
|
+
def __str__(self):
|
|
66
|
+
try:
|
|
67
|
+
video_obj = self.get_video()
|
|
68
|
+
return f"Prediction Meta for Video {video_obj.uuid} - {self.model_meta.name}"
|
|
69
|
+
except ValueError:
|
|
70
|
+
return f"Prediction Meta {self.pk} (Error: No VideoFile) - {self.model_meta.name}"
|
|
71
|
+
except Exception as e:
|
|
72
|
+
logger.warning("Error generating string representation for VideoPredictionMeta %s: %s", self.pk, e)
|
|
73
|
+
return f"Prediction Meta {self.pk} (Error: {e})"
|
|
74
|
+
|
|
75
|
+
def get_labelset(self) -> Optional["LabelSet"]:
|
|
76
|
+
"""Get the labelset associated with the model."""
|
|
77
|
+
return self.model_meta.labelset
|
|
78
|
+
|
|
79
|
+
def get_label_list(self) -> list["Label"]:
|
|
80
|
+
"""Get the ordered list of labels from the model's labelset."""
|
|
81
|
+
labelset = self.get_labelset()
|
|
82
|
+
if labelset:
|
|
83
|
+
return labelset.get_labels_in_order()
|
|
84
|
+
return []
|
|
85
|
+
|
|
86
|
+
def save_prediction_array(self, prediction_array: np.array):
|
|
87
|
+
"""
|
|
88
|
+
Save the prediction array to the database.
|
|
89
|
+
"""
|
|
90
|
+
self.prediction_array = pickle.dumps(prediction_array)
|
|
91
|
+
self.save(update_fields=['prediction_array', 'date_modified'])
|
|
92
|
+
|
|
93
|
+
def get_prediction_array(self):
|
|
94
|
+
"""
|
|
95
|
+
Get the prediction array from the database.
|
|
96
|
+
"""
|
|
97
|
+
if self.prediction_array is None:
|
|
98
|
+
return None
|
|
99
|
+
else:
|
|
100
|
+
try:
|
|
101
|
+
return pickle.loads(self.prediction_array)
|
|
102
|
+
except (pickle.UnpicklingError, TypeError, EOFError) as e:
|
|
103
|
+
logger.error(f"Error unpickling prediction array for {self}: {e}")
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
def calculate_prediction_array(self, window_size_in_seconds: int = None):
|
|
107
|
+
"""
|
|
108
|
+
Fetches all predictions for the associated video, labelset, and model meta,
|
|
109
|
+
applies smoothing, and saves the resulting binary prediction array.
|
|
110
|
+
"""
|
|
111
|
+
from ..label import ImageClassificationAnnotation
|
|
112
|
+
|
|
113
|
+
video_obj = self.get_video()
|
|
114
|
+
model_meta = self.model_meta
|
|
115
|
+
label_list = self.get_label_list()
|
|
116
|
+
num_frames = video_obj.frame_count
|
|
117
|
+
|
|
118
|
+
if num_frames is None or num_frames <= 0:
|
|
119
|
+
logger.warning(f"Cannot calculate prediction array for {video_obj} with invalid frame count ({num_frames}).")
|
|
120
|
+
return
|
|
121
|
+
|
|
122
|
+
if not label_list:
|
|
123
|
+
logger.warning(f"No labels found for model {model_meta}. Cannot calculate prediction array.")
|
|
124
|
+
return
|
|
125
|
+
|
|
126
|
+
prediction_array = np.zeros((num_frames, len(label_list)))
|
|
127
|
+
|
|
128
|
+
base_pred_qs = ImageClassificationAnnotation.objects.filter(
|
|
129
|
+
model_meta=model_meta,
|
|
130
|
+
frame__video_file=video_obj
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
for i, label in enumerate(label_list):
|
|
134
|
+
predictions = base_pred_qs.filter(label=label).order_by("frame__frame_number").values_list(
|
|
135
|
+
"frame__frame_number", "float_value"
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
confidences = np.full(num_frames, 0.5)
|
|
139
|
+
found_predictions = False
|
|
140
|
+
for frame_num, confidence in predictions:
|
|
141
|
+
if 0 <= frame_num < num_frames:
|
|
142
|
+
confidences[frame_num] = confidence
|
|
143
|
+
found_predictions = True
|
|
144
|
+
else:
|
|
145
|
+
logger.warning(f"Prediction found for out-of-bounds frame number {frame_num} (max: {num_frames-1}). Skipping.")
|
|
146
|
+
|
|
147
|
+
if not found_predictions:
|
|
148
|
+
logger.warning(f"No predictions found for label '{label.name}' in {video_obj}. Using default confidence.")
|
|
149
|
+
|
|
150
|
+
smooth_confidences = self.apply_running_mean(
|
|
151
|
+
confidences, window_size_in_seconds
|
|
152
|
+
)
|
|
153
|
+
binary_predictions = smooth_confidences > 0.5
|
|
154
|
+
prediction_array[:, i] = binary_predictions
|
|
155
|
+
|
|
156
|
+
self.save_prediction_array(prediction_array)
|
|
157
|
+
logger.info(f"Calculated and saved prediction array for {self}")
|
|
158
|
+
|
|
159
|
+
def apply_running_mean(self, confidence_array, window_size_in_seconds: int = None):
|
|
160
|
+
"""
|
|
161
|
+
Apply a running mean filter to the confidence array for smoothing, assuming a padding
|
|
162
|
+
of 0.5 for the edges.
|
|
163
|
+
"""
|
|
164
|
+
video_obj = self.get_video()
|
|
165
|
+
fps = video_obj.get_fps()
|
|
166
|
+
|
|
167
|
+
if fps is None or fps <= 0:
|
|
168
|
+
logger.warning(f"Invalid FPS ({fps}) for {video_obj}. Cannot apply running mean. Returning original array.")
|
|
169
|
+
return confidence_array
|
|
170
|
+
|
|
171
|
+
if not window_size_in_seconds:
|
|
172
|
+
window_size_in_seconds = DEFAULT_WINDOW_SIZE_IN_SECONDS_FOR_RUNNING_MEAN
|
|
173
|
+
|
|
174
|
+
window_size_in_frames = int(window_size_in_seconds * fps)
|
|
175
|
+
window_size_in_frames = max(window_size_in_frames, 1)
|
|
176
|
+
|
|
177
|
+
window = np.ones(window_size_in_frames) / window_size_in_frames
|
|
178
|
+
pad_size = window_size_in_frames // 2
|
|
179
|
+
|
|
180
|
+
padded_confidences = np.pad(
|
|
181
|
+
confidence_array,
|
|
182
|
+
(pad_size, pad_size),
|
|
183
|
+
"constant",
|
|
184
|
+
constant_values=(0.5, 0.5),
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
running_mean = np.convolve(padded_confidences, window, mode="same")
|
|
188
|
+
start_index = pad_size
|
|
189
|
+
end_index = start_index + len(confidence_array)
|
|
190
|
+
running_mean = running_mean[start_index:end_index]
|
|
191
|
+
|
|
192
|
+
if running_mean.shape != confidence_array.shape:
|
|
193
|
+
logger.warning(f"Running mean output shape {running_mean.shape} differs from input {confidence_array.shape}. Check padding/slicing.")
|
|
194
|
+
return confidence_array
|
|
195
|
+
|
|
196
|
+
return running_mean
|
|
197
|
+
|
|
198
|
+
def create_video_segments_for_label(self, segments: List[Tuple[int, int]], label: "Label"):
|
|
199
|
+
"""
|
|
200
|
+
Creates LabelVideoSegment instances for the given label and segments.
|
|
201
|
+
"""
|
|
202
|
+
from endoreg_db.models import InformationSource
|
|
203
|
+
|
|
204
|
+
video_obj = self.get_video()
|
|
205
|
+
information_source, _ = InformationSource.objects.get_or_create(name="prediction")
|
|
206
|
+
|
|
207
|
+
segments_to_create = []
|
|
208
|
+
for start_frame, end_frame in segments:
|
|
209
|
+
segment_data = {
|
|
210
|
+
"start_frame_number": start_frame,
|
|
211
|
+
"end_frame_number": end_frame,
|
|
212
|
+
"source": information_source,
|
|
213
|
+
"label": label,
|
|
214
|
+
"prediction_meta": self,
|
|
215
|
+
"video_file": video_obj,
|
|
216
|
+
}
|
|
217
|
+
if not LabelVideoSegment.objects.filter(
|
|
218
|
+
video_file=video_obj,
|
|
219
|
+
prediction_meta=self,
|
|
220
|
+
label=label,
|
|
221
|
+
start_frame_number=start_frame,
|
|
222
|
+
end_frame_number=end_frame
|
|
223
|
+
).exists():
|
|
224
|
+
segments_to_create.append(LabelVideoSegment(**segment_data))
|
|
225
|
+
|
|
226
|
+
if segments_to_create:
|
|
227
|
+
LabelVideoSegment.objects.bulk_create(segments_to_create)
|
|
228
|
+
logger.info(f"Created {len(segments_to_create)} video segments for label '{label.name}' in {video_obj}.")
|
|
229
|
+
else:
|
|
230
|
+
logger.info(f"No new video segments needed for label '{label.name}' in {video_obj}.")
|
|
231
|
+
|
|
232
|
+
def create_video_segments(self, segment_length_threshold_in_s: float = None):
|
|
233
|
+
"""
|
|
234
|
+
Generates LabelVideoSegments based on the stored prediction array.
|
|
235
|
+
"""
|
|
236
|
+
if not segment_length_threshold_in_s:
|
|
237
|
+
segment_length_threshold_in_s = DEFAULT_VIDEO_SEGMENT_LENGTH_THRESHOLD_IN_S
|
|
238
|
+
|
|
239
|
+
video_obj = self.get_video()
|
|
240
|
+
fps = video_obj.get_fps()
|
|
241
|
+
|
|
242
|
+
if fps is None or fps <= 0:
|
|
243
|
+
logger.warning(f"Cannot create video segments for {video_obj} with invalid FPS ({fps}).")
|
|
244
|
+
return
|
|
245
|
+
|
|
246
|
+
min_frame_length = int(segment_length_threshold_in_s * fps)
|
|
247
|
+
min_frame_length = max(min_frame_length, 1)
|
|
248
|
+
|
|
249
|
+
label_list = self.get_label_list()
|
|
250
|
+
|
|
251
|
+
prediction_array = self.get_prediction_array()
|
|
252
|
+
if prediction_array is None:
|
|
253
|
+
logger.info(f"Prediction array not found for {self}. Calculating...")
|
|
254
|
+
self.calculate_prediction_array()
|
|
255
|
+
prediction_array = self.get_prediction_array()
|
|
256
|
+
if prediction_array is None:
|
|
257
|
+
logger.error(f"Failed to get or calculate prediction array for {self}. Cannot create segments.")
|
|
258
|
+
return
|
|
259
|
+
|
|
260
|
+
if prediction_array.shape[1] != len(label_list):
|
|
261
|
+
logger.warning(f"Prediction array shape {prediction_array.shape} incompatible with label list length {len(label_list)} for {self}.")
|
|
262
|
+
return
|
|
263
|
+
|
|
264
|
+
logger.info(f"Creating video segments for {self} (min length: {min_frame_length} frames)...")
|
|
265
|
+
for i, label in enumerate(label_list):
|
|
266
|
+
binary_predictions = prediction_array[:, i].astype(bool)
|
|
267
|
+
segments = find_segments_in_prediction_array(binary_predictions, min_frame_length)
|
|
268
|
+
if segments:
|
|
269
|
+
self.create_video_segments_for_label(segments, label)
|
|
270
|
+
logger.info(f"Finished creating video segments for {self}.")
|
|
@@ -9,6 +9,17 @@ from .distribution import (
|
|
|
9
9
|
MultipleCategoricalValueDistribution,
|
|
10
10
|
DateValueDistribution,
|
|
11
11
|
)
|
|
12
|
+
from .emission import EmissionFactor
|
|
13
|
+
|
|
14
|
+
from .gender import Gender
|
|
15
|
+
from .information_source import (
|
|
16
|
+
InformationSource,
|
|
17
|
+
InformationSourceType,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
from .unit import Unit
|
|
21
|
+
|
|
22
|
+
from .tag import Tag
|
|
12
23
|
|
|
13
24
|
__all__ = [
|
|
14
25
|
'Material',
|
|
@@ -20,4 +31,10 @@ __all__ = [
|
|
|
20
31
|
'SingleCategoricalValueDistribution',
|
|
21
32
|
'MultipleCategoricalValueDistribution',
|
|
22
33
|
'DateValueDistribution',
|
|
34
|
+
"Gender",
|
|
35
|
+
"InformationSource",
|
|
36
|
+
"InformationSourceType",
|
|
37
|
+
"Unit",
|
|
38
|
+
"EmissionFactor",
|
|
39
|
+
"Tag",
|
|
23
40
|
]
|
|
@@ -22,8 +22,6 @@ class DateValueDistribution(BaseValueDistribution):
|
|
|
22
22
|
"""
|
|
23
23
|
objects = DateValueDistributionManager()
|
|
24
24
|
name = models.CharField(max_length=100)
|
|
25
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
26
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
27
25
|
description = models.TextField(blank=True, null=True)
|
|
28
26
|
DISTRIBUTION_CHOICES = [
|
|
29
27
|
('uniform', 'Uniform'),
|
|
@@ -41,9 +41,38 @@ class NumericValueDistribution(BaseValueDistribution):
|
|
|
41
41
|
assert isinstance(lab_value, LabValue)
|
|
42
42
|
default_normal_range_dict = lab_value.get_normal_range(patient.age(), patient.gender)
|
|
43
43
|
assert isinstance(default_normal_range_dict, dict)
|
|
44
|
+
|
|
44
45
|
if self.distribution_type == 'uniform':
|
|
45
46
|
assert self.min_descriptor and self.max_descriptor
|
|
46
|
-
|
|
47
|
+
|
|
48
|
+
min_key_needed = self.min_descriptor.split('_')[0]
|
|
49
|
+
max_key_needed = self.max_descriptor.split('_')[0]
|
|
50
|
+
|
|
51
|
+
min_val_from_range = default_normal_range_dict.get(min_key_needed)
|
|
52
|
+
max_val_from_range = default_normal_range_dict.get(max_key_needed)
|
|
53
|
+
|
|
54
|
+
if min_val_from_range is None:
|
|
55
|
+
raise ValueError(
|
|
56
|
+
f"Cannot generate value for LabValue '{lab_value.name}' using distribution "
|
|
57
|
+
f"'{getattr(self, 'name', self.pk)}'. "
|
|
58
|
+
f"Required normal range component '{min_key_needed}' derived from min_descriptor "
|
|
59
|
+
f"'{self.min_descriptor}' is None. "
|
|
60
|
+
f"Patient context: age={patient.age()}, gender='{patient.gender.name if patient.gender else None}'. "
|
|
61
|
+
f"LabValue '{lab_value.name}' is gender-dependent: {lab_value.normal_range_gender_dependent}. "
|
|
62
|
+
f"Check LabValue's default_normal_range definition for this patient context."
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
if max_val_from_range is None:
|
|
66
|
+
raise ValueError(
|
|
67
|
+
f"Cannot generate value for LabValue '{lab_value.name}' using distribution "
|
|
68
|
+
f"'{getattr(self, 'name', self.pk)}'. "
|
|
69
|
+
f"Required normal range component '{max_key_needed}' derived from max_descriptor "
|
|
70
|
+
f"'{self.max_descriptor}' is None. "
|
|
71
|
+
f"Patient context: age={patient.age()}, gender='{patient.gender.name if patient.gender else None}'. "
|
|
72
|
+
f"LabValue '{lab_value.name}' is gender-dependent: {lab_value.normal_range_gender_dependent}. "
|
|
73
|
+
f"Check LabValue's default_normal_range definition for this patient context."
|
|
74
|
+
)
|
|
75
|
+
|
|
47
76
|
value = self._generate_value_uniform(default_normal_range_dict)
|
|
48
77
|
|
|
49
78
|
return value
|
|
@@ -94,4 +123,3 @@ class NumericValueDistribution(BaseValueDistribution):
|
|
|
94
123
|
# generate value
|
|
95
124
|
return np.random.uniform(result_dict["min"], result_dict["max"])
|
|
96
125
|
|
|
97
|
-
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
from typing import List
|
|
2
|
+
from typing import TYPE_CHECKING, List
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from ...administration import ReferenceProduct
|
|
6
|
+
from ..unit import Unit
|
|
7
|
+
|
|
3
8
|
class EmissionFactorManager(models.Manager):
|
|
4
9
|
"""
|
|
5
10
|
Manager for EmissionFactor with custom query methods.
|
|
@@ -17,18 +22,22 @@ class EmissionFactor(models.Model):
|
|
|
17
22
|
|
|
18
23
|
Attributes:
|
|
19
24
|
name (str): The name of the emission factor.
|
|
20
|
-
name_de (str): The German name of the emission factor.
|
|
21
|
-
name_en (str): The English name of the emission factor.
|
|
22
25
|
unit (ForeignKey): The unit associated with the emission factor.
|
|
23
26
|
value (float): The value of the emission factor.
|
|
24
27
|
"""
|
|
25
28
|
objects = EmissionFactorManager()
|
|
26
29
|
|
|
27
30
|
name = models.CharField(max_length=255)
|
|
28
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
29
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
30
31
|
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
31
32
|
value = models.FloatField()
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
unit: "Unit"
|
|
36
|
+
reference_products: models.QuerySet["ReferenceProduct"]
|
|
37
|
+
reference_product_package: models.QuerySet["ReferenceProduct"]
|
|
38
|
+
reference_product_product: models.QuerySet["ReferenceProduct"]
|
|
39
|
+
|
|
40
|
+
|
|
32
41
|
|
|
33
42
|
def natural_key(self) -> tuple:
|
|
34
43
|
"""
|
|
@@ -64,7 +73,7 @@ class EmissionFactor(models.Model):
|
|
|
64
73
|
Returns:
|
|
65
74
|
list: A list of ReferenceProduct instances associated with this emission factor.
|
|
66
75
|
"""
|
|
67
|
-
from
|
|
76
|
+
from ...administration.product import ReferenceProduct
|
|
68
77
|
|
|
69
78
|
reference_products = []
|
|
70
79
|
reference_products += ReferenceProduct.objects.filter(emission_factor_total=self)
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from ..administration import Patient
|
|
2
6
|
|
|
3
7
|
class GenderManager(models.Manager):
|
|
4
8
|
def get_by_natural_key(self, name):
|
|
@@ -9,14 +13,15 @@ class Gender(models.Model):
|
|
|
9
13
|
objects = GenderManager()
|
|
10
14
|
|
|
11
15
|
name = models.CharField(max_length=255)
|
|
12
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
13
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
14
16
|
abbreviation = models.CharField(max_length=255, null=True)
|
|
15
17
|
description = models.TextField(blank=True, null=True)
|
|
16
18
|
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
patients: models.QuerySet["Patient"]
|
|
21
|
+
|
|
17
22
|
def natural_key(self):
|
|
18
23
|
return (self.name,)
|
|
19
24
|
|
|
20
25
|
def __str__(self):
|
|
21
|
-
return self.name
|
|
26
|
+
return str(self.name)
|
|
22
27
|
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from endoreg_db.models import InformationSourceType
|
|
5
|
+
|
|
6
|
+
def get_prediction_information_source():
|
|
7
|
+
"""
|
|
8
|
+
Returns the InformationSource instance with the name "prediction".
|
|
9
|
+
|
|
10
|
+
Raises:
|
|
11
|
+
AssertionError: If no InformationSource with the name "prediction" exists.
|
|
12
|
+
"""
|
|
13
|
+
_source = InformationSource.objects.get(name="prediction")
|
|
14
|
+
|
|
15
|
+
# make sure to return only one object
|
|
16
|
+
assert _source, "No prediction information source found"
|
|
17
|
+
return _source
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class InformationSourceManager(models.Manager):
|
|
21
|
+
def get_by_natural_key(self, name):
|
|
22
|
+
"""
|
|
23
|
+
Retrieves a model instance using its natural key.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
name: The natural key value corresponding to the model's 'name' field.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The model instance that matches the provided natural key.
|
|
30
|
+
"""
|
|
31
|
+
return self.get(name=name)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class InformationSource(models.Model):
|
|
35
|
+
objects = InformationSourceManager()
|
|
36
|
+
|
|
37
|
+
name = models.CharField(max_length=100)
|
|
38
|
+
|
|
39
|
+
url = models.URLField(blank=True, null=True)
|
|
40
|
+
description = models.TextField(blank=True, null=True)
|
|
41
|
+
date = models.DateField(blank=True, null=True)
|
|
42
|
+
date_created = models.DateField(auto_now_add=True)
|
|
43
|
+
date_modified = models.DateField(auto_now=True)
|
|
44
|
+
abbreviation = models.CharField(max_length=100, blank=True, null=True, unique=True)
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING:
|
|
47
|
+
#information_source_types: models.QuerySet["InformationSourceType"]
|
|
48
|
+
# Avoid self-referential import; use forward references instead
|
|
49
|
+
pass
|
|
50
|
+
class Meta:
|
|
51
|
+
verbose_name = "Information Source"
|
|
52
|
+
verbose_name_plural = "Information Sources"
|
|
53
|
+
|
|
54
|
+
# add name and abbreviation as index
|
|
55
|
+
indexes = [
|
|
56
|
+
models.Index(fields=["name"]),
|
|
57
|
+
models.Index(fields=["abbreviation"]),
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def natural_key(self):
|
|
62
|
+
"""
|
|
63
|
+
Returns the natural key tuple for the information source.
|
|
64
|
+
|
|
65
|
+
The tuple contains the object's name, which uniquely identifies it for
|
|
66
|
+
serialization and natural key lookup.
|
|
67
|
+
"""
|
|
68
|
+
return (self.name,)
|
|
69
|
+
|
|
70
|
+
def __str__(self):
|
|
71
|
+
"""
|
|
72
|
+
Return the name of the InformationSource as its string representation.
|
|
73
|
+
"""
|
|
74
|
+
return str(self.name)
|
|
75
|
+
|
|
76
|
+
class InformationSourceTypeManager(models.Manager):
|
|
77
|
+
def get_by_natural_key(self, name):
|
|
78
|
+
"""
|
|
79
|
+
Retrieve an instance of the model by its natural key, which is the 'name' field.
|
|
80
|
+
|
|
81
|
+
Parameters:
|
|
82
|
+
name (str): The value of the 'name' field to look up.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
The model instance with the specified name.
|
|
86
|
+
"""
|
|
87
|
+
return self.get(name=name)
|
|
88
|
+
|
|
89
|
+
class InformationSourceType(models.Model):
|
|
90
|
+
objects = InformationSourceTypeManager()
|
|
91
|
+
|
|
92
|
+
name = models.CharField(max_length=100, unique=True)
|
|
93
|
+
description = models.TextField(blank=True, null=True)
|
|
94
|
+
|
|
95
|
+
information_sources = models.ManyToManyField(
|
|
96
|
+
InformationSource,
|
|
97
|
+
related_name="information_source_types",
|
|
98
|
+
blank=True,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
class Meta:
|
|
102
|
+
verbose_name = "Information Source Type"
|
|
103
|
+
verbose_name_plural = "Information Source Types"
|
|
104
|
+
|
|
105
|
+
# information_sources: models.QuerySet["InformationSource"]
|
|
106
|
+
|
|
107
|
+
@classmethod
|
|
108
|
+
def get_prediction_type(cls) -> "InformationSourceType":
|
|
109
|
+
"""
|
|
110
|
+
Return the InformationSourceType instance with the name "prediction".
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
InformationSourceType: The instance representing the "prediction" information source type.
|
|
114
|
+
|
|
115
|
+
Raises:
|
|
116
|
+
InformationSourceType.DoesNotExist: If no such instance exists.
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
try:
|
|
120
|
+
return cls.objects.get(name="prediction")
|
|
121
|
+
except cls.DoesNotExist as e:
|
|
122
|
+
raise cls.DoesNotExist(
|
|
123
|
+
"The 'prediction' InformationSourceType was not found. "
|
|
124
|
+
"Please check your data fixtures or initial data migrations."
|
|
125
|
+
) from e
|
|
126
|
+
|
|
127
|
+
@classmethod
|
|
128
|
+
def get_manual_annotation_type(cls) -> "InformationSourceType":
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
Return the InformationSourceType instance representing manual annotation.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
InformationSourceType: The instance with name "annotation".
|
|
135
|
+
|
|
136
|
+
Raises:
|
|
137
|
+
AssertionError: If no InformationSourceType with name "annotation" exists.
|
|
138
|
+
|
|
139
|
+
"""
|
|
140
|
+
try:
|
|
141
|
+
return cls.objects.get(name="manual_annotation")
|
|
142
|
+
except cls.DoesNotExist as e:
|
|
143
|
+
raise cls.DoesNotExist(
|
|
144
|
+
"The 'manual_annotation' InformationSourceType was not found. "
|
|
145
|
+
"Please check your data fixtures or initial data migrations."
|
|
146
|
+
) from e
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def natural_key(self):
|
|
150
|
+
"""
|
|
151
|
+
Return a tuple containing the name of the information source type for natural key serialization.
|
|
152
|
+
"""
|
|
153
|
+
return (self.name,)
|
|
154
|
+
|
|
155
|
+
def __str__(self):
|
|
156
|
+
"""
|
|
157
|
+
Return the name of the InformationSourceType as its string representation.
|
|
158
|
+
"""
|
|
159
|
+
return str(self.name)
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .emission import EmissionFactor
|
|
7
|
+
from ..administration.product.product_material import ProductMaterial
|
|
2
8
|
|
|
3
9
|
class MaterialManager(models.Manager):
|
|
4
10
|
def get_by_natural_key(self, name):
|
|
@@ -8,10 +14,12 @@ class Material(models.Model):
|
|
|
8
14
|
objects = MaterialManager()
|
|
9
15
|
|
|
10
16
|
name = models.CharField(max_length=255)
|
|
11
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
12
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
13
17
|
emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
|
|
14
18
|
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
emission_factor: "EmissionFactor"
|
|
21
|
+
material_product_materials: models.QuerySet["ProductMaterial"]
|
|
22
|
+
|
|
15
23
|
def natural_key(self):
|
|
16
24
|
return (self.name,)
|
|
17
25
|
|
|
@@ -8,10 +8,14 @@ class Resource(models.Model):
|
|
|
8
8
|
objects = ResourceManager()
|
|
9
9
|
|
|
10
10
|
name = models.CharField(max_length=255)
|
|
11
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
12
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
13
11
|
|
|
14
12
|
def natural_key(self):
|
|
13
|
+
"""
|
|
14
|
+
Return a tuple representing the natural key for this resource instance.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
tuple: A one-element tuple containing the resource's name.
|
|
18
|
+
"""
|
|
15
19
|
return (self.name,)
|
|
16
20
|
|
|
17
21
|
def __str__(self):
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from endoreg_db.models import RequirementSet
|
|
6
|
+
|
|
7
|
+
class TagManager(models.Manager):
|
|
8
|
+
def get_by_natural_key(self, name):
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
class Tag(models.Model):
|
|
12
|
+
name = models.CharField(max_length=100, unique=True)
|
|
13
|
+
|
|
14
|
+
objects = TagManager()
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
requirement_sets: "models.ManyToManyField[RequirementSet]"
|
|
18
|
+
|
|
19
|
+
class Meta:
|
|
20
|
+
verbose_name = "Tag"
|
|
21
|
+
verbose_name_plural = "Tags"
|
|
22
|
+
|
|
23
|
+
def __str__(self):
|
|
24
|
+
return self.name
|
|
25
|
+
|
|
26
|
+
def natural_key(self):
|
|
27
|
+
return (self.name,)
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from endoreg_db.models import (
|
|
6
|
+
Product,
|
|
7
|
+
EmissionFactor,
|
|
8
|
+
Unit,
|
|
9
|
+
)
|
|
2
10
|
|
|
3
11
|
class TransportRouteManager(models.Manager):
|
|
4
12
|
def get_by_natural_key(self, name):
|
|
@@ -9,11 +17,14 @@ class TransportRoute(models.Model):
|
|
|
9
17
|
|
|
10
18
|
distance = models.FloatField()
|
|
11
19
|
name = models.CharField(max_length=255)
|
|
12
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
13
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
14
20
|
emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
|
|
15
21
|
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
16
22
|
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
emission_factor: "EmissionFactor"
|
|
25
|
+
unit: "Unit"
|
|
26
|
+
products: models.QuerySet["Product"]
|
|
27
|
+
|
|
17
28
|
def natural_key(self):
|
|
18
29
|
return (self.name,)
|
|
19
30
|
|