endoreg-db 0.8.9.32__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/__init__.py +0 -0
- endoreg_db/_version.py +34 -0
- endoreg_db/admin.py +97 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +99 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.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/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- 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/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +32 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -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 +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -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 +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -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 +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -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 +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -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 +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -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 +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -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 +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -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 +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -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 +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -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 +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -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 +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, cast
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.models import (
|
|
7
|
+
CenterShift,
|
|
8
|
+
Qualification,
|
|
9
|
+
ShiftType,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ShiftManager(models.Manager):
|
|
14
|
+
def get_queryset(self):
|
|
15
|
+
"""
|
|
16
|
+
Returns a queryset of active shifts.
|
|
17
|
+
|
|
18
|
+
Only includes shifts where the 'is_active' field is set to True.
|
|
19
|
+
"""
|
|
20
|
+
return super().get_queryset().filter(is_active=True)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Shift(models.Model):
|
|
24
|
+
"""
|
|
25
|
+
Model representing a shift.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
name = models.CharField(max_length=255, unique=True)
|
|
29
|
+
description = models.TextField(blank=True, null=True)
|
|
30
|
+
is_active = models.BooleanField(default=True)
|
|
31
|
+
|
|
32
|
+
shift_types = models.ManyToManyField(
|
|
33
|
+
"ShiftType",
|
|
34
|
+
related_name="shifts",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
required_qualifications = models.ManyToManyField(
|
|
38
|
+
"Qualification",
|
|
39
|
+
related_name="shifts",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
shift_types = cast(models.QuerySet["ShiftType"], shift_types)
|
|
44
|
+
required_qualifications = cast(
|
|
45
|
+
models.QuerySet["Qualification"], required_qualifications
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def center_shifts(self) -> models.QuerySet["CenterShift"]: ...
|
|
50
|
+
|
|
51
|
+
objects = ShiftManager()
|
|
52
|
+
|
|
53
|
+
def __str__(self):
|
|
54
|
+
"""
|
|
55
|
+
Returns the string representation of the shift using its name.
|
|
56
|
+
"""
|
|
57
|
+
return str(self.name)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import logging # Added import
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from django.db import models
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from endoreg_db.models import Shift
|
|
8
|
+
|
|
9
|
+
# Those are defined in our base data
|
|
10
|
+
NAME_REGULAR = "regular"
|
|
11
|
+
NAME_ON_CALL = "on_call"
|
|
12
|
+
NAME_WARD = "ward"
|
|
13
|
+
NAME_OFF_HOURS = "off_hours"
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__) # Added logger
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ShiftTypeManager(models.Manager):
|
|
19
|
+
def get_queryset(self):
|
|
20
|
+
"""
|
|
21
|
+
Returns a queryset containing only active shift types.
|
|
22
|
+
"""
|
|
23
|
+
return super().get_queryset().filter(is_active=True)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ShiftType(models.Model):
|
|
27
|
+
"""
|
|
28
|
+
Model representing a Shift type.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
name = models.CharField(max_length=255, unique=True)
|
|
32
|
+
description = models.TextField(blank=True, null=True)
|
|
33
|
+
is_active = models.BooleanField(default=True)
|
|
34
|
+
|
|
35
|
+
objects = ShiftTypeManager()
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
shift: models.QuerySet["Shift"]
|
|
39
|
+
|
|
40
|
+
def __str__(self):
|
|
41
|
+
"""
|
|
42
|
+
Returns the name of the shift type as its string representation.
|
|
43
|
+
"""
|
|
44
|
+
return str(self.name)
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def get_type_regular(cls) -> "ShiftType | None": # Modified return type
|
|
48
|
+
"""
|
|
49
|
+
Retrieves the 'regular' shift type instance.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
The ShiftType instance with the name 'regular', or None if it does not exist.
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
return cls.objects.get(name=NAME_REGULAR)
|
|
56
|
+
except cls.DoesNotExist:
|
|
57
|
+
logger.error(
|
|
58
|
+
f"ShiftType with name '{NAME_REGULAR}' does not exist. Base data might be missing."
|
|
59
|
+
)
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def get_type_on_call(cls) -> "ShiftType | None": # Modified return type
|
|
64
|
+
"""
|
|
65
|
+
Retrieves the ShiftType instance representing the on-call shift type.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The ShiftType instance with the on-call name, or None if it does not exist.
|
|
69
|
+
"""
|
|
70
|
+
try:
|
|
71
|
+
return cls.objects.get(name=NAME_ON_CALL)
|
|
72
|
+
except cls.DoesNotExist:
|
|
73
|
+
logger.error(
|
|
74
|
+
f"ShiftType with name '{NAME_ON_CALL}' does not exist. Base data might be missing."
|
|
75
|
+
)
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
@classmethod
|
|
79
|
+
def get_type_ward(cls) -> "ShiftType | None": # Modified return type
|
|
80
|
+
"""
|
|
81
|
+
Retrieves the ShiftType instance representing a ward shift.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The ShiftType instance with the name corresponding to a ward shift, or None if it does not exist.
|
|
85
|
+
"""
|
|
86
|
+
try:
|
|
87
|
+
return cls.objects.get(name=NAME_WARD)
|
|
88
|
+
except cls.DoesNotExist:
|
|
89
|
+
logger.error(
|
|
90
|
+
f"ShiftType with name '{NAME_WARD}' does not exist. Base data might be missing."
|
|
91
|
+
)
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def get_type_off_hours(cls) -> "ShiftType | None": # Modified return type
|
|
96
|
+
"""
|
|
97
|
+
Retrieves the off-hours shift type instance by name.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
The ShiftType instance for off-hours if it exists, otherwise None.
|
|
101
|
+
"""
|
|
102
|
+
try:
|
|
103
|
+
return cls.objects.get(name=NAME_OFF_HOURS)
|
|
104
|
+
except cls.DoesNotExist:
|
|
105
|
+
logger.error(
|
|
106
|
+
f"ShiftType with name '{NAME_OFF_HOURS}' does not exist. Base data might be missing."
|
|
107
|
+
)
|
|
108
|
+
return None
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from endoreg_db.models import ImageClassificationAnnotation
|
|
7
|
+
# later:
|
|
8
|
+
# from endoreg_db.models import VideoSegmentationAnnotation
|
|
9
|
+
# from endoreg_db.models import TextAnnotation # example name
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AIDataSet(models.Model):
|
|
13
|
+
"""
|
|
14
|
+
AIDataSet stores the definition of a training dataset for an AI model.
|
|
15
|
+
|
|
16
|
+
It does NOT store annotation vectors directly.
|
|
17
|
+
|
|
18
|
+
Instead, it stores:
|
|
19
|
+
- which AI model family it is for (ai_model_type)
|
|
20
|
+
- which type of data it is based on (dataset_type)
|
|
21
|
+
- which annotations belong to it (image/video/text *_annotations)
|
|
22
|
+
|
|
23
|
+
For now:
|
|
24
|
+
dataset_type == "image"
|
|
25
|
+
-> image_annotations contains ImageClassificationAnnotation rows
|
|
26
|
+
(each with frame_id and label_id)
|
|
27
|
+
|
|
28
|
+
Later:
|
|
29
|
+
dataset_type == "video"
|
|
30
|
+
-> video_annotations will contain video-level annotation rows
|
|
31
|
+
|
|
32
|
+
dataset_type == "text"
|
|
33
|
+
-> text_annotations will contain text-level annotation rows
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# ------------------------------------------------------------------
|
|
37
|
+
# CHOICES
|
|
38
|
+
# ------------------------------------------------------------------
|
|
39
|
+
DATASET_TYPE_IMAGE = "image"
|
|
40
|
+
DATASET_TYPE_VIDEO = "video"
|
|
41
|
+
DATASET_TYPE_TEXT = "text"
|
|
42
|
+
|
|
43
|
+
DATASET_TYPE_CHOICES = [
|
|
44
|
+
(DATASET_TYPE_IMAGE, "Image"),
|
|
45
|
+
# later, when implemented:
|
|
46
|
+
# (DATASET_TYPE_VIDEO, "Video"),
|
|
47
|
+
# (DATASET_TYPE_TEXT, "Text"),
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
AI_MODEL_TYPE_IMAGE_MULTILABEL = "image_multilabel_classification"
|
|
51
|
+
# later: add more ai_model_type values as needed, e.g.
|
|
52
|
+
# AI_MODEL_TYPE_VIDEO_SEGMENTATION = "video_segmentation"
|
|
53
|
+
# AI_MODEL_TYPE_TEXT_CLASSIFICATION = "text_classification"
|
|
54
|
+
|
|
55
|
+
# ------------------------------------------------------------------
|
|
56
|
+
# BASIC FIELDS
|
|
57
|
+
# ------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
name = models.CharField(
|
|
60
|
+
max_length=255,
|
|
61
|
+
blank=True,
|
|
62
|
+
null=True,
|
|
63
|
+
help_text='Human-readable identifier, e.g. "Legacy multilabel dataset v1".',
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
description = models.TextField(
|
|
67
|
+
blank=True,
|
|
68
|
+
null=True,
|
|
69
|
+
help_text="Optional notes / explanation about this dataset.",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
ai_model_type = models.CharField(
|
|
73
|
+
max_length=255,
|
|
74
|
+
default=AI_MODEL_TYPE_IMAGE_MULTILABEL,
|
|
75
|
+
help_text=(
|
|
76
|
+
"AI model family this dataset is for, e.g. "
|
|
77
|
+
'"image_multilabel_classification". '
|
|
78
|
+
"Used to pick the correct architecture and output dimension logic."
|
|
79
|
+
),
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
dataset_type = models.CharField(
|
|
83
|
+
max_length=32,
|
|
84
|
+
choices=DATASET_TYPE_CHOICES,
|
|
85
|
+
default=DATASET_TYPE_IMAGE,
|
|
86
|
+
help_text=(
|
|
87
|
+
"Controls which annotation table will be used. "
|
|
88
|
+
'Currently only "image" is implemented; later "video", "text", etc.'
|
|
89
|
+
),
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# ------------------------------------------------------------------
|
|
93
|
+
# TYPE-SPECIFIC ANNOTATION RELATIONS (Option A)
|
|
94
|
+
# ------------------------------------------------------------------
|
|
95
|
+
# For each dataset_type, we provide a separate M2M field.
|
|
96
|
+
# Only one of them is actually *used* per dataset instance.
|
|
97
|
+
# The others simply remain empty.
|
|
98
|
+
|
|
99
|
+
# IMAGE DATASETS:
|
|
100
|
+
# For dataset_type == "image":
|
|
101
|
+
# - image_annotations defines which ImageClassificationAnnotation rows
|
|
102
|
+
# belong to this dataset.
|
|
103
|
+
image_annotations = models.ManyToManyField(
|
|
104
|
+
"ImageClassificationAnnotation",
|
|
105
|
+
related_name="image_ai_datasets",
|
|
106
|
+
blank=True,
|
|
107
|
+
help_text=(
|
|
108
|
+
"For dataset_type='image', this is the set of ImageClassificationAnnotation "
|
|
109
|
+
"rows that define this AIDataSet. Each annotation has frame_id and label_id."
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# VIDEO DATASETS (FUTURE):
|
|
114
|
+
# For dataset_type == "video", you will later add something like:
|
|
115
|
+
#
|
|
116
|
+
# video_annotations = models.ManyToManyField(
|
|
117
|
+
# "VideoSegmentationAnnotation", # or whatever your video annotation model is
|
|
118
|
+
# related_name="video_ai_datasets",
|
|
119
|
+
# blank=True,
|
|
120
|
+
# help_text=(
|
|
121
|
+
# "For dataset_type='video', this will be the set of video-level "
|
|
122
|
+
# "annotation rows that define this AIDataSet."
|
|
123
|
+
# ),
|
|
124
|
+
# )
|
|
125
|
+
#
|
|
126
|
+
# TEXT DATASETS (FUTURE):
|
|
127
|
+
# For dataset_type == "text", you could add:
|
|
128
|
+
#
|
|
129
|
+
# text_annotations = models.ManyToManyField(
|
|
130
|
+
# "TextAnnotation", # placeholder name
|
|
131
|
+
# related_name="text_ai_datasets",
|
|
132
|
+
# blank=True,
|
|
133
|
+
# help_text=(
|
|
134
|
+
# "For dataset_type='text', this will be the set of text-level "
|
|
135
|
+
# "annotation rows that define this AIDataSet."
|
|
136
|
+
# ),
|
|
137
|
+
# )
|
|
138
|
+
|
|
139
|
+
# ------------------------------------------------------------------
|
|
140
|
+
# META FIELDS
|
|
141
|
+
# ------------------------------------------------------------------
|
|
142
|
+
created_at = models.DateTimeField(
|
|
143
|
+
auto_now_add=True,
|
|
144
|
+
help_text="When this AIDataSet was created.",
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
updated_at = models.DateTimeField(
|
|
148
|
+
auto_now=True,
|
|
149
|
+
help_text="When this AIDataSet was last modified.",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
is_active = models.BooleanField(
|
|
153
|
+
default=True,
|
|
154
|
+
help_text="Soft toggle to enable/disable this dataset for training.",
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
if TYPE_CHECKING:
|
|
158
|
+
# for static type checkers only
|
|
159
|
+
image_annotations: models.ManyToManyField["ImageClassificationAnnotation"]
|
|
160
|
+
# video_annotations: models.ManyToManyField["VideoSegmentationAnnotation"]
|
|
161
|
+
# text_annotations: models.ManyToManyField["TextAnnotation"]
|
|
162
|
+
|
|
163
|
+
# ------------------------------------------------------------------
|
|
164
|
+
# UNIFIED ACCESS HELPERS (USE THESE IN YOUR TRAINING CODE)
|
|
165
|
+
# ------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
def get_annotations_queryset(self):
|
|
168
|
+
"""
|
|
169
|
+
Return the *active* annotation relation for this dataset, based on dataset_type.
|
|
170
|
+
|
|
171
|
+
- For dataset_type='image' -> returns self.image_annotations
|
|
172
|
+
- For dataset_type='video' -> later: return self.video_annotations
|
|
173
|
+
- For dataset_type='text' -> later: return self.text_annotations
|
|
174
|
+
|
|
175
|
+
This is what your data loader / training code should call.
|
|
176
|
+
"""
|
|
177
|
+
if self.dataset_type == self.DATASET_TYPE_IMAGE:
|
|
178
|
+
return self.image_annotations
|
|
179
|
+
|
|
180
|
+
# TODO (future): implement once video/text annotation models exist
|
|
181
|
+
# if self.dataset_type == self.DATASET_TYPE_VIDEO:
|
|
182
|
+
# return self.video_annotations
|
|
183
|
+
#
|
|
184
|
+
# if self.dataset_type == self.DATASET_TYPE_TEXT:
|
|
185
|
+
# return self.text_annotations
|
|
186
|
+
|
|
187
|
+
# Fallback: empty queryset (nothing to train on)
|
|
188
|
+
return self.image_annotations.none()
|
|
189
|
+
|
|
190
|
+
def __str__(self) -> str:
|
|
191
|
+
if self.name:
|
|
192
|
+
return f"AIDataSet(id={self.id}, name={self.name})"
|
|
193
|
+
return f"AIDataSet(id={self.id})"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from .annotation import (
|
|
2
|
+
ImageClassificationAnnotation,
|
|
3
|
+
)
|
|
4
|
+
from .label import Label
|
|
5
|
+
from .label_set import LabelSet
|
|
6
|
+
from .label_type import LabelType
|
|
7
|
+
from .label_video_segment import (
|
|
8
|
+
LabelVideoSegment,
|
|
9
|
+
)
|
|
10
|
+
from .video_segmentation_label import VideoSegmentationLabel
|
|
11
|
+
from .video_segmentation_labelset import VideoSegmentationLabelSet
|
|
12
|
+
from .annotation import VideoSegmentationAnnotation
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"Label",
|
|
16
|
+
"LabelSet",
|
|
17
|
+
"LabelType",
|
|
18
|
+
"VideoSegmentationLabel",
|
|
19
|
+
"VideoSegmentationLabelSet",
|
|
20
|
+
"LabelVideoSegment",
|
|
21
|
+
"ImageClassificationAnnotation",
|
|
22
|
+
"VideoSegmentationAnnotation",
|
|
23
|
+
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Module for annotation models"""
|
|
2
|
+
|
|
3
|
+
from .image_classification import ImageClassificationAnnotation
|
|
4
|
+
|
|
5
|
+
from .video_segmentation_annotation import (
|
|
6
|
+
VideoSegmentationAnnotation,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"ImageClassificationAnnotation",
|
|
11
|
+
"VideoSegmentationAnnotation",
|
|
12
|
+
]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...media.frame import Frame
|
|
7
|
+
from ...metadata import ModelMeta
|
|
8
|
+
from ...other.information_source import InformationSource
|
|
9
|
+
from ..label import Label
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ImageClassificationAnnotation(models.Model):
|
|
13
|
+
"""
|
|
14
|
+
Represents an image classification annotation, linking a label to a specific frame.
|
|
15
|
+
|
|
16
|
+
An annotation is associated with a single `Frame` instance, which itself
|
|
17
|
+
links to either a `Video` or `RawVideoFile`.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
frame (ForeignKey): The frame associated with the annotation.
|
|
21
|
+
label (ForeignKey): The label assigned to the annotation.
|
|
22
|
+
value (bool): Indicates if the classification is true/positive.
|
|
23
|
+
float_value (FloatField): Optional float value associated with the classification (e.g., confidence score).
|
|
24
|
+
annotator (str): Identifier for the user or process that created the annotation.
|
|
25
|
+
model_meta (ForeignKey): Optional link to the model metadata if generated by a model.
|
|
26
|
+
date_created (datetime): The creation timestamp of the annotation.
|
|
27
|
+
date_modified (datetime): The last modification timestamp of the annotation.
|
|
28
|
+
information_source (ForeignKey): Optional link to the source of this information.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# Single ForeignKey to the unified Frame model
|
|
32
|
+
frame = models.ForeignKey(
|
|
33
|
+
"Frame", # Points to the unified Frame model
|
|
34
|
+
on_delete=models.CASCADE,
|
|
35
|
+
related_name="image_classification_annotations",
|
|
36
|
+
blank=False,
|
|
37
|
+
null=False,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
label = models.ForeignKey(
|
|
41
|
+
"Label",
|
|
42
|
+
on_delete=models.CASCADE,
|
|
43
|
+
related_name="image_classification_annotations",
|
|
44
|
+
)
|
|
45
|
+
value = models.BooleanField()
|
|
46
|
+
float_value = models.FloatField(blank=True, null=True)
|
|
47
|
+
annotator = models.CharField(max_length=255, blank=True, null=True)
|
|
48
|
+
model_meta = models.ForeignKey(
|
|
49
|
+
"ModelMeta",
|
|
50
|
+
on_delete=models.SET_NULL,
|
|
51
|
+
related_name="image_classification_annotations",
|
|
52
|
+
default=None,
|
|
53
|
+
null=True,
|
|
54
|
+
blank=True,
|
|
55
|
+
)
|
|
56
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
57
|
+
date_modified = models.DateTimeField(auto_now=True)
|
|
58
|
+
information_source = models.ForeignKey(
|
|
59
|
+
"InformationSource",
|
|
60
|
+
on_delete=models.SET_NULL,
|
|
61
|
+
related_name="image_classification_annotations",
|
|
62
|
+
default=None,
|
|
63
|
+
null=True,
|
|
64
|
+
blank=True,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if TYPE_CHECKING:
|
|
68
|
+
frame: models.ForeignKey["Frame"]
|
|
69
|
+
label: models.ForeignKey["Label"]
|
|
70
|
+
information_source: models.ForeignKey["InformationSource|None"]
|
|
71
|
+
model_meta: models.ForeignKey["ModelMeta|None"]
|
|
72
|
+
|
|
73
|
+
class Meta:
|
|
74
|
+
indexes = [
|
|
75
|
+
models.Index(fields=["frame", "label"]),
|
|
76
|
+
models.Index(fields=["frame"]),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
def __str__(self) -> str:
|
|
80
|
+
"""
|
|
81
|
+
String representation of the annotation.
|
|
82
|
+
"""
|
|
83
|
+
frame_str = str(self.frame) if self.frame else "No Frame"
|
|
84
|
+
label_name = self.label.name if self.label else "No Label"
|
|
85
|
+
return f"{frame_str} - {label_name} - {self.value}"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
from django.db.models import CheckConstraint, F, Q
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from ...media.video.video_file import VideoFile
|
|
9
|
+
from ..video_segmentation_label import VideoSegmentationLabel
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class VideoSegmentationAnnotation(models.Model):
|
|
13
|
+
"""
|
|
14
|
+
Represents a video segmentation annotation, linking a label to a time segment
|
|
15
|
+
within a specific video file.
|
|
16
|
+
|
|
17
|
+
An annotation must be associated with exactly one `VideoFile`.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
video_file = models.ForeignKey(
|
|
21
|
+
"VideoFile",
|
|
22
|
+
on_delete=models.CASCADE,
|
|
23
|
+
related_name="video_segmentation_annotations",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
label = models.ForeignKey(
|
|
27
|
+
"VideoSegmentationLabel",
|
|
28
|
+
on_delete=models.CASCADE,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# times in seconds
|
|
32
|
+
start_time = models.FloatField()
|
|
33
|
+
stop_time = models.FloatField()
|
|
34
|
+
|
|
35
|
+
is_true = models.BooleanField(default=True)
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
video_file: models.ForeignKey["VideoFile"]
|
|
39
|
+
label: models.ForeignKey["VideoSegmentationLabel"]
|
|
40
|
+
|
|
41
|
+
def __str__(self) -> str:
|
|
42
|
+
return f"{self.video_file.pk} - {self.label.name} - {self.start_time} to {self.stop_time}"
|
|
43
|
+
|
|
44
|
+
def get_video(self) -> "VideoFile":
|
|
45
|
+
"""
|
|
46
|
+
Convenience accessor for the associated VideoFile instance.
|
|
47
|
+
"""
|
|
48
|
+
if self.video_file.pk is None:
|
|
49
|
+
# Should not happen due to null=False
|
|
50
|
+
raise ValueError("Annotation is not linked to a VideoFile.")
|
|
51
|
+
return self.video_file
|
|
52
|
+
|
|
53
|
+
class Meta:
|
|
54
|
+
constraints = [
|
|
55
|
+
CheckConstraint(
|
|
56
|
+
condition=Q(start_time__lt=F("stop_time")),
|
|
57
|
+
name="start_time_less_than_stop_time",
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
# optional but usually helpful:
|
|
61
|
+
# ordering = ("video_file_id", "start_time")
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .label_set import LabelSet
|
|
7
|
+
from .label_type import LabelType
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LabelManager(models.Manager):
|
|
11
|
+
"""Manager class for handling Label model operations."""
|
|
12
|
+
|
|
13
|
+
def get_by_natural_key(self, name):
|
|
14
|
+
"""Retrieves a Label instance by its natural key (name)."""
|
|
15
|
+
return self.get(name=name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Label(models.Model):
|
|
19
|
+
"""
|
|
20
|
+
A class representing a label.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
name (str): The name of the label.
|
|
24
|
+
label_type (LabelType): The type of the label.
|
|
25
|
+
description (str): A description of the label.
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
name = models.CharField(max_length=255)
|
|
30
|
+
label_type = models.ForeignKey(
|
|
31
|
+
"LabelType",
|
|
32
|
+
on_delete=models.CASCADE,
|
|
33
|
+
related_name="labels",
|
|
34
|
+
blank=True,
|
|
35
|
+
null=True,
|
|
36
|
+
)
|
|
37
|
+
description = models.TextField(blank=True, null=True)
|
|
38
|
+
|
|
39
|
+
objects = LabelManager()
|
|
40
|
+
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
label_type: models.ForeignKey["LabelType|None"]
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def label_sets(self) -> models.QuerySet["LabelSet"]: ...
|
|
46
|
+
|
|
47
|
+
def natural_key(self):
|
|
48
|
+
"""Return the natural key of this label"""
|
|
49
|
+
return (self.name,)
|
|
50
|
+
|
|
51
|
+
def __str__(self):
|
|
52
|
+
return str(self.name)
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def get_outside_label(cls):
|
|
56
|
+
"""
|
|
57
|
+
Returns the label instance for 'outside'.
|
|
58
|
+
"""
|
|
59
|
+
try:
|
|
60
|
+
return cls.objects.get(name="outside")
|
|
61
|
+
except Exception as exc:
|
|
62
|
+
raise ValueError("'outside' label does not exist in the database") from exc
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def get_low_quality_label(cls):
|
|
66
|
+
"""
|
|
67
|
+
Retrieve the label instance with the name 'low_quality'.
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
ValueError: If a label with the name 'low_quality' does not exist.
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
return cls.objects.get(name="low_quality")
|
|
74
|
+
except Exception as exc:
|
|
75
|
+
raise ValueError(
|
|
76
|
+
"'low_quality' label does not exist in the database"
|
|
77
|
+
) from exc
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def get_or_create_from_name(cls, name: str):
|
|
81
|
+
"""
|
|
82
|
+
Retrieve or create a Label instance with the specified name.
|
|
83
|
+
|
|
84
|
+
Parameters:
|
|
85
|
+
name (str): The name of the label to retrieve or create.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
tuple: A tuple containing the Label instance and a boolean indicating whether the instance was created (True) or retrieved (False).
|
|
89
|
+
"""
|
|
90
|
+
label, _created = cls.objects.get_or_create(name=name)
|
|
91
|
+
return label, _created
|