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
endoreg_db/utils/legacy_ocr.py
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import pytesseract
|
|
2
|
-
# import cv2
|
|
3
|
-
from endoreg_db.models import EndoscopyProcessor
|
|
4
|
-
import os
|
|
5
|
-
from collections import Counter
|
|
6
|
-
from tempfile import TemporaryDirectory
|
|
7
|
-
import re
|
|
8
|
-
from datetime import datetime
|
|
9
|
-
from typing import Dict, List
|
|
10
|
-
import numpy as np
|
|
11
|
-
|
|
12
|
-
N_FRAMES_MEAN_OCR = 2
|
|
13
|
-
|
|
14
|
-
# Helper function to process date strings
|
|
15
|
-
def process_date_text(date_text):
|
|
16
|
-
"""
|
|
17
|
-
Processes a string of text that represents a date and returns a datetime.date object.
|
|
18
|
-
|
|
19
|
-
Args:
|
|
20
|
-
date_text (str): A string of text that represents a date.
|
|
21
|
-
|
|
22
|
-
Returns:
|
|
23
|
-
datetime.date: A datetime.date object representing the parsed date, or None if the text cannot be parsed.
|
|
24
|
-
"""
|
|
25
|
-
try:
|
|
26
|
-
# Remove any non-digit characters
|
|
27
|
-
date_text_clean = re.sub(r'\D', '', date_text)
|
|
28
|
-
# Reformat to 'ddmmyyyy' if necessary
|
|
29
|
-
if len(date_text_clean) == 8:
|
|
30
|
-
return datetime.strptime(date_text_clean, "%d%m%Y").date()
|
|
31
|
-
elif len(date_text_clean) == 14:
|
|
32
|
-
return datetime.strptime(date_text_clean, "%d%m%Y%H%M%S").date()
|
|
33
|
-
except ValueError:
|
|
34
|
-
# Return None if the text cannot be parsed into a date
|
|
35
|
-
# set date to 1/1/1900
|
|
36
|
-
return datetime.strptime("01011900", "%d%m%Y").date()
|
|
37
|
-
|
|
38
|
-
# Helper function to process patient names
|
|
39
|
-
def process_name_text(name_text):
|
|
40
|
-
"""
|
|
41
|
-
Remove all numbers, punctuation, and whitespace from a string of text and return the result.
|
|
42
|
-
"""
|
|
43
|
-
name = re.sub(r'[0-9!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\s]+', '', name_text).strip()
|
|
44
|
-
# capitalize first letter of each word
|
|
45
|
-
name = ' '.join([word.capitalize() for word in name.split()])
|
|
46
|
-
return name
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
# Helper function to process endoscope type text
|
|
50
|
-
def process_general_text(endoscope_text):
|
|
51
|
-
"""
|
|
52
|
-
This function takes in a string of text from an endoscope and returns a cleaned version of the text.
|
|
53
|
-
"""
|
|
54
|
-
return ' '.join(endoscope_text.split())
|
|
55
|
-
|
|
56
|
-
def roi_values_valid(roi):
|
|
57
|
-
"""
|
|
58
|
-
Check if all values in an ROI dictionary are valid (>=0).
|
|
59
|
-
"""
|
|
60
|
-
return all([value >= 0 for value in roi.values()])
|
|
61
|
-
|
|
62
|
-
# Function to extract text from ROIs
|
|
63
|
-
def extract_text_from_rois(image_path, processor:EndoscopyProcessor):
|
|
64
|
-
"""
|
|
65
|
-
Extracts text from regions of interest (ROIs) in an image using OCR.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
image_path (str): The path to the image file.
|
|
69
|
-
processor (EndoscopyProcessor): An instance of the EndoscopyProcessor class.
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
dict: A dictionary containing the extracted text for each ROI.
|
|
73
|
-
"""
|
|
74
|
-
# Read the image using OpenCV
|
|
75
|
-
image = cv2.imread(image_path)
|
|
76
|
-
|
|
77
|
-
# Initialize the dictionary to hold the extracted text
|
|
78
|
-
extracted_texts = {}
|
|
79
|
-
|
|
80
|
-
# Define your ROIs and their corresponding post-processing functions in tuples
|
|
81
|
-
rois_with_postprocessing = [
|
|
82
|
-
('examination_date', processor.get_roi_examination_date, process_date_text),
|
|
83
|
-
("patient_first_name", processor.get_roi_patient_first_name, process_name_text),
|
|
84
|
-
('patient_last_name', processor.get_roi_patient_last_name, process_name_text),
|
|
85
|
-
('patient_dob', processor.get_roi_patient_dob, process_date_text),
|
|
86
|
-
('endoscope_type', processor.get_roi_endoscope_type, process_general_text),
|
|
87
|
-
('endoscope_sn', processor.get_roi_endoscopy_sn, process_general_text),
|
|
88
|
-
]
|
|
89
|
-
|
|
90
|
-
# Extract and post-process text for each ROI
|
|
91
|
-
for roi_name, roi_function, post_process in rois_with_postprocessing:
|
|
92
|
-
# Get the ROI dictionary
|
|
93
|
-
roi = roi_function()
|
|
94
|
-
|
|
95
|
-
# Check if the ROI has values
|
|
96
|
-
|
|
97
|
-
if roi_values_valid(roi):
|
|
98
|
-
# Crop the image to the ROI
|
|
99
|
-
x, y, w, h = roi['x'], roi['y'], roi['width'], roi['height']
|
|
100
|
-
roi_cropped = image[y:y+h, x:x+w]
|
|
101
|
-
# Convert to grayscale
|
|
102
|
-
gray = cv2.cvtColor(roi_cropped, cv2.COLOR_BGR2GRAY)
|
|
103
|
-
|
|
104
|
-
# Invert colors for white text on black background
|
|
105
|
-
gray = cv2.bitwise_not(gray)
|
|
106
|
-
|
|
107
|
-
# Binarize the image - using Otsu's method
|
|
108
|
-
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
|
|
109
|
-
|
|
110
|
-
# Dilate the image to improve the contour of the pixelated text
|
|
111
|
-
kernel = np.ones((2,2), np.uint8)
|
|
112
|
-
dilation = cv2.dilate(binary, kernel, iterations=1)
|
|
113
|
-
|
|
114
|
-
# OCR configuration: Recognize white text on black background without corrections
|
|
115
|
-
config = '--psm 10 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-üöäÜÖÄß'
|
|
116
|
-
|
|
117
|
-
# Use pytesseract to do OCR on the preprocessed ROI
|
|
118
|
-
text = pytesseract.image_to_string(dilation, config=config).strip()
|
|
119
|
-
|
|
120
|
-
# Post-process extracted text
|
|
121
|
-
processed_text = post_process(text)
|
|
122
|
-
# processed_text = text
|
|
123
|
-
|
|
124
|
-
# Store the processed text in the dictionary
|
|
125
|
-
extracted_texts[roi_name] = processed_text
|
|
126
|
-
|
|
127
|
-
else:
|
|
128
|
-
pass
|
|
129
|
-
# ic(roi_name)
|
|
130
|
-
# ic(roi)
|
|
131
|
-
# ic("No values for this ROI")
|
|
132
|
-
|
|
133
|
-
return extracted_texts
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def get_most_frequent_values(rois_texts: Dict[str, List[str]]) -> Dict[str, str]:
|
|
137
|
-
"""
|
|
138
|
-
Given a dictionary of ROIs and their corresponding texts, returns a dictionary of the most frequent text for each ROI.
|
|
139
|
-
|
|
140
|
-
Args:
|
|
141
|
-
rois_texts: A dictionary where the keys are the names of the ROIs and the values are lists of texts.
|
|
142
|
-
|
|
143
|
-
Returns:
|
|
144
|
-
A dictionary where the keys are the names of the ROIs and the values are the most frequent text for each ROI.
|
|
145
|
-
"""
|
|
146
|
-
most_frequent = {}
|
|
147
|
-
for key in rois_texts.keys():
|
|
148
|
-
counter = Counter([text for text in rois_texts[key] if text])
|
|
149
|
-
# ic(key)
|
|
150
|
-
# ic(counter)
|
|
151
|
-
most_frequent[key], _ = counter.most_common(1)[0] if counter else (None, None)
|
|
152
|
-
return most_frequent
|
|
153
|
-
|
|
154
|
-
def process_video(video_path, processor):
|
|
155
|
-
"""
|
|
156
|
-
Processes a video file by extracting text from regions of interest (ROIs) in each frame.
|
|
157
|
-
|
|
158
|
-
Args:
|
|
159
|
-
video_path (str): The path to the video file to process.
|
|
160
|
-
processor (OCRProcessor): An instance of the OCRProcessor class that defines the ROIs to extract text from.
|
|
161
|
-
|
|
162
|
-
Returns:
|
|
163
|
-
dict: A dictionary containing the most frequent text values extracted from each ROI.
|
|
164
|
-
"""
|
|
165
|
-
# Create a temporary directory to store frames
|
|
166
|
-
with TemporaryDirectory() as temp_dir:
|
|
167
|
-
# ic(temp_dir)
|
|
168
|
-
# Capture the video
|
|
169
|
-
video = cv2.VideoCapture(video_path)
|
|
170
|
-
success, frame_number = True, 0
|
|
171
|
-
rois_texts = {roi_name: [] for roi_name in processor.get_rois().keys()}
|
|
172
|
-
frames_for_mean_extraction = 0
|
|
173
|
-
|
|
174
|
-
while success:
|
|
175
|
-
success, frame = video.read()
|
|
176
|
-
|
|
177
|
-
# Check if this is the 200th frame
|
|
178
|
-
if frame_number % 1000 == 0 and success:
|
|
179
|
-
frame_path = os.path.join(temp_dir, f"frame_{frame_number}.jpg")
|
|
180
|
-
cv2.imwrite(frame_path, frame) # Save the frame as a JPEG file
|
|
181
|
-
# cv2.imwrite(f"_tmp/frame_{frame_number}.jpg", frame)
|
|
182
|
-
|
|
183
|
-
# Extract text from ROIs
|
|
184
|
-
extracted_texts = extract_text_from_rois(frame_path, processor)
|
|
185
|
-
# ic(extracted_texts)
|
|
186
|
-
|
|
187
|
-
# Store the extracted text from each ROI
|
|
188
|
-
for key, text in extracted_texts.items():
|
|
189
|
-
rois_texts[key].append(text)
|
|
190
|
-
frames_for_mean_extraction += 1
|
|
191
|
-
|
|
192
|
-
frame_number += 1
|
|
193
|
-
|
|
194
|
-
if frames_for_mean_extraction >= N_FRAMES_MEAN_OCR: break
|
|
195
|
-
|
|
196
|
-
# Release the video capture object
|
|
197
|
-
video.release()
|
|
198
|
-
|
|
199
|
-
# Get the most frequent values for each ROI
|
|
200
|
-
return get_most_frequent_values(rois_texts)
|
|
201
|
-
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import shutil
|
|
2
|
-
import subprocess
|
|
3
|
-
import os
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from icecream import ic
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def get_transcoded_file_path(source_file_path: Path, suffix: str = "mp4"):
|
|
9
|
-
"""
|
|
10
|
-
Method to get the transcoded file path.
|
|
11
|
-
|
|
12
|
-
Args:
|
|
13
|
-
source_file_path (Path): Source file path.
|
|
14
|
-
suffix (str): Suffix of the transcoded file.
|
|
15
|
-
|
|
16
|
-
Returns:
|
|
17
|
-
transcoded_file_path (Path): Transcoded file path.
|
|
18
|
-
"""
|
|
19
|
-
transcoded_file_name = f"{source_file_path.stem}_transcoded.{suffix}"
|
|
20
|
-
transcoded_file_path = source_file_path.parent / transcoded_file_name
|
|
21
|
-
return transcoded_file_path
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def check_require_transcode(
|
|
25
|
-
filepath: Path, transcoded_file_path: Path, target_suffix=".mp4"
|
|
26
|
-
):
|
|
27
|
-
"""
|
|
28
|
-
Checks whether a video file requires transcoding.\
|
|
29
|
-
We check if the current suffix of the file path matches the target suffix\
|
|
30
|
-
and if the transcoded file path exists.\
|
|
31
|
-
If the current suffix does not match the target suffix and the transcoded file path does not exist,\
|
|
32
|
-
transcoding is required.
|
|
33
|
-
"""
|
|
34
|
-
current_suffix = filepath.suffix
|
|
35
|
-
|
|
36
|
-
require_transcode = False
|
|
37
|
-
if not current_suffix == target_suffix and not transcoded_file_path.exists():
|
|
38
|
-
if not transcoded_file_path.exists():
|
|
39
|
-
require_transcode = True
|
|
40
|
-
return require_transcode
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def transcode_videofile_if_required(filepath: Path):
|
|
44
|
-
"""
|
|
45
|
-
Perform transcoding on a video file if required.
|
|
46
|
-
This method checks whether a transcoded version (with an ".mp4" suffix) of the given
|
|
47
|
-
video file exists or needs to be produced. It first computes the expected transcoded file path,
|
|
48
|
-
then uses a class-specific check (check_require_transcode) to decide if transcoding is necessary.
|
|
49
|
-
If so, it transcodes the video file by calling the class method transcode_videofile and returns
|
|
50
|
-
the path of the transcoded file after ensuring that the resulting file path matches the computed one.
|
|
51
|
-
If transcoding is not required, the original file path is returned.
|
|
52
|
-
Args:
|
|
53
|
-
filepath (Path): The path to the original video file that may require transcoding.
|
|
54
|
-
Returns:
|
|
55
|
-
Path: The path to the transcoded video file if transcoding was performed; otherwise, the original file path.
|
|
56
|
-
"""
|
|
57
|
-
|
|
58
|
-
transcoded_file_path = get_transcoded_file_path(filepath, suffix=".mp4")
|
|
59
|
-
if check_require_transcode(filepath, transcoded_file_path):
|
|
60
|
-
transcoded_path = transcode_videofile(
|
|
61
|
-
filepath, transcoded_path=transcoded_file_path
|
|
62
|
-
)
|
|
63
|
-
assert transcoded_file_path == transcoded_path
|
|
64
|
-
return transcoded_path
|
|
65
|
-
else:
|
|
66
|
-
return filepath
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def transcode_videofile(filepath: Path, transcoded_path: Path):
|
|
70
|
-
"""
|
|
71
|
-
Transcodes a video to a compatible MP4 format using ffmpeg.
|
|
72
|
-
If the transcoded file exists, it is returned.
|
|
73
|
-
|
|
74
|
-
Parameters
|
|
75
|
-
----------
|
|
76
|
-
mov_file : str
|
|
77
|
-
The full path to the video file.
|
|
78
|
-
|
|
79
|
-
Returns
|
|
80
|
-
-------
|
|
81
|
-
transcoded_path : str
|
|
82
|
-
The full path to the transcoded video file.
|
|
83
|
-
"""
|
|
84
|
-
ic("Transcoding video")
|
|
85
|
-
ic(f"Input path: {filepath}")
|
|
86
|
-
|
|
87
|
-
# if filepath suffix is .mp4 or .MP4 we dont need to transcode and can copy the file
|
|
88
|
-
if filepath.suffix.lower() in [".mp4"]:
|
|
89
|
-
shutil.copyfile(filepath, transcoded_path)
|
|
90
|
-
return transcoded_path
|
|
91
|
-
|
|
92
|
-
ic(f"Transcoded path: {transcoded_path}")
|
|
93
|
-
if os.path.exists(transcoded_path):
|
|
94
|
-
return transcoded_path
|
|
95
|
-
|
|
96
|
-
# Run ffmpeg to transcode the video using H264 and AAC
|
|
97
|
-
# TODO Document settings, check if we need to change them
|
|
98
|
-
command = [
|
|
99
|
-
"ffmpeg",
|
|
100
|
-
"-i",
|
|
101
|
-
filepath.resolve().as_posix(),
|
|
102
|
-
"-c:v",
|
|
103
|
-
"libx264",
|
|
104
|
-
"-preset",
|
|
105
|
-
"fast",
|
|
106
|
-
"-c:a",
|
|
107
|
-
"aac",
|
|
108
|
-
transcoded_path,
|
|
109
|
-
]
|
|
110
|
-
subprocess.run(command, check=True)
|
|
111
|
-
return transcoded_path
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
from django.shortcuts import render
|
|
2
|
-
from django.contrib.admin.views.decorators import staff_member_required
|
|
3
|
-
from django.http import JsonResponse
|
|
4
|
-
from django.http import JsonResponse
|
|
5
|
-
from django.views.decorators.http import require_GET
|
|
6
|
-
from django.core.exceptions import ObjectDoesNotExist
|
|
7
|
-
from rest_framework import viewsets
|
|
8
|
-
from ..models import Patient
|
|
9
|
-
from ..serializers import PatientSerializer
|
|
10
|
-
from rest_framework.permissions import IsAuthenticatedOrReadOnly
|
|
11
|
-
from endoreg_db.models import (
|
|
12
|
-
FindingLocationClassification,
|
|
13
|
-
FindingLocationClassificationChoice,
|
|
14
|
-
FindingMorphologyClassification,
|
|
15
|
-
FindingMorphologyClassificationType
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
@staff_member_required # Ensures only staff members can access the page
|
|
19
|
-
def start_examination(request):
|
|
20
|
-
return render(request, 'admin/start_examination.html') # Loads the simple HTML page
|
|
21
|
-
|
|
22
|
-
#from ..models.patient.patient_finding_location import PatientFindingLocation
|
|
23
|
-
from ..models import FindingLocationClassification, FindingLocationClassificationChoice # Correct models
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
#need to implement one with json data after tesing whethe rthis works or not
|
|
27
|
-
"""def get_location_choices(request, location_id):
|
|
28
|
-
|
|
29
|
-
try:
|
|
30
|
-
# Ensure the location exists
|
|
31
|
-
location = FindingLocationClassification.objects.get(id=location_id)
|
|
32
|
-
# Get only choices related to the selected location classification
|
|
33
|
-
#location_choices = FindingLocationClassificationChoice.objects.filter(location_classification=location)
|
|
34
|
-
#its many to may relation so
|
|
35
|
-
location_choices = location.choices.all()
|
|
36
|
-
|
|
37
|
-
except FindingLocationClassification.DoesNotExist:
|
|
38
|
-
location_choices = []
|
|
39
|
-
|
|
40
|
-
# Get previously selected values to retain them after reloading
|
|
41
|
-
selected_location = int(location_id) if location_id else None
|
|
42
|
-
|
|
43
|
-
return render(request, 'admin/patient_finding_intervention.html', {
|
|
44
|
-
"location_choices": location_choices, # Pass updated choices to the template
|
|
45
|
-
"selected_location": location_id, # Keep previous selection
|
|
46
|
-
})
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
class PatientViewSet(viewsets.ModelViewSet):
|
|
50
|
-
"""API endpoint for managing patients."""
|
|
51
|
-
queryset = Patient.objects.all()
|
|
52
|
-
serializer_class = PatientSerializer
|
|
53
|
-
#permission_classes = [IsAuthenticatedOrReadOnly]
|
|
54
|
-
|
|
55
|
-
def perform_create(self, serializer):
|
|
56
|
-
serializer.save()
|
|
57
|
-
|
|
58
|
-
def update(self, request, *args, **kwargs):
|
|
59
|
-
# custom edit logic here if needed
|
|
60
|
-
return super().update(request, *args, **kwargs)
|
|
61
|
-
|
|
62
|
-
def destroy(self, request, *args, **kwargs):
|
|
63
|
-
# custom delete logic here if needed
|
|
64
|
-
return super().destroy(request, *args, **kwargs)
|
|
65
|
-
|
|
66
|
-
@require_GET
|
|
67
|
-
def get_location_choices(request, location_id):
|
|
68
|
-
"""Fetch location choices dynamically based on FindingLocationClassification."""
|
|
69
|
-
try:
|
|
70
|
-
location = FindingLocationClassification.objects.get(id=location_id)
|
|
71
|
-
location_choices = location.choices.all()
|
|
72
|
-
data = [{"id": choice.id, "name": choice.name} for choice in location_choices]
|
|
73
|
-
return JsonResponse({"location_choices": data})
|
|
74
|
-
except FindingLocationClassification.DoesNotExist:
|
|
75
|
-
return JsonResponse({"error": "Location classification not found", "location_choices": []}, status=404)
|
|
76
|
-
|
|
77
|
-
@require_GET
|
|
78
|
-
def get_morphology_choices(request, morphology_id):
|
|
79
|
-
"""Fetch morphology choices dynamically based on FindingMorphologyClassification."""
|
|
80
|
-
try:
|
|
81
|
-
morphology_classification = FindingMorphologyClassification.objects.get(id=morphology_id)
|
|
82
|
-
morphology_choices = FindingMorphologyClassificationType.objects.filter(
|
|
83
|
-
id=morphology_classification.classification_type_id
|
|
84
|
-
)
|
|
85
|
-
data = [{"id": choice.id, "name": choice.name} for choice in morphology_choices]
|
|
86
|
-
return JsonResponse({"morphology_choices": data})
|
|
87
|
-
except ObjectDoesNotExist:
|
|
88
|
-
return JsonResponse({"error": "Morphology classification not found", "morphology_choices": []}, status=404)
|
|
89
|
-
except Exception as e:
|
|
90
|
-
return JsonResponse({"error": "Internal server error", "morphology_choices": []}, status=500)
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
from rest_framework.views import APIView
|
|
2
|
-
from rest_framework.response import Response
|
|
3
|
-
from rest_framework import status
|
|
4
|
-
from django.http import FileResponse, Http404
|
|
5
|
-
import os, mimetypes
|
|
6
|
-
from ..models import RawPdfFile
|
|
7
|
-
from ..serializers.raw_pdf_anony_text_validation import RawPdfAnonyTextSerializer
|
|
8
|
-
|
|
9
|
-
class RawPdfAnonyTextView(APIView):
|
|
10
|
-
"""
|
|
11
|
-
API for:
|
|
12
|
-
- Fetching PDF metadata including `anonymized_text`.
|
|
13
|
-
- Fetching the next available PDF.
|
|
14
|
-
- Serving the actual PDF file.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
def get(self, request):
|
|
18
|
-
"""
|
|
19
|
-
Handles:
|
|
20
|
-
- First available PDF if `last_id` is NOT provided.
|
|
21
|
-
- Next available PDF if `last_id` is provided.
|
|
22
|
-
- Returns the actual PDF file if `id` is provided.
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
pdf_id = request.GET.get("id")
|
|
26
|
-
last_id = request.GET.get("last_id")
|
|
27
|
-
|
|
28
|
-
if pdf_id:
|
|
29
|
-
return self.serve_pdf_file(pdf_id)
|
|
30
|
-
else:
|
|
31
|
-
return self.fetch_pdf_metadata(last_id)
|
|
32
|
-
|
|
33
|
-
def fetch_pdf_metadata(self, last_id):
|
|
34
|
-
"""
|
|
35
|
-
Fetches the next available PDF metadata, including `anonymized_text`.
|
|
36
|
-
"""
|
|
37
|
-
pdf_entry = RawPdfAnonyTextSerializer.get_next_pdf(last_id)
|
|
38
|
-
|
|
39
|
-
if pdf_entry is None:
|
|
40
|
-
return Response({"error": "No more PDFs available."}, status=status.HTTP_404_NOT_FOUND)
|
|
41
|
-
|
|
42
|
-
serialized_pdf = RawPdfAnonyTextSerializer(pdf_entry, context={'request': self.request})
|
|
43
|
-
return Response(serialized_pdf.data, status=status.HTTP_200_OK)
|
|
44
|
-
|
|
45
|
-
def serve_pdf_file(self, pdf_id):
|
|
46
|
-
"""
|
|
47
|
-
Serves the actual PDF file for viewing.
|
|
48
|
-
"""
|
|
49
|
-
try:
|
|
50
|
-
pdf_entry = RawPdfFile.objects.get(id=pdf_id)
|
|
51
|
-
if not pdf_entry.file:
|
|
52
|
-
return Response({"error": "PDF file not found."}, status=status.HTTP_404_NOT_FOUND)
|
|
53
|
-
|
|
54
|
-
full_pdf_path = pdf_entry.file.path
|
|
55
|
-
if not os.path.exists(full_pdf_path):
|
|
56
|
-
raise Http404("PDF file not found on server.")
|
|
57
|
-
|
|
58
|
-
mime_type, _ = mimetypes.guess_type(full_pdf_path)
|
|
59
|
-
response = FileResponse(open(full_pdf_path, "rb"), content_type=mime_type or "application/pdf")
|
|
60
|
-
response["Content-Disposition"] = f'inline; filename="{os.path.basename(full_pdf_path)}"'
|
|
61
|
-
return response
|
|
62
|
-
|
|
63
|
-
except RawPdfFile.DoesNotExist:
|
|
64
|
-
return Response({"error": "Invalid PDF ID."}, status=status.HTTP_400_BAD_REQUEST)
|
|
65
|
-
except Exception as e:
|
|
66
|
-
return Response({"error": f"Internal error: {str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class UpdateAnonymizedTextView(APIView):
|
|
70
|
-
"""
|
|
71
|
-
API to update only `anonymized_text` in `RawPdfFile`
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
def patch(self, request):
|
|
75
|
-
"""
|
|
76
|
-
Updates `anonymized_text` for a given `pdf_id`.
|
|
77
|
-
"""
|
|
78
|
-
pdf_id = request.data.get("id")
|
|
79
|
-
|
|
80
|
-
if not pdf_id:
|
|
81
|
-
return Response({"error": "pdf_id is required."}, status=status.HTTP_400_BAD_REQUEST)
|
|
82
|
-
|
|
83
|
-
try:
|
|
84
|
-
pdf_entry = RawPdfFile.objects.get(id=pdf_id)
|
|
85
|
-
except RawPdfFile.DoesNotExist:
|
|
86
|
-
return Response({"error": "PDF not found."}, status=status.HTTP_404_NOT_FOUND)
|
|
87
|
-
|
|
88
|
-
serializer = RawPdfAnonyTextSerializer(pdf_entry, data=request.data, partial=True)
|
|
89
|
-
|
|
90
|
-
if serializer.is_valid():
|
|
91
|
-
serializer.save()
|
|
92
|
-
return Response({"message": "PDF anonymized_text updated successfully.", "updated_data": serializer.data},
|
|
93
|
-
status=status.HTTP_200_OK)
|
|
94
|
-
|
|
95
|
-
return Response({"error": "Invalid data.", "details": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
from rest_framework.views import APIView
|
|
2
|
-
from rest_framework.response import Response
|
|
3
|
-
from rest_framework import status
|
|
4
|
-
from django.http import FileResponse, Http404
|
|
5
|
-
import mimetypes
|
|
6
|
-
import os
|
|
7
|
-
from ..models import RawPdfFile
|
|
8
|
-
from ..serializers.raw_pdf_meta_validation import PDFFileForMetaSerializer
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class PDFFileForMetaView(APIView):
|
|
12
|
-
"""
|
|
13
|
-
API endpoint to:
|
|
14
|
-
- Fetch PDF metadata if `id` is NOT provided.
|
|
15
|
-
- Serve the actual PDF file if `id` is provided.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
def get(self, request):
|
|
19
|
-
"""
|
|
20
|
-
Handles both:
|
|
21
|
-
Fetching PDF metadata** (if `id` is NOT provided)
|
|
22
|
-
Serving the actual PDF file** (if `id` is provided)
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
pdf_id = request.GET.get("id") # Check if 'id' is provided in the query params
|
|
26
|
-
last_id = request.GET.get("last_id") # Check if 'last_id' is provided for pagination
|
|
27
|
-
|
|
28
|
-
if pdf_id:
|
|
29
|
-
return self.serve_pdf_file(pdf_id) # Serve the actual PDF file
|
|
30
|
-
else:
|
|
31
|
-
return self.fetch_pdf_metadata(last_id) # Fetch metadata for the first or next PDF
|
|
32
|
-
|
|
33
|
-
def fetch_pdf_metadata(self, last_id):
|
|
34
|
-
"""
|
|
35
|
-
Fetches the first or next available PDF metadata.
|
|
36
|
-
"""
|
|
37
|
-
pdf_entry = PDFFileForMetaSerializer.get_next_pdf(last_id)
|
|
38
|
-
|
|
39
|
-
if pdf_entry is None:
|
|
40
|
-
return Response({"error": "No more PDFs available."}, status=status.HTTP_404_NOT_FOUND)
|
|
41
|
-
|
|
42
|
-
serialized_pdf = PDFFileForMetaSerializer(pdf_entry, context={'request': self.request})
|
|
43
|
-
|
|
44
|
-
print("Debugging API Response:")
|
|
45
|
-
print("Serialized Data:", serialized_pdf.data) # Debugging
|
|
46
|
-
return Response(serialized_pdf.data, status=status.HTTP_200_OK)
|
|
47
|
-
|
|
48
|
-
def serve_pdf_file(self, pdf_id):
|
|
49
|
-
"""
|
|
50
|
-
Serves the actual PDF file for download or viewing.
|
|
51
|
-
"""
|
|
52
|
-
try:
|
|
53
|
-
pdf_entry = RawPdfFile.objects.get(id=pdf_id) # Get the PDF file by ID
|
|
54
|
-
|
|
55
|
-
if not pdf_entry.file:
|
|
56
|
-
return Response({"error": "PDF file not found."}, status=status.HTTP_404_NOT_FOUND)
|
|
57
|
-
|
|
58
|
-
full_pdf_path = pdf_entry.file.path # Get the absolute file path
|
|
59
|
-
|
|
60
|
-
if not os.path.exists(full_pdf_path):
|
|
61
|
-
raise Http404("PDF file not found on server.")
|
|
62
|
-
|
|
63
|
-
mime_type, _ = mimetypes.guess_type(full_pdf_path) # Detect file type
|
|
64
|
-
response = FileResponse(open(full_pdf_path, "rb"), content_type=mime_type or "application/pdf")
|
|
65
|
-
|
|
66
|
-
response["Content-Disposition"] = f'inline; filename="{os.path.basename(full_pdf_path)}"' # Allows direct viewing
|
|
67
|
-
|
|
68
|
-
return response # Sends the PDF file as a stream
|
|
69
|
-
|
|
70
|
-
except RawPdfFile.DoesNotExist:
|
|
71
|
-
return Response({"error": "Invalid PDF ID."}, status=status.HTTP_400_BAD_REQUEST)
|
|
72
|
-
|
|
73
|
-
except Exception as e:
|
|
74
|
-
return Response({"error": f"Internal error: {str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
75
|
-
|
|
76
|
-
from rest_framework.views import APIView
|
|
77
|
-
from rest_framework.response import Response
|
|
78
|
-
from rest_framework import status
|
|
79
|
-
from ..models import SensitiveMeta
|
|
80
|
-
from ..serializers.raw_pdf_meta_validation import SensitiveMetaUpdateSerializer
|
|
81
|
-
|
|
82
|
-
class UpdateSensitiveMetaView(APIView):
|
|
83
|
-
"""
|
|
84
|
-
API endpoint to update patient details in the SensitiveMeta table.
|
|
85
|
-
Handles partial updates (only edited fields).
|
|
86
|
-
"""
|
|
87
|
-
|
|
88
|
-
def patch(self, request, *args, **kwargs):
|
|
89
|
-
"""
|
|
90
|
-
Updates the provided fields for a specific patient record.
|
|
91
|
-
Only updates fields that are sent in the request.
|
|
92
|
-
"""
|
|
93
|
-
sensitive_meta_id = request.data.get("sensitive_meta_id") # Required field
|
|
94
|
-
|
|
95
|
-
if not sensitive_meta_id:
|
|
96
|
-
return Response({"error": "sensitive_meta_id is required."}, status=status.HTTP_400_BAD_REQUEST)
|
|
97
|
-
|
|
98
|
-
try:
|
|
99
|
-
sensitive_meta = SensitiveMeta.objects.get(id=sensitive_meta_id)
|
|
100
|
-
except SensitiveMeta.DoesNotExist:
|
|
101
|
-
return Response({"error": "Patient record not found."}, status=status.HTTP_404_NOT_FOUND)
|
|
102
|
-
|
|
103
|
-
# Serialize the request data with partial=True to allow partial updates
|
|
104
|
-
serializer = SensitiveMetaUpdateSerializer(sensitive_meta, data=request.data, partial=True)
|
|
105
|
-
|
|
106
|
-
if serializer.is_valid():
|
|
107
|
-
serializer.save()
|
|
108
|
-
return Response({"message": "Patient information updated successfully.", "updated_data": serializer.data},
|
|
109
|
-
status=status.HTTP_200_OK)
|
|
110
|
-
|
|
111
|
-
return Response({"error": "Invalid data.", "details": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
|