endoreg-db 0.8.9.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__init__.py +0 -0
- endoreg_db/_version.py +34 -0
- endoreg_db/admin.py +97 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +99 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +32 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# endoreg_db/services/video_import.py
|
|
2
|
+
import logging
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Optional, Union
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
from endoreg_db.import_files.context import (
|
|
8
|
+
ImportContext,
|
|
9
|
+
file_lock,
|
|
10
|
+
)
|
|
11
|
+
from endoreg_db.import_files.file_storage.state_management import (
|
|
12
|
+
finalize_failure,
|
|
13
|
+
finalize_video_success,
|
|
14
|
+
)
|
|
15
|
+
from endoreg_db.import_files.file_storage.storage import create_sensitive_copy
|
|
16
|
+
from endoreg_db.import_files.file_storage.create_video_file import (
|
|
17
|
+
create_or_retrieve_video_file,
|
|
18
|
+
)
|
|
19
|
+
from endoreg_db.import_files.context.validate_directories import validate_directories
|
|
20
|
+
from endoreg_db.import_files.file_storage.state_management import (
|
|
21
|
+
mark_instance_processing_started,
|
|
22
|
+
)
|
|
23
|
+
from endoreg_db.models import VideoFile
|
|
24
|
+
from endoreg_db.import_files.processing.video_processing.video_anonymization import (
|
|
25
|
+
VideoAnonymizer,
|
|
26
|
+
)
|
|
27
|
+
from endoreg_db.utils.paths import (
|
|
28
|
+
SENSITIVE_VIDEO_DIR,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class VideoImportService:
|
|
36
|
+
"""
|
|
37
|
+
Service for importing and anonymizing video files.
|
|
38
|
+
Uses a central video instance pattern for cleaner state management.
|
|
39
|
+
Responsibility:
|
|
40
|
+
Validate path
|
|
41
|
+
Move/copy raw file into stable storage
|
|
42
|
+
Create/attach VideoFile, VideoState, default SensitiveMeta
|
|
43
|
+
Mark a single clear state like state.import_completed = True or state.ready_for_anonymization = True
|
|
44
|
+
|
|
45
|
+
It does not:
|
|
46
|
+
Run frame cleaning
|
|
47
|
+
Run ML
|
|
48
|
+
Create processed_file
|
|
49
|
+
Decide fallback anonymization
|
|
50
|
+
|
|
51
|
+
These actions are delegated to the modules inside file_import
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(self):
|
|
56
|
+
self.logger = logger
|
|
57
|
+
self.anonymizer = VideoAnonymizer()
|
|
58
|
+
self.processing_context: Optional[ImportContext] = None
|
|
59
|
+
self.current_video: Optional[VideoFile] = None
|
|
60
|
+
|
|
61
|
+
validate_directories()
|
|
62
|
+
|
|
63
|
+
def import_and_anonymize(
|
|
64
|
+
self,
|
|
65
|
+
file_path: Union[Path, str],
|
|
66
|
+
center_name: str,
|
|
67
|
+
processor_name: str,
|
|
68
|
+
retry: bool = False,
|
|
69
|
+
delete_source: bool = True,
|
|
70
|
+
) -> "VideoFile | None":
|
|
71
|
+
"""
|
|
72
|
+
Public entrypoint: wrap import_and_anonymize logic.
|
|
73
|
+
"""
|
|
74
|
+
# First, initialize import context. this will be updated during import and keep track of current paths, file type and center and processor.
|
|
75
|
+
ctx = ImportContext(
|
|
76
|
+
file_path=Path(file_path),
|
|
77
|
+
center_name=center_name,
|
|
78
|
+
processor_name=processor_name,
|
|
79
|
+
delete_source=delete_source,
|
|
80
|
+
file_type="video",
|
|
81
|
+
)
|
|
82
|
+
self.logger.info("validating and preparing file")
|
|
83
|
+
if not ctx.file_path.exists():
|
|
84
|
+
raise FileNotFoundError(f"Video file not found: {file_path}")
|
|
85
|
+
|
|
86
|
+
ctx.sensitive_path = create_sensitive_copy(ctx.file_path, SENSITIVE_VIDEO_DIR)
|
|
87
|
+
|
|
88
|
+
with file_lock(ctx.file_path):
|
|
89
|
+
logger.info("Acquired file lock for %s", ctx.file_path)
|
|
90
|
+
|
|
91
|
+
# create or retrieve VideoFile + update history
|
|
92
|
+
ctx.current_video, processed, needs_processing = (
|
|
93
|
+
create_or_retrieve_video_file(ctx)
|
|
94
|
+
)
|
|
95
|
+
ctx.current_video.get_or_create_state()
|
|
96
|
+
assert ctx.current_video.state is not None
|
|
97
|
+
ctx.current_video = ctx.current_video
|
|
98
|
+
|
|
99
|
+
ctx.retry = retry
|
|
100
|
+
# Retry is a forced overwrite of needs processing - therefore the retry will cause full deletion of processed files using finalize failure.
|
|
101
|
+
|
|
102
|
+
if (
|
|
103
|
+
retry
|
|
104
|
+
and needs_processing
|
|
105
|
+
and not ctx.current_video.state.anonymization_validated
|
|
106
|
+
):
|
|
107
|
+
finalize_failure(ctx)
|
|
108
|
+
ctx.current_video, processed, needs_processing = (
|
|
109
|
+
create_or_retrieve_video_file(ctx)
|
|
110
|
+
)
|
|
111
|
+
assert needs_processing is True
|
|
112
|
+
elif not needs_processing and not retry:
|
|
113
|
+
return ctx.current_video
|
|
114
|
+
|
|
115
|
+
mark_instance_processing_started(ctx.current_video, ctx)
|
|
116
|
+
try:
|
|
117
|
+
# --- Anonymization with fallback ---
|
|
118
|
+
try:
|
|
119
|
+
ctx = self.anonymizer.anonymize_video(ctx)
|
|
120
|
+
logger.info(
|
|
121
|
+
"Primary video anonymization succeeded for %s",
|
|
122
|
+
ctx.file_path,
|
|
123
|
+
)
|
|
124
|
+
except Exception as primary_exc:
|
|
125
|
+
logger.exception(
|
|
126
|
+
"Primary video anonymization failed for %s: %s "
|
|
127
|
+
"- trying basic anonymization",
|
|
128
|
+
ctx.file_path,
|
|
129
|
+
primary_exc,
|
|
130
|
+
)
|
|
131
|
+
try:
|
|
132
|
+
ctx = self.anonymizer.anonymize_video(ctx)
|
|
133
|
+
except Exception as e:
|
|
134
|
+
logger.error(
|
|
135
|
+
f"Video Extraction failed for the second time. {e}"
|
|
136
|
+
)
|
|
137
|
+
raise
|
|
138
|
+
logger.info(
|
|
139
|
+
"Secondary video anonymization succeeded for %s",
|
|
140
|
+
ctx.file_path,
|
|
141
|
+
)
|
|
142
|
+
logger.info(f"Anonymized Video is located at: {ctx.anonymized_path}")
|
|
143
|
+
|
|
144
|
+
# --- Finalize success: history + move anonymized file ---
|
|
145
|
+
finalize_video_success(ctx)
|
|
146
|
+
|
|
147
|
+
return ctx.current_video
|
|
148
|
+
|
|
149
|
+
except Exception as exc:
|
|
150
|
+
logger.exception(
|
|
151
|
+
"Video import/anonymization failed for %s: %s", ctx.file_path, exc
|
|
152
|
+
)
|
|
153
|
+
finalize_failure(ctx)
|
|
154
|
+
raise
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
LOG_DIR = Path("data/logs")
|
|
5
|
+
DEFAULT_FILE_LOG_LEVEL = "INFO"
|
|
6
|
+
DEFAULT_CONSOLE_LOG_LEVEL = "WARNING"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def clear_log_files(logger_names, log_dir=None):
|
|
10
|
+
"""
|
|
11
|
+
Clears specified log files in the log directory.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
logger_names (list): A list of strings, each being a logger name.
|
|
15
|
+
log_dir (Path, optional): The directory containing log files. Defaults to LOG_DIR.
|
|
16
|
+
"""
|
|
17
|
+
log_dir = log_dir or LOG_DIR
|
|
18
|
+
|
|
19
|
+
# Ensure log directory exists (though clearing implies it might)
|
|
20
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
21
|
+
|
|
22
|
+
# Files to manage
|
|
23
|
+
log_files_to_clear = [
|
|
24
|
+
log_dir / f"{logger_name}.log" for logger_name in logger_names
|
|
25
|
+
]
|
|
26
|
+
log_files_to_clear.append(log_dir / "root.log") # Add root log file
|
|
27
|
+
|
|
28
|
+
# Clear existing log files in the directory managed by this config
|
|
29
|
+
for log_file in log_files_to_clear:
|
|
30
|
+
if log_file.exists():
|
|
31
|
+
try:
|
|
32
|
+
log_file.unlink()
|
|
33
|
+
print(f"Removed log file: {log_file}")
|
|
34
|
+
except OSError as e:
|
|
35
|
+
print(f"Error removing log file {log_file}: {e}")
|
|
36
|
+
# Optionally, create the log file to ensure it exists after clearing
|
|
37
|
+
# log_file.touch() # Removed touch to just clear
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def get_logging_config(
|
|
41
|
+
logger_names, file_log_level=None, console_log_level=None, log_dir=None
|
|
42
|
+
):
|
|
43
|
+
"""
|
|
44
|
+
Generates Django LOGGING configuration dynamically.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
logger_names (list): A list of strings, each being a logger name.
|
|
48
|
+
file_log_level (str, optional): The default log level for file handlers. Defaults to DEFAULT_FILE_LOG_LEVEL.
|
|
49
|
+
console_log_level (str, optional): The default log level for the console handler. Defaults to DEFAULT_CONSOLE_LOG_LEVEL.
|
|
50
|
+
log_dir (Path, optional): The directory to store log files. Defaults to LOG_DIR.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
dict: The Django LOGGING configuration dictionary.
|
|
54
|
+
"""
|
|
55
|
+
file_log_level = file_log_level or os.environ.get(
|
|
56
|
+
"FILE_LOG_LEVEL", DEFAULT_FILE_LOG_LEVEL
|
|
57
|
+
)
|
|
58
|
+
console_log_level = console_log_level or os.environ.get(
|
|
59
|
+
"CONSOLE_LOG_LEVEL", DEFAULT_CONSOLE_LOG_LEVEL
|
|
60
|
+
)
|
|
61
|
+
log_dir = log_dir or LOG_DIR
|
|
62
|
+
|
|
63
|
+
# Ensure log directory exists
|
|
64
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
65
|
+
|
|
66
|
+
handlers = {
|
|
67
|
+
"console": {
|
|
68
|
+
"level": console_log_level, # Use console level
|
|
69
|
+
"class": "logging.StreamHandler",
|
|
70
|
+
"formatter": "standard",
|
|
71
|
+
},
|
|
72
|
+
"file_root": { # Handler for the root logger's file
|
|
73
|
+
"level": file_log_level, # Use file level
|
|
74
|
+
"class": "logging.FileHandler",
|
|
75
|
+
"filename": log_dir / "root.log",
|
|
76
|
+
"formatter": "standard",
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
loggers = {
|
|
80
|
+
# Root logger configuration - logs INFO+ to file, WARNING+ to console
|
|
81
|
+
"": {
|
|
82
|
+
"handlers": ["console", "file_root"], # Use both handlers
|
|
83
|
+
"level": file_log_level, # Set to lowest level needed (INFO for file)
|
|
84
|
+
"propagate": False, # Root logger doesn't propagate further
|
|
85
|
+
},
|
|
86
|
+
# Django's default logger
|
|
87
|
+
"django": {
|
|
88
|
+
"handlers": ["console", "file_root"], # Log to console and root file
|
|
89
|
+
"level": file_log_level, # Or your preferred level, ensure it's captured by root file
|
|
90
|
+
"propagate": False, # Don't propagate Django logs to avoid double handling by root
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# Dynamically create file handlers and logger configurations
|
|
95
|
+
for name in logger_names:
|
|
96
|
+
handler_name = f"file_{name}"
|
|
97
|
+
handlers[handler_name] = {
|
|
98
|
+
"level": file_log_level, # Use file level
|
|
99
|
+
"class": "logging.FileHandler",
|
|
100
|
+
"filename": log_dir / f"{name}.log",
|
|
101
|
+
"formatter": "standard",
|
|
102
|
+
}
|
|
103
|
+
loggers[name] = {
|
|
104
|
+
"handlers": [handler_name], # Log only to its own file directly
|
|
105
|
+
"level": file_log_level, # Use file level
|
|
106
|
+
"propagate": True, # Propagate to root logger (which handles console and root.log)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
"version": 1,
|
|
111
|
+
"disable_existing_loggers": False,
|
|
112
|
+
"formatters": {
|
|
113
|
+
"standard": {
|
|
114
|
+
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
"handlers": handlers,
|
|
118
|
+
"loggers": loggers,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
# Example usage (optional, for testing the function itself)
|
|
123
|
+
if __name__ == "__main__":
|
|
124
|
+
test_loggers = ["app1", "app2", "database"]
|
|
125
|
+
log_directory = Path("data/logs_test") # Use a test directory
|
|
126
|
+
|
|
127
|
+
# Optionally clear logs before configuring logging
|
|
128
|
+
print("Clearing logs...")
|
|
129
|
+
clear_log_files(test_loggers, log_dir=log_directory)
|
|
130
|
+
print("Log clearing complete.")
|
|
131
|
+
|
|
132
|
+
# Get logging configuration
|
|
133
|
+
logging_config = get_logging_config(
|
|
134
|
+
test_loggers,
|
|
135
|
+
file_log_level="DEBUG",
|
|
136
|
+
console_log_level="WARNING",
|
|
137
|
+
log_dir=log_directory,
|
|
138
|
+
)
|
|
139
|
+
import json
|
|
140
|
+
|
|
141
|
+
print("\nGenerated Logging Configuration:")
|
|
142
|
+
print(json.dumps(logging_config, indent=4))
|
|
143
|
+
|
|
144
|
+
# Example of how to use it with Python's logging
|
|
145
|
+
# import logging.config
|
|
146
|
+
# logging.config.dictConfig(logging_config)
|
|
147
|
+
# logger1 = logging.getLogger("app1")
|
|
148
|
+
# logger1.debug("This is a debug message for app1.")
|
|
149
|
+
# logger1.info("This is an info message for app1.")
|
|
150
|
+
|
|
151
|
+
# logger_db = logging.getLogger("database")
|
|
152
|
+
# logger_db.warning("This is a warning for database.")
|
|
153
|
+
|
|
154
|
+
# root_logger = logging.getLogger()
|
|
155
|
+
# root_logger.info("This is an info message from root.") # Should go to root.log and console (if level >= WARNING)
|
|
156
|
+
# root_logger.warning("This is a warning message from root.") # Should go to root.log and console
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Management commands package
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Management commands
|
|
File without changes
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Management command to check and configure authentication settings.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from django.core.management.base import BaseCommand
|
|
6
|
+
from django.conf import settings
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Command(BaseCommand):
|
|
11
|
+
help = "Check and configure authentication settings based on environment"
|
|
12
|
+
|
|
13
|
+
def add_arguments(self, parser):
|
|
14
|
+
parser.add_argument(
|
|
15
|
+
"--mode",
|
|
16
|
+
choices=["check", "dev", "prod"],
|
|
17
|
+
default="check",
|
|
18
|
+
help="Mode: check current settings, set dev mode, or set prod mode",
|
|
19
|
+
)
|
|
20
|
+
parser.add_argument(
|
|
21
|
+
"--show-permissions",
|
|
22
|
+
action="store_true",
|
|
23
|
+
help="Show which permission classes will be used",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def handle(self, *args, **options):
|
|
27
|
+
mode = options["mode"]
|
|
28
|
+
|
|
29
|
+
if mode == "check":
|
|
30
|
+
self.check_current_settings()
|
|
31
|
+
elif mode == "dev":
|
|
32
|
+
self.set_dev_mode()
|
|
33
|
+
elif mode == "prod":
|
|
34
|
+
self.set_prod_mode()
|
|
35
|
+
|
|
36
|
+
if options["show_permissions"]:
|
|
37
|
+
self.show_permission_classes()
|
|
38
|
+
|
|
39
|
+
def check_current_settings(self):
|
|
40
|
+
"""Check current authentication configuration."""
|
|
41
|
+
debug_mode = getattr(settings, "DEBUG", False)
|
|
42
|
+
settings_module = os.environ.get("DJANGO_SETTINGS_MODULE", "Unknown")
|
|
43
|
+
|
|
44
|
+
self.stdout.write("\n" + "=" * 50)
|
|
45
|
+
self.stdout.write("🔍 AUTHENTICATION CONFIGURATION CHECK")
|
|
46
|
+
self.stdout.write("=" * 50)
|
|
47
|
+
|
|
48
|
+
self.stdout.write(f"Settings Module: {settings_module}")
|
|
49
|
+
self.stdout.write(f"DEBUG Mode: {debug_mode}")
|
|
50
|
+
|
|
51
|
+
if debug_mode:
|
|
52
|
+
self.stdout.write(
|
|
53
|
+
self.style.WARNING("🔓 Authentication: DISABLED (AllowAny)")
|
|
54
|
+
)
|
|
55
|
+
self.stdout.write(" - All API endpoints are accessible without login")
|
|
56
|
+
self.stdout.write(" - Suitable for development and testing")
|
|
57
|
+
else:
|
|
58
|
+
self.stdout.write(
|
|
59
|
+
self.style.SUCCESS("🔒 Authentication: ENABLED (IsAuthenticated)")
|
|
60
|
+
)
|
|
61
|
+
self.stdout.write(" - API endpoints require valid authentication")
|
|
62
|
+
self.stdout.write(" - Suitable for production deployment")
|
|
63
|
+
|
|
64
|
+
# Check if Keycloak is configured
|
|
65
|
+
keycloak_base_url = getattr(settings, "KEYCLOAK_BASE_URL", None)
|
|
66
|
+
if keycloak_base_url:
|
|
67
|
+
self.stdout.write(f"Keycloak Base URL: {keycloak_base_url}")
|
|
68
|
+
else:
|
|
69
|
+
self.stdout.write(self.style.WARNING("⚠️ Keycloak not configured"))
|
|
70
|
+
|
|
71
|
+
self.stdout.write("=" * 50 + "\n")
|
|
72
|
+
|
|
73
|
+
def set_dev_mode(self):
|
|
74
|
+
"""Instructions for setting development mode."""
|
|
75
|
+
self.stdout.write(self.style.SUCCESS("\n🛠️ DEVELOPMENT MODE SETUP"))
|
|
76
|
+
self.stdout.write("To enable development mode with disabled authentication:")
|
|
77
|
+
self.stdout.write("")
|
|
78
|
+
self.stdout.write("1. Use dev settings:")
|
|
79
|
+
self.stdout.write(" export DJANGO_SETTINGS_MODULE=dev.dev_settings")
|
|
80
|
+
self.stdout.write(" python manage.py runserver")
|
|
81
|
+
self.stdout.write("")
|
|
82
|
+
self.stdout.write("2. Or run with explicit settings:")
|
|
83
|
+
self.stdout.write(" python manage.py runserver --settings=dev.dev_settings")
|
|
84
|
+
self.stdout.write("")
|
|
85
|
+
self.stdout.write(
|
|
86
|
+
"This will set DEBUG=True and disable authentication requirements."
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def set_prod_mode(self):
|
|
90
|
+
"""Instructions for setting production mode."""
|
|
91
|
+
self.stdout.write(self.style.SUCCESS("\n🏭 PRODUCTION MODE SETUP"))
|
|
92
|
+
self.stdout.write("To enable production mode with authentication:")
|
|
93
|
+
self.stdout.write("")
|
|
94
|
+
self.stdout.write("1. Use production settings:")
|
|
95
|
+
self.stdout.write(" export DJANGO_SETTINGS_MODULE=prod_settings")
|
|
96
|
+
self.stdout.write(" python manage.py runserver --settings=prod_settings")
|
|
97
|
+
self.stdout.write("")
|
|
98
|
+
self.stdout.write("2. Set required environment variables:")
|
|
99
|
+
self.stdout.write(" export DJANGO_SECRET_KEY='your-secure-secret-key'")
|
|
100
|
+
self.stdout.write(" export OIDC_RP_CLIENT_SECRET='your-keycloak-secret'")
|
|
101
|
+
self.stdout.write("")
|
|
102
|
+
self.stdout.write(
|
|
103
|
+
"This will set DEBUG=False and enable authentication requirements."
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def show_permission_classes(self):
|
|
107
|
+
"""Show which permission classes are being used."""
|
|
108
|
+
debug_mode = getattr(settings, "DEBUG", False)
|
|
109
|
+
|
|
110
|
+
self.stdout.write("\n" + "=" * 40)
|
|
111
|
+
self.stdout.write("🔐 PERMISSION CLASSES IN USE")
|
|
112
|
+
self.stdout.write("=" * 40)
|
|
113
|
+
|
|
114
|
+
if debug_mode:
|
|
115
|
+
permission_class = "AllowAny"
|
|
116
|
+
icon = "🔓"
|
|
117
|
+
else:
|
|
118
|
+
permission_class = "IsAuthenticated"
|
|
119
|
+
icon = "🔒"
|
|
120
|
+
|
|
121
|
+
self.stdout.write(f"{icon} Current Mode: {permission_class}")
|
|
122
|
+
self.stdout.write("")
|
|
123
|
+
self.stdout.write("Views using dynamic permissions:")
|
|
124
|
+
self.stdout.write(" • video_segments_view")
|
|
125
|
+
self.stdout.write(" • VideoViewSet")
|
|
126
|
+
self.stdout.write(" • Other API endpoints")
|
|
127
|
+
self.stdout.write("")
|
|
128
|
+
self.stdout.write("Views always requiring authentication:")
|
|
129
|
+
self.stdout.write(" • video_segment_detail_view")
|
|
130
|
+
self.stdout.write(" • video_segments_by_label_id_view")
|
|
131
|
+
self.stdout.write(" • video_segments_by_label_name_view")
|
|
132
|
+
self.stdout.write("=" * 40 + "\n")
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django management command to create ModelMeta from Hugging Face model.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from django.core.files.base import ContentFile
|
|
6
|
+
from django.core.management.base import BaseCommand, CommandError
|
|
7
|
+
from huggingface_hub import hf_hub_download
|
|
8
|
+
|
|
9
|
+
from endoreg_db.models import AiModel, LabelSet, ModelMeta
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Command(BaseCommand):
|
|
13
|
+
help = "Create ModelMeta by downloading model from Hugging Face"
|
|
14
|
+
|
|
15
|
+
def add_arguments(self, parser):
|
|
16
|
+
parser.add_argument(
|
|
17
|
+
"--model_id",
|
|
18
|
+
type=str,
|
|
19
|
+
default="wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
20
|
+
help="Hugging Face model ID",
|
|
21
|
+
)
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
"--model_name",
|
|
24
|
+
type=str,
|
|
25
|
+
default="image_multilabel_classification_colonoscopy_default",
|
|
26
|
+
help="Name for the AI model",
|
|
27
|
+
)
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
"--labelset_name",
|
|
30
|
+
type=str,
|
|
31
|
+
default="multilabel_classification_colonoscopy_default",
|
|
32
|
+
help="Name of the labelset",
|
|
33
|
+
)
|
|
34
|
+
parser.add_argument(
|
|
35
|
+
"--meta_version",
|
|
36
|
+
type=str,
|
|
37
|
+
default="1",
|
|
38
|
+
help="Version for the model meta",
|
|
39
|
+
)
|
|
40
|
+
parser.add_argument(
|
|
41
|
+
"--labelset_version",
|
|
42
|
+
type=int,
|
|
43
|
+
default=None,
|
|
44
|
+
help="LabelSet version; if omitted, the latest by name is used",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def handle(self, *args, **options):
|
|
48
|
+
model_id = options["model_id"]
|
|
49
|
+
model_name = options["model_name"]
|
|
50
|
+
labelset_name = options["labelset_name"]
|
|
51
|
+
version = options["meta_version"]
|
|
52
|
+
labelset_version = options.get("labelset_version")
|
|
53
|
+
|
|
54
|
+
self.stdout.write(f"Downloading model {model_id} from Hugging Face...")
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
# Download the model weights
|
|
58
|
+
weights_path = hf_hub_download(
|
|
59
|
+
repo_id=model_id,
|
|
60
|
+
filename="colo_segmentation_RegNetX800MF_base.safetensors",
|
|
61
|
+
local_dir="/tmp",
|
|
62
|
+
)
|
|
63
|
+
self.stdout.write(f"Downloaded weights to: {weights_path}")
|
|
64
|
+
|
|
65
|
+
# Get or create AI model
|
|
66
|
+
ai_model, created = AiModel.objects.get_or_create(
|
|
67
|
+
name=model_name, defaults={"description": f"Model from {model_id}"}
|
|
68
|
+
)
|
|
69
|
+
if created:
|
|
70
|
+
self.stdout.write(f"Created AI model: {ai_model.name}")
|
|
71
|
+
|
|
72
|
+
# Get labelset (optionally by version); fail with non-zero exit
|
|
73
|
+
labelset_qs = LabelSet.objects.filter(name=labelset_name)
|
|
74
|
+
if labelset_version is not None:
|
|
75
|
+
labelset_qs = labelset_qs.filter(version=labelset_version)
|
|
76
|
+
labelset = labelset_qs.order_by("-version").first()
|
|
77
|
+
if labelset is None:
|
|
78
|
+
raise CommandError(
|
|
79
|
+
f"LabelSet '{labelset_name}'"
|
|
80
|
+
+ (f" v{labelset_version}" if labelset_version is not None else "")
|
|
81
|
+
+ " not found"
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Create ModelMeta
|
|
85
|
+
model_meta, created = ModelMeta.objects.get_or_create(
|
|
86
|
+
name=model_name,
|
|
87
|
+
model=ai_model,
|
|
88
|
+
version=version,
|
|
89
|
+
defaults={
|
|
90
|
+
"labelset": labelset,
|
|
91
|
+
"activation": "sigmoid",
|
|
92
|
+
"mean": "0.45211223,0.27139644,0.19264949",
|
|
93
|
+
"std": "0.31418097,0.21088019,0.16059452",
|
|
94
|
+
"size_x": 716,
|
|
95
|
+
"size_y": 716,
|
|
96
|
+
"axes": "2,0,1",
|
|
97
|
+
"batchsize": 16,
|
|
98
|
+
"num_workers": 0,
|
|
99
|
+
"description": f"Downloaded from {model_id}",
|
|
100
|
+
},
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Save the weights file to the model
|
|
104
|
+
with open(weights_path, "rb") as f:
|
|
105
|
+
model_meta.weights.save(
|
|
106
|
+
f"{model_name}_v{version}.safetensors", ContentFile(f.read())
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Set as active meta
|
|
110
|
+
ai_model.active_meta = model_meta
|
|
111
|
+
ai_model.save()
|
|
112
|
+
|
|
113
|
+
self.stdout.write(
|
|
114
|
+
self.style.SUCCESS(
|
|
115
|
+
f"Successfully {'created' if created else 'updated'} ModelMeta: {model_meta}"
|
|
116
|
+
)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
except Exception as e:
|
|
120
|
+
self.stdout.write(self.style.ERROR(f"Error creating ModelMeta: {e}"))
|
|
121
|
+
import traceback
|
|
122
|
+
|
|
123
|
+
traceback.print_exc()
|
|
124
|
+
raise CommandError("ModelMeta creation failed") from e
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# TODO Review slimmed down version using service endoreg_db/services/model_meta_from_hf.py
|
|
128
|
+
# your management command file
|
|
129
|
+
# from django.core.management.base import BaseCommand, CommandError
|
|
130
|
+
|
|
131
|
+
# from endoreg_db.services.model_meta_from_hf import ensure_model_meta_from_hf
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# class Command(BaseCommand):
|
|
135
|
+
# help = "Create ModelMeta by downloading model from Hugging Face"
|
|
136
|
+
|
|
137
|
+
# def add_arguments(self, parser):
|
|
138
|
+
# parser.add_argument(
|
|
139
|
+
# "--model_id",
|
|
140
|
+
# type=str,
|
|
141
|
+
# default="wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
142
|
+
# )
|
|
143
|
+
# parser.add_argument(
|
|
144
|
+
# "--model_name",
|
|
145
|
+
# type=str,
|
|
146
|
+
# default="image_multilabel_classification_colonoscopy_default",
|
|
147
|
+
# )
|
|
148
|
+
# parser.add_argument(
|
|
149
|
+
# "--labelset_name",
|
|
150
|
+
# type=str,
|
|
151
|
+
# default="multilabel_classification_colonoscopy_default",
|
|
152
|
+
# )
|
|
153
|
+
# parser.add_argument(
|
|
154
|
+
# "--meta_version",
|
|
155
|
+
# type=str,
|
|
156
|
+
# default="1",
|
|
157
|
+
# )
|
|
158
|
+
# parser.add_argument(
|
|
159
|
+
# "--labelset_version",
|
|
160
|
+
# type=int,
|
|
161
|
+
# default=None,
|
|
162
|
+
# )
|
|
163
|
+
|
|
164
|
+
# def handle(self, *args, **options):
|
|
165
|
+
# try:
|
|
166
|
+
# model_meta = ensure_model_meta_from_hf(
|
|
167
|
+
# model_id=options["model_id"],
|
|
168
|
+
# model_name=options["model_name"],
|
|
169
|
+
# labelset_name=options["labelset_name"],
|
|
170
|
+
# meta_version=options["meta_version"],
|
|
171
|
+
# labelset_version=options.get("labelset_version"),
|
|
172
|
+
# )
|
|
173
|
+
# self.stdout.write(
|
|
174
|
+
# self.style.SUCCESS(f"Successfully ensured ModelMeta: {model_meta}")
|
|
175
|
+
# )
|
|
176
|
+
# except Exception as e:
|
|
177
|
+
# raise CommandError(f"ModelMeta creation failed: {e}") from e
|