endoreg-db 0.6.4__py3-none-any.whl → 0.8.2__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/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_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 +207 -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 +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/ollama_api_docs.py +1528 -0
- endoreg_db/services/pdf_import.py +963 -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 +1118 -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 +70 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +229 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -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 +66 -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 +45 -0
- endoreg_db/views/media/pdf_media.py +386 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +596 -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 +161 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +64 -0
- endoreg_db/views/video/correction.py +672 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +329 -0
- endoreg_db/views/video/video_media.py +158 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_reprocess.py +40 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db-0.8.2.dist-info/METADATA +384 -0
- endoreg_db-0.8.2.dist-info/RECORD +790 -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.2.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,574 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from rest_framework import serializers
|
|
3
|
-
from django.http import FileResponse, Http404, StreamingHttpResponse
|
|
4
|
-
from ..models import RawVideoFile, Label, LabelRawVideoSegment, RawVideoPredictionMeta
|
|
5
|
-
import subprocess, cv2
|
|
6
|
-
from django.conf import settings
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class VideoFileSerializer(serializers.ModelSerializer):
|
|
10
|
-
"""
|
|
11
|
-
Serializer that dynamically handles video retrieval and streaming.
|
|
12
|
-
Ensures file returns the relative file path (not MEDIA_URL)
|
|
13
|
-
Computes full_video_path using the correct storage path (/home/admin/test-data)-need to change make it dynamic
|
|
14
|
-
Returns video_url for frontend integration
|
|
15
|
-
Serves the video file when needed
|
|
16
|
-
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
video_url = serializers.SerializerMethodField()
|
|
20
|
-
full_video_path = serializers.SerializerMethodField()
|
|
21
|
-
file = serializers.SerializerMethodField() # Override file to remove incorrect MEDIA_URL behavior,otherwise:Django's FileField automatically generates a URL based on MEDIA_URL
|
|
22
|
-
# Video dropdown field for frontend selection (currently shows video ID, but can be changed later)
|
|
23
|
-
video_selection_field = serializers.SerializerMethodField()
|
|
24
|
-
# classification_data = serializers.SerializerMethodField() #data from database (smooth prediction values but currently hardcoded one)
|
|
25
|
-
# The Meta class tells Django what data to include when serializing a RawVideoFile object.
|
|
26
|
-
sequences = serializers.SerializerMethodField()
|
|
27
|
-
label_names = serializers.SerializerMethodField()
|
|
28
|
-
# Convert selected label frames into time segments (seconds)
|
|
29
|
-
label_time_segments = serializers.SerializerMethodField()
|
|
30
|
-
# label_predictions = serializers.SerializerMethodField()
|
|
31
|
-
original_file_name = serializers.CharField()
|
|
32
|
-
duration = serializers.SerializerMethodField()
|
|
33
|
-
|
|
34
|
-
class Meta:
|
|
35
|
-
model = RawVideoFile
|
|
36
|
-
# he fields list defines which data should be included in the API response.
|
|
37
|
-
fields = [
|
|
38
|
-
"id",
|
|
39
|
-
"original_file_name",
|
|
40
|
-
"file",
|
|
41
|
-
"duration",
|
|
42
|
-
"video_url",
|
|
43
|
-
"full_video_path",
|
|
44
|
-
"video_selection_field",
|
|
45
|
-
"label_names",
|
|
46
|
-
"sequences",
|
|
47
|
-
"label_time_segments",
|
|
48
|
-
] # Ensure computed fields are included
|
|
49
|
-
|
|
50
|
-
# @staticmethod #using @staticmethod makes it reusable without needing to create a serializer instance.
|
|
51
|
-
# Without @staticmethod, you would need to instantiate the serializer before calling the method, which is unnecessary her
|
|
52
|
-
def get_video_selection_field(self, obj):
|
|
53
|
-
"""
|
|
54
|
-
Returns the field used for video selection in the frontend dropdown.
|
|
55
|
-
Currently, it shows the video ID, but this can be changed easily later.
|
|
56
|
-
"""
|
|
57
|
-
return obj.id
|
|
58
|
-
|
|
59
|
-
def get_video_url(
|
|
60
|
-
self, obj
|
|
61
|
-
): # when we serialize a RawVideoFile object (video metadata), the get_video_url method is automatically invoked by DRF
|
|
62
|
-
"""
|
|
63
|
-
Returns the API endpoint where the frontend can fetch the video.
|
|
64
|
-
"""
|
|
65
|
-
if not obj.id:
|
|
66
|
-
return {"error": "Invalid video ID"}
|
|
67
|
-
|
|
68
|
-
request = self.context.get(
|
|
69
|
-
"request"
|
|
70
|
-
) # Gets the request object (provided by DRF).
|
|
71
|
-
if request:
|
|
72
|
-
return request.build_absolute_uri(f"/api/video/{obj.id}/")
|
|
73
|
-
|
|
74
|
-
return {"error": "Video URL not avalaible"}
|
|
75
|
-
|
|
76
|
-
def get_duration(self, obj):
|
|
77
|
-
"""
|
|
78
|
-
Returns the total duration of the video in seconds.
|
|
79
|
-
If duration is not stored in the database, it extracts it dynamically using OpenCV.
|
|
80
|
-
"""
|
|
81
|
-
if hasattr(obj, "duration") and obj.duration:
|
|
82
|
-
return (
|
|
83
|
-
obj.duration
|
|
84
|
-
) # If duration is stored in the database, return it directly.
|
|
85
|
-
|
|
86
|
-
# Dynamically extract duration if not stored
|
|
87
|
-
video_path = obj.file.path
|
|
88
|
-
cap = cv2.VideoCapture(video_path)
|
|
89
|
-
|
|
90
|
-
if not cap.isOpened():
|
|
91
|
-
return None # Error handling if video can't be opened
|
|
92
|
-
|
|
93
|
-
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
94
|
-
total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
|
|
95
|
-
cap.release()
|
|
96
|
-
|
|
97
|
-
return (
|
|
98
|
-
round(total_frames / fps, 2) if fps > 0 else None
|
|
99
|
-
) # Return duration in seconds
|
|
100
|
-
|
|
101
|
-
def get_file(self, obj):
|
|
102
|
-
"""
|
|
103
|
-
Ensures the file field returns only the relative path, adn also validates it
|
|
104
|
-
"""
|
|
105
|
-
if not obj.file:
|
|
106
|
-
return {"error": "No file associated with this entry"}
|
|
107
|
-
# obj.file.name is an attribute of FieldFile that returns the file path as a string and name is not the database attribute, it is an attribute of Django’s FieldFile object that holds the file path as a string.
|
|
108
|
-
if not hasattr(obj.file, "name") or not obj.file.name.strip():
|
|
109
|
-
return {"error": "Invalid file name"}
|
|
110
|
-
|
|
111
|
-
return str(
|
|
112
|
-
obj.file.name
|
|
113
|
-
).strip() # Only return the file path, no URL,#obj.file returning a FieldFile object instead of a string
|
|
114
|
-
|
|
115
|
-
def get_full_video_path(self, obj):
|
|
116
|
-
"""
|
|
117
|
-
Constructs the absolute file path dynamically.
|
|
118
|
-
- Uses the actual storage directory (`/home/admin/test-data/`)
|
|
119
|
-
"""
|
|
120
|
-
from ..utils import STORAGE_DIR
|
|
121
|
-
if not obj.file:
|
|
122
|
-
return {"error": "No video file associated with this entry"}
|
|
123
|
-
|
|
124
|
-
video_relative_path = str(obj.file.name).strip() # Convert FieldFile to string
|
|
125
|
-
if not video_relative_path:
|
|
126
|
-
return {
|
|
127
|
-
"error": "Video file path is empty or invalid"
|
|
128
|
-
} # none might cause, 500 error, Handle edge case where the file name is empty
|
|
129
|
-
|
|
130
|
-
full_path = STORAGE_DIR / video_relative_path
|
|
131
|
-
|
|
132
|
-
return (
|
|
133
|
-
str(full_path)
|
|
134
|
-
if full_path.exists()
|
|
135
|
-
else {"error": f"file not found at: {full_path}"}
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
def get_sequences(self, obj):
|
|
139
|
-
"""
|
|
140
|
-
Extracts the sequences field from the RawVideoFile model.
|
|
141
|
-
Example Output:
|
|
142
|
-
{
|
|
143
|
-
"outside": [[1, 32], [123, 200]],
|
|
144
|
-
"needle": [[36, 141]],
|
|
145
|
-
"kolonpolyp": [[91, 126]]
|
|
146
|
-
}
|
|
147
|
-
"""
|
|
148
|
-
return obj.sequences or {
|
|
149
|
-
"error": "no sequence found, check database first"
|
|
150
|
-
} # Get from sequences, return {} if missing
|
|
151
|
-
|
|
152
|
-
def get_label_names(self, obj):
|
|
153
|
-
"""
|
|
154
|
-
Extracts only label names from the sequences data.
|
|
155
|
-
Example Output:
|
|
156
|
-
["outside", "needle", "kolonpolyp"]
|
|
157
|
-
"""
|
|
158
|
-
sequences = self.get_sequences(obj)
|
|
159
|
-
return list(sequences.keys()) if sequences else []
|
|
160
|
-
|
|
161
|
-
def get_label_time_segments(self, obj):
|
|
162
|
-
"""
|
|
163
|
-
Converts frame sequences of a selected label into time segments in seconds.
|
|
164
|
-
Also retrieves frame-wise predictions for the given label.
|
|
165
|
-
|
|
166
|
-
Includes:
|
|
167
|
-
- Frame index
|
|
168
|
-
- Corresponding frame filename (frame_0000001.jpg)
|
|
169
|
-
- Full frame file path for frontend access
|
|
170
|
-
- segment_start and segment_end (in frame index format, not divided by FPS)
|
|
171
|
-
"""
|
|
172
|
-
|
|
173
|
-
fps = (
|
|
174
|
-
obj.fps
|
|
175
|
-
if hasattr(obj, "fps") and obj.fps is not None
|
|
176
|
-
else obj.get_fps()
|
|
177
|
-
if hasattr(obj, "get_fps") and obj.get_fps() is not None
|
|
178
|
-
else 50
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
print("here is fps::::::::::::::::::.-----------::::::", fps)
|
|
182
|
-
sequences = self.get_sequences(obj) # Fetch sequence data
|
|
183
|
-
readable_predictions = obj.readable_predictions # Predictions from DB
|
|
184
|
-
|
|
185
|
-
if not isinstance(readable_predictions, list):
|
|
186
|
-
return {"error": "Invalid prediction data format. Expected a list."}
|
|
187
|
-
|
|
188
|
-
frame_dir = Path(obj.frame_dir) # Get the correct directory from the model
|
|
189
|
-
|
|
190
|
-
time_segments = {} # Dictionary to store converted times and frame predictions
|
|
191
|
-
|
|
192
|
-
for label, frame_ranges in sequences.items():
|
|
193
|
-
label_times = [] # Stores time segments
|
|
194
|
-
frame_predictions = {} # Ensure frame_predictions is properly initialized for each label
|
|
195
|
-
|
|
196
|
-
for frame_range in frame_ranges:
|
|
197
|
-
if len(frame_range) != 2:
|
|
198
|
-
continue # Skip invalid frame ranges
|
|
199
|
-
|
|
200
|
-
start_frame, end_frame = frame_range # Raw frame indices from DB
|
|
201
|
-
start_time = start_frame / fps # Convert frame index to seconds
|
|
202
|
-
end_time = end_frame / fps # Convert frame index to seconds
|
|
203
|
-
|
|
204
|
-
frame_data = {} # Store frame-wise info
|
|
205
|
-
|
|
206
|
-
# Fetch predictions for frames within this range
|
|
207
|
-
for frame_num in range(start_frame, end_frame + 1):
|
|
208
|
-
if (
|
|
209
|
-
0 <= frame_num < len(readable_predictions)
|
|
210
|
-
): # Ensure index is valid
|
|
211
|
-
frame_filename = f"frame_{str(frame_num).zfill(7)}.jpg" # Frame filename format
|
|
212
|
-
frame_path = (
|
|
213
|
-
frame_dir / frame_filename
|
|
214
|
-
) # Full path to the frame
|
|
215
|
-
|
|
216
|
-
frame_data[frame_num] = {
|
|
217
|
-
"frame_filename": frame_filename,
|
|
218
|
-
"frame_file_path": str(frame_path),
|
|
219
|
-
"predictions": readable_predictions[frame_num],
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
# Store frame-wise predictions in frame_predictions
|
|
223
|
-
frame_predictions[frame_num] = readable_predictions[frame_num]
|
|
224
|
-
|
|
225
|
-
# Append the converted time segment
|
|
226
|
-
label_times.append(
|
|
227
|
-
{
|
|
228
|
-
"segment_start": start_frame, # Raw start frame (not divided by FPS)
|
|
229
|
-
"segment_end": end_frame, # Raw end frame (not divided by FPS)
|
|
230
|
-
"start_time": round(
|
|
231
|
-
start_time, 2
|
|
232
|
-
), # Converted start time in seconds
|
|
233
|
-
"end_time": round(end_time, 2), # Converted end time in seconds
|
|
234
|
-
"frames": frame_data, # Attach frame details
|
|
235
|
-
}
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
# Store time segments and frame_predictions under the label
|
|
239
|
-
time_segments[label] = {
|
|
240
|
-
"time_ranges": label_times,
|
|
241
|
-
"frame_predictions": frame_predictions, # Ensure frame_predictions is correctly assigned
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return time_segments
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
class VideoListSerializer(serializers.ModelSerializer):
|
|
248
|
-
"""
|
|
249
|
-
Minimal serializer to return only `id` and `original_file_name`
|
|
250
|
-
for the video selection dropdown in Vue.js.
|
|
251
|
-
"""
|
|
252
|
-
|
|
253
|
-
class Meta:
|
|
254
|
-
model = RawVideoFile
|
|
255
|
-
fields = ["id", "original_file_name"] # Only fetch required fields
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
from pathlib import Path
|
|
259
|
-
from rest_framework import serializers
|
|
260
|
-
from django.http import FileResponse, Http404, StreamingHttpResponse
|
|
261
|
-
from ..models import (
|
|
262
|
-
RawVideoFile,
|
|
263
|
-
Label,
|
|
264
|
-
LabelRawVideoSegment,
|
|
265
|
-
) # Importing necessary models
|
|
266
|
-
import subprocess
|
|
267
|
-
from django.conf import settings
|
|
268
|
-
from django.db.models import Q # Import Q for better querying
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
class LabelSerializer(serializers.ModelSerializer):
|
|
272
|
-
"""
|
|
273
|
-
Serializer for fetching labels from the `endoreg_db_label` table.
|
|
274
|
-
Includes `id` (for backend processing) and `name` (for dropdown display in Vue.js).
|
|
275
|
-
"""
|
|
276
|
-
|
|
277
|
-
class Meta:
|
|
278
|
-
model = Label
|
|
279
|
-
fields = ["id", "name"]
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
class LabelSegmentSerializer(serializers.ModelSerializer):
|
|
283
|
-
"""
|
|
284
|
-
Serializer for retrieving label segments from `endoreg_db_labelrawvideosegment`.
|
|
285
|
-
"""
|
|
286
|
-
|
|
287
|
-
class Meta:
|
|
288
|
-
model = LabelRawVideoSegment
|
|
289
|
-
fields = [
|
|
290
|
-
"id",
|
|
291
|
-
"video_id",
|
|
292
|
-
"label_id",
|
|
293
|
-
"start_frame_number",
|
|
294
|
-
"end_frame_number",
|
|
295
|
-
]
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
from django.db import transaction
|
|
299
|
-
|
|
300
|
-
from django.db import transaction
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
class LabelSegmentUpdateSerializer(serializers.Serializer):
|
|
304
|
-
"""
|
|
305
|
-
Serializer for updating label segments.
|
|
306
|
-
|
|
307
|
-
- Ensures that the segments stored in the database match exactly with what is sent from the frontend.
|
|
308
|
-
- Updates existing segments if their `start_frame_number` matches but `end_frame_number` has changed.
|
|
309
|
-
- Inserts new segments if they are not already present in the database.
|
|
310
|
-
- Deletes extra segments from the database if they are no longer in the frontend data.
|
|
311
|
-
"""
|
|
312
|
-
|
|
313
|
-
video_id = serializers.IntegerField()
|
|
314
|
-
label_id = serializers.IntegerField()
|
|
315
|
-
segments = serializers.ListField(
|
|
316
|
-
child=serializers.DictField(
|
|
317
|
-
child=serializers.FloatField() # Ensure we handle float values
|
|
318
|
-
)
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
def validate(self, data):
|
|
322
|
-
"""
|
|
323
|
-
Validates that all required segment fields are provided correctly.
|
|
324
|
-
|
|
325
|
-
- Ensures that each segment contains `start_frame_number` and `end_frame_number`.
|
|
326
|
-
- Validates that `start_frame_number` is always less than or equal to `end_frame_number`.
|
|
327
|
-
"""
|
|
328
|
-
if not data.get("segments"):
|
|
329
|
-
raise serializers.ValidationError("No segments provided.")
|
|
330
|
-
|
|
331
|
-
for segment in data["segments"]:
|
|
332
|
-
if "start_frame_number" not in segment or "end_frame_number" not in segment:
|
|
333
|
-
raise serializers.ValidationError(
|
|
334
|
-
"Each segment must have `start_frame_number` and `end_frame_number`."
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
if segment["start_frame_number"] > segment["end_frame_number"]:
|
|
338
|
-
raise serializers.ValidationError(
|
|
339
|
-
"Start frame must be less than or equal to end frame."
|
|
340
|
-
)
|
|
341
|
-
|
|
342
|
-
return data
|
|
343
|
-
|
|
344
|
-
def save(self):
|
|
345
|
-
"""
|
|
346
|
-
Synchronizes label segments with updated frontend data.
|
|
347
|
-
|
|
348
|
-
This method compares the incoming segments with the current database entries for a given video and label.
|
|
349
|
-
It updates segments with modified end frame numbers, inserts new segments, and deletes existing segments
|
|
350
|
-
that are not present in the provided data. All operations are performed within a transaction to ensure
|
|
351
|
-
database consistency. A validation error is raised if no prediction metadata is found for the video.
|
|
352
|
-
|
|
353
|
-
Returns:
|
|
354
|
-
dict: A dictionary containing serialized updated segments, serialized new segments, and the count
|
|
355
|
-
of deleted segments.
|
|
356
|
-
"""
|
|
357
|
-
|
|
358
|
-
video_id = self.validated_data["video_id"]
|
|
359
|
-
label_id = self.validated_data["label_id"]
|
|
360
|
-
new_segments = self.validated_data["segments"]
|
|
361
|
-
|
|
362
|
-
# Fetch the correct `prediction_meta_id` based on `video_id`
|
|
363
|
-
prediction_meta_entry = RawVideoPredictionMeta.objects.filter(
|
|
364
|
-
video_id=video_id
|
|
365
|
-
).first()
|
|
366
|
-
if not prediction_meta_entry:
|
|
367
|
-
raise serializers.ValidationError(
|
|
368
|
-
{"error": "No prediction metadata found for this video."}
|
|
369
|
-
)
|
|
370
|
-
|
|
371
|
-
prediction_meta_id = (
|
|
372
|
-
prediction_meta_entry.id
|
|
373
|
-
) # Get the correct prediction_meta_id
|
|
374
|
-
|
|
375
|
-
existing_segments = LabelRawVideoSegment.objects.filter(
|
|
376
|
-
video_id=video_id, label_id=label_id
|
|
377
|
-
)
|
|
378
|
-
|
|
379
|
-
# Convert existing segments into a dictionary for quick lookup
|
|
380
|
-
# Key format: (start_frame_number, end_frame_number)
|
|
381
|
-
existing_segments_dict = {
|
|
382
|
-
(float(seg.start_frame_number), float(seg.end_frame_number)): seg
|
|
383
|
-
for seg in existing_segments
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
# Prepare lists for batch processing
|
|
387
|
-
updated_segments = [] # Stores segments that need to be updated
|
|
388
|
-
new_entries = [] # Stores segments that need to be created
|
|
389
|
-
existing_keys = set(
|
|
390
|
-
existing_segments_dict.keys()
|
|
391
|
-
) # Existing database segment keys
|
|
392
|
-
new_keys = set(
|
|
393
|
-
(float(seg["start_frame_number"]), float(seg["end_frame_number"]))
|
|
394
|
-
for seg in new_segments
|
|
395
|
-
) # New frontend segment keys
|
|
396
|
-
|
|
397
|
-
# Start a transaction to ensure database consistency
|
|
398
|
-
updated_segments = []
|
|
399
|
-
new_entries = []
|
|
400
|
-
existing_keys = set(existing_segments_dict.keys())
|
|
401
|
-
new_keys = set(
|
|
402
|
-
(float(seg["start_frame_number"]), float(seg["end_frame_number"]))
|
|
403
|
-
for seg in new_segments
|
|
404
|
-
)
|
|
405
|
-
|
|
406
|
-
print(f" Before Update: Found {existing_segments.count()} existing segments.")
|
|
407
|
-
print(f" New Segments Received: {len(new_segments)}")
|
|
408
|
-
print(f" Using prediction_meta_id: {prediction_meta_id}")
|
|
409
|
-
|
|
410
|
-
with transaction.atomic():
|
|
411
|
-
for segment in new_segments:
|
|
412
|
-
start_frame = float(segment["start_frame_number"])
|
|
413
|
-
end_frame = float(segment["end_frame_number"])
|
|
414
|
-
|
|
415
|
-
if (start_frame, end_frame) in existing_keys:
|
|
416
|
-
# If segment with exact start_frame and end_frame already exists, no change is needed
|
|
417
|
-
continue
|
|
418
|
-
else:
|
|
419
|
-
# Check if a segment exists with the same start_frame but different end_frame
|
|
420
|
-
existing_segment = LabelRawVideoSegment.objects.filter(
|
|
421
|
-
video_id=video_id,
|
|
422
|
-
label_id=label_id,
|
|
423
|
-
start_frame_number=start_frame,
|
|
424
|
-
).first()
|
|
425
|
-
|
|
426
|
-
if existing_segment:
|
|
427
|
-
# If a segment with the same start_frame exists but the end_frame is different, update it
|
|
428
|
-
if float(existing_segment.end_frame_number) != end_frame:
|
|
429
|
-
existing_segment.end_frame_number = end_frame
|
|
430
|
-
existing_segment.save()
|
|
431
|
-
updated_segments.append(existing_segment)
|
|
432
|
-
else:
|
|
433
|
-
# If no existing segment matches, create a new one
|
|
434
|
-
new_entries.append(
|
|
435
|
-
LabelRawVideoSegment(
|
|
436
|
-
video_id=video_id,
|
|
437
|
-
label_id=label_id,
|
|
438
|
-
start_frame_number=start_frame,
|
|
439
|
-
end_frame_number=end_frame,
|
|
440
|
-
)
|
|
441
|
-
)
|
|
442
|
-
print(
|
|
443
|
-
f" Adding new segment: Start {start_frame} → End {end_frame}"
|
|
444
|
-
)
|
|
445
|
-
new_entries.append(
|
|
446
|
-
LabelRawVideoSegment(
|
|
447
|
-
video_id=video_id,
|
|
448
|
-
label_id=label_id,
|
|
449
|
-
start_frame_number=start_frame,
|
|
450
|
-
end_frame_number=end_frame,
|
|
451
|
-
prediction_meta_id=prediction_meta_id, # Assign correct prediction_meta_id
|
|
452
|
-
)
|
|
453
|
-
)
|
|
454
|
-
|
|
455
|
-
# Delete segments that are no longer present in the frontend data
|
|
456
|
-
segments_to_delete = existing_segments.exclude(
|
|
457
|
-
start_frame_number__in=[
|
|
458
|
-
float(seg["start_frame_number"]) for seg in new_segments
|
|
459
|
-
]
|
|
460
|
-
)
|
|
461
|
-
deleted_count = segments_to_delete.count()
|
|
462
|
-
segments_to_delete.delete()
|
|
463
|
-
|
|
464
|
-
# Insert new segments in bulk for efficiency
|
|
465
|
-
if new_entries:
|
|
466
|
-
LabelRawVideoSegment.objects.bulk_create(new_entries)
|
|
467
|
-
|
|
468
|
-
# Return the updated, new, and deleted segment information
|
|
469
|
-
print(
|
|
470
|
-
"------------------------------,",
|
|
471
|
-
updated_segments,
|
|
472
|
-
"-----------------------",
|
|
473
|
-
new_segments,
|
|
474
|
-
"_-------",
|
|
475
|
-
deleted_count,
|
|
476
|
-
)
|
|
477
|
-
print(
|
|
478
|
-
f" After Update: Updated {len(updated_segments)} segments, Added {len(new_entries)}, Deleted {deleted_count}"
|
|
479
|
-
)
|
|
480
|
-
|
|
481
|
-
return {
|
|
482
|
-
"updated_segments": LabelSegmentSerializer(
|
|
483
|
-
updated_segments, many=True
|
|
484
|
-
).data,
|
|
485
|
-
"new_segments": LabelSegmentSerializer(new_entries, many=True).data,
|
|
486
|
-
"deleted_segments": deleted_count,
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
# Use StreamingHttpResponse to stream FFmpeg output to browser
|
|
490
|
-
# return StreamingHttpResponse(subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE).stdout, content_type="video/mp4")
|
|
491
|
-
|
|
492
|
-
# Ensure the path exists before returning
|
|
493
|
-
# return str(full_path) if full_path.exists() else None
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
''' def get_classification_data(self, obj):
|
|
497
|
-
"""
|
|
498
|
-
Returns binary classification data in a **scalable** way.
|
|
499
|
-
Currently hardcoded for testing, but can later integrate a model.
|
|
500
|
-
"""
|
|
501
|
-
classifications = [
|
|
502
|
-
{
|
|
503
|
-
"label": "OUTSIDE",
|
|
504
|
-
"start_time": 0.1,
|
|
505
|
-
"end_time": 19,
|
|
506
|
-
"confidence": 0.85, # Hardcoded but has to - dynamically computed
|
|
507
|
-
},
|
|
508
|
-
|
|
509
|
-
{
|
|
510
|
-
"label": "Needle",
|
|
511
|
-
"start_time": 36,
|
|
512
|
-
"end_time": 141,
|
|
513
|
-
"confidence": 0.95, # Hardcoded but has to - dynamically computed
|
|
514
|
-
},
|
|
515
|
-
{
|
|
516
|
-
"label": "Kolonpolyp",
|
|
517
|
-
"start_time": 91,
|
|
518
|
-
"end_time": 126,
|
|
519
|
-
"confidence": 0.89, # Hardcoded but has to - dynamically computed
|
|
520
|
-
}
|
|
521
|
-
]
|
|
522
|
-
|
|
523
|
-
return classifications'''
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
"""
|
|
527
|
-
await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
|
|
528
|
-
const videoId = 1;
|
|
529
|
-
axios.get(`http://localhost:8000/api/video/${videoId}/`, {
|
|
530
|
-
headers: {
|
|
531
|
-
'Accept': 'application/json' }
|
|
532
|
-
})
|
|
533
|
-
.then(response => {
|
|
534
|
-
console.log("Video Metadata:", response.data);
|
|
535
|
-
|
|
536
|
-
const videoUrl = response.data.video_url;
|
|
537
|
-
|
|
538
|
-
const videoElement = document.createElement("video");
|
|
539
|
-
videoElement.src = videoUrl;
|
|
540
|
-
videoElement.controls = true;
|
|
541
|
-
videoElement.width = 600;
|
|
542
|
-
document.body.appendChild(videoElement);
|
|
543
|
-
})
|
|
544
|
-
.catch(error => {
|
|
545
|
-
console.error("Error Fetching Video:", error.response ? error.response.data : error);
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
|
|
549
|
-
|
|
550
|
-
const videoIdUpdate = 1; // Change to actual video ID
|
|
551
|
-
const labelIdUpdate = 15; // Change to actual label ID
|
|
552
|
-
|
|
553
|
-
const updatedSegments = {
|
|
554
|
-
video_id: videoIdUpdate,
|
|
555
|
-
label_id: labelIdUpdate,
|
|
556
|
-
segments: [
|
|
557
|
-
{ start_frame_number: 1, end_frame_number: 15 } // Updated end_frame (was 10)
|
|
558
|
-
// New segment
|
|
559
|
-
]
|
|
560
|
-
};
|
|
561
|
-
|
|
562
|
-
axios.put(`http://localhost:8000/api/video/${videoIdUpdate}/label/${labelIdUpdate}/update_segments/`, updatedSegments, {
|
|
563
|
-
headers: {
|
|
564
|
-
'Accept': 'application/json',
|
|
565
|
-
'Content-Type': 'application/json'
|
|
566
|
-
}
|
|
567
|
-
})
|
|
568
|
-
.then(response => {
|
|
569
|
-
console.log(" Segments Updated Successfully:", response.data);
|
|
570
|
-
})
|
|
571
|
-
.catch(error => {
|
|
572
|
-
console.error(" Error Updating Segments:", error.response ? error.response.data : error);
|
|
573
|
-
});
|
|
574
|
-
""" ""
|
endoreg_db/tests.py
DELETED