endoreg-db 0.6.4__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 +12 -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/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +14 -9
- endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
- 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 +3 -46
- 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_colonoscopy.yaml +8 -3
- 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/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_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +3 -0
- endoreg_db/data/pdf_type/data.yaml +26 -2
- 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 +6 -6
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
- endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
- endoreg_db/data/requirement/disease_misc.yaml +3 -3
- endoreg_db/data/requirement/disease_renal.yaml +18 -2
- endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
- endoreg_db/data/requirement/event_cardiology.yaml +17 -17
- 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 +352 -31
- 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 +36 -35
- endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
- 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 +42 -2
- endoreg_db/data/requirement_type/requirement_types.yaml +82 -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/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 +1 -0
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +2 -3
- 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_name_data.py +37 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +30 -6
- 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 +270 -307
- 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/{disease.py → medical/disease.py} +60 -52
- endoreg_db/models/{event.py → medical/event.py} +31 -54
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
- 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 +1 -7
- 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/{risk → medical/risk}/risk_type.py +0 -4
- 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/requirement.py +556 -114
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
- 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 +80 -87
- endoreg_db/models/requirement/requirement_operator.py +132 -14
- endoreg_db/models/requirement/requirement_set.py +181 -21
- 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 -283
- endoreg_db/utils/__init__.py +66 -57
- 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 +50 -12
- 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/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 +100 -82
- 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/{views.py → auth/keycloak.py} +19 -13
- 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/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -90
- 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 -240
- 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 -98
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
- 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 -58
- 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 -254
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
- 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/examination/examination.py +0 -67
- 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 -65
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -162
- 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 -574
- 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.4.dist-info/METADATA +0 -161
- endoreg_db-0.6.4.dist-info/RECORD +0 -470
- /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/{risk → medical/risk}/__init__.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/risk.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.4.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
endoreg_db/urls/video.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
from django.urls import path
|
|
2
|
+
|
|
3
|
+
from endoreg_db.views import (
|
|
4
|
+
VideoReimportView,
|
|
5
|
+
SensitiveMetaDetailView,
|
|
6
|
+
VideoLabelView,
|
|
7
|
+
VideoStreamView,
|
|
8
|
+
# Video Correction Views (Phase 1.1)
|
|
9
|
+
VideoMetadataView,
|
|
10
|
+
VideoProcessingHistoryView,
|
|
11
|
+
VideoAnalyzeView,
|
|
12
|
+
VideoApplyMaskView,
|
|
13
|
+
VideoRemoveFramesView,
|
|
14
|
+
VideoReprocessView,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
url_patterns = [
|
|
18
|
+
# Video Label segments API endpoint
|
|
19
|
+
# GET /api/videos/<int:video_id>/labels/<str:label_name>/
|
|
20
|
+
# Retrieves time segments and frame predictions for a specific label on a video
|
|
21
|
+
path(
|
|
22
|
+
'videos/<int:video_id>/labels/<str:label_name>/',
|
|
23
|
+
VideoLabelView.as_view(),
|
|
24
|
+
name='video_label_segments'
|
|
25
|
+
),
|
|
26
|
+
|
|
27
|
+
# Video streaming API endpoint
|
|
28
|
+
# GET /api/videostream/<int:pk>/
|
|
29
|
+
# Streams the raw video file with HTTP range and CORS support
|
|
30
|
+
path(
|
|
31
|
+
'videostream/<int:pk>/',
|
|
32
|
+
VideoStreamView.as_view(),
|
|
33
|
+
name='video_stream'
|
|
34
|
+
),
|
|
35
|
+
|
|
36
|
+
# Video Re-import API endpoint
|
|
37
|
+
# POST /api/video/<int:video_id>/reimport/
|
|
38
|
+
# Re-imports a video file to regenerate metadata when OCR failed or data is incomplete
|
|
39
|
+
path(
|
|
40
|
+
'video/<int:video_id>/reimport/',
|
|
41
|
+
VideoReimportView.as_view(),
|
|
42
|
+
name='video_reimport'
|
|
43
|
+
),
|
|
44
|
+
# Video Sensitive Meta endpoints (for video anonymization)
|
|
45
|
+
# GET /api/video/sensitivemeta/<int:sensitive_meta_id>/
|
|
46
|
+
# PATCH /api/video/sensitivemeta/<int:sensitive_meta_id>/
|
|
47
|
+
path(
|
|
48
|
+
'video/sensitivemeta/<int:sensitive_meta_id>/',
|
|
49
|
+
SensitiveMetaDetailView.as_view(),
|
|
50
|
+
name='video_sensitive_meta_detail'
|
|
51
|
+
),
|
|
52
|
+
|
|
53
|
+
# ---------------------------------------------------------------------------------------
|
|
54
|
+
# VIDEO CORRECTION API ENDPOINTS (Phase 1.1)
|
|
55
|
+
#
|
|
56
|
+
# These endpoints enable video correction workflows:
|
|
57
|
+
# - Analysis: Detect sensitive frames using MiniCPM-o 2.6 or OCR+LLM
|
|
58
|
+
# - Masking: Apply device-specific masks or custom ROI masks
|
|
59
|
+
# - Frame Removal: Remove sensitive frames from videos
|
|
60
|
+
# - Processing History: Track all correction operations
|
|
61
|
+
# ---------------------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
# Video Metadata API
|
|
64
|
+
# GET /api/video-metadata/<int:id>/
|
|
65
|
+
# Returns analysis results (sensitive frame count, ratio, frame IDs)
|
|
66
|
+
path(
|
|
67
|
+
'video-metadata/<int:id>/',
|
|
68
|
+
VideoMetadataView.as_view(),
|
|
69
|
+
name='video_metadata'
|
|
70
|
+
),
|
|
71
|
+
|
|
72
|
+
# Video Processing History API
|
|
73
|
+
# GET /api/video-processing-history/<int:id>/
|
|
74
|
+
# Returns history of all processing operations (masking, frame removal, analysis)
|
|
75
|
+
path(
|
|
76
|
+
'video-processing-history/<int:id>/',
|
|
77
|
+
VideoProcessingHistoryView.as_view(),
|
|
78
|
+
name='video_processing_history'
|
|
79
|
+
),
|
|
80
|
+
|
|
81
|
+
# Video Analysis API
|
|
82
|
+
# POST /api/video-analyze/<int:id>/
|
|
83
|
+
# Analyzes video for sensitive frames using MiniCPM-o 2.6 or OCR+LLM
|
|
84
|
+
# Body: { detection_method: 'minicpm'|'ocr_llm'|'hybrid', sample_interval: 30 }
|
|
85
|
+
path(
|
|
86
|
+
'video-analyze/<int:id>/',
|
|
87
|
+
VideoAnalyzeView.as_view(),
|
|
88
|
+
name='video_analyze'
|
|
89
|
+
),
|
|
90
|
+
|
|
91
|
+
# Video Masking API
|
|
92
|
+
# POST /api/video-apply-mask/<int:id>/
|
|
93
|
+
# Applies device mask or custom ROI mask to video
|
|
94
|
+
# Body: { mask_type: 'device'|'custom', device_name: 'olympus', roi: {...} }
|
|
95
|
+
path(
|
|
96
|
+
'video-apply-mask/<int:id>/',
|
|
97
|
+
VideoApplyMaskView.as_view(),
|
|
98
|
+
name='video_apply_mask'
|
|
99
|
+
),
|
|
100
|
+
|
|
101
|
+
# Frame Removal API
|
|
102
|
+
# POST /api/video-remove-frames/<int:id>/
|
|
103
|
+
# Removes specified frames from video
|
|
104
|
+
# Body: { frame_list: [10,20,30] OR frame_ranges: '10-20,30' OR detection_method: 'automatic' }
|
|
105
|
+
path(
|
|
106
|
+
'video-remove-frames/<int:id>/',
|
|
107
|
+
VideoRemoveFramesView.as_view(),
|
|
108
|
+
name='video_remove_frames'
|
|
109
|
+
),
|
|
110
|
+
|
|
111
|
+
# Video Reprocessing API
|
|
112
|
+
# POST /api/video-reprocess/<int:id>/
|
|
113
|
+
# Re-runs entire anonymization pipeline for a video
|
|
114
|
+
path(
|
|
115
|
+
'video-reprocess/<int:id>/',
|
|
116
|
+
VideoReprocessView.as_view(),
|
|
117
|
+
name='video_reprocess'
|
|
118
|
+
),
|
|
119
|
+
]
|
endoreg_db/urls.py
CHANGED
|
@@ -1,286 +1,9 @@
|
|
|
1
|
-
from django.urls import
|
|
2
|
-
from rest_framework.routers import DefaultRouter
|
|
3
|
-
from .views.patient_views import (
|
|
4
|
-
PatientViewSet,
|
|
5
|
-
start_examination,
|
|
6
|
-
get_location_choices,
|
|
7
|
-
get_morphology_choices,
|
|
8
|
-
)
|
|
9
|
-
from .views.csrf import csrf_token_view
|
|
10
|
-
# endoreg_db_production/endoreg_db/urls.py
|
|
11
|
-
from endoreg_db.views.views import (
|
|
12
|
-
VideoView,
|
|
13
|
-
keycloak_login,
|
|
14
|
-
keycloak_callback,
|
|
15
|
-
public_home,
|
|
16
|
-
)#from .views.feature_selection_view import FetchSingleFramePredictionView // its implemented in ando-ai other project need to add here
|
|
17
|
-
from .views.video_segmentation_views import VideoView, VideoLabelView,UpdateLabelSegmentsView
|
|
18
|
-
from .views.views_for_timeline import video_timeline_view
|
|
19
|
-
from .views.raw_video_meta_validation_views import VideoFileForMetaView, VideoFileForMetaView
|
|
20
|
-
from .views.raw_pdf_meta_validation_views import PDFFileForMetaView
|
|
21
|
-
from .views.raw_pdf_meta_validation_views import UpdateSensitiveMetaView
|
|
22
|
-
from .views.raw_pdf_anony_text_validation_views import RawPdfAnonyTextView, UpdateAnonymizedTextView
|
|
23
|
-
router = DefaultRouter()
|
|
24
|
-
router.register(r'patients', PatientViewSet)
|
|
1
|
+
from django.urls import include, path
|
|
25
2
|
|
|
3
|
+
# Import the package-level URL patterns (defined in endoreg_db/urls/__init__.py)
|
|
4
|
+
from endoreg_db.urls import urlpatterns as api_urlpatterns
|
|
26
5
|
|
|
6
|
+
# Expose API under /api/
|
|
27
7
|
urlpatterns = [
|
|
28
|
-
path(
|
|
29
|
-
|
|
30
|
-
path('get-morphology-choices/<int:morphology_id>/', get_morphology_choices, name="get_morphology_choices"),
|
|
31
|
-
path('api/', include(router.urls)),
|
|
32
|
-
path('api/conf/', csrf_token_view, name='csrf_token'),
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
#--------------------------------------START : VIDEO SEGMENTATION END POINTS--------------------------------------
|
|
36
|
-
|
|
37
|
-
# The dropdown contains video names and their corresponding IDs, which are retrieved from the database(RawVideoFile). Additionally, this route(api/videos) also fetches labels along with their names and IDs from the label table.
|
|
38
|
-
# We will modify this implementation later as per our requirements.
|
|
39
|
-
#Based on the selected video ID, relevant data will be fetched from the database, and the video, along with its associated details,
|
|
40
|
-
# will be displayed on the frontend using route(api/video/<int:video_id>/).
|
|
41
|
-
# once label is selected from the dropdown,using its name, details can be fetched from rawvideofile using route("api/video/<int:video_id>/label/<str:label_name>/)
|
|
42
|
-
#If editing is required, a form will be available for each label. This form dynamically updates when the selected label changes. It will display all segments associated with the selected label, each with a delete option. Below these segments, there may be a button for adding more segments.
|
|
43
|
-
#If any values in the form are modified, the updated data will be saved in the dafrom .views import VideoView, keycloak_login, keycloak_callbacktabase table.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# Fetch all videos for the dropdown
|
|
49
|
-
# Fetch all available videos (for the video selection dropdown in frontend)
|
|
50
|
-
# Usage in frontend: Call this API to get a list of available videos.
|
|
51
|
-
# Example request: GET /api/videos/
|
|
52
|
-
# Response: Returns a JSON list of videos (id, file path, video_url, sequences, label_names).
|
|
53
|
-
# it also fetch the label from teh label table
|
|
54
|
-
|
|
55
|
-
# for kaycloak:-
|
|
56
|
-
# /api/videos/ , protected API
|
|
57
|
-
# /login/ , sends user to Keycloak login page
|
|
58
|
-
# /login/callback/ , where Keycloak sends the user after login
|
|
59
|
-
path('', public_home, name='public_home'),
|
|
60
|
-
path('api/videos/', VideoView.as_view(), name='video_list'),
|
|
61
|
-
path('login/', keycloak_login, name='keycloak_login'),
|
|
62
|
-
path('login/callback/', keycloak_callback, name='keycloak_callback'),
|
|
63
|
-
|
|
64
|
-
#need to change this route
|
|
65
|
-
#path('api/prediction/', FetchSingleFramePredictionView.as_view(), name='fetch-single-frame-prediction'),#.as_view() converts the class-based view into a function that Django can use for routing.
|
|
66
|
-
|
|
67
|
-
# Fetch video details + labels based on selected video
|
|
68
|
-
# Usage in frontend: Call this when a user selects a video from the dropdown.
|
|
69
|
-
# Example request: GET /api/video/1/
|
|
70
|
-
# Response: Returns metadata, file path, video URL, sequences, and available label names.
|
|
71
|
-
# Frontend should use this api for `label_names`, to display label selection (dropdown or tabs).
|
|
72
|
-
path("api/video/<int:video_id>/", VideoView.as_view(), name="video_handler"),
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# Fetch time segments along with frame predictions and filenames for a selected label
|
|
76
|
-
#
|
|
77
|
-
# **Usage in frontend:**
|
|
78
|
-
# - Call this API when a user selects a label from the dropdown in the timeline.
|
|
79
|
-
# - The API returns time segments (start & end times in seconds) where the label appears in the video.
|
|
80
|
-
# - Each segment includes frame-wise predictions and the corresponding frame filenames.
|
|
81
|
-
#
|
|
82
|
-
# **Example request:**
|
|
83
|
-
# GET /api/video/1/label/outside/
|
|
84
|
-
#
|
|
85
|
-
# **Example response:**
|
|
86
|
-
# {
|
|
87
|
-
# "label": "outside",
|
|
88
|
-
# "time_segments": [
|
|
89
|
-
# { "segment_start": 0,
|
|
90
|
-
# "segment_end": 463,
|
|
91
|
-
# "start_time": 0.0,
|
|
92
|
-
# "end_time": 9.26,
|
|
93
|
-
# "frames": {
|
|
94
|
-
# "0": {
|
|
95
|
-
# "frame_filename": "frame_0000000.jpg",
|
|
96
|
-
# "frame_file_path": "/home/admin/test-data/video_frames/abc123/frame_0000000.jpg",
|
|
97
|
-
# "predictions": {
|
|
98
|
-
# "appendix": 0.0150,
|
|
99
|
-
# and others
|
|
100
|
-
# }
|
|
101
|
-
# },
|
|
102
|
-
# "1": {
|
|
103
|
-
# "frame_filename": "frame_0000001.jpg",
|
|
104
|
-
# "frame_file_path": "/home/admin/test-data/video_frames/abc123/frame_0000001.jpg",
|
|
105
|
-
# "predictions": {
|
|
106
|
-
# "appendix": 0.0124,
|
|
107
|
-
# and otehrs
|
|
108
|
-
# }}}}]}
|
|
109
|
-
#
|
|
110
|
-
# start_time and end_time are in seconds, converted from frame indices.
|
|
111
|
-
# frames contains all frames in the segment with:
|
|
112
|
-
# frame_filename (e.g., frame_0000001.jpg)
|
|
113
|
-
# frame_file_path (full path for easy access)
|
|
114
|
-
# predictions (frame-wise probability scores for each category)
|
|
115
|
-
#we need label name for this not id as we donot have id in rawvideofile table
|
|
116
|
-
path("api/video/<int:video_id>/label/<str:label_name>/", VideoLabelView.as_view(), name="video_label_times"),
|
|
117
|
-
|
|
118
|
-
# Update or create label segments for a specific video and label
|
|
119
|
-
# - Call this API when a user updates the start and end frames of a label segment(adding new , deleting or changing the values).
|
|
120
|
-
# - The API will:
|
|
121
|
-
# - **Update** existing segments if they match the given `video_id` and `label_id`.
|
|
122
|
-
# - **Create** new segments if they do not already exist.
|
|
123
|
-
# - **Delete** segments from the database if they were removed from the frontend.
|
|
124
|
-
# - This ensures that the database reflects exactly what is sent from the frontend.
|
|
125
|
-
#
|
|
126
|
-
# **Example request (Updating segments for label ID 12 in video ID 1):**
|
|
127
|
-
# PUT /api/video/1/label/12/update_segments/
|
|
128
|
-
#
|
|
129
|
-
# **Request body (JSON):**
|
|
130
|
-
# {
|
|
131
|
-
# "video_id": 1,
|
|
132
|
-
# "label_id": 12,
|
|
133
|
-
# "segments": [
|
|
134
|
-
# {
|
|
135
|
-
# "start_frame_number": 0,
|
|
136
|
-
# "end_frame_number": 463
|
|
137
|
-
# },{
|
|
138
|
-
# "start_frame_number": 500,
|
|
139
|
-
# "end_frame_number": 700
|
|
140
|
-
# }]}
|
|
141
|
-
#
|
|
142
|
-
# **Expected response (If successful):**
|
|
143
|
-
# {
|
|
144
|
-
# "updated_segments": [
|
|
145
|
-
# {
|
|
146
|
-
# "id": 1,
|
|
147
|
-
# "video_id": 1,
|
|
148
|
-
# "label_id": 12,
|
|
149
|
-
# "start_frame_number": 0,
|
|
150
|
-
# "end_frame_number": 463
|
|
151
|
-
# }
|
|
152
|
-
# ],
|
|
153
|
-
# "new_segments": [
|
|
154
|
-
# {
|
|
155
|
-
# "id": 2,
|
|
156
|
-
# "video_id": 1,
|
|
157
|
-
# "label_id": 12,
|
|
158
|
-
# "start_frame_number": 500,
|
|
159
|
-
# "end_frame_number": 700
|
|
160
|
-
# }
|
|
161
|
-
# ],
|
|
162
|
-
# "deleted_segments": 1 # Number of deleted segments if any were removed
|
|
163
|
-
# }
|
|
164
|
-
|
|
165
|
-
# **Frontend Integration:**
|
|
166
|
-
# - Vue.js should send this request when the user **saves changes** to segments.
|
|
167
|
-
# - The **"Add Segment"** button should allow users to add new segments dynamically.
|
|
168
|
-
# - The **"Delete Segment"** button should remove segments from the list before submitting.
|
|
169
|
-
# - The request should be triggered via an `axios.put` call:
|
|
170
|
-
#
|
|
171
|
-
path("api/video/<int:video_id>/label/<int:label_id>/update_segments/", UpdateLabelSegmentsView.as_view(), name="update_label_segments"),
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
#----------------------------------START : SENSITIVE META AND RAWVIDEOFILE VIDEO PATIENT DETAILS-------------------------------
|
|
175
|
-
|
|
176
|
-
# API Endpoint for fetching video metadata or streaming the next available video
|
|
177
|
-
# This endpoint is used by the frontend to fetch:
|
|
178
|
-
# - The first available video if `last_id` is NOT provided.
|
|
179
|
-
# - The next available video where `id > last_id` if `last_id` is provided.
|
|
180
|
-
# - If `Accept: application/json` is set in headers, it returns video metadata as JSON.
|
|
181
|
-
# - If no videos are available, it returns {"error": "No more videos available."}.
|
|
182
|
-
# const url = lastId ? `http://localhost:8000/api/video/meta/?last_id=${lastId}` : "http://localhost:8000/api/video/meta/";
|
|
183
|
-
path("api/video/sensitivemeta/", VideoFileForMetaView.as_view(), name="video_meta"), # Single endpoint for both first and next video
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
# This API endpoint allows updating specific patient details (SensitiveMeta)
|
|
188
|
-
# linked to a video. It is used to correct or modify the patient's first name,
|
|
189
|
-
# last name, date of birth, and examination date.
|
|
190
|
-
# Fetch video metadata and update patient details
|
|
191
|
-
# The frontend should send a JSON request body like this:
|
|
192
|
-
# {
|
|
193
|
-
# "sensitive_meta_id": 2, # The ID of the SensitiveMeta entry (REQUIRED)
|
|
194
|
-
# "patient_first_name": "John", # New first name (REQUIRED, cannot be empty)
|
|
195
|
-
# "patient_last_name": "Doe", # New last name (REQUIRED, cannot be empty)
|
|
196
|
-
# "patient_dob": "1985-06-15", # New Date of Birth (REQUIRED, format YYYY-MM-DD)
|
|
197
|
-
# "examination_date": "2024-03-20" # New Examination Date (OPTIONAL, format YYYY-MM-DD)
|
|
198
|
-
# }
|
|
199
|
-
# - The frontend sends a PATCH request to this endpoint with updated patient data.
|
|
200
|
-
# - The backend validates the input using the serializer (`SensitiveMetaUpdateSerializer`).
|
|
201
|
-
# - If validation passes, the patient information is updated in the database.
|
|
202
|
-
# - If there are errors (e.g., missing fields, incorrect date format),
|
|
203
|
-
# the API returns structured error messages.
|
|
204
|
-
path("api/video/update_sensitivemeta/", VideoFileForMetaView.as_view(), name="update_patient_meta"),
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
#----------------------------------START : SENSITIVE META AND RAWPDFOFILE PDF PATIENT DETAILS-------------------------------
|
|
210
|
-
|
|
211
|
-
#The first request (without id) fetches the first available PDF metadata.
|
|
212
|
-
#The "Next" button (with id) fetches the next available PDF.
|
|
213
|
-
#If an id is provided, the API returns the actual PDF file instead of JSON.
|
|
214
|
-
path("api/pdf/sensitivemeta/", PDFFileForMetaView.as_view(), name="pdf_meta"),
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
# This API endpoint allows updating specific patient details (SensitiveMeta)
|
|
220
|
-
# linked to a PDF record. It enables modifying the patient's first name,
|
|
221
|
-
# last name, date of birth, and examination date.
|
|
222
|
-
|
|
223
|
-
# The frontend should send a JSON request body like this:
|
|
224
|
-
# {
|
|
225
|
-
# "sensitive_meta_id": 2, # The ID of the SensitiveMeta entry (REQUIRED)
|
|
226
|
-
# "patient_first_name": "John", # New first name (OPTIONAL, if provided, cannot be empty)
|
|
227
|
-
# "patient_last_name": "Doe", # New last name (OPTIONAL, if provided, cannot be empty)
|
|
228
|
-
# "patient_dob": "1985-06-15", # New Date of Birth (OPTIONAL, format YYYY-MM-DD)
|
|
229
|
-
# "examination_date": "2024-03-20" # New Examination Date (OPTIONAL, format YYYY-MM-DD)
|
|
230
|
-
# }
|
|
231
|
-
|
|
232
|
-
# - The frontend sends a PATCH request to this endpoint with the updated patient data.
|
|
233
|
-
# - The backend processes the request and updates only the fields that are provided.
|
|
234
|
-
# - If validation passes, the corresponding SensitiveMeta entry is updated in the database.
|
|
235
|
-
# - If errors occur (e.g., invalid ID, empty fields, incorrect date format),
|
|
236
|
-
# the API returns structured error messages.
|
|
237
|
-
|
|
238
|
-
path("api/pdf/update_sensitivemeta/", UpdateSensitiveMetaView.as_view(), name="update_pdf_meta"),
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
# API Endpoint for Fetching PDF Data (Including Anonymized Text)
|
|
245
|
-
# - This endpoint is used when the page loads.
|
|
246
|
-
# - Fetches the first available PDF (if no `last_id` is provided).
|
|
247
|
-
# - If `last_id` is given, fetches the next available PDF.
|
|
248
|
-
# - The frontend calls this endpoint on **page load** and when clicking the **next button**.
|
|
249
|
-
# Example frontend usage:
|
|
250
|
-
# const url = lastId ? `http://localhost:8000/api/pdf/anony_text/?last_id=${lastId}`
|
|
251
|
-
# : "http://localhost:8000/api/pdf/anony_text/";
|
|
252
|
-
path("api/pdf/anony_text/", RawPdfAnonyTextView.as_view(), name="pdf_anony_text"),
|
|
253
|
-
|
|
254
|
-
# API Endpoint for Updating the `anonymized_text` Field in `RawPdfFile`
|
|
255
|
-
# - This endpoint is called when the user edits the anonymized text and clicks **Save**.
|
|
256
|
-
# - Updates only the `anonymized_text` field for the specified PDF `id`.
|
|
257
|
-
# - The frontend sends a **PATCH request** to this endpoint with the updated text.
|
|
258
|
-
# Example frontend usage:
|
|
259
|
-
# axios.patch("http://localhost:8000/api/pdf/update_anony_text/", { id: 1, anonymized_text: "Updated text" });
|
|
260
|
-
path("api/pdf/update_anony_text/", UpdateAnonymizedTextView.as_view(), name="update_pdf_anony_text"),
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
#this is for, to test the timeline
|
|
277
|
-
#need to delete this url and also endoreg_db_production/endoreg_db/views/views_for_timeline.py and endoreg_db_production/endoreg_db/templates/timeline.html
|
|
278
|
-
path('video/<int:video_id>/timeline/', video_timeline_view, name='video_timeline'),
|
|
279
|
-
]
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
#https://biigle.de/manual/tutorials/videos/navigating-timeline#for time line example
|
|
283
|
-
from django.conf import settings
|
|
284
|
-
from django.conf.urls.static import static
|
|
285
|
-
if settings.DEBUG:
|
|
286
|
-
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
|
8
|
+
path("api/", include((api_urlpatterns, "endoreg_db"), namespace="api")),
|
|
9
|
+
]
|
endoreg_db/utils/__init__.py
CHANGED
|
@@ -1,79 +1,88 @@
|
|
|
1
1
|
"""Module for utility classes and functions."""
|
|
2
2
|
|
|
3
|
+
# --- Imports from submodules ---
|
|
4
|
+
|
|
5
|
+
# dataloader
|
|
6
|
+
from endoreg_db.utils.video.ffmpeg_wrapper import assemble_video_from_frames, get_stream_info, transcode_video, transcode_videofile_if_required
|
|
3
7
|
from .dataloader import load_model_data_from_yaml
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
from .
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
# dates
|
|
10
|
+
from .dates import ensure_aware_datetime, random_day_by_month_year, random_day_by_year
|
|
11
|
+
|
|
12
|
+
# env
|
|
13
|
+
from .env import DEBUG, DJANGO_SETTINGS_MODULE, get_env_var
|
|
14
|
+
|
|
15
|
+
# file_operations
|
|
16
|
+
from .file_operations import copy_with_progress, get_uuid_filename, rename_file_uuid
|
|
17
|
+
|
|
18
|
+
# hashs
|
|
8
19
|
from .hashs import (
|
|
20
|
+
DJANGO_NAME_SALT,
|
|
21
|
+
get_examiner_hash,
|
|
9
22
|
get_hash_string,
|
|
23
|
+
get_patient_examination_hash,
|
|
10
24
|
get_pdf_hash,
|
|
11
|
-
get_examiner_hash,
|
|
12
25
|
get_video_hash,
|
|
13
|
-
get_patient_examination_hash,
|
|
14
|
-
DJANGO_NAME_SALT
|
|
15
26
|
)
|
|
27
|
+
|
|
28
|
+
# names
|
|
16
29
|
from .names import (
|
|
17
|
-
create_mock_patient_name,
|
|
18
30
|
create_mock_examiner_name,
|
|
31
|
+
create_mock_patient_name,
|
|
19
32
|
guess_name_gender,
|
|
20
33
|
)
|
|
21
34
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
RAW_PDF_DIR,
|
|
41
|
-
RAW_PDF_DIR_NAME,
|
|
35
|
+
# parse_and_generate_yaml
|
|
36
|
+
from .parse_and_generate_yaml import collect_center_names
|
|
37
|
+
|
|
38
|
+
# paths
|
|
39
|
+
from .paths import data_paths
|
|
40
|
+
|
|
41
|
+
# pydantic_models
|
|
42
|
+
from .pydantic_models import DbConfig
|
|
43
|
+
|
|
44
|
+
# validate_endo_roi
|
|
45
|
+
from .validate_endo_roi import validate_endo_roi
|
|
46
|
+
|
|
47
|
+
# ffmpeg_wrapper
|
|
48
|
+
from .video.ffmpeg_wrapper import (
|
|
49
|
+
extract_frames,
|
|
50
|
+
)
|
|
51
|
+
from .video import (
|
|
52
|
+
split_video
|
|
42
53
|
)
|
|
43
54
|
|
|
55
|
+
|
|
56
|
+
# --- Exports ---
|
|
57
|
+
|
|
44
58
|
__all__ = [
|
|
45
|
-
"load_model_data_from_yaml",
|
|
46
59
|
"collect_center_names",
|
|
47
|
-
"
|
|
48
|
-
"get_examiner_hash",
|
|
49
|
-
"DbConfig",
|
|
50
|
-
"random_day_by_month_year",
|
|
51
|
-
"random_day_by_year",
|
|
52
|
-
"get_hash_string",
|
|
60
|
+
"copy_with_progress",
|
|
53
61
|
"create_mock_examiner_name",
|
|
54
62
|
"create_mock_patient_name",
|
|
55
|
-
"
|
|
63
|
+
"data_paths",
|
|
64
|
+
"DbConfig",
|
|
65
|
+
"DEBUG",
|
|
66
|
+
"DJANGO_NAME_SALT",
|
|
67
|
+
"DJANGO_SETTINGS_MODULE",
|
|
68
|
+
"ensure_aware_datetime",
|
|
69
|
+
"get_env_var",
|
|
70
|
+
"get_examiner_hash",
|
|
71
|
+
"get_hash_string",
|
|
72
|
+
"get_patient_examination_hash",
|
|
56
73
|
"get_pdf_hash",
|
|
74
|
+
"get_uuid_filename",
|
|
57
75
|
"get_video_hash",
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"WEIGHTS_DIR_NAME",
|
|
70
|
-
"FRAME_DIR_NAME",
|
|
71
|
-
"VIDEO_DIR_NAME",
|
|
72
|
-
"STORAGE_DIR_NAME",
|
|
73
|
-
"RAW_FRAME_DIR_NAME",
|
|
74
|
-
"RAW_VIDEO_DIR_NAME",
|
|
75
|
-
"RAW_PDF_DIR_NAME",
|
|
76
|
-
"PDF_DIR_NAME",
|
|
77
|
-
"PDF_DIR",
|
|
78
|
-
"RAW_PDF_DIR",
|
|
76
|
+
"guess_name_gender",
|
|
77
|
+
"load_model_data_from_yaml",
|
|
78
|
+
"random_day_by_month_year",
|
|
79
|
+
"random_day_by_year",
|
|
80
|
+
"rename_file_uuid",
|
|
81
|
+
"validate_endo_roi",
|
|
82
|
+
"assemble_video_from_frames", # Updated name
|
|
83
|
+
"get_stream_info",
|
|
84
|
+
"transcode_video",
|
|
85
|
+
"transcode_videofile_if_required", # Added
|
|
86
|
+
"extract_frames", # Added
|
|
79
87
|
]
|
|
88
|
+
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
from .
|
|
1
|
+
from endoreg_db.models import ModelMeta
|
|
2
2
|
|
|
3
|
-
# get latest model meta by model name
|
|
4
|
-
|
|
5
|
-
# TODO MOVE THIS TO A QUERY FILE
|
|
6
3
|
def get_latest_model_meta_by_model_name(model_name):
|
|
7
4
|
model_meta = ModelMeta.objects.filter(name=model_name).order_by('-version').first()
|
|
8
5
|
return model_meta
|
|
@@ -44,7 +44,7 @@ def calculate_metrics(pred, target, threshold=0.5):
|
|
|
44
44
|
class MultiLabelClassificationNet(LightningModule):
|
|
45
45
|
def __init__(
|
|
46
46
|
self,
|
|
47
|
-
labels=
|
|
47
|
+
labels=None,
|
|
48
48
|
lr=6e-3,
|
|
49
49
|
weight_decay=0.001,
|
|
50
50
|
pos_weight=2,
|
|
@@ -76,13 +76,18 @@ class MultiLabelClassificationNet(LightningModule):
|
|
|
76
76
|
pos_weight=torch.Tensor([self.pos_weight] * len(self.labels))
|
|
77
77
|
)
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
@classmethod
|
|
80
|
+
def load_from_checkpoint(cls, checkpoint_path, *args, **kwargs):
|
|
81
|
+
instance = super(MultiLabelClassificationNet, cls).load_from_checkpoint(
|
|
82
|
+
checkpoint_path, *args, **kwargs
|
|
83
|
+
)
|
|
84
|
+
return instance
|
|
85
|
+
|
|
86
|
+
def forward(self, x): # pylint: disable=arguments-differ
|
|
81
87
|
x = self.model(x)
|
|
82
88
|
return x
|
|
83
89
|
|
|
84
|
-
def training_step(self, batch,
|
|
85
|
-
"""Training step"""
|
|
90
|
+
def training_step(self, batch, _batch_idx): # pylint: disable=arguments-differ
|
|
86
91
|
x, y = batch
|
|
87
92
|
y_pred = self(x)
|
|
88
93
|
loss = self.criterion(y_pred, y)
|
|
@@ -94,8 +99,7 @@ class MultiLabelClassificationNet(LightningModule):
|
|
|
94
99
|
|
|
95
100
|
return {"loss": loss, "preds": preds, "targets": y}
|
|
96
101
|
|
|
97
|
-
def validation_step(self, batch,
|
|
98
|
-
"""Validation step"""
|
|
102
|
+
def validation_step(self, batch, _batch_idx): # pylint: disable=arguments-differ
|
|
99
103
|
x, y = batch
|
|
100
104
|
y_pred = self(x)
|
|
101
105
|
loss = self.criterion(y_pred, y)
|
|
@@ -107,8 +111,8 @@ class MultiLabelClassificationNet(LightningModule):
|
|
|
107
111
|
|
|
108
112
|
return {"loss": loss, "preds": preds, "targets": y}
|
|
109
113
|
|
|
110
|
-
def validation_epoch_end(self,
|
|
111
|
-
"""
|
|
114
|
+
def validation_epoch_end(self, _outputs):
|
|
115
|
+
"""Called at the end of validation to aggregate outputs"""
|
|
112
116
|
self.val_preds = np.concatenate([_ for _ in self.val_preds])
|
|
113
117
|
self.val_targets = np.concatenate([_ for _ in self.val_targets])
|
|
114
118
|
|
|
@@ -145,7 +149,7 @@ class MultiLabelClassificationNet(LightningModule):
|
|
|
145
149
|
self.parameters(), self.lr, momentum=0.5, weight_decay=self.weight_decay
|
|
146
150
|
)
|
|
147
151
|
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
|
|
148
|
-
optimizer, T_0=20,
|
|
152
|
+
optimizer, T_0=20,
|
|
149
153
|
)
|
|
150
154
|
|
|
151
155
|
return {
|