endoreg-db 0.8.6.4__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/admin.py +92 -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 +18 -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/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -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 +91 -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/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- 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 +105 -0
- 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_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- 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_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- 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.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -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/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- 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 +441 -0
- 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 +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- 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 +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -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 +11 -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 +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -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_model_meta_from_huggingface.py +115 -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 +423 -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 +77 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- 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/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 +1857 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- endoreg_db/models/administration/__init__.py +116 -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 +156 -0
- endoreg_db/models/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- 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/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- 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/person.py +31 -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/__init__.py +14 -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/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- 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 -0
- 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 +83 -0
- 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/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -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 +757 -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 +77 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -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 +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -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 +141 -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 +168 -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_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- 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/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -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 +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- 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/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +222 -0
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/metadata/pdf_meta.py +89 -0
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -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 +40 -0
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- 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 +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- 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/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -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 +118 -0
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- 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 +69 -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 +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -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/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/serializers/video_examination.py +198 -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 +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -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 +1259 -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/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 +83 -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 +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +58 -0
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -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 +76 -0
- endoreg_db/utils/ocr.py +190 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- 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/__init__.py +6 -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/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -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 +274 -0
- 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 +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- 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 +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -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/csrf.py +7 -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 +8 -0
- endoreg_db/views/pdf/pdf_stream.py +186 -0
- endoreg_db/views/pdf/reimport.py +177 -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 +367 -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 +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -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_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Management command to import a video file and automatically run NICE/PARIS classifications.
|
|
3
|
+
This command extends the basic import_video functionality with automatic classification.
|
|
4
|
+
"""
|
|
5
|
+
from django.core.management import BaseCommand, call_command
|
|
6
|
+
from django.db import connection
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from endoreg_db.models import VideoFile, ModelMeta
|
|
9
|
+
from endoreg_db.models.administration.center import Center
|
|
10
|
+
from endoreg_db.models.medical.hardware import EndoscopyProcessor
|
|
11
|
+
|
|
12
|
+
# TODO Migrate
|
|
13
|
+
from endoreg_db.serializers._old.Frames_NICE_and_PARIS_classifications import (
|
|
14
|
+
ForNiceClassificationSerializer,
|
|
15
|
+
ForParisClassificationSerializer
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from ...helpers.default_objects import (
|
|
19
|
+
get_latest_segmentation_model
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
from endoreg_db.utils.video.ffmpeg_wrapper import check_ffmpeg_availability
|
|
23
|
+
|
|
24
|
+
from endoreg_db.helpers.data_loader import (
|
|
25
|
+
load_disease_data,
|
|
26
|
+
load_gender_data,
|
|
27
|
+
load_event_data,
|
|
28
|
+
load_information_source,
|
|
29
|
+
load_examination_data,
|
|
30
|
+
load_center_data,
|
|
31
|
+
load_endoscope_data,
|
|
32
|
+
load_ai_model_label_data,
|
|
33
|
+
load_ai_model_data,
|
|
34
|
+
load_default_ai_model
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Command(BaseCommand):
|
|
39
|
+
help = """
|
|
40
|
+
Imports a video file and automatically runs NICE/PARIS classifications.
|
|
41
|
+
|
|
42
|
+
Workflow:
|
|
43
|
+
1. Validates dependencies (FFMPEG, center, processor)
|
|
44
|
+
2. Loads reference data
|
|
45
|
+
3. Imports video using VideoFile.create_from_file_initialized()
|
|
46
|
+
4. Runs VideoFile.pipe_1() for AI segmentation
|
|
47
|
+
5. Automatically runs NICE classification
|
|
48
|
+
6. Automatically runs PARIS classification (if frame_dir available)
|
|
49
|
+
7. Reports results of all steps
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def add_arguments(self, parser):
|
|
53
|
+
parser.add_argument(
|
|
54
|
+
"--verbose",
|
|
55
|
+
action="store_true",
|
|
56
|
+
help="Display verbose output",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--center_name",
|
|
60
|
+
type=str,
|
|
61
|
+
default="university_hospital_wuerzburg",
|
|
62
|
+
help="Name of the center to associate with video",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"video_file",
|
|
67
|
+
type=Path,
|
|
68
|
+
help="Path to the video file to import",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
parser.add_argument(
|
|
72
|
+
"--frame_dir_root",
|
|
73
|
+
type=str,
|
|
74
|
+
default="~/test-data/raw_frame_dir",
|
|
75
|
+
help="Path to the frame directory",
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
parser.add_argument(
|
|
79
|
+
"--video_dir_root",
|
|
80
|
+
type=str,
|
|
81
|
+
default="~/test-data/raw_video_dir",
|
|
82
|
+
help="Path to the video directory",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
"--delete_source",
|
|
87
|
+
action="store_true",
|
|
88
|
+
default=False,
|
|
89
|
+
help="Delete the source video file after importing",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
parser.add_argument(
|
|
93
|
+
"--save_video_file",
|
|
94
|
+
action="store_true",
|
|
95
|
+
default=True,
|
|
96
|
+
help="Save the video file to the video directory",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
parser.add_argument(
|
|
100
|
+
"--model_path",
|
|
101
|
+
type=str,
|
|
102
|
+
default="./data/models/colo_segmentation_RegNetX800MF_6.ckpt",
|
|
103
|
+
help="Path to the model file",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
parser.add_argument(
|
|
107
|
+
"--segmentation",
|
|
108
|
+
action="store_true",
|
|
109
|
+
help="Whether to use segmentation",
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
parser.add_argument(
|
|
113
|
+
"--processor_name",
|
|
114
|
+
type=str,
|
|
115
|
+
default="olympus_cv_1500",
|
|
116
|
+
help="Name of the processor to associate with video",
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# NEW: Classification options
|
|
120
|
+
parser.add_argument(
|
|
121
|
+
"--skip_classification",
|
|
122
|
+
action="store_true",
|
|
123
|
+
default=False,
|
|
124
|
+
help="Skip automatic NICE/PARIS classification after import",
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
parser.add_argument(
|
|
128
|
+
"--classification_only",
|
|
129
|
+
type=str,
|
|
130
|
+
choices=['nice', 'paris', 'both'],
|
|
131
|
+
default='both',
|
|
132
|
+
help="Which classification types to run (default: both)",
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
def handle(self, *args, **options):
|
|
136
|
+
"""
|
|
137
|
+
Main command handler that orchestrates the complete workflow.
|
|
138
|
+
"""
|
|
139
|
+
# Check FFMPEG availability
|
|
140
|
+
try:
|
|
141
|
+
check_ffmpeg_availability()
|
|
142
|
+
self.stdout.write(self.style.SUCCESS("✓ FFMPEG is available"))
|
|
143
|
+
except FileNotFoundError as e:
|
|
144
|
+
self.stderr.write(self.style.ERROR(f"✗ FFMPEG not found: {str(e)}"))
|
|
145
|
+
return
|
|
146
|
+
|
|
147
|
+
self.stdout.write(f"Database: {connection.alias}")
|
|
148
|
+
self.stdout.write(self.style.SUCCESS("=== Starting Video Import and Classification Workflow ==="))
|
|
149
|
+
|
|
150
|
+
# Load reference data
|
|
151
|
+
self._load_reference_data()
|
|
152
|
+
|
|
153
|
+
# Parse options
|
|
154
|
+
segmentation = options["segmentation"]
|
|
155
|
+
skip_classification = options["skip_classification"]
|
|
156
|
+
classification_only = options["classification_only"]
|
|
157
|
+
|
|
158
|
+
# Get AI model if segmentation is enabled
|
|
159
|
+
self.ai_model_meta = None
|
|
160
|
+
if segmentation:
|
|
161
|
+
load_ai_model_label_data()
|
|
162
|
+
load_ai_model_data()
|
|
163
|
+
load_default_ai_model()
|
|
164
|
+
try:
|
|
165
|
+
self.ai_model_meta = get_latest_segmentation_model()
|
|
166
|
+
except ModelMeta.DoesNotExist as exc:
|
|
167
|
+
raise AssertionError("No ModelMeta found for the latest default segmentation AiModel") from exc
|
|
168
|
+
|
|
169
|
+
# Validate input parameters
|
|
170
|
+
video_file = Path(options["video_file"]).expanduser()
|
|
171
|
+
if not video_file.exists():
|
|
172
|
+
self.stdout.write(self.style.ERROR(f"✗ Video file not found: {video_file}"))
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
# Validate center and processor
|
|
176
|
+
center, processor = self._validate_center_and_processor(options)
|
|
177
|
+
if not center or not processor:
|
|
178
|
+
return
|
|
179
|
+
|
|
180
|
+
# Step 1: Import Video
|
|
181
|
+
self.stdout.write(self.style.SUCCESS("\n=== Step 1: Importing Video ==="))
|
|
182
|
+
video_file_obj = self._import_video(options, video_file)
|
|
183
|
+
if not video_file_obj:
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
# Step 2: Run Pipeline 1 (AI Segmentation)
|
|
187
|
+
self.stdout.write(self.style.SUCCESS("\n=== Step 2: Running AI Segmentation (Pipeline 1) ==="))
|
|
188
|
+
pipeline_success = self._run_pipeline_1(video_file_obj)
|
|
189
|
+
if not pipeline_success:
|
|
190
|
+
self.stdout.write(self.style.WARNING("⚠ Pipeline 1 failed, but continuing with classification..."))
|
|
191
|
+
|
|
192
|
+
# Step 3: Run Classifications (if not skipped)
|
|
193
|
+
if not skip_classification:
|
|
194
|
+
self.stdout.write(self.style.SUCCESS("\n=== Step 3: Running Polyp Classifications ==="))
|
|
195
|
+
self._run_classifications(video_file_obj, classification_only)
|
|
196
|
+
else:
|
|
197
|
+
self.stdout.write(self.style.WARNING("⚠ Skipping classifications as requested"))
|
|
198
|
+
|
|
199
|
+
self.stdout.write(self.style.SUCCESS("\n=== Workflow Complete ==="))
|
|
200
|
+
self.stdout.write(f"✓ Video imported with ID: {video_file_obj.id}")
|
|
201
|
+
self.stdout.write(f"✓ Video available at: {video_file_obj.processed_file}")
|
|
202
|
+
|
|
203
|
+
def _load_reference_data(self):
|
|
204
|
+
"""Load all necessary reference data."""
|
|
205
|
+
self.stdout.write("Loading reference data...")
|
|
206
|
+
load_gender_data()
|
|
207
|
+
load_disease_data()
|
|
208
|
+
load_event_data()
|
|
209
|
+
load_information_source()
|
|
210
|
+
load_examination_data()
|
|
211
|
+
load_center_data()
|
|
212
|
+
load_endoscope_data()
|
|
213
|
+
self.stdout.write(self.style.SUCCESS("✓ Reference data loaded"))
|
|
214
|
+
|
|
215
|
+
def _validate_center_and_processor(self, options):
|
|
216
|
+
"""Validate that center and processor exist."""
|
|
217
|
+
center_name = options["center_name"]
|
|
218
|
+
processor_name = options["processor_name"]
|
|
219
|
+
|
|
220
|
+
# Validate center
|
|
221
|
+
try:
|
|
222
|
+
center = Center.objects.get(name=center_name)
|
|
223
|
+
self.stdout.write(self.style.SUCCESS(f"✓ Using center: {center.name_en}"))
|
|
224
|
+
except Center.DoesNotExist:
|
|
225
|
+
self.stdout.write(self.style.ERROR(f"✗ Center not found: {center_name}"))
|
|
226
|
+
return None, None
|
|
227
|
+
|
|
228
|
+
# Validate processor
|
|
229
|
+
try:
|
|
230
|
+
processors_qs = EndoscopyProcessor.objects.filter(centers=center)
|
|
231
|
+
proc_count = processors_qs.count()
|
|
232
|
+
|
|
233
|
+
if proc_count == 0:
|
|
234
|
+
processor = EndoscopyProcessor.objects.filter(name=processor_name).first()
|
|
235
|
+
if processor is None:
|
|
236
|
+
self.stderr.write(self.style.ERROR(f"✗ No processors found for center or fallback"))
|
|
237
|
+
return None, None
|
|
238
|
+
processor.centers.add(center)
|
|
239
|
+
self.stdout.write(self.style.WARNING(f"⚠ Linked fallback processor '{processor.name}' to center"))
|
|
240
|
+
elif proc_count == 1:
|
|
241
|
+
processor = processors_qs.first()
|
|
242
|
+
else:
|
|
243
|
+
processor = self._choose_processor_interactively(processors_qs)
|
|
244
|
+
|
|
245
|
+
self.stdout.write(self.style.SUCCESS(f"✓ Using processor: {processor.name}"))
|
|
246
|
+
return center, processor
|
|
247
|
+
|
|
248
|
+
except EndoscopyProcessor.DoesNotExist:
|
|
249
|
+
self.stdout.write(self.style.ERROR(f"✗ Processor not found: {processor_name}"))
|
|
250
|
+
return None, None
|
|
251
|
+
|
|
252
|
+
def _import_video(self, options, video_file):
|
|
253
|
+
"""Import the video file into the database."""
|
|
254
|
+
try:
|
|
255
|
+
video_file_obj = VideoFile.create_from_file_initialized(
|
|
256
|
+
file_path=video_file,
|
|
257
|
+
center_name=options["center_name"],
|
|
258
|
+
processor_name=options["processor_name"],
|
|
259
|
+
delete_source=options["delete_source"],
|
|
260
|
+
save_video_file=options["save_video_file"],
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
if video_file_obj:
|
|
264
|
+
self.stdout.write(self.style.SUCCESS(f"✓ Video imported successfully (ID: {video_file_obj.id})"))
|
|
265
|
+
return video_file_obj
|
|
266
|
+
else:
|
|
267
|
+
self.stdout.write(self.style.ERROR("✗ Failed to create VideoFile instance"))
|
|
268
|
+
return None
|
|
269
|
+
|
|
270
|
+
except Exception as e:
|
|
271
|
+
self.stdout.write(self.style.ERROR(f"✗ Error importing video: {str(e)}"))
|
|
272
|
+
return None
|
|
273
|
+
|
|
274
|
+
def _run_pipeline_1(self, video_file_obj):
|
|
275
|
+
"""Run the AI segmentation pipeline."""
|
|
276
|
+
try:
|
|
277
|
+
if self.ai_model_meta:
|
|
278
|
+
success = video_file_obj.pipe_1(model_name=self.ai_model_meta.model.name)
|
|
279
|
+
else:
|
|
280
|
+
# Get the default model meta if segmentation is not enabled
|
|
281
|
+
ai_model_meta = ModelMeta.objects.filter(
|
|
282
|
+
model__name="colo_segmentation_RegNetX800MF_6"
|
|
283
|
+
).first()
|
|
284
|
+
|
|
285
|
+
if ai_model_meta:
|
|
286
|
+
success = video_file_obj.pipe_1(model_name=ai_model_meta.model.name)
|
|
287
|
+
else:
|
|
288
|
+
success = video_file_obj.pipe_1(model_name="colo_segmentation_RegNetX800MF_6")
|
|
289
|
+
|
|
290
|
+
if success:
|
|
291
|
+
self.stdout.write(self.style.SUCCESS("✓ Pipeline 1 completed successfully"))
|
|
292
|
+
return True
|
|
293
|
+
else:
|
|
294
|
+
self.stdout.write(self.style.ERROR("✗ Pipeline 1 failed"))
|
|
295
|
+
return False
|
|
296
|
+
|
|
297
|
+
except Exception as e:
|
|
298
|
+
self.stdout.write(self.style.ERROR(f"✗ Pipeline 1 error: {str(e)}"))
|
|
299
|
+
return False
|
|
300
|
+
|
|
301
|
+
def _run_classifications(self, video_file_obj, classification_only):
|
|
302
|
+
"""Run NICE and/or PARIS classifications."""
|
|
303
|
+
video_list = [video_file_obj]
|
|
304
|
+
|
|
305
|
+
# Run NICE Classification
|
|
306
|
+
if classification_only in ['nice', 'both']:
|
|
307
|
+
self.stdout.write("Running NICE classification...")
|
|
308
|
+
try:
|
|
309
|
+
nice_serializer = ForNiceClassificationSerializer()
|
|
310
|
+
nice_results = nice_serializer.to_representation(video_list)
|
|
311
|
+
|
|
312
|
+
if nice_results and isinstance(nice_results, dict) and 'data' in nice_results:
|
|
313
|
+
segments_count = sum(len(item.get('frames', [])) for item in nice_results['data'] if 'frames' in item)
|
|
314
|
+
self.stdout.write(self.style.SUCCESS(f"✓ NICE classification completed ({segments_count} segments found)"))
|
|
315
|
+
else:
|
|
316
|
+
self.stdout.write(self.style.WARNING("⚠ NICE classification completed but no valid segments found"))
|
|
317
|
+
|
|
318
|
+
except Exception as e:
|
|
319
|
+
self.stdout.write(self.style.ERROR(f"✗ NICE classification failed: {str(e)}"))
|
|
320
|
+
|
|
321
|
+
# Run PARIS Classification
|
|
322
|
+
if classification_only in ['paris', 'both']:
|
|
323
|
+
self.stdout.write("Running PARIS classification...")
|
|
324
|
+
try:
|
|
325
|
+
# Check if video has frame_dir (required for PARIS)
|
|
326
|
+
if not getattr(video_file_obj, "frame_dir", None):
|
|
327
|
+
self.stdout.write(self.style.WARNING("⚠ PARIS classification skipped: no frame_dir available"))
|
|
328
|
+
else:
|
|
329
|
+
paris_serializer = ForParisClassificationSerializer()
|
|
330
|
+
paris_results = paris_serializer.to_representation(video_list)
|
|
331
|
+
|
|
332
|
+
if paris_results and isinstance(paris_results, dict) and 'data' in paris_results:
|
|
333
|
+
segments_count = sum(len(item.get('frames', [])) for item in paris_results['data'] if 'frames' in item)
|
|
334
|
+
self.stdout.write(self.style.SUCCESS(f"✓ PARIS classification completed ({segments_count} segments found)"))
|
|
335
|
+
else:
|
|
336
|
+
self.stdout.write(self.style.WARNING("⚠ PARIS classification completed but no valid segments found"))
|
|
337
|
+
|
|
338
|
+
except Exception as e:
|
|
339
|
+
self.stdout.write(self.style.ERROR(f"✗ PARIS classification failed: {str(e)}"))
|
|
340
|
+
|
|
341
|
+
def _choose_processor_interactively(self, processors_qs):
|
|
342
|
+
"""Interactively choose a processor from multiple options."""
|
|
343
|
+
processors = list(processors_qs)
|
|
344
|
+
|
|
345
|
+
self.stdout.write(self.style.ERROR(
|
|
346
|
+
f"\nThe center has {len(processors)} endoscopy processors.\n"
|
|
347
|
+
"Choose one for this import:\n"
|
|
348
|
+
))
|
|
349
|
+
for idx, proc in enumerate(processors, 1):
|
|
350
|
+
self.stdout.write(f" [{idx}] {proc.name}")
|
|
351
|
+
|
|
352
|
+
while True:
|
|
353
|
+
try:
|
|
354
|
+
choice = input("Processor number › ").strip()
|
|
355
|
+
except (EOFError, KeyboardInterrupt):
|
|
356
|
+
self.stderr.write("\nAborted.")
|
|
357
|
+
raise SystemExit(1)
|
|
358
|
+
|
|
359
|
+
try:
|
|
360
|
+
index = int(choice) - 1
|
|
361
|
+
if not 0 <= index < len(processors):
|
|
362
|
+
raise ValueError
|
|
363
|
+
except ValueError:
|
|
364
|
+
self.stderr.write("❌ Please enter a number in the list above.\n")
|
|
365
|
+
continue
|
|
366
|
+
|
|
367
|
+
return processors[index]
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django management command to initialize the default AI model with metadata.
|
|
3
|
+
This command ensures that a default AI model exists with proper ModelMeta records.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from django.core.management.base import BaseCommand
|
|
7
|
+
from django.core.management import call_command
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
#FIXME
|
|
10
|
+
from endoreg_db.data.ai_model_meta import (
|
|
11
|
+
default_multilabel_classification
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from endoreg_db.models import AiModel
|
|
15
|
+
from endoreg_db.helpers.data_loader import (
|
|
16
|
+
load_ai_model_label_data,
|
|
17
|
+
load_ai_model_data,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Command(BaseCommand):
|
|
22
|
+
help = """
|
|
23
|
+
Initialize the default AI model with metadata.
|
|
24
|
+
This command ensures that the default segmentation model exists with proper ModelMeta records.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def add_arguments(self, parser):
|
|
28
|
+
"""
|
|
29
|
+
Adds the --force command-line argument to control metadata recreation.
|
|
30
|
+
|
|
31
|
+
The --force flag, when specified, forces the recreation of model metadata even if it already exists.
|
|
32
|
+
"""
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--force',
|
|
35
|
+
action='store_true',
|
|
36
|
+
help='Force recreation of the model metadata even if it exists',
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def handle(self, *args, **options):
|
|
40
|
+
"""
|
|
41
|
+
Initializes the default AI model and its metadata, creating or updating as needed.
|
|
42
|
+
|
|
43
|
+
Loads required AI model label and model data, ensures the presence of a default AI model, and creates associated model metadata if it does not already exist or if the `--force` flag is specified. Generates a dummy weights file if necessary and invokes the metadata creation command. Verifies successful creation and outputs status messages throughout the process.
|
|
44
|
+
"""
|
|
45
|
+
force = options.get('force', False)
|
|
46
|
+
default_multilabel_classification()
|
|
47
|
+
# First ensure the basic AI model data is loaded
|
|
48
|
+
self.stdout.write("Loading AI model label data...")
|
|
49
|
+
load_ai_model_label_data()
|
|
50
|
+
|
|
51
|
+
self.stdout.write("Loading AI model data...")
|
|
52
|
+
load_ai_model_data()
|
|
53
|
+
|
|
54
|
+
# Check if default model exists
|
|
55
|
+
default_model_name = "image_multilabel_classification_colonoscopy_default"
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
ai_model = AiModel.objects.get(name=default_model_name)
|
|
59
|
+
self.stdout.write(f"Found AI model: {ai_model.name}")
|
|
60
|
+
except AiModel.DoesNotExist:
|
|
61
|
+
self.stdout.write(
|
|
62
|
+
self.style.ERROR(f"AI model '{default_model_name}' not found. Make sure AI model data is loaded.")
|
|
63
|
+
)
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
# Check if model metadata exists
|
|
67
|
+
existing_meta = ai_model.metadata_versions.first()
|
|
68
|
+
if existing_meta and not force:
|
|
69
|
+
self.stdout.write(
|
|
70
|
+
self.style.SUCCESS(f"Model metadata already exists for {ai_model.name}. Use --force to recreate.")
|
|
71
|
+
)
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
# Create default model metadata
|
|
75
|
+
self.stdout.write("Creating default model metadata...")
|
|
76
|
+
|
|
77
|
+
# Use a dummy weights file path for now - in production this should point to actual model weights
|
|
78
|
+
dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.ckpt"
|
|
79
|
+
|
|
80
|
+
# Create the dummy weights file if it doesn't exist
|
|
81
|
+
dummy_weights_path.parent.mkdir(parents=True, exist_ok=True)
|
|
82
|
+
if not dummy_weights_path.exists():
|
|
83
|
+
dummy_weights_path.write_bytes(b"dummy weights content")
|
|
84
|
+
self.stdout.write(f"Created dummy weights file at {dummy_weights_path}")
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
# Create ModelMeta using the create_multilabel_model_meta command
|
|
88
|
+
call_command(
|
|
89
|
+
"create_multilabel_model_meta",
|
|
90
|
+
"--model_path", str(dummy_weights_path),
|
|
91
|
+
"--model_name", default_model_name,
|
|
92
|
+
"--image_classification_labelset_name", "multilabel_classification_colonoscopy",
|
|
93
|
+
"--activation_function_name", "sigmoid",
|
|
94
|
+
"--model_meta_version", "1",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
self.stdout.write(
|
|
98
|
+
self.style.SUCCESS(f"Successfully created model metadata for {default_model_name}")
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Verify the model can be retrieved
|
|
102
|
+
from endoreg_db.helpers.default_objects import get_latest_segmentation_model
|
|
103
|
+
model_meta = get_latest_segmentation_model()
|
|
104
|
+
self.stdout.write(
|
|
105
|
+
self.style.SUCCESS(f"Verified: Model metadata can be retrieved: {model_meta}")
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
except Exception as e:
|
|
109
|
+
self.stdout.write(
|
|
110
|
+
self.style.ERROR(f"Failed to create model metadata: {e}")
|
|
111
|
+
)
|
|
112
|
+
raise
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
|
|
3
|
+
from ...data import (
|
|
4
|
+
AI_MODEL_DATA_DIR,
|
|
5
|
+
AI_MODEL_META_DATA_DIR, # Add this import
|
|
6
|
+
MODEL_TYPE_DATA_DIR,
|
|
7
|
+
VIDEO_SEGMENTATION_LABEL_DATA_DIR,
|
|
8
|
+
VIDEO_SEGMENTATION_LABELSET_DATA_DIR,
|
|
9
|
+
)
|
|
10
|
+
from ...models import (
|
|
11
|
+
AiModel,
|
|
12
|
+
LabelSet, # Add LabelSet import
|
|
13
|
+
ModelMeta, # Add ModelMeta back to imports
|
|
14
|
+
ModelType,
|
|
15
|
+
VideoSegmentationLabel,
|
|
16
|
+
VideoSegmentationLabelSet,
|
|
17
|
+
)
|
|
18
|
+
from ...utils import load_model_data_from_yaml
|
|
19
|
+
|
|
20
|
+
IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
21
|
+
ModelType.__name__,
|
|
22
|
+
VideoSegmentationLabel.__name__,
|
|
23
|
+
VideoSegmentationLabelSet.__name__,
|
|
24
|
+
AiModel.__name__,
|
|
25
|
+
ModelMeta.__name__, # Re-enable ModelMeta loading
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
IMPORT_METADATA = {
|
|
29
|
+
ModelType.__name__: {
|
|
30
|
+
"dir": MODEL_TYPE_DATA_DIR, # e.g. "intervention_types"
|
|
31
|
+
"model": ModelType, # e.g. InterventionType
|
|
32
|
+
"foreign_keys": [], # e.g. ["interventions"]
|
|
33
|
+
"foreign_key_models": [], # e.g. [Intervention]
|
|
34
|
+
},
|
|
35
|
+
ModelMeta.__name__: {
|
|
36
|
+
"dir": AI_MODEL_META_DATA_DIR, # e.g. "ai_model_meta"
|
|
37
|
+
"model": ModelMeta, # e.g. ModelMeta
|
|
38
|
+
"foreign_keys": ["labelset", "model"], # Foreign key relationships
|
|
39
|
+
"foreign_key_models": [LabelSet, AiModel], # Actual model classes
|
|
40
|
+
},
|
|
41
|
+
VideoSegmentationLabel.__name__: {
|
|
42
|
+
"dir": VIDEO_SEGMENTATION_LABEL_DATA_DIR, # e.g. "interventions"
|
|
43
|
+
"model": VideoSegmentationLabel, # e.g. Intervention
|
|
44
|
+
"foreign_keys": [], # e.g. ["intervention_types"]
|
|
45
|
+
"foreign_key_models": [], # e.g. [InterventionType]
|
|
46
|
+
},
|
|
47
|
+
VideoSegmentationLabelSet.__name__: {
|
|
48
|
+
"dir": VIDEO_SEGMENTATION_LABELSET_DATA_DIR, # e.g. "interventions"
|
|
49
|
+
"model": VideoSegmentationLabelSet, # e.g. Intervention
|
|
50
|
+
"foreign_keys": ["labels"], # e.g. ["intervention_types"]
|
|
51
|
+
"foreign_key_models": [VideoSegmentationLabel], # e.g. [Intervention]
|
|
52
|
+
},
|
|
53
|
+
AiModel.__name__: {
|
|
54
|
+
"dir": AI_MODEL_DATA_DIR, # e.g. "intervention_types"
|
|
55
|
+
"model": AiModel, # e.g. InterventionType
|
|
56
|
+
"foreign_keys": ["video_segmentation_labelset", "model_type"], # e.g. ["interventions"]
|
|
57
|
+
"foreign_key_models": [VideoSegmentationLabelSet, ModelType], # e.g. [Intervention]
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class Command(BaseCommand):
|
|
63
|
+
help = """Load all .yaml files in the data/intervention directory
|
|
64
|
+
into the Intervention and InterventionType model"""
|
|
65
|
+
|
|
66
|
+
def add_arguments(self, parser):
|
|
67
|
+
parser.add_argument(
|
|
68
|
+
"--verbose",
|
|
69
|
+
action="store_true",
|
|
70
|
+
help="Display verbose output",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def handle(self, *args, **options):
|
|
74
|
+
verbose = options["verbose"]
|
|
75
|
+
for model_name in IMPORT_MODELS:
|
|
76
|
+
_metadata = IMPORT_METADATA[model_name]
|
|
77
|
+
load_model_data_from_yaml(self, model_name, _metadata, verbose)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from django.conf import settings
|
|
2
|
+
from django.core.management.base import BaseCommand
|
|
3
|
+
from ...models import Label, LabelType, LabelSet
|
|
4
|
+
import os
|
|
5
|
+
from ...utils import load_model_data_from_yaml
|
|
6
|
+
from ...data import LABEL_DATA_DIR
|
|
7
|
+
|
|
8
|
+
SOURCE_DIR = LABEL_DATA_DIR
|
|
9
|
+
|
|
10
|
+
IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
11
|
+
"LabelType",
|
|
12
|
+
"Label",
|
|
13
|
+
"LabelSet",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
IMPORT_METADATA = {
|
|
17
|
+
# "": { # same as model name in "import models", e.g. "Intervention"
|
|
18
|
+
# "subdir": os.path.join(SOURCE_DIR,""), # e.g. "interventions"
|
|
19
|
+
# "model": None, # e.g. Intervention
|
|
20
|
+
# "foreign_keys": [], # e.g. ["intervention_types"]
|
|
21
|
+
# "foreign_key_models": [] # e.g. [InterventionType]
|
|
22
|
+
# },
|
|
23
|
+
"LabelType": {
|
|
24
|
+
"dir": os.path.join(SOURCE_DIR, "label-type"), # e.g. "interventions"
|
|
25
|
+
"model": LabelType, # e.g. Intervention
|
|
26
|
+
"foreign_keys": [], # e.g. ["intervention_types"]
|
|
27
|
+
"foreign_key_models": [], # e.g. [InterventionType]
|
|
28
|
+
},
|
|
29
|
+
"Label": {
|
|
30
|
+
"dir": os.path.join(SOURCE_DIR, "label"), # e.g. "interventions"
|
|
31
|
+
"model": Label, # e.g. Intervention
|
|
32
|
+
"foreign_keys": ["label_type"], # e.g. ["intervention_types"]
|
|
33
|
+
"foreign_key_models": [LabelType], # e.g. [InterventionType]
|
|
34
|
+
},
|
|
35
|
+
"LabelSet": {
|
|
36
|
+
"dir": os.path.join(SOURCE_DIR, "label-set"), # e.g. "interventions"
|
|
37
|
+
"model": LabelSet, # e.g. Intervention
|
|
38
|
+
"foreign_keys": ["labels"], # e.g. ["intervention_types"]
|
|
39
|
+
"foreign_key_models": [Label], # e.g. [InterventionType]
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Command(BaseCommand):
|
|
45
|
+
help = """Load all .yaml files in the data/intervention directory
|
|
46
|
+
into the Intervention and InterventionType model"""
|
|
47
|
+
|
|
48
|
+
def add_arguments(self, parser):
|
|
49
|
+
parser.add_argument(
|
|
50
|
+
"--verbose",
|
|
51
|
+
action="store_true",
|
|
52
|
+
help="Display verbose output",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def handle(self, *args, **options):
|
|
56
|
+
verbose = options["verbose"]
|
|
57
|
+
for model_name in IMPORT_MODELS:
|
|
58
|
+
_metadata = IMPORT_METADATA[model_name]
|
|
59
|
+
load_model_data_from_yaml(self, model_name, _metadata, verbose)
|