endoreg-db 0.8.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__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 +613 -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 +699 -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 +730 -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 +147 -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 +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/pdf_import.py +1159 -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 +1258 -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 +70 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +226 -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 +272 -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 +386 -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 +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +161 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +61 -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 +329 -0
- endoreg_db/views/video/video_media.py +158 -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.5.1.dist-info/METADATA +383 -0
- endoreg_db-0.8.5.1.dist-info/RECORD +794 -0
- endoreg_db-0.8.5.1.dist-info/WHEEL +4 -0
- endoreg_db-0.8.5.1.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from django.conf import settings
|
|
2
|
+
import os
|
|
3
|
+
from django.core.management.base import BaseCommand
|
|
4
|
+
from ...models import Unit
|
|
5
|
+
import yaml
|
|
6
|
+
from ...utils import load_model_data_from_yaml
|
|
7
|
+
from ...data import UNIT_DATA_DIR
|
|
8
|
+
|
|
9
|
+
SOURCE_DIR = UNIT_DATA_DIR # e.g. settings.DATA_DIR_INTERVENTION
|
|
10
|
+
|
|
11
|
+
MODEL_0 = Unit
|
|
12
|
+
|
|
13
|
+
IMPORT_MODELS = [ # string as model key, serves as key in IMPORT_METADATA
|
|
14
|
+
MODEL_0.__name__,
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
IMPORT_METADATA = {
|
|
18
|
+
MODEL_0.__name__: {
|
|
19
|
+
"dir": SOURCE_DIR, # e.g. "interventions"
|
|
20
|
+
"model": MODEL_0, # e.g. Intervention
|
|
21
|
+
"foreign_keys": [], # e.g. ["intervention_types"]
|
|
22
|
+
"foreign_key_models": [] # e.g. [InterventionType]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
class Command(BaseCommand):
|
|
27
|
+
help = """Load all .yaml files in the data/intervention directory
|
|
28
|
+
into the Intervention and InterventionType model"""
|
|
29
|
+
|
|
30
|
+
def add_arguments(self, parser):
|
|
31
|
+
parser.add_argument(
|
|
32
|
+
'--verbose',
|
|
33
|
+
action='store_true',
|
|
34
|
+
help='Display verbose output',
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def handle(self, *args, **options):
|
|
38
|
+
verbose = options['verbose']
|
|
39
|
+
for model_name in IMPORT_MODELS:
|
|
40
|
+
_metadata = IMPORT_METADATA[model_name]
|
|
41
|
+
load_model_data_from_yaml(
|
|
42
|
+
self,
|
|
43
|
+
model_name,
|
|
44
|
+
_metadata,
|
|
45
|
+
verbose
|
|
46
|
+
)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from django.contrib.auth.models import Group, Permission
|
|
3
|
+
from django.contrib.contenttypes.models import ContentType
|
|
4
|
+
from django.apps import apps
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Command(BaseCommand):
|
|
8
|
+
help = "Create additional user groups and permissions for all models in 'endoreg_db' app."
|
|
9
|
+
|
|
10
|
+
def add_arguments(self, parser):
|
|
11
|
+
parser.add_argument(
|
|
12
|
+
'--verbose',
|
|
13
|
+
action='store_true',
|
|
14
|
+
help='Display verbose output',
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
def handle(self, *args, **options):
|
|
18
|
+
verbose = options['verbose']
|
|
19
|
+
|
|
20
|
+
# Create groups
|
|
21
|
+
groups = ["demo", "verified", "agl", "endo_reg_user", "g_play_user", "ukw_user"]
|
|
22
|
+
for group_name in groups:
|
|
23
|
+
_group, created = Group.objects.get_or_create(name=group_name)
|
|
24
|
+
if verbose and created:
|
|
25
|
+
self.stdout.write(self.style.SUCCESS(f"Created group {group_name}"))
|
|
26
|
+
|
|
27
|
+
if verbose:
|
|
28
|
+
self.stdout.write(self.style.SUCCESS("All groups processed successfully."))
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# django command to register a new AI model
|
|
2
|
+
# expects path to model_meta.json file
|
|
3
|
+
# example model_meta: {
|
|
4
|
+
# "name": "multilabel_classification",
|
|
5
|
+
# "version": 0,
|
|
6
|
+
# "model_type": "multilabel_classification", # name of modeltype, is unique
|
|
7
|
+
# "labelset": "multilabel_classification", #labelset name, combination of name and version is unique
|
|
8
|
+
# "labelset_version": 0,
|
|
9
|
+
# "weights_path": "weights/multilabel_classification_0.pth", # path to weights file
|
|
10
|
+
#}
|
|
11
|
+
|
|
12
|
+
from django.core.management.base import BaseCommand
|
|
13
|
+
from django.core.files import File
|
|
14
|
+
from endoreg_db.models import ModelMeta, ModelType, LabelSet
|
|
15
|
+
import json
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
class Command(BaseCommand):
|
|
19
|
+
"""
|
|
20
|
+
Registers a new AI model in the database.
|
|
21
|
+
"""
|
|
22
|
+
help = 'Registers a new AI model in the database.'
|
|
23
|
+
|
|
24
|
+
def add_arguments(self, parser):
|
|
25
|
+
parser.add_argument('model_meta_path', type=str)
|
|
26
|
+
|
|
27
|
+
def handle(self, *args, **options):
|
|
28
|
+
model_meta_path = Path(options['model_meta_path'])
|
|
29
|
+
|
|
30
|
+
with open(model_meta_path, 'r') as f:
|
|
31
|
+
model_meta = json.load(f)
|
|
32
|
+
|
|
33
|
+
# get or create model type
|
|
34
|
+
model_type = ModelType.objects.get(name=model_meta['model_type'])
|
|
35
|
+
|
|
36
|
+
# get or create labelset
|
|
37
|
+
labelset = LabelSet.objects.get(name=model_meta['labelset'], version=model_meta['labelset_version'])
|
|
38
|
+
|
|
39
|
+
# Handle weights file
|
|
40
|
+
weights_path = model_meta['weights_path']
|
|
41
|
+
# weights path is realative to model_meta_path
|
|
42
|
+
weights_path = model_meta_path.parent / weights_path
|
|
43
|
+
|
|
44
|
+
assert weights_path.exists(), f"weights file at {weights_path} does not exist"
|
|
45
|
+
|
|
46
|
+
# Make sure the path is correct and the file exists
|
|
47
|
+
try:
|
|
48
|
+
with open(weights_path, 'rb') as file:
|
|
49
|
+
model_name_string = f"{model_meta['name']}_{model_meta['version']}"
|
|
50
|
+
weights = File(file, name = model_name_string)
|
|
51
|
+
# Create ModelMeta instance
|
|
52
|
+
model_meta_instance = ModelMeta.objects.create(
|
|
53
|
+
name=model_meta['name'],
|
|
54
|
+
version=model_meta['version'],
|
|
55
|
+
type=model_type,
|
|
56
|
+
labelset=labelset,
|
|
57
|
+
weights=weights,
|
|
58
|
+
description=model_meta.get('description', '') # Assuming description is optional
|
|
59
|
+
)
|
|
60
|
+
print(f"Successfully registered model {model_meta_instance}")
|
|
61
|
+
except IOError:
|
|
62
|
+
print(f"Failed to open weights file at {weights_path}. Make sure the file exists.")
|
|
63
|
+
|
|
64
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from django_celery_beat.models import PeriodicTask
|
|
3
|
+
|
|
4
|
+
class Command(BaseCommand):
|
|
5
|
+
help = 'Deletes all periodic tasks from the database to reset the schedule'
|
|
6
|
+
|
|
7
|
+
def handle(self, *args, **kwargs):
|
|
8
|
+
PeriodicTask.objects.all().delete()
|
|
9
|
+
self.stdout.write(self.style.SUCCESS('Successfully deleted all periodic tasks.'))
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django management command to perform complete setup for EndoReg DB when used as an embedded app.
|
|
3
|
+
This command ensures all necessary data and configurations are initialized.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from django.core.management import call_command
|
|
7
|
+
from django.core.management.base import BaseCommand
|
|
8
|
+
|
|
9
|
+
from endoreg_db.models import ModelMeta
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Command(BaseCommand):
|
|
13
|
+
help = """
|
|
14
|
+
Complete setup for EndoReg DB when used as an embedded app.
|
|
15
|
+
This command performs all necessary initialization steps:
|
|
16
|
+
1. Loads base database data
|
|
17
|
+
2. Sets up caching (if using db cache)
|
|
18
|
+
3. Loads default models from setup configuration file (setup_config.yaml)
|
|
19
|
+
4. Loads models according to fallback chain (Local Files -> HuggingFace -> graceful failure)
|
|
20
|
+
5. Initializes model metadata
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def add_arguments(self, parser):
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
"--skip-ai-setup",
|
|
26
|
+
action="store_true",
|
|
27
|
+
help="Skip AI model setup (for cases where AI features are not needed)",
|
|
28
|
+
)
|
|
29
|
+
parser.add_argument(
|
|
30
|
+
"--force-recreate",
|
|
31
|
+
action="store_true",
|
|
32
|
+
help="Force recreation of AI model metadata even if it exists",
|
|
33
|
+
)
|
|
34
|
+
parser.add_argument(
|
|
35
|
+
"--yaml-only",
|
|
36
|
+
action="store_true",
|
|
37
|
+
help="Only use YAML-defined models, don't auto-generate missing metadata",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def handle(self, *args, **options):
|
|
41
|
+
skip_ai = options.get("skip_ai_setup", False)
|
|
42
|
+
force_recreate = options.get("force_recreate", False)
|
|
43
|
+
yaml_only = options.get("yaml_only", False)
|
|
44
|
+
|
|
45
|
+
self.stdout.write(self.style.SUCCESS("🚀 Starting EndoReg DB embedded app setup..."))
|
|
46
|
+
|
|
47
|
+
if yaml_only:
|
|
48
|
+
self.stdout.write(self.style.WARNING("📋 YAML-only mode: Will not auto-generate missing metadata"))
|
|
49
|
+
|
|
50
|
+
# Step 1: Load base database data
|
|
51
|
+
self.stdout.write("\n📊 Step 1: Loading base database data...")
|
|
52
|
+
try:
|
|
53
|
+
call_command("load_base_db_data")
|
|
54
|
+
self.stdout.write(self.style.SUCCESS("✅ Base database data loaded successfully"))
|
|
55
|
+
except Exception as e:
|
|
56
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to load base data: {e}"))
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
# Step 2: Create cache table (only if using database caching)
|
|
60
|
+
self.stdout.write("\n💾 Step 2: Setting up caching...")
|
|
61
|
+
from django.conf import settings
|
|
62
|
+
|
|
63
|
+
cache_backend = settings.CACHES.get("default", {}).get("BACKEND", "")
|
|
64
|
+
if "db" in cache_backend or "database" in cache_backend:
|
|
65
|
+
self.stdout.write("Using database caching - creating cache table...")
|
|
66
|
+
try:
|
|
67
|
+
call_command("createcachetable")
|
|
68
|
+
self.stdout.write(self.style.SUCCESS("✅ Cache table created successfully"))
|
|
69
|
+
except Exception as e:
|
|
70
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to create cache table: {e}"))
|
|
71
|
+
return
|
|
72
|
+
else:
|
|
73
|
+
self.stdout.write("Using in-memory caching - skipping cache table creation")
|
|
74
|
+
|
|
75
|
+
if skip_ai:
|
|
76
|
+
self.stdout.write(self.style.WARNING("\n⚠️ Skipping AI setup as requested"))
|
|
77
|
+
else:
|
|
78
|
+
# Step 3: Load AI model data
|
|
79
|
+
self.stdout.write("\n🤖 Step 3: Loading AI model data...")
|
|
80
|
+
try:
|
|
81
|
+
call_command("load_ai_model_data")
|
|
82
|
+
self.stdout.write(self.style.SUCCESS("✅ AI model data loaded successfully"))
|
|
83
|
+
except Exception as e:
|
|
84
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to load AI model data: {e}"))
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
# Step 4: Load AI model label data
|
|
88
|
+
self.stdout.write("\n🏷️ Step 4: Loading AI model label data...")
|
|
89
|
+
try:
|
|
90
|
+
call_command("load_ai_model_label_data")
|
|
91
|
+
self.stdout.write(self.style.SUCCESS("✅ AI model label data loaded successfully"))
|
|
92
|
+
except Exception as e:
|
|
93
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to load AI model label data: {e}"))
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
# Step 5: Create model metadata
|
|
97
|
+
self.stdout.write("\n📋 Step 5: Creating AI model metadata...")
|
|
98
|
+
try:
|
|
99
|
+
# Load setup configuration
|
|
100
|
+
from endoreg_db.utils.setup_config import setup_config
|
|
101
|
+
|
|
102
|
+
# Get primary model from configuration
|
|
103
|
+
default_model_name = setup_config.get_primary_model_name()
|
|
104
|
+
primary_labelset = setup_config.get_primary_labelset_name()
|
|
105
|
+
|
|
106
|
+
# Check if model metadata already exists
|
|
107
|
+
from endoreg_db.models import AiModel
|
|
108
|
+
|
|
109
|
+
ai_model = AiModel.objects.filter(name=default_model_name).first()
|
|
110
|
+
|
|
111
|
+
if not ai_model:
|
|
112
|
+
self.stdout.write(self.style.ERROR(f"❌ AI model '{default_model_name}' not found"))
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
existing_meta = ai_model.metadata_versions.first()
|
|
116
|
+
if existing_meta and not force_recreate:
|
|
117
|
+
self.stdout.write(self.style.SUCCESS("✅ Model metadata already exists (use --force-recreate to recreate)"))
|
|
118
|
+
else:
|
|
119
|
+
# Try to create model metadata using configurable approach
|
|
120
|
+
model_path = self._find_model_weights_file()
|
|
121
|
+
if model_path:
|
|
122
|
+
call_command_kwargs = {
|
|
123
|
+
"model_name": default_model_name,
|
|
124
|
+
"model_meta_version": 1,
|
|
125
|
+
"image_classification_labelset_name": primary_labelset,
|
|
126
|
+
"model_path": str(model_path),
|
|
127
|
+
}
|
|
128
|
+
# Add bump_version flag if force_recreate is enabled
|
|
129
|
+
if force_recreate:
|
|
130
|
+
call_command_kwargs["bump_version"] = True
|
|
131
|
+
|
|
132
|
+
call_command("create_multilabel_model_meta", **call_command_kwargs)
|
|
133
|
+
self.stdout.write(self.style.SUCCESS("✅ AI model metadata created successfully"))
|
|
134
|
+
else:
|
|
135
|
+
self.stdout.write(self.style.WARNING("⚠️ Model weights file not found. AI features may not work properly."))
|
|
136
|
+
|
|
137
|
+
except Exception as e:
|
|
138
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to create AI model metadata: {e}"))
|
|
139
|
+
return
|
|
140
|
+
|
|
141
|
+
# Step 5.5: Validate and fix AI model active metadata
|
|
142
|
+
self.stdout.write("\n🔧 Step 5.5: Validating AI model active metadata...")
|
|
143
|
+
try:
|
|
144
|
+
self._validate_and_fix_ai_model_metadata(yaml_only)
|
|
145
|
+
self.stdout.write(self.style.SUCCESS("✅ AI model metadata validation completed"))
|
|
146
|
+
except Exception as e:
|
|
147
|
+
self.stdout.write(self.style.ERROR(f"❌ Failed to validate AI model metadata: {e}"))
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
# Step 6: Verification
|
|
151
|
+
self.stdout.write("\n🔍 Step 6: Verifying setup...")
|
|
152
|
+
try:
|
|
153
|
+
self._verify_setup()
|
|
154
|
+
self.stdout.write(self.style.SUCCESS("✅ Setup verification completed successfully"))
|
|
155
|
+
except Exception as e:
|
|
156
|
+
self.stdout.write(self.style.ERROR(f"❌ Setup verification failed: {e}"))
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
self.stdout.write(self.style.SUCCESS("\n🎉 EndoReg DB embedded app setup completed successfully!"))
|
|
160
|
+
self.stdout.write("\nNext steps:")
|
|
161
|
+
self.stdout.write("1. Run migrations: python manage.py migrate")
|
|
162
|
+
self.stdout.write("2. Create superuser: python manage.py createsuperuser")
|
|
163
|
+
self.stdout.write("3. Start development server: python manage.py runserver")
|
|
164
|
+
|
|
165
|
+
def _find_model_weights_file(self):
|
|
166
|
+
"""Find the model weights file using configurable search patterns and directories."""
|
|
167
|
+
# Load setup configuration
|
|
168
|
+
from endoreg_db.utils.setup_config import setup_config
|
|
169
|
+
|
|
170
|
+
# First try to find weights using configured patterns
|
|
171
|
+
found_files = setup_config.find_model_weights_files()
|
|
172
|
+
if found_files:
|
|
173
|
+
self.stdout.write(f"Found model weights at: {found_files[0]}")
|
|
174
|
+
return found_files[0]
|
|
175
|
+
|
|
176
|
+
# If no local weights found and HuggingFace fallback is enabled
|
|
177
|
+
hf_config = setup_config.get_huggingface_config()
|
|
178
|
+
if hf_config.get("enabled", True):
|
|
179
|
+
self.stdout.write("📦 No local model weights found — attempting HuggingFace download...")
|
|
180
|
+
try:
|
|
181
|
+
if not ModelMeta.objects.exists():
|
|
182
|
+
ModelMeta.setup_default_from_huggingface(
|
|
183
|
+
hf_config.get("repo_id", "wg-lux/colo_segmentation_RegNetX800MF_base"),
|
|
184
|
+
labelset_name=hf_config.get("labelset_name", "multilabel_classification_colonoscopy_default"),
|
|
185
|
+
)
|
|
186
|
+
self.stdout.write("✅ Default ModelMeta created from HuggingFace.")
|
|
187
|
+
|
|
188
|
+
# Try to find the downloaded weights
|
|
189
|
+
found_files = setup_config.find_model_weights_files()
|
|
190
|
+
if found_files:
|
|
191
|
+
return found_files[0]
|
|
192
|
+
|
|
193
|
+
except Exception as e:
|
|
194
|
+
self.stdout.write(f"⚠️ HuggingFace download failed: {e}")
|
|
195
|
+
|
|
196
|
+
self.stdout.write("Model weights file not found in configured locations")
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
def _verify_setup(self):
|
|
200
|
+
"""Verify that the setup was successful."""
|
|
201
|
+
from django.conf import settings
|
|
202
|
+
from django.db import connection
|
|
203
|
+
|
|
204
|
+
# Check that required tables exist
|
|
205
|
+
required_tables = [
|
|
206
|
+
"endoreg_db_aimodel",
|
|
207
|
+
"endoreg_db_modelmeta",
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
# Only check for cache table if using database caching
|
|
211
|
+
cache_backend = settings.CACHES.get("default", {}).get("BACKEND", "")
|
|
212
|
+
if "db" in cache_backend or "database" in cache_backend:
|
|
213
|
+
required_tables.append("django_cache_table")
|
|
214
|
+
|
|
215
|
+
cursor = connection.cursor()
|
|
216
|
+
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
|
|
217
|
+
existing_tables = [row[0] for row in cursor.fetchall()]
|
|
218
|
+
|
|
219
|
+
missing_tables = [table for table in required_tables if table not in existing_tables]
|
|
220
|
+
if missing_tables:
|
|
221
|
+
raise Exception(f"Missing required tables: {missing_tables}")
|
|
222
|
+
|
|
223
|
+
# Check that AI models exist (if AI setup was performed)
|
|
224
|
+
from endoreg_db.models import AiModel
|
|
225
|
+
|
|
226
|
+
if AiModel.objects.exists():
|
|
227
|
+
ai_model_count = AiModel.objects.count()
|
|
228
|
+
self.stdout.write(f"Found {ai_model_count} AI model(s)")
|
|
229
|
+
|
|
230
|
+
# Check for model metadata
|
|
231
|
+
from endoreg_db.models import ModelMeta
|
|
232
|
+
|
|
233
|
+
meta_count = ModelMeta.objects.count()
|
|
234
|
+
self.stdout.write(f"Found {meta_count} model metadata record(s)")
|
|
235
|
+
|
|
236
|
+
self.stdout.write("Setup verification passed")
|
|
237
|
+
|
|
238
|
+
def _validate_and_fix_ai_model_metadata(self, yaml_only=False):
|
|
239
|
+
"""
|
|
240
|
+
Validate that all AI models have proper active metadata and fix if necessary.
|
|
241
|
+
This addresses the "No model metadata found for this model" error.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
yaml_only (bool): If True, only set active metadata but don't create new metadata
|
|
245
|
+
"""
|
|
246
|
+
from endoreg_db.models import AiModel, LabelSet, ModelMeta
|
|
247
|
+
from endoreg_db.utils.setup_config import setup_config
|
|
248
|
+
|
|
249
|
+
all_models = AiModel.objects.all()
|
|
250
|
+
fixed_count = 0
|
|
251
|
+
|
|
252
|
+
# Get configurable defaults
|
|
253
|
+
defaults = setup_config.get_auto_generation_defaults()
|
|
254
|
+
primary_labelset_name = setup_config.get_primary_labelset_name()
|
|
255
|
+
|
|
256
|
+
for model in all_models:
|
|
257
|
+
self.stdout.write(f"Checking model: {model.name}")
|
|
258
|
+
|
|
259
|
+
# Check if model has metadata versions
|
|
260
|
+
metadata_count = model.metadata_versions.count()
|
|
261
|
+
self.stdout.write(f" Metadata versions: {metadata_count}")
|
|
262
|
+
|
|
263
|
+
if metadata_count == 0:
|
|
264
|
+
if yaml_only:
|
|
265
|
+
self.stdout.write(f" ⚠️ YAML-only mode: Skipping auto-generation for {model.name}")
|
|
266
|
+
continue
|
|
267
|
+
|
|
268
|
+
# Create metadata for models that don't have any
|
|
269
|
+
self.stdout.write(f" Creating metadata for {model.name}...")
|
|
270
|
+
|
|
271
|
+
# Use configured labelset or create default
|
|
272
|
+
labelset = None
|
|
273
|
+
try:
|
|
274
|
+
labelset = LabelSet.objects.get(name=primary_labelset_name)
|
|
275
|
+
except LabelSet.DoesNotExist:
|
|
276
|
+
labelset = LabelSet.objects.first()
|
|
277
|
+
if not labelset:
|
|
278
|
+
labelset = LabelSet.objects.create(name="default_colonoscopy_labels", description="Default colonoscopy classification labels")
|
|
279
|
+
|
|
280
|
+
# Create basic metadata WITH weights if available
|
|
281
|
+
weights_file = self._find_model_weights_file()
|
|
282
|
+
weights_path = ""
|
|
283
|
+
if weights_file:
|
|
284
|
+
# If we have weights, set up the relative path
|
|
285
|
+
from pathlib import Path
|
|
286
|
+
|
|
287
|
+
from endoreg_db.utils.paths import STORAGE_DIR
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
weights_path = str(Path(weights_file).relative_to(STORAGE_DIR))
|
|
291
|
+
except ValueError:
|
|
292
|
+
# If file is not in storage dir, copy it there
|
|
293
|
+
import shutil
|
|
294
|
+
|
|
295
|
+
weights_dir = STORAGE_DIR / "model_weights"
|
|
296
|
+
weights_dir.mkdir(parents=True, exist_ok=True)
|
|
297
|
+
dest_path = weights_dir / Path(weights_file).name
|
|
298
|
+
shutil.copy2(weights_file, dest_path)
|
|
299
|
+
weights_path = str(dest_path.relative_to(STORAGE_DIR))
|
|
300
|
+
self.stdout.write(f" Copied weights to: {dest_path}")
|
|
301
|
+
|
|
302
|
+
# Create basic metadata using configurable defaults
|
|
303
|
+
meta = ModelMeta.objects.create(
|
|
304
|
+
name=model.name,
|
|
305
|
+
version="1.0",
|
|
306
|
+
model=model,
|
|
307
|
+
labelset=labelset,
|
|
308
|
+
weights=weights_path, # Set weights if available
|
|
309
|
+
activation=defaults.get("activation", "sigmoid"),
|
|
310
|
+
mean=defaults.get("mean", "0.485,0.456,0.406"),
|
|
311
|
+
std=defaults.get("std", "0.229,0.224,0.225"),
|
|
312
|
+
size_x=defaults.get("size_x", 224),
|
|
313
|
+
size_y=defaults.get("size_y", 224),
|
|
314
|
+
axes=defaults.get("axes", "CHW"),
|
|
315
|
+
batchsize=defaults.get("batchsize", 32),
|
|
316
|
+
num_workers=defaults.get("num_workers", 4),
|
|
317
|
+
description=f"Auto-generated metadata for {model.name}",
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
model.active_meta = meta
|
|
321
|
+
model.save()
|
|
322
|
+
fixed_count += 1
|
|
323
|
+
self.stdout.write(f" ✅ Created and set metadata for {model.name}")
|
|
324
|
+
|
|
325
|
+
elif not model.active_meta:
|
|
326
|
+
# Model has metadata but no active meta set
|
|
327
|
+
first_meta = model.metadata_versions.first()
|
|
328
|
+
if first_meta:
|
|
329
|
+
self.stdout.write(f" Setting active metadata for {model.name}...")
|
|
330
|
+
|
|
331
|
+
# Check if the metadata has weights - if not, try to assign them
|
|
332
|
+
if not first_meta.weights:
|
|
333
|
+
self.stdout.write(" Metadata exists but no weights assigned, attempting to add weights...")
|
|
334
|
+
weights_file = self._find_model_weights_file()
|
|
335
|
+
if weights_file:
|
|
336
|
+
from pathlib import Path
|
|
337
|
+
|
|
338
|
+
from endoreg_db.utils.paths import STORAGE_DIR
|
|
339
|
+
|
|
340
|
+
try:
|
|
341
|
+
weights_path = str(Path(weights_file).relative_to(STORAGE_DIR))
|
|
342
|
+
except ValueError:
|
|
343
|
+
# Copy weights to storage if not already there
|
|
344
|
+
import shutil
|
|
345
|
+
|
|
346
|
+
weights_dir = STORAGE_DIR / "model_weights"
|
|
347
|
+
weights_dir.mkdir(parents=True, exist_ok=True)
|
|
348
|
+
dest_path = weights_dir / Path(weights_file).name
|
|
349
|
+
shutil.copy2(weights_file, dest_path)
|
|
350
|
+
weights_path = str(dest_path.relative_to(STORAGE_DIR))
|
|
351
|
+
self.stdout.write(f" Copied weights to: {dest_path}")
|
|
352
|
+
|
|
353
|
+
# Assign the relative path to the FileField
|
|
354
|
+
first_meta.weights.name = weights_path
|
|
355
|
+
first_meta.save(update_fields=["weights"])
|
|
356
|
+
self.stdout.write(f" Added weights to existing metadata: {weights_path}")
|
|
357
|
+
|
|
358
|
+
model.active_meta = first_meta
|
|
359
|
+
model.save()
|
|
360
|
+
fixed_count += 1
|
|
361
|
+
self.stdout.write(f" ✅ Set active metadata: {first_meta.name} v{first_meta.version}")
|
|
362
|
+
else:
|
|
363
|
+
self.stdout.write(f" ⚠️ No metadata versions available for {model.name}")
|
|
364
|
+
|
|
365
|
+
else:
|
|
366
|
+
self.stdout.write(f" ✅ Model {model.name} has active metadata: {model.active_meta}")
|
|
367
|
+
|
|
368
|
+
# Verify all models can get latest version
|
|
369
|
+
self.stdout.write("\nTesting model metadata access...")
|
|
370
|
+
for model in all_models:
|
|
371
|
+
try:
|
|
372
|
+
latest = model.get_latest_version()
|
|
373
|
+
self.stdout.write(f" ✅ {model.name}: {latest}")
|
|
374
|
+
except Exception as e:
|
|
375
|
+
self.stdout.write(f" ❌ {model.name}: {e}")
|
|
376
|
+
raise Exception(f"Model {model.name} still has metadata issues: {e}")
|
|
377
|
+
|
|
378
|
+
if fixed_count > 0:
|
|
379
|
+
self.stdout.write(f"Fixed metadata for {fixed_count} model(s)")
|
|
380
|
+
else:
|
|
381
|
+
self.stdout.write("All models already had proper metadata")
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django Management Command for File Watcher Service
|
|
3
|
+
|
|
4
|
+
This command provides Django integration for the file watcher service.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from django.core.management.base import BaseCommand
|
|
8
|
+
from django.conf import settings
|
|
9
|
+
import sys
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Command(BaseCommand):
|
|
15
|
+
help = """
|
|
16
|
+
Start the file watcher service for automatic video and PDF processing.
|
|
17
|
+
|
|
18
|
+
This command monitors:
|
|
19
|
+
- data/raw_videos/ for video files (.mp4, .avi, .mov, .mkv, .webm, .m4v)
|
|
20
|
+
- data/raw_pdfs/ for PDF files (.pdf)
|
|
21
|
+
|
|
22
|
+
When files are detected, they are automatically processed with:
|
|
23
|
+
- Video: Import, anonymization, and segmentation
|
|
24
|
+
- PDF: Import and anonymization
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def add_arguments(self, parser):
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
'--test',
|
|
30
|
+
action='store_true',
|
|
31
|
+
help='Test the file watcher configuration without starting monitoring',
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--existing',
|
|
35
|
+
action='store_true',
|
|
36
|
+
help='Process existing files in the directories before starting monitoring',
|
|
37
|
+
)
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
'--log-level',
|
|
40
|
+
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
|
|
41
|
+
default='INFO',
|
|
42
|
+
help='Set logging level (default: INFO)',
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def handle(self, *args, **options):
|
|
46
|
+
self.stdout.write(self.style.SUCCESS("Starting File Watcher Service"))
|
|
47
|
+
|
|
48
|
+
# Set environment variables
|
|
49
|
+
os.environ['WATCHER_LOG_LEVEL'] = options['log_level']
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
# Add project root to path
|
|
53
|
+
project_root = Path(settings.BASE_DIR)
|
|
54
|
+
if str(project_root) not in sys.path:
|
|
55
|
+
sys.path.insert(0, str(project_root))
|
|
56
|
+
|
|
57
|
+
# Import the file watcher service from the correct location
|
|
58
|
+
file_watcher_path = project_root / 'scripts' / 'file_watcher.py'
|
|
59
|
+
|
|
60
|
+
if not file_watcher_path.exists():
|
|
61
|
+
self.stdout.write(self.style.ERROR(f"❌ File watcher script not found: {file_watcher_path}"))
|
|
62
|
+
return
|
|
63
|
+
|
|
64
|
+
# Import the module dynamically
|
|
65
|
+
import importlib.util
|
|
66
|
+
spec = importlib.util.spec_from_file_location("file_watcher", file_watcher_path)
|
|
67
|
+
file_watcher_module = importlib.util.module_from_spec(spec)
|
|
68
|
+
spec.loader.exec_module(file_watcher_module)
|
|
69
|
+
|
|
70
|
+
FileWatcherService = file_watcher_module.FileWatcherService
|
|
71
|
+
|
|
72
|
+
if options['test']:
|
|
73
|
+
self.stdout.write("Testing file watcher configuration...")
|
|
74
|
+
service = FileWatcherService()
|
|
75
|
+
try:
|
|
76
|
+
service._validate_django_setup()
|
|
77
|
+
except Exception as e:
|
|
78
|
+
self.stdout.write(self.style.ERROR(f"❌ Validation failed: {e}"))
|
|
79
|
+
return
|
|
80
|
+
self.stdout.write(self.style.SUCCESS("✅ File watcher test passed"))
|
|
81
|
+
return
|
|
82
|
+
|
|
83
|
+
# Create and start the service
|
|
84
|
+
service = FileWatcherService()
|
|
85
|
+
|
|
86
|
+
if options['existing']:
|
|
87
|
+
self.stdout.write("Processing existing files...")
|
|
88
|
+
service._process_existing_files()
|
|
89
|
+
self.stdout.write(self.style.SUCCESS("✅ Existing files processed"))
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
self.stdout.write("Starting file monitoring...")
|
|
93
|
+
self.stdout.write(f"Video directory: {service.video_dir}")
|
|
94
|
+
self.stdout.write(f"PDF directory: {service.pdf_dir}")
|
|
95
|
+
self.stdout.write("Press Ctrl+C to stop")
|
|
96
|
+
|
|
97
|
+
service.start()
|
|
98
|
+
|
|
99
|
+
except KeyboardInterrupt:
|
|
100
|
+
self.stdout.write(self.style.WARNING("\n⚠️ File watcher stopped by user"))
|
|
101
|
+
except Exception as e:
|
|
102
|
+
self.stdout.write(self.style.ERROR(f"❌ Error: {str(e)}"))
|
|
103
|
+
if options['verbosity'] >= 2:
|
|
104
|
+
import traceback
|
|
105
|
+
self.stdout.write(traceback.format_exc())
|
|
106
|
+
sys.exit(1)
|