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
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
from typing import List, TYPE_CHECKING
|
|
2
|
+
from typing import List, TYPE_CHECKING, Optional
|
|
3
3
|
|
|
4
4
|
if TYPE_CHECKING:
|
|
5
5
|
from endoreg_db.models import Examination, Requirement, FindingIntervention
|
|
6
|
-
|
|
6
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
7
7
|
|
|
8
8
|
class ExaminationIndicationManager(models.Manager):
|
|
9
9
|
"""
|
|
@@ -29,16 +29,12 @@ class ExaminationIndication(models.Model):
|
|
|
29
29
|
|
|
30
30
|
Attributes:
|
|
31
31
|
name (str): The unique name of the indication.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
classification (ForeignKey): The classification associated with the indication.
|
|
35
|
-
examination (ForeignKey): The examination associated with the indication.
|
|
32
|
+
classifications (ManyToManyField): The classifications associated with the indication.
|
|
33
|
+
examinations (ManyToManyField): The examinations associated with the indication.
|
|
36
34
|
expected_interventions (ManyToManyField): Expected interventions for this indication.
|
|
37
35
|
"""
|
|
38
36
|
|
|
39
37
|
name = models.CharField(max_length=255, unique=True)
|
|
40
|
-
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
41
|
-
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
42
38
|
description = models.TextField(blank=True, null=True)
|
|
43
39
|
|
|
44
40
|
classifications = models.ManyToManyField(
|
|
@@ -47,10 +43,10 @@ class ExaminationIndication(models.Model):
|
|
|
47
43
|
blank=True,
|
|
48
44
|
)
|
|
49
45
|
|
|
50
|
-
|
|
46
|
+
examinations = models.ManyToManyField(
|
|
51
47
|
"Examination",
|
|
52
|
-
on_delete=models.CASCADE,
|
|
53
48
|
related_name="indications",
|
|
49
|
+
blank=True,
|
|
54
50
|
)
|
|
55
51
|
|
|
56
52
|
expected_interventions = models.ManyToManyField(
|
|
@@ -62,17 +58,29 @@ class ExaminationIndication(models.Model):
|
|
|
62
58
|
objects = ExaminationIndicationManager()
|
|
63
59
|
|
|
64
60
|
if TYPE_CHECKING:
|
|
65
|
-
classifications: "models.ManyToManyField[ExaminationIndicationClassification]"
|
|
66
|
-
|
|
61
|
+
classifications: "models.ManyToManyField[ExaminationIndicationClassification, ExaminationIndicationClassification]"
|
|
62
|
+
examinations: "models.ManyToManyField[Examination, Examination]"
|
|
67
63
|
related_requirements: "models.QuerySet[Requirement]"
|
|
68
|
-
expected_interventions: "models.ManyToManyField[FindingIntervention]"
|
|
64
|
+
expected_interventions: "models.ManyToManyField[FindingIntervention, FindingIntervention]"
|
|
69
65
|
|
|
70
|
-
|
|
66
|
+
@property
|
|
67
|
+
def links(self) -> "RequirementLinks":
|
|
71
68
|
"""
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
Aggregates related requirements, classifications, examination, and interventions into a RequirementLinks object.
|
|
70
|
+
|
|
74
71
|
Returns:
|
|
75
|
-
|
|
72
|
+
A RequirementLinks instance representing all entities linked to this examination indication.
|
|
73
|
+
"""
|
|
74
|
+
from endoreg_db.utils.links.requirement_link import RequirementLinks
|
|
75
|
+
return RequirementLinks(
|
|
76
|
+
examination_indications=[self],
|
|
77
|
+
examinations=list(self.examinations.all()),
|
|
78
|
+
finding_interventions=list(self.expected_interventions.all()),
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def natural_key(self) -> tuple:
|
|
82
|
+
"""
|
|
83
|
+
Returns a tuple containing the unique name of the indication as its natural key.
|
|
76
84
|
"""
|
|
77
85
|
return (self.name,)
|
|
78
86
|
|
|
@@ -100,14 +108,25 @@ class ExaminationIndication(models.Model):
|
|
|
100
108
|
choices.extend(classification.choices.all())
|
|
101
109
|
return choices
|
|
102
110
|
|
|
103
|
-
def get_examination(self) -> "Examination":
|
|
111
|
+
def get_examination(self) -> Optional["Examination"]:
|
|
104
112
|
"""
|
|
105
|
-
|
|
113
|
+
Returns the first examination associated with this indication, or None if no examinations exist.
|
|
114
|
+
|
|
115
|
+
Note: Since this is now a many-to-many relationship, this method returns the first examination.
|
|
116
|
+
Consider using get_examinations() for accessing all related examinations.
|
|
117
|
+
"""
|
|
118
|
+
return self.examinations.first()
|
|
106
119
|
|
|
120
|
+
def get_examinations(self) -> List["Examination"]:
|
|
121
|
+
"""
|
|
122
|
+
Returns all examinations associated with this indication.
|
|
123
|
+
|
|
107
124
|
Returns:
|
|
108
|
-
Examination:
|
|
125
|
+
List[Examination]: A list of all examinations linked to this indication.
|
|
109
126
|
"""
|
|
110
|
-
return self.
|
|
127
|
+
return list(self.examinations.all())
|
|
128
|
+
|
|
129
|
+
|
|
111
130
|
|
|
112
131
|
|
|
113
132
|
class ExaminationIndicationClassificationManager(models.Manager):
|
|
@@ -134,28 +153,24 @@ class ExaminationIndicationClassification(models.Model):
|
|
|
134
153
|
|
|
135
154
|
Attributes:
|
|
136
155
|
name (str): The unique name of the classification.
|
|
137
|
-
|
|
138
|
-
|
|
156
|
+
description (str): Optional description of the classification.
|
|
157
|
+
examinations (ManyToManyField): The examinations associated with this classification.
|
|
139
158
|
"""
|
|
140
159
|
|
|
141
160
|
name = models.CharField(max_length=255, unique=True)
|
|
142
|
-
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
143
|
-
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
144
161
|
description = models.TextField(blank=True, null=True)
|
|
145
|
-
|
|
162
|
+
examinations = models.ManyToManyField(
|
|
146
163
|
"Examination",
|
|
147
|
-
on_delete=models.CASCADE,
|
|
148
164
|
related_name="indication_classifications",
|
|
149
165
|
blank=True,
|
|
150
|
-
null=True,
|
|
151
166
|
)
|
|
152
167
|
|
|
168
|
+
objects = ExaminationIndicationClassificationManager()
|
|
169
|
+
|
|
153
170
|
if TYPE_CHECKING:
|
|
154
|
-
|
|
171
|
+
examinations: "models.ManyToManyField[Examination, Examination]"
|
|
155
172
|
choices: "models.QuerySet[ExaminationIndicationClassificationChoice]"
|
|
156
173
|
|
|
157
|
-
objects = ExaminationIndicationClassificationManager()
|
|
158
|
-
|
|
159
174
|
def natural_key(self) -> tuple:
|
|
160
175
|
"""
|
|
161
176
|
Returns the natural key for the classification.
|
|
@@ -183,6 +198,24 @@ class ExaminationIndicationClassification(models.Model):
|
|
|
183
198
|
"""
|
|
184
199
|
return list(self.choices.all())
|
|
185
200
|
|
|
201
|
+
def get_examination(self) -> Optional["Examination"]:
|
|
202
|
+
"""
|
|
203
|
+
Returns the first examination associated with this classification, or None if no examinations exist.
|
|
204
|
+
|
|
205
|
+
Note: Since this is now a many-to-many relationship, this method returns the first examination.
|
|
206
|
+
Consider using get_examinations() for accessing all related examinations.
|
|
207
|
+
"""
|
|
208
|
+
return self.examinations.first()
|
|
209
|
+
|
|
210
|
+
def get_examinations(self) -> List["Examination"]:
|
|
211
|
+
"""
|
|
212
|
+
Returns all examinations associated with this classification.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
List[Examination]: A list of all examinations linked to this classification.
|
|
216
|
+
"""
|
|
217
|
+
return list(self.examinations.all())
|
|
218
|
+
|
|
186
219
|
|
|
187
220
|
class ExaminationIndicationClassificationChoiceManager(models.Manager):
|
|
188
221
|
"""
|
|
@@ -210,16 +243,12 @@ class ExaminationIndicationClassificationChoice(models.Model):
|
|
|
210
243
|
|
|
211
244
|
Attributes:
|
|
212
245
|
name (str): The unique name of the choice.
|
|
213
|
-
name_de (str): The German name of the choice.
|
|
214
|
-
name_en (str): The English name of the choice.
|
|
215
246
|
subcategories (JSONField): Subcategories associated with the choice.
|
|
216
247
|
numerical_descriptors (JSONField): Numerical descriptors for the choice.
|
|
217
248
|
classification (ForeignKey): The classification to which this choice belongs.
|
|
218
249
|
"""
|
|
219
250
|
|
|
220
251
|
name = models.CharField(max_length=255, unique=True)
|
|
221
|
-
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
222
|
-
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
223
252
|
subcategories = models.JSONField(default=dict)
|
|
224
253
|
numerical_descriptors = models.JSONField(default=dict)
|
|
225
254
|
classification = models.ForeignKey(
|
|
@@ -14,15 +14,11 @@ class ExaminationTime(models.Model):
|
|
|
14
14
|
|
|
15
15
|
Attributes:
|
|
16
16
|
name (str): The unique name of the examination time.
|
|
17
|
-
name_de (str): The German name of the examination time.
|
|
18
|
-
name_en (str): The English name of the examination time.
|
|
19
17
|
start_time (TimeField): The starting time for the examination.
|
|
20
18
|
end_time (TimeField): The ending time for the examination.
|
|
21
19
|
time_types (ManyToManyField): The types associated with this examination time.
|
|
22
20
|
"""
|
|
23
21
|
name = models.CharField(max_length=100, unique=True)
|
|
24
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
25
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
26
22
|
start_time = models.TimeField(blank=True, null=True)
|
|
27
23
|
time_types = models.ManyToManyField('ExaminationTimeType', blank=True)
|
|
28
24
|
end_time = models.TimeField(blank=True, null=True)
|
|
@@ -13,22 +13,15 @@ class ExaminationTimeType(models.Model):
|
|
|
13
13
|
|
|
14
14
|
Attributes:
|
|
15
15
|
name (str): The unique name of the examination time type.
|
|
16
|
-
name_de (str): The German name of the examination time type.
|
|
17
|
-
name_en (str): The English name of the examination time type.
|
|
18
16
|
examinations: The examinations associated with this type.
|
|
19
17
|
"""
|
|
20
18
|
objects = ExaminationTimeTypeManager()
|
|
21
19
|
name = models.CharField(max_length=100, unique=True)
|
|
22
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
23
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
24
20
|
examinations = models.ManyToManyField('Examination', blank=True)
|
|
25
21
|
|
|
26
22
|
def __str__(self) -> str:
|
|
27
23
|
"""
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
str: The name of the examination time type.
|
|
24
|
+
Return the name of the examination time type as its string representation.
|
|
32
25
|
"""
|
|
33
26
|
return self.name
|
|
34
27
|
|
|
@@ -25,20 +25,14 @@ class ExaminationType(models.Model):
|
|
|
25
25
|
|
|
26
26
|
Attributes:
|
|
27
27
|
name (str): The unique name of the examination type.
|
|
28
|
-
name_de (str): The German name of the examination type.
|
|
29
|
-
name_en (str): The English name of the examination type.
|
|
30
28
|
"""
|
|
31
29
|
|
|
32
30
|
objects = ExaminationTypeManager()
|
|
33
31
|
name = models.CharField(max_length=100, unique=True)
|
|
34
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
35
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
36
32
|
|
|
37
33
|
def __str__(self) -> str:
|
|
38
34
|
"""
|
|
39
|
-
Return the string representation of the examination type.
|
|
40
|
-
|
|
41
|
-
If an English name is provided, it is returned; otherwise, the default name is used.
|
|
35
|
+
Return the string representation of the examination type using its name.
|
|
42
36
|
"""
|
|
43
37
|
name = self.name_en or self.name
|
|
44
38
|
name = str(name)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from .finding import Finding
|
|
2
|
+
from .finding_type import FindingType
|
|
3
|
+
|
|
4
|
+
from .finding_classification import (
|
|
5
|
+
FindingClassificationType, FindingClassification, FindingClassificationChoice,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
from .finding_intervention import FindingIntervention, FindingInterventionType
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"Finding",
|
|
12
|
+
"FindingClassificationType",
|
|
13
|
+
"FindingClassification",
|
|
14
|
+
"FindingClassificationChoice",
|
|
15
|
+
"FindingType",
|
|
16
|
+
"FindingIntervention",
|
|
17
|
+
"FindingInterventionType",
|
|
18
|
+
]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Class to represent findings of examinations
|
|
2
|
+
from django.db import models
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
class FindingManager(models.Manager):
|
|
8
|
+
def get_by_natural_key(self, name):
|
|
9
|
+
return self.get(name=name)
|
|
10
|
+
|
|
11
|
+
class Finding(models.Model):
|
|
12
|
+
name = models.CharField(max_length=100, unique=True)
|
|
13
|
+
description = models.TextField(blank=True, null=True)
|
|
14
|
+
examinations = models.ManyToManyField(
|
|
15
|
+
'Examination',
|
|
16
|
+
blank=True,
|
|
17
|
+
related_name='findings'
|
|
18
|
+
) # type: ignore
|
|
19
|
+
finding_types = models.ManyToManyField(
|
|
20
|
+
'FindingType',
|
|
21
|
+
blank=True,
|
|
22
|
+
related_name='findings'
|
|
23
|
+
) # type: ignore
|
|
24
|
+
|
|
25
|
+
finding_interventions = models.ManyToManyField(
|
|
26
|
+
'FindingIntervention',
|
|
27
|
+
blank=True,
|
|
28
|
+
related_name='findings'
|
|
29
|
+
) # type: ignore
|
|
30
|
+
|
|
31
|
+
objects = FindingManager()
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from endoreg_db.models import (
|
|
35
|
+
Examination, FindingType, FindingIntervention, FindingClassificationType,
|
|
36
|
+
FindingClassification,
|
|
37
|
+
PatientFindingClassification
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
finding_classifications: models.QuerySet['FindingClassification']
|
|
41
|
+
examinations: models.QuerySet[Examination]
|
|
42
|
+
finding_types: models.QuerySet[FindingType]
|
|
43
|
+
finding_interventions: models.QuerySet[FindingIntervention]
|
|
44
|
+
|
|
45
|
+
def natural_key(self):
|
|
46
|
+
"""
|
|
47
|
+
Return a tuple containing the unique natural key for this Finding instance.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
tuple: A single-element tuple with the Finding's name.
|
|
51
|
+
"""
|
|
52
|
+
return (self.name,)
|
|
53
|
+
|
|
54
|
+
def __str__(self):
|
|
55
|
+
return self.name
|
|
56
|
+
|
|
57
|
+
def get_finding_types(self):
|
|
58
|
+
"""
|
|
59
|
+
Return all finding types associated with this finding.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
QuerySet: All related FindingType instances.
|
|
63
|
+
"""
|
|
64
|
+
return self.finding_types.all()
|
|
65
|
+
|
|
66
|
+
def get_classifications(self, classification_type: str = None) -> models.QuerySet['FindingClassification']:
|
|
67
|
+
"""
|
|
68
|
+
Retrieve all classifications associated with this finding, optionally filtered by classification type.
|
|
69
|
+
|
|
70
|
+
Parameters:
|
|
71
|
+
classification_type (str, optional): If provided, only classifications with a matching type name are returned.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
List[FindingClassification]: List of related classification objects, filtered by type if specified.
|
|
75
|
+
"""
|
|
76
|
+
if classification_type:
|
|
77
|
+
return self.finding_classifications.filter(classification_types__name=classification_type)
|
|
78
|
+
return self.finding_classifications.all()
|
|
79
|
+
|
|
80
|
+
def get_location_classifications(self):
|
|
81
|
+
"""
|
|
82
|
+
Retrieve all related FindingClassification objects with classification type 'location'.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
QuerySet: All FindingClassification instances linked to this finding where the classification type name is 'location' (case-insensitive).
|
|
86
|
+
"""
|
|
87
|
+
return self.finding_classifications.filter(classification_types__name__iexact="location")
|
|
88
|
+
|
|
89
|
+
def get_morphology_classifications(self):
|
|
90
|
+
"""
|
|
91
|
+
Retrieve all related FindingClassification objects with classification type 'morphology'.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
QuerySet: A queryset of FindingClassification instances associated with this finding and classified as 'morphology'.
|
|
95
|
+
"""
|
|
96
|
+
return self.finding_classifications.filter(classification_types__name__iexact="morphology")
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, List
|
|
3
|
+
|
|
4
|
+
class FindingClassificationTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
class FindingClassificationType(models.Model):
|
|
9
|
+
name = models.CharField(max_length=255, unique=True)
|
|
10
|
+
description = models.TextField(blank=True)
|
|
11
|
+
|
|
12
|
+
objects = FindingClassificationTypeManager()
|
|
13
|
+
|
|
14
|
+
def natural_key(self):
|
|
15
|
+
return (self.name,)
|
|
16
|
+
|
|
17
|
+
def __str__(self):
|
|
18
|
+
return str(self.name)
|
|
19
|
+
|
|
20
|
+
@classmethod
|
|
21
|
+
def get_required_classifications_for_finding(cls, finding):
|
|
22
|
+
"""
|
|
23
|
+
Returns all required finding classification types for a given finding.
|
|
24
|
+
"""
|
|
25
|
+
required_classification_types = [
|
|
26
|
+
_ for _ in finding.required_morphology_classification_types.all()
|
|
27
|
+
]
|
|
28
|
+
return required_classification_types
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class FindingClassificationManager(models.Manager):
|
|
32
|
+
def get_by_natural_key(self, name):
|
|
33
|
+
return self.get(name=name)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class FindingClassification(models.Model):
|
|
37
|
+
name = models.CharField(max_length=255, unique=True)
|
|
38
|
+
description = models.TextField(blank=True)
|
|
39
|
+
classification_types = models.ManyToManyField(
|
|
40
|
+
to=FindingClassificationType,
|
|
41
|
+
# on_delete=models.CASCADE
|
|
42
|
+
)
|
|
43
|
+
choices = models.ManyToManyField(
|
|
44
|
+
'FindingClassificationChoice',
|
|
45
|
+
related_name='classifications',
|
|
46
|
+
blank=True
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
findings = models.ManyToManyField('Finding', blank=True, related_name='finding_classifications')
|
|
50
|
+
examinations = models.ManyToManyField('Examination', blank=True, related_name='finding_classifications')
|
|
51
|
+
finding_types = models.ManyToManyField('FindingType', blank=True, related_name='finding_classifications')
|
|
52
|
+
|
|
53
|
+
objects = FindingClassificationManager()
|
|
54
|
+
|
|
55
|
+
if TYPE_CHECKING:
|
|
56
|
+
from endoreg_db.models import (
|
|
57
|
+
Finding, Examination, FindingType, PatientFindingClassification
|
|
58
|
+
)
|
|
59
|
+
classification_types: models.ManyToManyField[FindingClassificationType]
|
|
60
|
+
findings: models.QuerySet[Finding]
|
|
61
|
+
examinations: models.QuerySet[Examination]
|
|
62
|
+
finding_types: models.QuerySet[FindingType]
|
|
63
|
+
choices: models.QuerySet['FindingClassificationChoice']
|
|
64
|
+
patient_finding_classifications: models.QuerySet['PatientFindingClassification']
|
|
65
|
+
|
|
66
|
+
def natural_key(self):
|
|
67
|
+
return (self.name,)
|
|
68
|
+
|
|
69
|
+
def __str__(self):
|
|
70
|
+
return str(self.name)
|
|
71
|
+
|
|
72
|
+
def get_choices(self):
|
|
73
|
+
"""
|
|
74
|
+
Return all choices associated with this classification.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
QuerySet: All related FindingClassificationChoice instances.
|
|
78
|
+
"""
|
|
79
|
+
return self.choices.all()
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def is_morphology(self):
|
|
83
|
+
"""
|
|
84
|
+
Return True if any related classification type has the name "morphology" (case-insensitive).
|
|
85
|
+
"""
|
|
86
|
+
return self.classification_types.filter(name__iexact="morphology").exists()
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def is_location(self):
|
|
90
|
+
"""
|
|
91
|
+
Returns True if any related classification type has the name "location" (case-insensitive).
|
|
92
|
+
"""
|
|
93
|
+
return self.classification_types.filter(name__iexact="location").exists()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class FindingClassificationChoiceManager(models.Manager):
|
|
97
|
+
def get_by_natural_key(self, name):
|
|
98
|
+
"""
|
|
99
|
+
Retrieve an instance by its unique name using the natural key.
|
|
100
|
+
|
|
101
|
+
Parameters:
|
|
102
|
+
name (str): The unique name identifying the instance.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
The model instance with the specified name.
|
|
106
|
+
"""
|
|
107
|
+
return self.get(name=name)
|
|
108
|
+
|
|
109
|
+
class FindingClassificationChoice(models.Model):
|
|
110
|
+
name = models.CharField(max_length=255, unique=True)
|
|
111
|
+
description = models.TextField(blank=True)
|
|
112
|
+
# classifications = models.ManyToManyField(
|
|
113
|
+
# "FindingClassification",
|
|
114
|
+
# related_name='choices'
|
|
115
|
+
# )
|
|
116
|
+
|
|
117
|
+
subcategories = models.JSONField(
|
|
118
|
+
default = dict
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
numerical_descriptors = models.JSONField(
|
|
122
|
+
default = dict
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
objects = FindingClassificationChoiceManager()
|
|
126
|
+
|
|
127
|
+
if TYPE_CHECKING:
|
|
128
|
+
from endoreg_db.models import (
|
|
129
|
+
PatientFindingClassification
|
|
130
|
+
)
|
|
131
|
+
classifications: models.QuerySet['FindingClassification']
|
|
132
|
+
patient_finding_classifications: models.QuerySet['PatientFindingClassification']
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def natural_key(self):
|
|
136
|
+
return (self.name,)
|
|
137
|
+
|
|
138
|
+
def __str__(self):
|
|
139
|
+
classifications_names = ", ".join([c.name for c in self.classifications.all()])
|
|
140
|
+
_str = f"{self.name} ({classifications_names})"
|
|
141
|
+
return _str
|
|
142
|
+
|
|
@@ -6,11 +6,7 @@ class FindingInterventionManager(models.Manager):
|
|
|
6
6
|
|
|
7
7
|
class FindingIntervention(models.Model):
|
|
8
8
|
name = models.CharField(max_length=100, unique=True)
|
|
9
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
10
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
11
9
|
description = models.TextField(blank=True, null=True)
|
|
12
|
-
description_de = models.TextField(blank=True, null=True)
|
|
13
|
-
description_en = models.TextField(blank=True, null=True)
|
|
14
10
|
|
|
15
11
|
intervention_types = models.ManyToManyField(
|
|
16
12
|
'FindingInterventionType',
|
|
@@ -36,7 +32,7 @@ class FindingIntervention(models.Model):
|
|
|
36
32
|
return (self.name,)
|
|
37
33
|
|
|
38
34
|
def __str__(self):
|
|
39
|
-
return self.name
|
|
35
|
+
return str(self.name)
|
|
40
36
|
|
|
41
37
|
|
|
42
38
|
class FindingInterventionTypeManager(models.Manager):
|
|
@@ -45,11 +41,7 @@ class FindingInterventionTypeManager(models.Manager):
|
|
|
45
41
|
|
|
46
42
|
class FindingInterventionType(models.Model):
|
|
47
43
|
name = models.CharField(max_length=100, unique=True)
|
|
48
|
-
name_de = models.CharField(max_length=100, blank=True, null=True)
|
|
49
|
-
name_en = models.CharField(max_length=100, blank=True, null=True)
|
|
50
44
|
description = models.TextField(blank=True, null=True)
|
|
51
|
-
description_de = models.TextField(blank=True, null=True)
|
|
52
|
-
description_en = models.TextField(blank=True, null=True)
|
|
53
45
|
|
|
54
46
|
objects = FindingInterventionTypeManager()
|
|
55
47
|
|
|
@@ -57,4 +49,4 @@ class FindingInterventionType(models.Model):
|
|
|
57
49
|
return (self.name,)
|
|
58
50
|
|
|
59
51
|
def __str__(self):
|
|
60
|
-
return self.name
|
|
52
|
+
return str(self.name)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
class FindingTypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
"""
|
|
7
|
+
Retrieve a FindingType instance by its unique name for natural key deserialization.
|
|
8
|
+
|
|
9
|
+
Parameters:
|
|
10
|
+
name (str): The unique name of the FindingType to retrieve.
|
|
11
|
+
|
|
12
|
+
Returns:
|
|
13
|
+
FindingType: The instance matching the given name.
|
|
14
|
+
"""
|
|
15
|
+
return self.get(name=name)
|
|
16
|
+
|
|
17
|
+
class FindingType(models.Model):
|
|
18
|
+
name = models.CharField(max_length=100, unique=True)
|
|
19
|
+
description = models.TextField(blank=True, null=True)
|
|
20
|
+
|
|
21
|
+
objects = FindingTypeManager()
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from endoreg_db.models import (
|
|
25
|
+
Finding, Examination, FindingClassification, FindingMorphologyClassification
|
|
26
|
+
)
|
|
27
|
+
finding_classifications: models.QuerySet['FindingClassification']
|
|
28
|
+
morphology_classifications: models.QuerySet['FindingMorphologyClassification']
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def natural_key(self):
|
|
32
|
+
return (self.name,)
|
|
33
|
+
|
|
34
|
+
def __str__(self):
|
|
35
|
+
return self.name
|
|
@@ -1,37 +1,41 @@
|
|
|
1
|
-
from django.db import models
|
|
1
|
+
from django.db import models#
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
2
3
|
|
|
3
4
|
class EndoscopeManager(models.Manager):
|
|
4
5
|
def get_by_natural_key(self, name, sn):
|
|
5
6
|
return self.get(name=name, sn=sn)
|
|
6
|
-
|
|
7
|
+
|
|
7
8
|
class Endoscope(models.Model):
|
|
8
9
|
objects = EndoscopeManager()
|
|
9
|
-
|
|
10
|
-
name = models.CharField(max_length=255)
|
|
11
|
-
name_de = models.CharField(max_length=255, blank=True, null=True)
|
|
12
|
-
name_en = models.CharField(max_length=255, blank=True, null=True)
|
|
10
|
+
|
|
11
|
+
name = models.CharField(max_length=255)
|
|
13
12
|
sn = models.CharField(max_length=255)
|
|
14
13
|
center = models.ForeignKey(
|
|
15
14
|
'Center',
|
|
16
|
-
blank=True,
|
|
17
|
-
null=True,
|
|
15
|
+
blank=True,
|
|
16
|
+
null=True,
|
|
18
17
|
on_delete=models.CASCADE,
|
|
19
18
|
related_name='endoscopes'
|
|
20
19
|
)
|
|
21
20
|
endoscope_type = models.ForeignKey(
|
|
22
21
|
'EndoscopeType',
|
|
23
|
-
blank=True,
|
|
24
|
-
null=True,
|
|
22
|
+
blank=True,
|
|
23
|
+
null=True,
|
|
25
24
|
on_delete=models.CASCADE,
|
|
26
25
|
related_name='endoscopes'
|
|
27
26
|
)
|
|
28
|
-
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from endoreg_db.models.center.center import Center
|
|
30
|
+
center: "Center"
|
|
31
|
+
endoscope_type: "EndoscopeType"
|
|
32
|
+
|
|
29
33
|
def natural_key(self):
|
|
30
34
|
return (self.name, self.sn)
|
|
31
|
-
|
|
35
|
+
|
|
32
36
|
def __str__(self):
|
|
33
|
-
return self.name
|
|
34
|
-
|
|
37
|
+
return str(self.name)
|
|
38
|
+
|
|
35
39
|
class Meta:
|
|
36
40
|
ordering = ['name']
|
|
37
41
|
verbose_name = 'Endoscope'
|
|
@@ -40,20 +44,21 @@ class Endoscope(models.Model):
|
|
|
40
44
|
class EndoscopeTypeManager(models.Manager):
|
|
41
45
|
def get_by_natural_key(self, name):
|
|
42
46
|
return self.get(name=name)
|
|
43
|
-
|
|
47
|
+
|
|
44
48
|
class EndoscopeType(models.Model):
|
|
45
49
|
objects = EndoscopeTypeManager()
|
|
46
|
-
|
|
47
|
-
name = models.CharField(max_length=255)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
|
|
51
|
+
name = models.CharField(max_length=255, unique=True)
|
|
52
|
+
|
|
53
|
+
if TYPE_CHECKING:
|
|
54
|
+
endoscopes: models.QuerySet["Endoscope"]
|
|
55
|
+
|
|
56
|
+
def natural_key(self) -> tuple[str]:
|
|
52
57
|
return (self.name,)
|
|
53
58
|
|
|
54
59
|
def __str__(self):
|
|
55
|
-
return self.name
|
|
56
|
-
|
|
60
|
+
return str(self.name)
|
|
61
|
+
|
|
57
62
|
class Meta:
|
|
58
63
|
ordering = ['name']
|
|
59
64
|
verbose_name = 'Endoscope Type'
|