endoreg-db 0.6.3__py3-none-any.whl → 0.8.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +26 -26
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +26 -0
- endoreg_db/data/ai_model/data.yaml +1 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/center/data.yaml +13 -12
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/misc.yaml +1 -2
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +418 -2
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +157 -5
- 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 +8 -44
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
- endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +26 -121
- 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_morphology_classification_type/colonoscopy.yaml +6 -6
- endoreg_db/data/finding_type/data.yaml +23 -10
- endoreg_db/data/gender/data.yaml +8 -1
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/misc.yaml +43 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +4 -4
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +3 -0
- endoreg_db/data/pdf_type/data.yaml +27 -10
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +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/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/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/patient_finding_intervention_form.py +4 -5
- endoreg_db/forms/patient_form.py +7 -6
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +359 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +422 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +2 -7
- endoreg_db/management/commands/load_base_db_data.py +15 -1
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +49 -28
- endoreg_db/management/commands/load_finding_data.py +49 -92
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_qualification_data.py +59 -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/register_ai_model.py +1 -1
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/migrations/0001_initial.py +625 -813
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/models/__init__.py +274 -291
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +3 -1
- endoreg_db/models/administration/center/center.py +61 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +45 -74
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
- endoreg_db/models/media/__init__.py +14 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +608 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +4 -0
- endoreg_db/models/media/video/create_from_file.py +336 -0
- endoreg_db/models/media/video/pipe_1.py +195 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +680 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +348 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +166 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_meta.py +11 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
- endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
- endoreg_db/models/{examination → medical/examination}/examination_type.py +18 -10
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
- endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
- endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
- endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
- endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/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/{data_file/metadata → metadata}/__init__.py +6 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +193 -0
- endoreg_db/models/metadata/model_meta_logic.py +236 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +17 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
- endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
- endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +10 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +13 -2
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/__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/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/models/video_metadata.py +66 -0
- endoreg_db/models/video_processing.py +153 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +147 -10
- endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
- endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +66 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/ollama_api_docs.py +1528 -0
- endoreg_db/services/pdf_import.py +993 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +915 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/urls/__init__.py +72 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +32 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/pdf.py +0 -0
- endoreg_db/urls/report.py +78 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +36 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +119 -0
- endoreg_db/urls.py +6 -269
- endoreg_db/utils/__init__.py +68 -16
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
- endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
- endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +88 -31
- endoreg_db/utils/dates.py +21 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +1 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +2 -0
- endoreg_db/utils/paths.py +104 -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/db_config.py +1 -1
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +19 -6
- endoreg_db/utils/video/extract_frames.py +37 -70
- endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +282 -2
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +63 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/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 +9 -0
- endoreg_db/views/media/pdf_media.py +386 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +151 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +72 -0
- endoreg_db/views/video/correction.py +672 -0
- endoreg_db/views/video/media/__init__.py +23 -0
- endoreg_db/views/video/media/task_status.py +49 -0
- endoreg_db/views/video/media/video_analyze.py +52 -0
- endoreg_db/views/video/media/video_apply_mask.py +48 -0
- endoreg_db/views/video/media/video_correction.py +21 -0
- endoreg_db/views/video/media/video_download_processed.py +58 -0
- endoreg_db/views/video/media/video_media.py +158 -0
- endoreg_db/views/video/media/video_meta.py +29 -0
- endoreg_db/views/video/media/video_processing_history.py +24 -0
- endoreg_db/views/video/media/video_remove_frames.py +48 -0
- endoreg_db/views/video/media/video_reprocess.py +40 -0
- endoreg_db/views/video/reimport.py +192 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
- endoreg_db/views/video/video_examination_viewset.py +329 -0
- endoreg_db/views/video/video_stream.py +188 -0
- endoreg_db-0.8.1.dist-info/METADATA +384 -0
- endoreg_db-0.8.1.dist-info/RECORD +789 -0
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
- endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
- endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_logging_data.py +0 -39
- endoreg_db/management/commands/load_lx_data.py +0 -64
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
- endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
- endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
- endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
- endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -103
- endoreg_db/models/ai_model/lightning/__init__.py +0 -3
- endoreg_db/models/ai_model/lightning/predict.py +0 -172
- endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
- endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
- endoreg_db/models/ai_model/model_meta.py +0 -250
- endoreg_db/models/annotation/__init__.py +0 -32
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
- endoreg_db/models/annotation/image_classification.py +0 -86
- endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
- endoreg_db/models/case/__init__.py +0 -1
- endoreg_db/models/case/case.py +0 -34
- endoreg_db/models/center/center.py +0 -51
- endoreg_db/models/center/center_product.py +0 -33
- endoreg_db/models/center/center_waste.py +0 -16
- endoreg_db/models/data_file/__init__.py +0 -39
- endoreg_db/models/data_file/base_classes/__init__.py +0 -7
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -100
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -136
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -807
- endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
- endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
- endoreg_db/models/data_file/base_classes/utils.py +0 -80
- endoreg_db/models/data_file/frame.py +0 -29
- endoreg_db/models/data_file/import_classes/__init__.py +0 -18
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -288
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
- endoreg_db/models/data_file/metadata/video_meta.py +0 -199
- endoreg_db/models/data_file/report_file.py +0 -56
- endoreg_db/models/data_file/video/__init__.py +0 -11
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -196
- endoreg_db/models/data_file/video_segment.py +0 -214
- endoreg_db/models/disease.py +0 -79
- endoreg_db/models/event.py +0 -73
- endoreg_db/models/examination/examination.py +0 -67
- endoreg_db/models/examination/examination_indication.py +0 -170
- endoreg_db/models/finding/__init__.py +0 -11
- endoreg_db/models/finding/finding.py +0 -75
- endoreg_db/models/finding/finding_location_classification.py +0 -94
- endoreg_db/models/finding/finding_morphology_classification.py +0 -89
- endoreg_db/models/finding/finding_type.py +0 -22
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -111
- endoreg_db/models/logging/__init__.py +0 -11
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -27
- endoreg_db/models/lx/__init__.py +0 -4
- endoreg_db/models/lx/client.py +0 -57
- endoreg_db/models/lx/identity.py +0 -34
- endoreg_db/models/lx/permission.py +0 -18
- endoreg_db/models/lx/user.py +0 -16
- endoreg_db/models/network/__init__.py +0 -9
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -58
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -5
- endoreg_db/models/patient/__init__.py +0 -24
- endoreg_db/models/patient/patient_examination.py +0 -182
- endoreg_db/models/patient/patient_finding.py +0 -143
- endoreg_db/models/patient/patient_finding_location.py +0 -120
- endoreg_db/models/patient/patient_finding_morphology.py +0 -166
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -34
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -60
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/patient.py +0 -389
- endoreg_db/models/persons/patient/patient_disease.py +0 -22
- endoreg_db/models/persons/patient/patient_event.py +0 -52
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
- endoreg_db/models/persons/patient/patient_medication.py +0 -59
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -8
- endoreg_db/models/prediction/image_classification.py +0 -51
- endoreg_db/models/prediction/video_prediction_meta.py +0 -306
- endoreg_db/models/product/product.py +0 -110
- endoreg_db/models/product/product_group.py +0 -27
- endoreg_db/models/product/product_material.py +0 -28
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -9
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -14
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -9
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -33
- endoreg_db/serializers/prediction.py +0 -10
- endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -20
- endoreg_db/serializers/video_segmentation.py +0 -587
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video/transcode_videofile.py +0 -111
- endoreg_db/views/patient_views.py +0 -90
- endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
- endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
- endoreg_db/views/raw_video_meta_validation_views.py +0 -148
- endoreg_db/views/report_views.py +0 -96
- endoreg_db/views/video_segmentation_views.py +0 -166
- endoreg_db-0.6.3.dist-info/METADATA +0 -161
- endoreg_db-0.6.3.dist-info/RECORD +0 -435
- /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
- /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
- /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
- {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
from rest_framework.permissions import IsAuthenticated, AllowAny
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Command(BaseCommand):
|
|
12
|
+
help = 'Check and configure authentication settings based on environment'
|
|
13
|
+
|
|
14
|
+
def add_arguments(self, parser):
|
|
15
|
+
parser.add_argument(
|
|
16
|
+
'--mode',
|
|
17
|
+
choices=['check', 'dev', 'prod'],
|
|
18
|
+
default='check',
|
|
19
|
+
help='Mode: check current settings, set dev mode, or set prod mode'
|
|
20
|
+
)
|
|
21
|
+
parser.add_argument(
|
|
22
|
+
'--show-permissions',
|
|
23
|
+
action='store_true',
|
|
24
|
+
help='Show which permission classes will be used'
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def handle(self, *args, **options):
|
|
28
|
+
mode = options['mode']
|
|
29
|
+
|
|
30
|
+
if mode == 'check':
|
|
31
|
+
self.check_current_settings()
|
|
32
|
+
elif mode == 'dev':
|
|
33
|
+
self.set_dev_mode()
|
|
34
|
+
elif mode == 'prod':
|
|
35
|
+
self.set_prod_mode()
|
|
36
|
+
|
|
37
|
+
if options['show_permissions']:
|
|
38
|
+
self.show_permission_classes()
|
|
39
|
+
|
|
40
|
+
def check_current_settings(self):
|
|
41
|
+
"""Check current authentication configuration."""
|
|
42
|
+
debug_mode = getattr(settings, 'DEBUG', False)
|
|
43
|
+
settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', 'Unknown')
|
|
44
|
+
|
|
45
|
+
self.stdout.write("\n" + "="*50)
|
|
46
|
+
self.stdout.write("🔍 AUTHENTICATION CONFIGURATION CHECK")
|
|
47
|
+
self.stdout.write("="*50)
|
|
48
|
+
|
|
49
|
+
self.stdout.write(f"Settings Module: {settings_module}")
|
|
50
|
+
self.stdout.write(f"DEBUG Mode: {debug_mode}")
|
|
51
|
+
|
|
52
|
+
if debug_mode:
|
|
53
|
+
self.stdout.write(self.style.WARNING("🔓 Authentication: DISABLED (AllowAny)"))
|
|
54
|
+
self.stdout.write(" - All API endpoints are accessible without login")
|
|
55
|
+
self.stdout.write(" - Suitable for development and testing")
|
|
56
|
+
else:
|
|
57
|
+
self.stdout.write(self.style.SUCCESS("🔒 Authentication: ENABLED (IsAuthenticated)"))
|
|
58
|
+
self.stdout.write(" - API endpoints require valid authentication")
|
|
59
|
+
self.stdout.write(" - Suitable for production deployment")
|
|
60
|
+
|
|
61
|
+
# Check if Keycloak is configured
|
|
62
|
+
keycloak_server = getattr(settings, 'KEYCLOAK_SERVER_URL', None)
|
|
63
|
+
if keycloak_server:
|
|
64
|
+
self.stdout.write(f"Keycloak Server: {keycloak_server}")
|
|
65
|
+
else:
|
|
66
|
+
self.stdout.write(self.style.WARNING("⚠️ Keycloak not configured"))
|
|
67
|
+
|
|
68
|
+
self.stdout.write("="*50 + "\n")
|
|
69
|
+
|
|
70
|
+
def set_dev_mode(self):
|
|
71
|
+
"""Instructions for setting development mode."""
|
|
72
|
+
self.stdout.write(self.style.SUCCESS("\n🛠️ DEVELOPMENT MODE SETUP"))
|
|
73
|
+
self.stdout.write("To enable development mode with disabled authentication:")
|
|
74
|
+
self.stdout.write("")
|
|
75
|
+
self.stdout.write("1. Use dev settings:")
|
|
76
|
+
self.stdout.write(" export DJANGO_SETTINGS_MODULE=dev.dev_settings")
|
|
77
|
+
self.stdout.write(" python manage.py runserver")
|
|
78
|
+
self.stdout.write("")
|
|
79
|
+
self.stdout.write("2. Or run with explicit settings:")
|
|
80
|
+
self.stdout.write(" python manage.py runserver --settings=dev.dev_settings")
|
|
81
|
+
self.stdout.write("")
|
|
82
|
+
self.stdout.write("This will set DEBUG=True and disable authentication requirements.")
|
|
83
|
+
|
|
84
|
+
def set_prod_mode(self):
|
|
85
|
+
"""Instructions for setting production mode."""
|
|
86
|
+
self.stdout.write(self.style.SUCCESS("\n🏭 PRODUCTION MODE SETUP"))
|
|
87
|
+
self.stdout.write("To enable production mode with authentication:")
|
|
88
|
+
self.stdout.write("")
|
|
89
|
+
self.stdout.write("1. Use production settings:")
|
|
90
|
+
self.stdout.write(" export DJANGO_SETTINGS_MODULE=prod_settings")
|
|
91
|
+
self.stdout.write(" python manage.py runserver --settings=prod_settings")
|
|
92
|
+
self.stdout.write("")
|
|
93
|
+
self.stdout.write("2. Set required environment variables:")
|
|
94
|
+
self.stdout.write(" export DJANGO_SECRET_KEY='your-secure-secret-key'")
|
|
95
|
+
self.stdout.write(" export KEYCLOAK_CLIENT_SECRET='your-keycloak-secret'")
|
|
96
|
+
self.stdout.write("")
|
|
97
|
+
self.stdout.write("This will set DEBUG=False and enable authentication requirements.")
|
|
98
|
+
|
|
99
|
+
def show_permission_classes(self):
|
|
100
|
+
"""Show which permission classes are being used."""
|
|
101
|
+
debug_mode = getattr(settings, 'DEBUG', False)
|
|
102
|
+
|
|
103
|
+
self.stdout.write("\n" + "="*40)
|
|
104
|
+
self.stdout.write("🔐 PERMISSION CLASSES IN USE")
|
|
105
|
+
self.stdout.write("="*40)
|
|
106
|
+
|
|
107
|
+
if debug_mode:
|
|
108
|
+
permission_class = "AllowAny"
|
|
109
|
+
icon = "🔓"
|
|
110
|
+
else:
|
|
111
|
+
permission_class = "IsAuthenticated"
|
|
112
|
+
icon = "🔒"
|
|
113
|
+
|
|
114
|
+
self.stdout.write(f"{icon} Current Mode: {permission_class}")
|
|
115
|
+
self.stdout.write("")
|
|
116
|
+
self.stdout.write("Views using dynamic permissions:")
|
|
117
|
+
self.stdout.write(" • video_segments_view")
|
|
118
|
+
self.stdout.write(" • VideoViewSet")
|
|
119
|
+
self.stdout.write(" • Other API endpoints")
|
|
120
|
+
self.stdout.write("")
|
|
121
|
+
self.stdout.write("Views always requiring authentication:")
|
|
122
|
+
self.stdout.write(" • video_segment_detail_view")
|
|
123
|
+
self.stdout.write(" • video_segments_by_label_id_view")
|
|
124
|
+
self.stdout.write(" • video_segments_by_label_name_view")
|
|
125
|
+
self.stdout.write("="*40 + "\n")
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This script creates a new ModelMeta object for a multilabel classification model.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from django.core.management import BaseCommand
|
|
7
|
+
from endoreg_db.models import LabelSet, AiModel, ModelMeta
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Example usage:
|
|
11
|
+
# python manage.py create_multilabel_model_meta --model_path "./data/models/colo_segmentation_RegNetX800MF_6.ckpt"
|
|
12
|
+
# python manage.py create_multilabel_model_meta --model_path "./libs/endoreg-db/tests/assets/colo_segmentation_RegNetX800MF_6.ckpt"
|
|
13
|
+
|
|
14
|
+
FPS = 50
|
|
15
|
+
SMOOTH_WINDOW_SIZE_S = 1
|
|
16
|
+
MIN_SEQ_LEN_S = 0.5
|
|
17
|
+
crop_template = [0, 1080, 550, 1920 - 20] # [top, bottom, left, right]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Command(BaseCommand):
|
|
21
|
+
help = """
|
|
22
|
+
Creates a new ModelMeta object for a multilabel classification model.
|
|
23
|
+
1. Validates the existence of the specified LabelSet and AiModel
|
|
24
|
+
2. Checks that the model file exists on disk
|
|
25
|
+
3. Creates or updates a ModelMeta entry with the specified parameters
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def add_arguments(self, parser):
|
|
29
|
+
"""
|
|
30
|
+
Adds command-line arguments for configuring model meta creation.
|
|
31
|
+
|
|
32
|
+
This method defines all necessary arguments for specifying model details, label set selection, normalization parameters, image dimensions, axes configuration, batch size, worker count, and versioning options for the Django management command.
|
|
33
|
+
"""
|
|
34
|
+
parser.add_argument(
|
|
35
|
+
"--model_name",
|
|
36
|
+
type=str,
|
|
37
|
+
default="image_multilabel_classification_colonoscopy_default",
|
|
38
|
+
help="Name of the model to use for segmentation",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# model_path
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--model_path",
|
|
44
|
+
type=str,
|
|
45
|
+
#default="./data/models/colo_segmentation_RegNetX800MF_6.ckpt", #model not yet here
|
|
46
|
+
default="./tests/assets/colo_segmentation_RegNetX800MF_6.ckpt", # model currently still here
|
|
47
|
+
help="Path to the model file",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# model_meta_version: int = 1
|
|
51
|
+
parser.add_argument(
|
|
52
|
+
"--model_meta_version",
|
|
53
|
+
type=int,
|
|
54
|
+
default=1,
|
|
55
|
+
help="Version of the model meta",
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--image_classification_labelset_name",
|
|
60
|
+
type=str,
|
|
61
|
+
default="multilabel_classification_colonoscopy_default",
|
|
62
|
+
help="Name of the LabelSet for image classification",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"--image_classification_labelset_version",
|
|
67
|
+
type=int,
|
|
68
|
+
default=-1,
|
|
69
|
+
help="Version of the LabelSet for image classification, default is -1 which invokes the highest version",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# activation: str = "sigmoid"
|
|
73
|
+
parser.add_argument(
|
|
74
|
+
"--activation_function_name",
|
|
75
|
+
type=str,
|
|
76
|
+
default="sigmoid",
|
|
77
|
+
help="Activation function for the model",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# mean: str = "0.45211223,0.27139644,0.19264949"
|
|
81
|
+
parser.add_argument(
|
|
82
|
+
"--mean",
|
|
83
|
+
type=str,
|
|
84
|
+
default="0.45211223,0.27139644,0.19264949",
|
|
85
|
+
help="Mean for normalization",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
parser.add_argument(
|
|
89
|
+
"--std",
|
|
90
|
+
type=str,
|
|
91
|
+
default="0.31418097,0.21088019,0.16059452",
|
|
92
|
+
help="Std for normalization",
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# size_x: int = 716
|
|
96
|
+
parser.add_argument(
|
|
97
|
+
"--size_x",
|
|
98
|
+
type=int,
|
|
99
|
+
default=716,
|
|
100
|
+
help="Size of the image in x direction",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# size_y: int = 716
|
|
104
|
+
parser.add_argument(
|
|
105
|
+
"--size_y",
|
|
106
|
+
type=int,
|
|
107
|
+
default=716,
|
|
108
|
+
help="Size of the image in y direction",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
parser.add_argument(
|
|
112
|
+
"--axes",
|
|
113
|
+
type=str,
|
|
114
|
+
default="2,0,1",
|
|
115
|
+
help="Axes of the image",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# batchsize: int = 16
|
|
119
|
+
parser.add_argument(
|
|
120
|
+
"--batchsize",
|
|
121
|
+
type=int,
|
|
122
|
+
default=16,
|
|
123
|
+
help="Batchsize for the model",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# num_workers: int = 0
|
|
127
|
+
parser.add_argument(
|
|
128
|
+
"--num_workers",
|
|
129
|
+
type=int,
|
|
130
|
+
default=0,
|
|
131
|
+
help="Number of workers for the model",
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# bump_version: bool = False
|
|
135
|
+
parser.add_argument(
|
|
136
|
+
"--bump_version",
|
|
137
|
+
action="store_true",
|
|
138
|
+
help="Bump the version of the model",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def handle(self, *args, **options):
|
|
142
|
+
"""
|
|
143
|
+
Processes command-line arguments to create or update a ModelMeta object for a multilabel classification model.
|
|
144
|
+
|
|
145
|
+
Retrieves and validates the specified LabelSet and AiModel, ensures the model file exists, and invokes ModelMeta.create_from_file with the provided configuration. Raises a ValueError if the requested LabelSet does not exist.
|
|
146
|
+
"""
|
|
147
|
+
model_name = options["model_name"]
|
|
148
|
+
|
|
149
|
+
model_path = options["model_path"]
|
|
150
|
+
activation_function_name = options["activation_function_name"]
|
|
151
|
+
|
|
152
|
+
mean = options["mean"]
|
|
153
|
+
std = options["std"]
|
|
154
|
+
|
|
155
|
+
size_x = options["size_x"]
|
|
156
|
+
size_y = options["size_y"]
|
|
157
|
+
|
|
158
|
+
axes = options["axes"]
|
|
159
|
+
|
|
160
|
+
image_classification_labelset_name = options[
|
|
161
|
+
"image_classification_labelset_name"
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
image_classification_labelset_version = options[
|
|
165
|
+
"image_classification_labelset_version"
|
|
166
|
+
]
|
|
167
|
+
if image_classification_labelset_version == -1:
|
|
168
|
+
# If version is -1, we want the latest version of the labelset
|
|
169
|
+
labelset = LabelSet.objects.filter(
|
|
170
|
+
name=image_classification_labelset_name
|
|
171
|
+
).order_by("-version").first()
|
|
172
|
+
if labelset:
|
|
173
|
+
image_classification_labelset_version = labelset.version
|
|
174
|
+
else:
|
|
175
|
+
raise ValueError(
|
|
176
|
+
f"No LabelSet found with name: {image_classification_labelset_name}"
|
|
177
|
+
)
|
|
178
|
+
else:
|
|
179
|
+
# If a specific version is provided, we use that
|
|
180
|
+
labelset = LabelSet.objects.filter(
|
|
181
|
+
name=image_classification_labelset_name,
|
|
182
|
+
version=image_classification_labelset_version
|
|
183
|
+
).first()
|
|
184
|
+
if not labelset:
|
|
185
|
+
raise ValueError(
|
|
186
|
+
f"No LabelSet found with name: {image_classification_labelset_name} and version: {image_classification_labelset_version}"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# assert model exists
|
|
190
|
+
db_ai_model = AiModel.objects.filter(name=model_name).first()
|
|
191
|
+
assert db_ai_model, f"Model not found: {model_name}"
|
|
192
|
+
|
|
193
|
+
model_path = Path(model_path).expanduser().resolve().as_posix()
|
|
194
|
+
|
|
195
|
+
assert Path(model_path).exists(), f"Model file not found: {model_path}"
|
|
196
|
+
|
|
197
|
+
_model_meta = ModelMeta.create_from_file(
|
|
198
|
+
meta_name=model_name, # Name of the new metadata object
|
|
199
|
+
model_name=model_name, # name of the ai_model to use; This also defines the models VideoSegmentationLabelSet
|
|
200
|
+
labelset_name=image_classification_labelset_name,
|
|
201
|
+
weights_file=model_path,
|
|
202
|
+
# Use the correct keyword arguments matching the method signature
|
|
203
|
+
requested_version=options["model_meta_version"],
|
|
204
|
+
bump_if_exists=options["bump_version"],
|
|
205
|
+
# Pass other options via **kwargs
|
|
206
|
+
activation=activation_function_name,
|
|
207
|
+
mean=mean,
|
|
208
|
+
std=std,
|
|
209
|
+
size_x=size_x,
|
|
210
|
+
size_y=size_y,
|
|
211
|
+
axes=axes,
|
|
212
|
+
batchsize=options["batchsize"],
|
|
213
|
+
num_workers=options["num_workers"],
|
|
214
|
+
)
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Management command to fix missing patient data in existing videos.
|
|
3
|
+
Fills in default values for videos that have incomplete SensitiveMeta.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from django.core.management.base import BaseCommand
|
|
7
|
+
from django.db import transaction
|
|
8
|
+
from datetime import date
|
|
9
|
+
from endoreg_db.models import VideoFile, SensitiveMeta
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Command(BaseCommand):
|
|
13
|
+
help = """
|
|
14
|
+
Fixes missing patient data in existing VideoFile entries.
|
|
15
|
+
This command will:
|
|
16
|
+
1. Find all videos with missing or incomplete SensitiveMeta
|
|
17
|
+
2. Create default SensitiveMeta for videos without any
|
|
18
|
+
3. Fill in missing fields (first_name, last_name, DOB, examination_date)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def add_arguments(self, parser):
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
'--dry-run',
|
|
24
|
+
action='store_true',
|
|
25
|
+
help='Show what would be changed without making actual changes',
|
|
26
|
+
)
|
|
27
|
+
parser.add_argument(
|
|
28
|
+
'--verbose',
|
|
29
|
+
action='store_true',
|
|
30
|
+
help='Show detailed output',
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def handle(self, *args, **options):
|
|
34
|
+
dry_run = options['dry_run']
|
|
35
|
+
verbose = options['verbose']
|
|
36
|
+
|
|
37
|
+
self.stdout.write(self.style.SUCCESS("Starting patient data repair..."))
|
|
38
|
+
|
|
39
|
+
if dry_run:
|
|
40
|
+
self.stdout.write(self.style.WARNING("DRY RUN MODE - No changes will be made"))
|
|
41
|
+
|
|
42
|
+
# Find videos without SensitiveMeta
|
|
43
|
+
videos_without_meta = VideoFile.objects.filter(sensitive_meta__isnull=True)
|
|
44
|
+
count_without_meta = videos_without_meta.count()
|
|
45
|
+
|
|
46
|
+
# Find videos with incomplete SensitiveMeta
|
|
47
|
+
videos_with_incomplete_meta = VideoFile.objects.filter(
|
|
48
|
+
sensitive_meta__isnull=False
|
|
49
|
+
).filter(
|
|
50
|
+
# At least one of these fields is missing
|
|
51
|
+
sensitive_meta__patient_first_name__isnull=True
|
|
52
|
+
) | VideoFile.objects.filter(
|
|
53
|
+
sensitive_meta__isnull=False,
|
|
54
|
+
sensitive_meta__patient_last_name__isnull=True
|
|
55
|
+
) | VideoFile.objects.filter(
|
|
56
|
+
sensitive_meta__isnull=False,
|
|
57
|
+
sensitive_meta__patient_dob__isnull=True
|
|
58
|
+
) | VideoFile.objects.filter(
|
|
59
|
+
sensitive_meta__isnull=False,
|
|
60
|
+
sensitive_meta__examination_date__isnull=True
|
|
61
|
+
) | VideoFile.objects.filter(
|
|
62
|
+
sensitive_meta__isnull=False,
|
|
63
|
+
sensitive_meta__patient_first_name__exact=''
|
|
64
|
+
) | VideoFile.objects.filter(
|
|
65
|
+
sensitive_meta__isnull=False,
|
|
66
|
+
sensitive_meta__patient_last_name__exact=''
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
count_incomplete = videos_with_incomplete_meta.count()
|
|
70
|
+
|
|
71
|
+
self.stdout.write(f"Found {count_without_meta} videos without SensitiveMeta")
|
|
72
|
+
self.stdout.write(f"Found {count_incomplete} videos with incomplete SensitiveMeta")
|
|
73
|
+
|
|
74
|
+
if count_without_meta == 0 and count_incomplete == 0:
|
|
75
|
+
self.stdout.write(self.style.SUCCESS("No repairs needed - all videos have complete patient data!"))
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
fixed_count = 0
|
|
79
|
+
created_count = 0
|
|
80
|
+
|
|
81
|
+
# Process videos without SensitiveMeta
|
|
82
|
+
if count_without_meta > 0:
|
|
83
|
+
self.stdout.write(f"\nProcessing {count_without_meta} videos without SensitiveMeta...")
|
|
84
|
+
|
|
85
|
+
for video in videos_without_meta:
|
|
86
|
+
if verbose:
|
|
87
|
+
self.stdout.write(f"Creating SensitiveMeta for video {video.uuid}")
|
|
88
|
+
|
|
89
|
+
if not dry_run:
|
|
90
|
+
try:
|
|
91
|
+
with transaction.atomic():
|
|
92
|
+
default_data = {
|
|
93
|
+
"patient_first_name": "Patient",
|
|
94
|
+
"patient_last_name": "Unknown",
|
|
95
|
+
"patient_dob": date(1990, 1, 1),
|
|
96
|
+
"examination_date": date.today(),
|
|
97
|
+
"center_name": video.center.name if video.center else "university_hospital_wuerzburg"
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
sensitive_meta = SensitiveMeta.create_from_dict(default_data)
|
|
101
|
+
video.sensitive_meta = sensitive_meta
|
|
102
|
+
video.save(update_fields=['sensitive_meta'])
|
|
103
|
+
created_count += 1
|
|
104
|
+
|
|
105
|
+
except Exception as e:
|
|
106
|
+
self.stdout.write(
|
|
107
|
+
self.style.ERROR(f"Failed to create SensitiveMeta for video {video.uuid}: {e}")
|
|
108
|
+
)
|
|
109
|
+
else:
|
|
110
|
+
created_count += 1
|
|
111
|
+
|
|
112
|
+
# Process videos with incomplete SensitiveMeta
|
|
113
|
+
if count_incomplete > 0:
|
|
114
|
+
self.stdout.write(f"\nProcessing {count_incomplete} videos with incomplete SensitiveMeta...")
|
|
115
|
+
|
|
116
|
+
for video in videos_with_incomplete_meta:
|
|
117
|
+
if not video.sensitive_meta:
|
|
118
|
+
continue # Skip if somehow None (already handled above)
|
|
119
|
+
|
|
120
|
+
update_data = {}
|
|
121
|
+
missing_fields = []
|
|
122
|
+
|
|
123
|
+
if not video.sensitive_meta.patient_first_name:
|
|
124
|
+
update_data["patient_first_name"] = "Patient"
|
|
125
|
+
missing_fields.append("first_name")
|
|
126
|
+
|
|
127
|
+
if not video.sensitive_meta.patient_last_name:
|
|
128
|
+
update_data["patient_last_name"] = "Unknown"
|
|
129
|
+
missing_fields.append("last_name")
|
|
130
|
+
|
|
131
|
+
if not video.sensitive_meta.patient_dob:
|
|
132
|
+
update_data["patient_dob"] = date(1990, 1, 1)
|
|
133
|
+
missing_fields.append("dob")
|
|
134
|
+
|
|
135
|
+
if not video.sensitive_meta.examination_date:
|
|
136
|
+
update_data["examination_date"] = date.today()
|
|
137
|
+
missing_fields.append("examination_date")
|
|
138
|
+
|
|
139
|
+
if update_data:
|
|
140
|
+
if verbose:
|
|
141
|
+
self.stdout.write(
|
|
142
|
+
f"Updating video {video.uuid} - missing fields: {', '.join(missing_fields)}"
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
if not dry_run:
|
|
146
|
+
try:
|
|
147
|
+
with transaction.atomic():
|
|
148
|
+
video.sensitive_meta.update_from_dict(update_data)
|
|
149
|
+
fixed_count += 1
|
|
150
|
+
except Exception as e:
|
|
151
|
+
self.stdout.write(
|
|
152
|
+
self.style.ERROR(f"Failed to update SensitiveMeta for video {video.uuid}: {e}")
|
|
153
|
+
)
|
|
154
|
+
else:
|
|
155
|
+
fixed_count += 1
|
|
156
|
+
|
|
157
|
+
# Summary
|
|
158
|
+
self.stdout.write("\n" + "="*50)
|
|
159
|
+
if dry_run:
|
|
160
|
+
self.stdout.write(self.style.SUCCESS("DRY RUN SUMMARY:"))
|
|
161
|
+
self.stdout.write(f"Would create SensitiveMeta for: {created_count} videos")
|
|
162
|
+
self.stdout.write(f"Would update incomplete data for: {fixed_count} videos")
|
|
163
|
+
self.stdout.write(f"Total videos that would be fixed: {created_count + fixed_count}")
|
|
164
|
+
else:
|
|
165
|
+
self.stdout.write(self.style.SUCCESS("REPAIR COMPLETED:"))
|
|
166
|
+
self.stdout.write(f"Created SensitiveMeta for: {created_count} videos")
|
|
167
|
+
self.stdout.write(f"Updated incomplete data for: {fixed_count} videos")
|
|
168
|
+
self.stdout.write(f"Total videos fixed: {created_count + fixed_count}")
|
|
169
|
+
|
|
170
|
+
if not dry_run and (created_count > 0 or fixed_count > 0):
|
|
171
|
+
self.stdout.write(self.style.SUCCESS("\n✅ Patient data repair completed successfully!"))
|
|
172
|
+
self.stdout.write("All videos now have the minimum required patient data for annotation.")
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django management command to fix video file paths in the database.
|
|
3
|
+
"""
|
|
4
|
+
from django.core.management.base import BaseCommand
|
|
5
|
+
from django.db import transaction
|
|
6
|
+
from endoreg_db.models import VideoFile
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Command(BaseCommand):
|
|
15
|
+
help = 'Fix video file paths in the database to match actual file locations'
|
|
16
|
+
|
|
17
|
+
def add_arguments(self, parser):
|
|
18
|
+
parser.add_argument(
|
|
19
|
+
'--video-id',
|
|
20
|
+
type=int,
|
|
21
|
+
help='Fix specific video ID only',
|
|
22
|
+
)
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
'--dry-run',
|
|
25
|
+
action='store_true',
|
|
26
|
+
help='Show what would be changed without making changes',
|
|
27
|
+
)
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
'--verbose',
|
|
30
|
+
action='store_true',
|
|
31
|
+
help='Enable verbose output',
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--storage-dir',
|
|
35
|
+
type=str,
|
|
36
|
+
default=None,
|
|
37
|
+
help='Path to the storage directory (default: $ENDOREG_STORAGE_DIR or ./storage)'
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def handle(self, *args, **options):
|
|
41
|
+
"""
|
|
42
|
+
Synchronizes video file paths in the database with actual files on disk, updating broken or missing paths as needed.
|
|
43
|
+
|
|
44
|
+
Scans the specified storage directory for video files, matches them to database records by UUID, and updates the `raw_file` field for videos whose stored path is missing or incorrect. Supports dry-run and verbose modes, and can process all videos or a specific video by ID.
|
|
45
|
+
"""
|
|
46
|
+
dry_run = options['dry_run']
|
|
47
|
+
verbose = options['verbose']
|
|
48
|
+
video_id = options.get('video_id')
|
|
49
|
+
|
|
50
|
+
# Determine storage_dir from argument, env, or fallback
|
|
51
|
+
storage_dir = options.get('storage_dir') or \
|
|
52
|
+
os.environ.get('ENDOREG_STORAGE_DIR') or \
|
|
53
|
+
'./storage'
|
|
54
|
+
storage_dir = Path(storage_dir)
|
|
55
|
+
|
|
56
|
+
# Find all actual video files
|
|
57
|
+
actual_files = {}
|
|
58
|
+
for pattern in ['**/*.mp4', '**/*.avi', '**/*.mov', '**/*.mkv']:
|
|
59
|
+
for file_path in storage_dir.glob(pattern):
|
|
60
|
+
if file_path.is_file() and file_path.stat().st_size > 0:
|
|
61
|
+
# Extract UUID from filename
|
|
62
|
+
filename = file_path.name
|
|
63
|
+
# UUID is typically the first part before underscore or the whole name
|
|
64
|
+
if '_' in filename:
|
|
65
|
+
uuid_part = filename.split('_')[0]
|
|
66
|
+
else:
|
|
67
|
+
uuid_part = filename.split('.')[0]
|
|
68
|
+
|
|
69
|
+
# Store relative path from storage directory
|
|
70
|
+
relative_path = file_path.relative_to(storage_dir)
|
|
71
|
+
actual_files[uuid_part] = {
|
|
72
|
+
'absolute_path': file_path,
|
|
73
|
+
'relative_path': relative_path,
|
|
74
|
+
'size_mb': file_path.stat().st_size / (1024*1024)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
self.stdout.write(f"Found {len(actual_files)} video files in storage")
|
|
78
|
+
|
|
79
|
+
# Query videos to fix
|
|
80
|
+
if video_id:
|
|
81
|
+
try:
|
|
82
|
+
videos = [VideoFile.objects.get(pk=video_id)]
|
|
83
|
+
self.stdout.write(f"Processing specific video ID: {video_id}")
|
|
84
|
+
except VideoFile.DoesNotExist:
|
|
85
|
+
self.stdout.write(self.style.ERROR(f"Video with ID {video_id} not found"))
|
|
86
|
+
return
|
|
87
|
+
else:
|
|
88
|
+
videos = VideoFile.objects.all()
|
|
89
|
+
self.stdout.write(f"Processing {videos.count()} videos...")
|
|
90
|
+
|
|
91
|
+
fixed_count = 0
|
|
92
|
+
skipped_count = 0
|
|
93
|
+
error_count = 0
|
|
94
|
+
|
|
95
|
+
for video in videos:
|
|
96
|
+
try:
|
|
97
|
+
uuid_str = str(video.uuid)
|
|
98
|
+
|
|
99
|
+
# Check if we have a matching file
|
|
100
|
+
if uuid_str in actual_files:
|
|
101
|
+
file_info = actual_files[uuid_str]
|
|
102
|
+
|
|
103
|
+
# Check current file path
|
|
104
|
+
current_path_exists = False
|
|
105
|
+
current_path = None
|
|
106
|
+
|
|
107
|
+
if hasattr(video, 'raw_file') and video.raw_file:
|
|
108
|
+
try:
|
|
109
|
+
current_path = Path(video.raw_file.path)
|
|
110
|
+
current_path_exists = current_path.exists()
|
|
111
|
+
except (ValueError, AttributeError, OSError):
|
|
112
|
+
current_path_exists = False
|
|
113
|
+
|
|
114
|
+
if not current_path_exists:
|
|
115
|
+
# File path is broken, fix it
|
|
116
|
+
if verbose:
|
|
117
|
+
self.stdout.write(f"Video {video.id} ({uuid_str}):")
|
|
118
|
+
self.stdout.write(f" Current: {current_path or 'None'} (broken)")
|
|
119
|
+
self.stdout.write(f" Found: {file_info['absolute_path']} ({file_info['size_mb']:.1f} MB)")
|
|
120
|
+
|
|
121
|
+
if not dry_run:
|
|
122
|
+
with transaction.atomic():
|
|
123
|
+
# Update the raw_file path
|
|
124
|
+
video.raw_file.name = str(file_info['relative_path'])
|
|
125
|
+
video.save(update_fields=['raw_file'])
|
|
126
|
+
|
|
127
|
+
self.stdout.write(
|
|
128
|
+
self.style.SUCCESS(f"✅ Fixed video {video.id}: {file_info['relative_path']}")
|
|
129
|
+
)
|
|
130
|
+
else:
|
|
131
|
+
self.stdout.write(
|
|
132
|
+
self.style.WARNING(f"🔄 Would fix video {video.id}: {file_info['relative_path']}")
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
fixed_count += 1
|
|
136
|
+
else:
|
|
137
|
+
if verbose:
|
|
138
|
+
self.stdout.write(f"✅ Video {video.id} ({uuid_str}) already has correct path")
|
|
139
|
+
skipped_count += 1
|
|
140
|
+
else:
|
|
141
|
+
if verbose:
|
|
142
|
+
self.stdout.write(f"❌ Video {video.id} ({uuid_str}): No matching file found")
|
|
143
|
+
error_count += 1
|
|
144
|
+
|
|
145
|
+
except Exception as e:
|
|
146
|
+
self.stdout.write(
|
|
147
|
+
self.style.ERROR(f"❌ Error processing video {video.id}: {e}")
|
|
148
|
+
)
|
|
149
|
+
error_count += 1
|
|
150
|
+
|
|
151
|
+
# Summary
|
|
152
|
+
self.stdout.write(f"\n{'='*50}")
|
|
153
|
+
self.stdout.write(self.style.SUCCESS("SUMMARY"))
|
|
154
|
+
self.stdout.write(f"{'='*50}")
|
|
155
|
+
|
|
156
|
+
action_word = "Would fix" if dry_run else "Fixed"
|
|
157
|
+
self.stdout.write(f"🔧 {action_word}: {fixed_count} videos")
|
|
158
|
+
self.stdout.write(f"✅ Already correct: {skipped_count} videos")
|
|
159
|
+
self.stdout.write(f"❌ Errors/Missing files: {error_count} videos")
|
|
160
|
+
|
|
161
|
+
if dry_run and fixed_count > 0:
|
|
162
|
+
self.stdout.write("\n💡 Run without --dry-run to apply changes")
|
|
163
|
+
elif not dry_run and fixed_count > 0:
|
|
164
|
+
self.stdout.write(f"\n🎉 Successfully fixed {fixed_count} video file paths!")
|
|
165
|
+
self.stdout.write("🔄 Restart your Django server to reload file paths")
|