endoreg-db 0.4.5__py3-none-any.whl → 0.8.6.3__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.
- endoreg_db/admin.py +90 -1
- 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 +76 -4
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/center/data.yaml +40 -9
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/misc.yaml +1 -2
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +24 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
- endoreg_db/data/lab_value/coagulation.yaml +6 -1
- endoreg_db/data/lab_value/electrolytes.yaml +39 -1
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
- endoreg_db/data/lab_value/hematology.yaml +17 -2
- endoreg_db/data/lab_value/hormones.yaml +6 -0
- endoreg_db/data/lab_value/lipids.yaml +12 -3
- endoreg_db/data/lab_value/misc.yaml +48 -2
- endoreg_db/data/lab_value/renal_function.yaml +2 -1
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +48 -53
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +30 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/pdf_type/data.yaml +27 -9
- 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-examination-generic.yaml +4 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/__init__.py +3 -1
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -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 +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +58 -26
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +174 -118
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/{load_logging_data.py → load_contraindication_data.py} +4 -2
- endoreg_db/management/commands/load_disease_data.py +29 -7
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +30 -7
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_lab_value_data.py +3 -3
- endoreg_db/management/commands/load_medication_data.py +83 -21
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_organ_data.py} +7 -5
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/register_ai_model.py +1 -1
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1234 -944
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +339 -53
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +19 -4
- 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}/__init__.py +10 -1
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +60 -16
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +6 -13
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +21 -8
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +9 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{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/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +21 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +44 -13
- 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 +53 -54
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +68 -29
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +68 -22
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +32 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -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 +36 -1
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +14 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +15 -3
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/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 +118 -10
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -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/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/serializers/video_examination.py +198 -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 +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -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 +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -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 +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +118 -35
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +123 -4
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +274 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +187 -0
- endoreg_db/views/pdf/reimport.py +177 -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 +367 -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 +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -3
- endoreg_db-0.8.6.3.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.3.dist-info/RECORD +793 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info}/WHEEL +1 -1
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.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/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- 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_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
- endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
- endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
- endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -3
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- 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 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/logging/__init__.py +0 -4
- 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 -24
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/network/__init__.py +0 -3
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -53
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- 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 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.4.5.dist-info/METADATA +0 -34
- endoreg_db-0.4.5.dist-info/RECORD +0 -316
- /endoreg_db/{data/distribution/numeric/.init → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{models/persons/patient/case/__init__.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → config/__init__.py} +0 -0
- /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
- /endoreg_db/data/{model_type → ai_model_type}/data.yaml +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/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info/licenses}/LICENSE +0 -0
|
@@ -1,10 +1,118 @@
|
|
|
1
|
-
from .
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
from .
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
from .administration import (
|
|
2
|
+
ActiveModelSerializer,
|
|
3
|
+
AiModelSerializer,
|
|
4
|
+
CenterSerializer,
|
|
5
|
+
GenderSerializer,
|
|
6
|
+
ModelTypeSerializer,
|
|
7
|
+
)
|
|
8
|
+
from .examination import (
|
|
9
|
+
ExaminationDropdownSerializer,
|
|
10
|
+
ExaminationSerializer,
|
|
11
|
+
ExaminationTypeSerializer,
|
|
12
|
+
)
|
|
13
|
+
from .finding import FindingSerializer
|
|
14
|
+
from .finding_classification import (
|
|
15
|
+
FindingClassificationChoiceSerializer,
|
|
16
|
+
FindingClassificationSerializer,
|
|
17
|
+
)
|
|
18
|
+
from .label import ImageClassificationAnnotationSerializer, LabelSerializer
|
|
19
|
+
from .label_video_segment import (
|
|
20
|
+
LabelVideoSegmentAnnotationSerializer,
|
|
21
|
+
LabelVideoSegmentSerializer,
|
|
22
|
+
)
|
|
23
|
+
from .meta import (
|
|
24
|
+
PDFFileForMetaSerializer,
|
|
25
|
+
ReportMetaSerializer,
|
|
26
|
+
SensitiveMetaDetailSerializer,
|
|
27
|
+
SensitiveMetaUpdateSerializer,
|
|
28
|
+
SensitiveMetaVerificationSerializer,
|
|
29
|
+
VideoMetaSerializer,
|
|
30
|
+
)
|
|
31
|
+
from .misc import (
|
|
32
|
+
FileOverviewSerializer,
|
|
33
|
+
StatsSerializer,
|
|
34
|
+
TranslatableFieldMixin,
|
|
35
|
+
UploadCreateResponseSerializer,
|
|
36
|
+
UploadJobStatusSerializer,
|
|
37
|
+
VoPPatientDataSerializer,
|
|
38
|
+
)
|
|
39
|
+
from .patient import PatientDropdownSerializer, PatientSerializer
|
|
40
|
+
from .patient_examination import PatientExaminationSerializer
|
|
41
|
+
from .patient_finding import (
|
|
42
|
+
PatientFindingClassificationSerializer,
|
|
43
|
+
PatientFindingDetailSerializer,
|
|
44
|
+
PatientFindingInterventionSerializer,
|
|
45
|
+
PatientFindingListSerializer,
|
|
46
|
+
PatientFindingSerializer,
|
|
47
|
+
PatientFindingWriteSerializer,
|
|
48
|
+
)
|
|
49
|
+
from .pdf import RawPdfAnonyTextSerializer
|
|
50
|
+
from .report import ReportDataSerializer, ReportListSerializer, SecureFileUrlSerializer
|
|
51
|
+
from .video.video_metadata import VideoMetadataSerializer
|
|
52
|
+
from .video.video_processing_history import VideoProcessingHistorySerializer
|
|
53
|
+
from .video_examination import (
|
|
54
|
+
VideoExaminationCreateSerializer,
|
|
55
|
+
VideoExaminationSerializer,
|
|
56
|
+
VideoExaminationUpdateSerializer,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
__all__ = [
|
|
60
|
+
# Administration
|
|
61
|
+
"CenterSerializer",
|
|
62
|
+
"GenderSerializer",
|
|
63
|
+
"ActiveModelSerializer",
|
|
64
|
+
"ModelTypeSerializer",
|
|
65
|
+
"AiModelSerializer",
|
|
66
|
+
# Examination
|
|
67
|
+
"ExaminationSerializer",
|
|
68
|
+
"ExaminationTypeSerializer",
|
|
69
|
+
"ExaminationDropdownSerializer",
|
|
70
|
+
# Finding
|
|
71
|
+
"FindingSerializer",
|
|
72
|
+
"FindingClassificationSerializer",
|
|
73
|
+
"FindingClassificationChoiceSerializer",
|
|
74
|
+
"LabelSerializer",
|
|
75
|
+
"ImageClassificationAnnotationSerializer",
|
|
76
|
+
# LabelVideoSegment
|
|
77
|
+
"LabelVideoSegmentSerializer",
|
|
78
|
+
"LabelVideoSegmentAnnotationSerializer",
|
|
79
|
+
# Meta
|
|
80
|
+
"PDFFileForMetaSerializer",
|
|
81
|
+
"ReportMetaSerializer",
|
|
82
|
+
"SensitiveMetaDetailSerializer",
|
|
83
|
+
"SensitiveMetaUpdateSerializer",
|
|
84
|
+
"SensitiveMetaVerificationSerializer",
|
|
85
|
+
"VideoMetaSerializer",
|
|
86
|
+
# Misc
|
|
87
|
+
"FileOverviewSerializer",
|
|
88
|
+
"VoPPatientDataSerializer",
|
|
89
|
+
"StatsSerializer",
|
|
90
|
+
"UploadJobStatusSerializer",
|
|
91
|
+
"UploadCreateResponseSerializer",
|
|
92
|
+
"TranslatableFieldMixin",
|
|
93
|
+
# Patient
|
|
94
|
+
"PatientSerializer",
|
|
95
|
+
"PatientDropdownSerializer",
|
|
96
|
+
# Patient Examination
|
|
97
|
+
"PatientExaminationSerializer",
|
|
98
|
+
# Patient Finding
|
|
99
|
+
"PatientFindingSerializer",
|
|
100
|
+
"PatientFindingClassificationSerializer",
|
|
101
|
+
"PatientFindingDetailSerializer",
|
|
102
|
+
"PatientFindingInterventionSerializer",
|
|
103
|
+
"PatientFindingListSerializer",
|
|
104
|
+
"PatientFindingWriteSerializer",
|
|
105
|
+
# PDF
|
|
106
|
+
"RawPdfAnonyTextSerializer",
|
|
107
|
+
# Report
|
|
108
|
+
"ReportListSerializer",
|
|
109
|
+
"ReportDataSerializer",
|
|
110
|
+
"SecureFileUrlSerializer",
|
|
111
|
+
# Video Correction (Phase 1.1)
|
|
112
|
+
"VideoMetadataSerializer",
|
|
113
|
+
"VideoProcessingHistorySerializer",
|
|
114
|
+
# Video Examination
|
|
115
|
+
"VideoExaminationSerializer",
|
|
116
|
+
"VideoExaminationCreateSerializer",
|
|
117
|
+
"VideoExaminationUpdateSerializer",
|
|
118
|
+
]
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
#from ...models import RawPdfFile, SensitiveMeta
|
|
5
|
+
from endoreg_db.models import RawPdfFile, SensitiveMeta
|
|
6
|
+
|
|
7
|
+
class PDFFileForMetaSerializer(serializers.ModelSerializer):
|
|
8
|
+
"""
|
|
9
|
+
Serializer to fetch PDF metadata along with linked `SensitiveMeta` details.
|
|
10
|
+
Implements validation and ensures Vue.js can process errors easily.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# Fetch patient details from `SensitiveMeta`
|
|
14
|
+
patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
|
|
15
|
+
patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
|
|
16
|
+
patient_dob = serializers.CharField(source="sensitive_meta.patient_dob", read_only=True)
|
|
17
|
+
examination_date = serializers.CharField(source="sensitive_meta.examination_date", read_only=True)
|
|
18
|
+
|
|
19
|
+
# PDF file URL where Vue.js can fetch the document
|
|
20
|
+
pdf_url = serializers.SerializerMethodField()
|
|
21
|
+
|
|
22
|
+
# Full absolute path of the PDF file
|
|
23
|
+
full_pdf_path = serializers.SerializerMethodField()
|
|
24
|
+
|
|
25
|
+
# Direct file path from the database
|
|
26
|
+
file = serializers.SerializerMethodField()
|
|
27
|
+
|
|
28
|
+
class Meta:
|
|
29
|
+
model = RawPdfFile
|
|
30
|
+
fields = ['id', 'file', 'pdf_url', 'full_pdf_path',
|
|
31
|
+
'sensitive_meta_id', 'patient_first_name',
|
|
32
|
+
'patient_last_name', 'patient_dob', 'examination_date']
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def get_next_pdf(last_id=None):
|
|
36
|
+
"""
|
|
37
|
+
Retrieves the first available PDF if `last_id` is NOT provided.
|
|
38
|
+
Otherwise, fetches the next available PDF where `id > last_id`.
|
|
39
|
+
"""
|
|
40
|
+
query_filter = {} if last_id is None else {"id__gt": int(last_id)}
|
|
41
|
+
|
|
42
|
+
# Get the next available PDF
|
|
43
|
+
pdf_entry = RawPdfFile.objects.select_related("sensitive_meta").filter(**query_filter).order_by('id').first()
|
|
44
|
+
|
|
45
|
+
return pdf_entry # Returns a model instance or None
|
|
46
|
+
|
|
47
|
+
def get_pdf_url(self, obj):
|
|
48
|
+
"""
|
|
49
|
+
Generates the full URL for Vue.js to fetch and display the PDF.
|
|
50
|
+
"""
|
|
51
|
+
request = self.context.get('request')
|
|
52
|
+
print("---------------------here :",obj.file)
|
|
53
|
+
if request and obj.file:
|
|
54
|
+
return request.build_absolute_uri(f"/api/pdf/sensitivemeta/?id={obj.id}") # Constructs full API endpoint
|
|
55
|
+
return None # Return None if file is missing
|
|
56
|
+
|
|
57
|
+
def get_file(self, obj):
|
|
58
|
+
"""
|
|
59
|
+
Returns the relative file path stored in the database.
|
|
60
|
+
"""
|
|
61
|
+
if not obj.file:
|
|
62
|
+
return None # No file linked
|
|
63
|
+
return str(obj.file.name).strip() # Ensures clean output
|
|
64
|
+
|
|
65
|
+
def get_full_pdf_path(self, obj):
|
|
66
|
+
"""
|
|
67
|
+
Constructs the full absolute file path using `settings.MEDIA_ROOT`.
|
|
68
|
+
"""
|
|
69
|
+
if not obj.file:
|
|
70
|
+
return None # No file linked
|
|
71
|
+
|
|
72
|
+
pdf_relative_path = str(obj.file.name)
|
|
73
|
+
|
|
74
|
+
full_path = Path(settings.MEDIA_ROOT) / pdf_relative_path
|
|
75
|
+
|
|
76
|
+
return str(full_path) if full_path.exists() else None # Returns path or None if file is missing
|
|
77
|
+
|
|
78
|
+
def validate(self, data):
|
|
79
|
+
"""
|
|
80
|
+
Ensures that the PDF file is valid and has required fields.
|
|
81
|
+
"""
|
|
82
|
+
errors = {}
|
|
83
|
+
|
|
84
|
+
if 'file' in data and not data['file']:
|
|
85
|
+
errors['file'] = "A valid PDF file is required."
|
|
86
|
+
|
|
87
|
+
if 'sensitive_meta_id' in data and not SensitiveMeta.objects.filter(id=data['sensitive_meta_id']).exists():
|
|
88
|
+
errors['sensitive_meta_id'] = "The provided sensitive_meta_id does not exist."
|
|
89
|
+
|
|
90
|
+
if errors:
|
|
91
|
+
raise serializers.ValidationError(errors) # Returns structured error response
|
|
92
|
+
|
|
93
|
+
return data # Returns validated data
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
from rest_framework import serializers
|
|
97
|
+
#from ..models import SensitiveMeta
|
|
98
|
+
|
|
99
|
+
class SensitiveMetaUpdateSerializer(serializers.ModelSerializer):
|
|
100
|
+
"""
|
|
101
|
+
Serializer for updating patient details in the `SensitiveMeta` table.
|
|
102
|
+
Allows partial updates.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
sensitive_meta_id = serializers.IntegerField(write_only=True) # Needed for lookup, not included in response
|
|
106
|
+
|
|
107
|
+
class Meta:
|
|
108
|
+
model = SensitiveMeta
|
|
109
|
+
fields = ['sensitive_meta_id', 'patient_first_name', 'patient_last_name', 'patient_dob', 'examination_date']
|
|
110
|
+
|
|
111
|
+
def validate(self, data):
|
|
112
|
+
"""
|
|
113
|
+
Ensures valid input before updating.
|
|
114
|
+
"""
|
|
115
|
+
errors = {}
|
|
116
|
+
|
|
117
|
+
if 'patient_first_name' in data and (not data['patient_first_name'].strip()):
|
|
118
|
+
errors['patient_first_name'] = "First name cannot be empty."
|
|
119
|
+
|
|
120
|
+
if 'patient_last_name' in data and (not data['patient_last_name'].strip()):
|
|
121
|
+
errors['patient_last_name'] = "Last name cannot be empty."
|
|
122
|
+
|
|
123
|
+
if 'patient_dob' in data and not data['patient_dob']:
|
|
124
|
+
errors['patient_dob'] = "Date of birth is required."
|
|
125
|
+
|
|
126
|
+
if 'examination_date' in data and not data['examination_date']:
|
|
127
|
+
errors['examination_date'] = "Examination date is required."
|
|
128
|
+
|
|
129
|
+
if errors:
|
|
130
|
+
raise serializers.ValidationError(errors)
|
|
131
|
+
|
|
132
|
+
return data
|
|
133
|
+
|
|
134
|
+
def update(self, instance, validated_data):
|
|
135
|
+
"""
|
|
136
|
+
Updates only the provided fields dynamically.
|
|
137
|
+
"""
|
|
138
|
+
validated_data.pop("sensitive_meta_id", None) # Remove ID before updating
|
|
139
|
+
|
|
140
|
+
for attr, value in validated_data.items():
|
|
141
|
+
setattr(instance, attr, value) # Dynamically update fields
|
|
142
|
+
|
|
143
|
+
instance.save()
|
|
144
|
+
return instance
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
"""
|
|
149
|
+
await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
|
|
150
|
+
const fetchPdfMeta = async (lastId = 1) => {
|
|
151
|
+
const url = lastId
|
|
152
|
+
? `http://localhost:8000/api/pdf/sensitivemeta/?last_id=${lastId}`
|
|
153
|
+
: "http://localhost:8000/api/pdf/sensitivemeta/";
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
const response = await axios.get(url);
|
|
157
|
+
console.log("PDF Metadata:", response.data);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error("Error fetching PDFs:", error.response?.data || error);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
fetchPdfMeta(); // Fetch the first available PDF
|
|
164
|
+
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
"""with header response"""
|
|
168
|
+
"""
|
|
169
|
+
await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
|
|
170
|
+
|
|
171
|
+
const fetchPdfMeta = async (lastId = 1) => {
|
|
172
|
+
const url = lastId
|
|
173
|
+
? `http://localhost:8000/api/pdf/sensitivemeta/?last_id=${lastId}`
|
|
174
|
+
: "http://localhost:8000/api/pdf/sensitivemeta/";
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const response = await axios.get(url, {
|
|
178
|
+
headers: {
|
|
179
|
+
"Accept": "application/json"
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
console.log("PDF Metadata (JSON Expected):", response.data);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
console.error("Error fetching PDFs:", error.response?.data || error);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
fetchPdfMeta();
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
"""
|
|
194
|
+
await import('https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js');
|
|
195
|
+
|
|
196
|
+
const updatePatientInfo = async () => {
|
|
197
|
+
const updatedData = {
|
|
198
|
+
sensitive_meta_id: 1,
|
|
199
|
+
patient_first_name: "dummy value",
|
|
200
|
+
patient_last_name: "dummy value",
|
|
201
|
+
patient_dob: "1994-06-15",
|
|
202
|
+
examination_date: "2024-06-15"
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
try {
|
|
206
|
+
const response = await axios.patch("http://localhost:8000/api/pdf/update_sensitivemeta/", updatedData, {
|
|
207
|
+
headers: { "Content-Type": "application/json" }
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
console.log("Update Success:", response.data);
|
|
211
|
+
alert("Patient information updated successfully!");
|
|
212
|
+
|
|
213
|
+
return response.data;
|
|
214
|
+
} catch (error) {
|
|
215
|
+
console.error("Update Error:", error.response?.data || error);
|
|
216
|
+
alert("Failed to update patient information.");
|
|
217
|
+
return error.response?.data || { error: "Unknown error" };
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
updatePatientInfo().then(response => console.log("Final Response:", response));
|
|
222
|
+
|
|
223
|
+
"""
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
from ...models import VideoFile, SensitiveMeta
|
|
5
|
+
import cv2
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class VideoFileForMetaSerializer(serializers.ModelSerializer):
|
|
9
|
+
"""
|
|
10
|
+
Serializer to fetch video metadata along with linked `SensitiveMeta` details.
|
|
11
|
+
Ensures that Vue.js can properly access and play videos.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Fetch patient name and DOB from `SensitiveMeta` table
|
|
15
|
+
patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
|
|
16
|
+
patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
|
|
17
|
+
patient_dob = serializers.CharField(source="sensitive_meta.patient_dob", read_only=True)
|
|
18
|
+
examination_date = serializers.CharField(source="sensitive_meta.examination_date", read_only=True)
|
|
19
|
+
|
|
20
|
+
duration = serializers.SerializerMethodField()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# `video_url` generates the full URL where Vue.js can fetch & play the video
|
|
24
|
+
video_url = serializers.SerializerMethodField()
|
|
25
|
+
|
|
26
|
+
# `full_video_path` dynamically constructs the absolute path using MEDIA_ROOT
|
|
27
|
+
full_video_path = serializers.SerializerMethodField()
|
|
28
|
+
|
|
29
|
+
file = serializers.SerializerMethodField()
|
|
30
|
+
|
|
31
|
+
class Meta:
|
|
32
|
+
model = VideoFile
|
|
33
|
+
fields = ['id', 'original_file_name', 'file', 'video_url', 'full_video_path',
|
|
34
|
+
'sensitive_meta_id', 'patient_first_name', 'patient_last_name', 'patient_dob', 'examination_date','duration']
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def get_next_video(last_id=None):
|
|
38
|
+
"""
|
|
39
|
+
Fetches the first or next available video.
|
|
40
|
+
Returns a model instance if found, else returns None.
|
|
41
|
+
"""
|
|
42
|
+
query_filter = {} if last_id is None else {"id__gt": int(last_id)}
|
|
43
|
+
|
|
44
|
+
# Get next available video
|
|
45
|
+
video_entry = VideoFile.objects.select_related("sensitive_meta").filter(**query_filter).order_by('id').first()
|
|
46
|
+
|
|
47
|
+
return video_entry # Always return model instance or None
|
|
48
|
+
|
|
49
|
+
def get_video_url(self, obj):
|
|
50
|
+
"""
|
|
51
|
+
Returns the absolute URL for streaming the processed video file, or None if unavailable.
|
|
52
|
+
|
|
53
|
+
The URL includes an "api/" prefix and is constructed only if a request context and a processed video file are present.
|
|
54
|
+
"""
|
|
55
|
+
request = self.context.get('request')
|
|
56
|
+
if request and obj.processed_file:
|
|
57
|
+
print("---------------------------:",obj.processed_file)
|
|
58
|
+
return request.build_absolute_uri(f"/api/video/{obj.id}/") # Added api/ prefix
|
|
59
|
+
return None # Return None instead of an error dictionary
|
|
60
|
+
|
|
61
|
+
def get_file(self, obj):
|
|
62
|
+
"""
|
|
63
|
+
Returns the relative file path of the processed video, excluding the `/media/` prefix.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
The relative file path as a string if available, otherwise None.
|
|
67
|
+
"""
|
|
68
|
+
if not obj.processed_file:
|
|
69
|
+
return None # No file associated
|
|
70
|
+
|
|
71
|
+
video_relative_path = str(obj.processed_file.name).strip()
|
|
72
|
+
return video_relative_path if video_relative_path else None # Avoids errors if the file path is empty
|
|
73
|
+
|
|
74
|
+
def get_full_video_path(self, obj):
|
|
75
|
+
"""
|
|
76
|
+
Constructs the full absolute file path using `settings.MEDIA_ROOT`
|
|
77
|
+
and the `file` field from the database.
|
|
78
|
+
"""
|
|
79
|
+
if not obj.processed_file:
|
|
80
|
+
return None # No file associated
|
|
81
|
+
|
|
82
|
+
video_relative_path = str(obj.processed_file.name).strip()
|
|
83
|
+
full_path = Path(settings.MEDIA_ROOT) / video_relative_path
|
|
84
|
+
|
|
85
|
+
return str(full_path) if full_path.exists() else None # Return path or None if not found
|
|
86
|
+
|
|
87
|
+
def get_duration(self, obj):
|
|
88
|
+
"""
|
|
89
|
+
Returns the total duration of the video in seconds.
|
|
90
|
+
- If stored in the database, use it.
|
|
91
|
+
- Otherwise, calculate dynamically using OpenCV.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
# Step 1: Check if the `duration` field is already stored in the database.
|
|
95
|
+
if hasattr(obj, "duration") and obj.duration:
|
|
96
|
+
return obj.duration # If duration exists in the database, return it immediately.
|
|
97
|
+
|
|
98
|
+
# Step 2: Get the actual video file path
|
|
99
|
+
video_path = obj.processed_file.path if obj.processed_file else None # Extracts the file path if it exists
|
|
100
|
+
|
|
101
|
+
# Step 3: Validate if the file exists
|
|
102
|
+
if not video_path or not Path(video_path).exists():
|
|
103
|
+
return None # Return None if the file path is invalid or missing
|
|
104
|
+
|
|
105
|
+
# Step 4: Open the video file using OpenCV
|
|
106
|
+
cap = cv2.VideoCapture(video_path) # Load the video file
|
|
107
|
+
|
|
108
|
+
if not cap.isOpened():
|
|
109
|
+
return None # If OpenCV fails to open the video, return None (invalid or corrupted file)
|
|
110
|
+
|
|
111
|
+
# Step 5: Extract FPS (Frames Per Second)
|
|
112
|
+
fps = cap.get(cv2.CAP_PROP_FPS) # Get the number of frames per second
|
|
113
|
+
print("here is the fps------------", fps) # Debugging print to check FPS value
|
|
114
|
+
|
|
115
|
+
# Step 6: Get Total Number of Frames
|
|
116
|
+
total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) # Get the total number of frames in the video
|
|
117
|
+
|
|
118
|
+
# Step 7: Release the video file from OpenCV memory
|
|
119
|
+
cap.release() # Free up system memory
|
|
120
|
+
|
|
121
|
+
# Step 8: Calculate and Return Video Duration
|
|
122
|
+
return round(total_frames / fps, 2) if fps > 0 else None # Divide frames by FPS to get duration (seconds)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class SensitiveMetaUpdateSerializer(serializers.ModelSerializer):
|
|
128
|
+
"""
|
|
129
|
+
Serializer to update patient information in the `SensitiveMeta` table.
|
|
130
|
+
Handles validation and saves the data directly in the serializer.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
sensitive_meta_id = serializers.IntegerField(write_only=True) # Needed for lookup but not included in response
|
|
134
|
+
|
|
135
|
+
class Meta:
|
|
136
|
+
model = SensitiveMeta
|
|
137
|
+
fields = ['sensitive_meta_id', 'patient_first_name', 'patient_last_name', 'patient_dob', 'examination_date']
|
|
138
|
+
|
|
139
|
+
def validate(self, data):
|
|
140
|
+
"""
|
|
141
|
+
Validate input data before updating.
|
|
142
|
+
"""
|
|
143
|
+
errors = {}
|
|
144
|
+
|
|
145
|
+
# Ensure the SensitiveMeta ID exists
|
|
146
|
+
sensitive_meta_id = data.get("sensitive_meta_id")
|
|
147
|
+
if not SensitiveMeta.objects.filter(id=sensitive_meta_id).exists():
|
|
148
|
+
raise serializers.ValidationError({"sensitive_meta_id": "SensitiveMeta entry not found."})
|
|
149
|
+
|
|
150
|
+
# Validate each field separately
|
|
151
|
+
if 'patient_first_name' in data and (data['patient_first_name'] is None or data['patient_first_name'].strip() == ""):
|
|
152
|
+
errors['patient_first_name'] = "First name cannot be empty."
|
|
153
|
+
|
|
154
|
+
if 'patient_last_name' in data and (data['patient_last_name'] is None or data['patient_last_name'].strip() == ""):
|
|
155
|
+
errors['patient_last_name'] = "Last name cannot be empty."
|
|
156
|
+
|
|
157
|
+
if 'patient_dob' in data and not data['patient_dob']:
|
|
158
|
+
errors['patient_dob'] = "Date of birth is required."
|
|
159
|
+
|
|
160
|
+
if 'examination_date' in data and not data['examination_date']:
|
|
161
|
+
errors['examination_date'] = "Examination date is required."
|
|
162
|
+
|
|
163
|
+
if errors:
|
|
164
|
+
raise serializers.ValidationError(errors) # Raise errors before saving
|
|
165
|
+
|
|
166
|
+
return data
|
|
167
|
+
|
|
168
|
+
def update(self, instance, validated_data):
|
|
169
|
+
"""
|
|
170
|
+
Update the SensitiveMeta entry directly inside the serializer.
|
|
171
|
+
"""
|
|
172
|
+
# Remove `sensitive_meta_id` before updating
|
|
173
|
+
validated_data.pop("sensitive_meta_id", None)
|
|
174
|
+
|
|
175
|
+
for attr, value in validated_data.items():
|
|
176
|
+
setattr(instance, attr, value) # Set attributes dynamically
|
|
177
|
+
|
|
178
|
+
instance.save() # Save changes
|
|
179
|
+
return instance # Return updated instance
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from endoreg_db.models import VideoFile, VideoImportMeta, LabelVideoSegment, VideoMeta, SensitiveMeta
|
|
3
|
+
# serializers/video.py
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from rest_framework import serializers
|
|
6
|
+
from django.conf import settings
|
|
7
|
+
|
|
8
|
+
from .utils import calc_duration_seconds # wrap your OpenCV helper
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoBriefSer(serializers.ModelSerializer):
|
|
12
|
+
class Meta:
|
|
13
|
+
model = VideoFile
|
|
14
|
+
fields = ["id", "original_file_name", "sensitive_meta_id"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class VideoDetailSer(VideoBriefSer):
|
|
18
|
+
patient_first_name = serializers.CharField(source="sensitive_meta.patient_first_name", read_only=True)
|
|
19
|
+
patient_last_name = serializers.CharField(source="sensitive_meta.patient_last_name", read_only=True)
|
|
20
|
+
patient_dob = serializers.DateField (source="sensitive_meta.patient_dob", read_only=True)
|
|
21
|
+
examination_date = serializers.DateField (source="sensitive_meta.examination_date", read_only=True)
|
|
22
|
+
|
|
23
|
+
file = serializers.SerializerMethodField()
|
|
24
|
+
full_path = serializers.SerializerMethodField()
|
|
25
|
+
duration = serializers.SerializerMethodField()
|
|
26
|
+
video_url = serializers.SerializerMethodField()
|
|
27
|
+
|
|
28
|
+
class Meta(VideoBriefSer.Meta):
|
|
29
|
+
fields = VideoBriefSer.Meta.fields + [
|
|
30
|
+
"file", "full_path", "video_url",
|
|
31
|
+
"patient_first_name", "patient_last_name",
|
|
32
|
+
"patient_dob", "examination_date",
|
|
33
|
+
"duration",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
# helpers ----------------------------------------------------------
|
|
37
|
+
def get_file(self, obj):
|
|
38
|
+
f = obj.processed_file or obj.raw_file
|
|
39
|
+
return f.name if f else None
|
|
40
|
+
|
|
41
|
+
def get_full_path(self, obj):
|
|
42
|
+
f = obj.processed_file or obj.raw_file
|
|
43
|
+
return str(Path(settings.MEDIA_ROOT) / f.name) if f else None
|
|
44
|
+
|
|
45
|
+
def get_video_url(self, obj):
|
|
46
|
+
req = self.context.get("request")
|
|
47
|
+
return req.build_absolute_uri(f"/api/media/videos/{obj.pk}/") if req else None
|
|
48
|
+
|
|
49
|
+
def get_duration(self, obj):
|
|
50
|
+
return obj.duration or calc_duration_seconds(obj)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SensitiveMetaUpdateSer(serializers.ModelSerializer):
|
|
54
|
+
sensitive_meta_id = serializers.IntegerField(write_only=True)
|
|
55
|
+
|
|
56
|
+
class Meta:
|
|
57
|
+
model = SensitiveMeta
|
|
58
|
+
fields = ["sensitive_meta_id", "patient_first_name",
|
|
59
|
+
"patient_last_name", "patient_dob", "examination_date"]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class VideoImportMetaSerializer(serializers.ModelSerializer):
|
|
63
|
+
class Meta:
|
|
64
|
+
model = VideoImportMeta
|
|
65
|
+
fields = "__all__"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class LabelVideoSegmentSerializer(serializers.ModelSerializer):
|
|
69
|
+
class Meta:
|
|
70
|
+
model = LabelVideoSegment
|
|
71
|
+
fields = "__all__"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from .center import CenterSerializer
|
|
2
|
+
from .gender import GenderSerializer
|
|
3
|
+
from .ai import ActiveModelSerializer, ModelTypeSerializer, AiModelSerializer
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
# AI
|
|
7
|
+
"ActiveModelSerializer",
|
|
8
|
+
"ModelTypeSerializer",
|
|
9
|
+
"AiModelSerializer",
|
|
10
|
+
|
|
11
|
+
# Misc
|
|
12
|
+
"CenterSerializer",
|
|
13
|
+
"GenderSerializer",
|
|
14
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from endoreg_db.models import AiModel, ModelType
|
|
3
|
+
|
|
4
|
+
class AiModelSerializer(serializers.ModelSerializer):
|
|
5
|
+
"""
|
|
6
|
+
Serializer for the AiModel model.
|
|
7
|
+
Handles 'model_type' relationship by its name.
|
|
8
|
+
"""
|
|
9
|
+
model_type = serializers.SlugRelatedField(
|
|
10
|
+
queryset=ModelType.objects.all(),
|
|
11
|
+
slug_field='name',
|
|
12
|
+
allow_null=True, # Match model field definition
|
|
13
|
+
required=False # Match model field definition (blank=True)
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
class Meta:
|
|
17
|
+
model = AiModel
|
|
18
|
+
fields = '__all__'
|