endoreg-db 0.6.3__py3-none-any.whl → 0.8.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +26 -26
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +26 -0
- endoreg_db/data/ai_model/data.yaml +1 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/center/data.yaml +13 -12
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/misc.yaml +1 -2
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +418 -2
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +157 -5
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +8 -44
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
- endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +26 -121
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
- endoreg_db/data/finding_type/data.yaml +23 -10
- endoreg_db/data/gender/data.yaml +8 -1
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/misc.yaml +43 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +4 -4
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +3 -0
- endoreg_db/data/pdf_type/data.yaml +27 -10
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/patient_finding_intervention_form.py +4 -5
- endoreg_db/forms/patient_form.py +7 -6
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +359 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +422 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +2 -7
- endoreg_db/management/commands/load_base_db_data.py +15 -1
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +49 -28
- endoreg_db/management/commands/load_finding_data.py +49 -92
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/register_ai_model.py +1 -1
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/migrations/0001_initial.py +625 -813
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/models/__init__.py +274 -291
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +3 -1
- endoreg_db/models/administration/center/center.py +61 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +45 -74
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
- endoreg_db/models/media/__init__.py +14 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +608 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +4 -0
- endoreg_db/models/media/video/create_from_file.py +336 -0
- endoreg_db/models/media/video/pipe_1.py +195 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +680 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +348 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +166 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_meta.py +11 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
- endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
- endoreg_db/models/{examination → medical/examination}/examination_type.py +18 -10
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
- endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
- endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
- endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
- endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +193 -0
- endoreg_db/models/metadata/model_meta_logic.py +236 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +17 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
- endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
- endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +10 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +13 -2
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/models/video_metadata.py +66 -0
- endoreg_db/models/video_processing.py +153 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +147 -10
- endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
- endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +66 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/ollama_api_docs.py +1528 -0
- endoreg_db/services/pdf_import.py +993 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +915 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/urls/__init__.py +72 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +32 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/pdf.py +0 -0
- endoreg_db/urls/report.py +78 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +36 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +119 -0
- endoreg_db/urls.py +6 -269
- endoreg_db/utils/__init__.py +68 -16
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
- endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
- endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +88 -31
- endoreg_db/utils/dates.py +21 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +1 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +2 -0
- endoreg_db/utils/paths.py +104 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/db_config.py +1 -1
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +19 -6
- endoreg_db/utils/video/extract_frames.py +37 -70
- endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +282 -2
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +63 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +9 -0
- endoreg_db/views/media/pdf_media.py +386 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +151 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +72 -0
- endoreg_db/views/video/correction.py +672 -0
- endoreg_db/views/video/media/__init__.py +23 -0
- endoreg_db/views/video/media/task_status.py +49 -0
- endoreg_db/views/video/media/video_analyze.py +52 -0
- endoreg_db/views/video/media/video_apply_mask.py +48 -0
- endoreg_db/views/video/media/video_correction.py +21 -0
- endoreg_db/views/video/media/video_download_processed.py +58 -0
- endoreg_db/views/video/media/video_media.py +158 -0
- endoreg_db/views/video/media/video_meta.py +29 -0
- endoreg_db/views/video/media/video_processing_history.py +24 -0
- endoreg_db/views/video/media/video_remove_frames.py +48 -0
- endoreg_db/views/video/media/video_reprocess.py +40 -0
- endoreg_db/views/video/reimport.py +192 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
- endoreg_db/views/video/video_examination_viewset.py +329 -0
- endoreg_db/views/video/video_stream.py +188 -0
- endoreg_db-0.8.1.dist-info/METADATA +384 -0
- endoreg_db-0.8.1.dist-info/RECORD +789 -0
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
- endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
- endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_logging_data.py +0 -39
- endoreg_db/management/commands/load_lx_data.py +0 -64
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
- endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
- endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
- endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
- endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -103
- endoreg_db/models/ai_model/lightning/__init__.py +0 -3
- endoreg_db/models/ai_model/lightning/predict.py +0 -172
- endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
- endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
- endoreg_db/models/ai_model/model_meta.py +0 -250
- endoreg_db/models/annotation/__init__.py +0 -32
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
- endoreg_db/models/annotation/image_classification.py +0 -86
- endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
- endoreg_db/models/case/__init__.py +0 -1
- endoreg_db/models/case/case.py +0 -34
- endoreg_db/models/center/center.py +0 -51
- endoreg_db/models/center/center_product.py +0 -33
- endoreg_db/models/center/center_waste.py +0 -16
- endoreg_db/models/data_file/__init__.py +0 -39
- endoreg_db/models/data_file/base_classes/__init__.py +0 -7
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -100
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -136
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -807
- endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
- endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
- endoreg_db/models/data_file/base_classes/utils.py +0 -80
- endoreg_db/models/data_file/frame.py +0 -29
- endoreg_db/models/data_file/import_classes/__init__.py +0 -18
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -288
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
- endoreg_db/models/data_file/metadata/video_meta.py +0 -199
- endoreg_db/models/data_file/report_file.py +0 -56
- endoreg_db/models/data_file/video/__init__.py +0 -11
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -196
- endoreg_db/models/data_file/video_segment.py +0 -214
- endoreg_db/models/disease.py +0 -79
- endoreg_db/models/event.py +0 -73
- endoreg_db/models/examination/examination.py +0 -67
- endoreg_db/models/examination/examination_indication.py +0 -170
- endoreg_db/models/finding/__init__.py +0 -11
- endoreg_db/models/finding/finding.py +0 -75
- endoreg_db/models/finding/finding_location_classification.py +0 -94
- endoreg_db/models/finding/finding_morphology_classification.py +0 -89
- endoreg_db/models/finding/finding_type.py +0 -22
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -111
- endoreg_db/models/logging/__init__.py +0 -11
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -27
- endoreg_db/models/lx/__init__.py +0 -4
- endoreg_db/models/lx/client.py +0 -57
- endoreg_db/models/lx/identity.py +0 -34
- endoreg_db/models/lx/permission.py +0 -18
- endoreg_db/models/lx/user.py +0 -16
- endoreg_db/models/network/__init__.py +0 -9
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -58
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -5
- endoreg_db/models/patient/__init__.py +0 -24
- endoreg_db/models/patient/patient_examination.py +0 -182
- endoreg_db/models/patient/patient_finding.py +0 -143
- endoreg_db/models/patient/patient_finding_location.py +0 -120
- endoreg_db/models/patient/patient_finding_morphology.py +0 -166
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -34
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -60
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/patient.py +0 -389
- endoreg_db/models/persons/patient/patient_disease.py +0 -22
- endoreg_db/models/persons/patient/patient_event.py +0 -52
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
- endoreg_db/models/persons/patient/patient_medication.py +0 -59
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -8
- endoreg_db/models/prediction/image_classification.py +0 -51
- endoreg_db/models/prediction/video_prediction_meta.py +0 -306
- endoreg_db/models/product/product.py +0 -110
- endoreg_db/models/product/product_group.py +0 -27
- endoreg_db/models/product/product_material.py +0 -28
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -9
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -14
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -9
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -33
- endoreg_db/serializers/prediction.py +0 -10
- endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -20
- endoreg_db/serializers/video_segmentation.py +0 -587
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video/transcode_videofile.py +0 -111
- endoreg_db/views/patient_views.py +0 -90
- endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
- endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
- endoreg_db/views/raw_video_meta_validation_views.py +0 -148
- endoreg_db/views/report_views.py +0 -96
- endoreg_db/views/video_segmentation_views.py +0 -166
- endoreg_db-0.6.3.dist-info/METADATA +0 -161
- endoreg_db-0.6.3.dist-info/RECORD +0 -435
- /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
- /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
- /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
- {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
from ...models import RawPdfFile, SensitiveMeta
|
|
5
|
+
|
|
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 = {}
|
|
41
|
+
if last_id is not None:
|
|
42
|
+
try:
|
|
43
|
+
query_filter = {"id__gt": int(last_id)}
|
|
44
|
+
except ValueError:
|
|
45
|
+
# If last_id is not a valid integer, treat it as if no ID was provided.
|
|
46
|
+
# This prevents a crash and safely defaults to fetching the first PDF.
|
|
47
|
+
query_filter = {}
|
|
48
|
+
|
|
49
|
+
# Get the next available PDF
|
|
50
|
+
pdf_entry = RawPdfFile.objects.select_related("sensitive_meta").filter(**query_filter).order_by('id').first()
|
|
51
|
+
|
|
52
|
+
return pdf_entry # Returns a model instance or None
|
|
53
|
+
|
|
54
|
+
def get_pdf_url(self, obj):
|
|
55
|
+
"""
|
|
56
|
+
Generates an absolute URL for accessing the PDF associated with the given object.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
The full URL as a string if the file exists; otherwise, None.
|
|
60
|
+
"""
|
|
61
|
+
request = self.context.get('request')
|
|
62
|
+
print("---------------------here :",obj.file)
|
|
63
|
+
if request and obj.file:
|
|
64
|
+
return request.build_absolute_uri(f"/pdf/sensitivemeta/?id={obj.id}") # Constructs full API endpoint
|
|
65
|
+
return None # Return None if file is missing
|
|
66
|
+
|
|
67
|
+
def get_file(self, obj):
|
|
68
|
+
"""
|
|
69
|
+
Retrieves the relative file path of the PDF from the database.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
The relative file path as a string, or None if no file is linked.
|
|
73
|
+
"""
|
|
74
|
+
if not obj.file:
|
|
75
|
+
return None # No file linked
|
|
76
|
+
return str(obj.file.name).strip() # Ensures clean output
|
|
77
|
+
|
|
78
|
+
def get_full_pdf_path(self, obj):
|
|
79
|
+
"""
|
|
80
|
+
Constructs the full absolute file path using `settings.MEDIA_ROOT`.
|
|
81
|
+
"""
|
|
82
|
+
if not obj.file:
|
|
83
|
+
return None # No file linked
|
|
84
|
+
|
|
85
|
+
pdf_relative_path = str(obj.file.name)
|
|
86
|
+
|
|
87
|
+
full_path = Path(settings.MEDIA_ROOT) / pdf_relative_path
|
|
88
|
+
|
|
89
|
+
return str(full_path) if full_path.exists() else None # Returns path or None if file is missing
|
|
90
|
+
|
|
91
|
+
def validate(self, data):
|
|
92
|
+
"""
|
|
93
|
+
Validate input data to ensure a PDF file is provided and the referenced sensitive_meta_id exists.
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
serializers.ValidationError: If the PDF file is missing or the sensitive_meta_id does not correspond to an existing SensitiveMeta record.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
dict: The validated input data if all checks pass.
|
|
100
|
+
"""
|
|
101
|
+
errors = {}
|
|
102
|
+
|
|
103
|
+
if 'file' in data and not data['file']:
|
|
104
|
+
errors['file'] = "A valid PDF file is required."
|
|
105
|
+
|
|
106
|
+
if 'sensitive_meta_id' in data and not SensitiveMeta.objects.filter(id=data['sensitive_meta_id']).exists():
|
|
107
|
+
errors['sensitive_meta_id'] = "The provided sensitive_meta_id does not exist."
|
|
108
|
+
|
|
109
|
+
if errors:
|
|
110
|
+
raise serializers.ValidationError(errors) # Returns structured error response
|
|
111
|
+
|
|
112
|
+
return data # Returns validated data
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from endoreg_db.models import SensitiveMeta
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from django.utils import timezone
|
|
5
|
+
from rest_framework import serializers
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ReportMetaSerializer(serializers.ModelSerializer):
|
|
9
|
+
"""
|
|
10
|
+
Serializer für Report-Metadaten basierend auf SensitiveMeta
|
|
11
|
+
"""
|
|
12
|
+
# Füge fehlende Zeitstempel-Felder hinzu
|
|
13
|
+
created_at = serializers.SerializerMethodField()
|
|
14
|
+
updated_at = serializers.SerializerMethodField()
|
|
15
|
+
casenumber = serializers.CharField(source='case_number', allow_blank=True, allow_null=True)
|
|
16
|
+
|
|
17
|
+
class Meta:
|
|
18
|
+
model = SensitiveMeta
|
|
19
|
+
fields = [
|
|
20
|
+
'id', 'patient_first_name', 'patient_last_name',
|
|
21
|
+
'patient_gender', 'patient_dob', 'examination_date',
|
|
22
|
+
'casenumber', 'created_at', 'updated_at'
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
def get_created_at(self, obj):
|
|
26
|
+
"""
|
|
27
|
+
Retrieve the `created_at` timestamp from the SensitiveMeta instance, or return the current time if unavailable.
|
|
28
|
+
|
|
29
|
+
Parameters:
|
|
30
|
+
obj: The SensitiveMeta instance being serialized.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
datetime: The `created_at` timestamp, or the current time as a fallback.
|
|
34
|
+
"""
|
|
35
|
+
if hasattr(obj, 'created_at') and obj.created_at:
|
|
36
|
+
return obj.created_at
|
|
37
|
+
# Fallback wenn SensitiveMeta kein created_at hat
|
|
38
|
+
return timezone.now()
|
|
39
|
+
|
|
40
|
+
def get_updated_at(self, obj):
|
|
41
|
+
"""
|
|
42
|
+
Return the `updated_at` timestamp from the SensitiveMeta instance, or fall back to the `created_at` timestamp if `updated_at` is missing or null.
|
|
43
|
+
|
|
44
|
+
Parameters:
|
|
45
|
+
obj: The SensitiveMeta instance being serialized.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
A datetime representing when the instance was last updated, or created if no update timestamp is available.
|
|
49
|
+
"""
|
|
50
|
+
if hasattr(obj, 'updated_at') and obj.updated_at:
|
|
51
|
+
return obj.updated_at
|
|
52
|
+
# Fallback wenn SensitiveMeta kein updated_at hat
|
|
53
|
+
return self.get_created_at(obj)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from ...models import SensitiveMeta
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
class SensitiveMetaDetailSerializer(serializers.ModelSerializer):
|
|
9
|
+
"""
|
|
10
|
+
Serializer for displaying SensitiveMeta details with verification state.
|
|
11
|
+
Includes all relevant fields for annotation and verification.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# State verification fields
|
|
15
|
+
is_verified = serializers.SerializerMethodField()
|
|
16
|
+
dob_verified = serializers.SerializerMethodField()
|
|
17
|
+
names_verified = serializers.SerializerMethodField()
|
|
18
|
+
|
|
19
|
+
# Related fields for better display
|
|
20
|
+
center_name = serializers.CharField(source="center.name", read_only=True)
|
|
21
|
+
patient_gender_name = serializers.CharField(source="patient_gender.name", read_only=True)
|
|
22
|
+
|
|
23
|
+
# Examiner information
|
|
24
|
+
examiners_display = serializers.SerializerMethodField()
|
|
25
|
+
|
|
26
|
+
# Formatted dates for display
|
|
27
|
+
patient_dob_display = serializers.SerializerMethodField()
|
|
28
|
+
examination_date_display = serializers.SerializerMethodField()
|
|
29
|
+
|
|
30
|
+
# Hash displays (last 8 characters for security)
|
|
31
|
+
patient_hash_display = serializers.SerializerMethodField()
|
|
32
|
+
examination_hash_display = serializers.SerializerMethodField()
|
|
33
|
+
|
|
34
|
+
class Meta:
|
|
35
|
+
model = SensitiveMeta
|
|
36
|
+
fields = [
|
|
37
|
+
'id',
|
|
38
|
+
'patient_first_name',
|
|
39
|
+
'patient_last_name',
|
|
40
|
+
'patient_dob',
|
|
41
|
+
'patient_dob_display',
|
|
42
|
+
'examination_date',
|
|
43
|
+
'examination_date_display',
|
|
44
|
+
'center_name',
|
|
45
|
+
'patient_gender_name',
|
|
46
|
+
'endoscope_type',
|
|
47
|
+
'endoscope_sn',
|
|
48
|
+
'patient_hash_display',
|
|
49
|
+
'examination_hash_display',
|
|
50
|
+
'examiners_display',
|
|
51
|
+
'is_verified',
|
|
52
|
+
'dob_verified',
|
|
53
|
+
'names_verified',
|
|
54
|
+
]
|
|
55
|
+
read_only_fields = [
|
|
56
|
+
'id',
|
|
57
|
+
'patient_hash_display',
|
|
58
|
+
'examination_hash_display',
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
def get_is_verified(self, obj):
|
|
62
|
+
"""
|
|
63
|
+
Return the overall verification status of the given SensitiveMeta instance.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
bool: True if the instance is verified; False if the verification attribute is missing.
|
|
67
|
+
|
|
68
|
+
Raises:
|
|
69
|
+
Exception: Propagates unexpected exceptions after logging.
|
|
70
|
+
"""
|
|
71
|
+
try:
|
|
72
|
+
return obj.is_verified
|
|
73
|
+
except AttributeError:
|
|
74
|
+
return False
|
|
75
|
+
except Exception as e:
|
|
76
|
+
logger.exception(f"Unexpected error in get_is_verified for SensitiveMeta {getattr(obj, 'pk', None)}: {e}")
|
|
77
|
+
raise
|
|
78
|
+
|
|
79
|
+
def get_dob_verified(self, obj):
|
|
80
|
+
"""
|
|
81
|
+
Return the date of birth verification status for the given object.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
bool: True if the date of birth is verified; otherwise, False if unavailable or on error.
|
|
85
|
+
"""
|
|
86
|
+
try:
|
|
87
|
+
return obj.state.dob_verified
|
|
88
|
+
except Exception:
|
|
89
|
+
return False
|
|
90
|
+
|
|
91
|
+
def get_names_verified(self, obj):
|
|
92
|
+
"""
|
|
93
|
+
Return whether the patient's names have been verified.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
bool: True if the names are verified; False if not verified or if an error occurs.
|
|
97
|
+
"""
|
|
98
|
+
try:
|
|
99
|
+
return obj.state.names_verified
|
|
100
|
+
except Exception:
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
def get_examiners_display(self, obj):
|
|
104
|
+
"""
|
|
105
|
+
Return a list of examiner full names for the given SensitiveMeta instance.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
list[str]: List of examiner names in "First Last" format, or an empty list if unavailable.
|
|
109
|
+
"""
|
|
110
|
+
try:
|
|
111
|
+
if obj.pk:
|
|
112
|
+
examiners = obj.examiners.all()
|
|
113
|
+
return [f"{e.first_name} {e.last_name}" for e in examiners]
|
|
114
|
+
return []
|
|
115
|
+
except Exception as e:
|
|
116
|
+
logger.warning(f"Error getting examiners for SensitiveMeta {obj.pk}: {e}")
|
|
117
|
+
return []
|
|
118
|
+
|
|
119
|
+
def get_patient_dob_display(self, obj):
|
|
120
|
+
"""
|
|
121
|
+
Return the patient's date of birth formatted as "YYYY-MM-DD" for display.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
str or None: Formatted date string if available, otherwise None.
|
|
125
|
+
"""
|
|
126
|
+
if obj.patient_dob:
|
|
127
|
+
return obj.patient_dob.strftime("%Y-%m-%d")
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
def get_examination_date_display(self, obj):
|
|
131
|
+
"""
|
|
132
|
+
Return the examination date formatted as "YYYY-MM-DD" for display.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
str or None: Formatted examination date string, or None if not set.
|
|
136
|
+
"""
|
|
137
|
+
if obj.examination_date:
|
|
138
|
+
return obj.examination_date.strftime("%Y-%m-%d")
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
def get_patient_hash_display(self, obj):
|
|
142
|
+
"""
|
|
143
|
+
Return the last eight characters of the patient's hash, prefixed with ellipsis, or None if not available.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
str or None: Truncated patient hash for display, or None if the hash is not set.
|
|
147
|
+
"""
|
|
148
|
+
if obj.patient_hash:
|
|
149
|
+
return f"...{obj.patient_hash[-8:]}"
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
def get_examination_hash_display(self, obj):
|
|
153
|
+
"""
|
|
154
|
+
Return the last eight characters of the examination hash, prefixed with ellipsis, or None if not available.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
str or None: Truncated examination hash for display, or None if the hash is not set.
|
|
158
|
+
"""
|
|
159
|
+
if obj.examination_hash:
|
|
160
|
+
return f"...{obj.examination_hash[-8:]}"
|
|
161
|
+
return None
|
|
162
|
+
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
from django.db import transaction
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from ...models import SensitiveMeta, Center, Gender
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SensitiveMetaUpdateSerializer(serializers.ModelSerializer):
|
|
12
|
+
"""
|
|
13
|
+
Serializer for updating SensitiveMeta fields including verification state.
|
|
14
|
+
Handles partial updates and state management.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# Verification state fields
|
|
18
|
+
dob_verified = serializers.BooleanField(required=False)
|
|
19
|
+
names_verified = serializers.BooleanField(required=False)
|
|
20
|
+
|
|
21
|
+
# Center can be updated by name
|
|
22
|
+
center_name = serializers.CharField(write_only=True, required=False)
|
|
23
|
+
|
|
24
|
+
# Gender can be updated by name
|
|
25
|
+
patient_gender_name = serializers.CharField(write_only=True, required=False)
|
|
26
|
+
|
|
27
|
+
class Meta:
|
|
28
|
+
model = SensitiveMeta
|
|
29
|
+
fields = [
|
|
30
|
+
'patient_first_name',
|
|
31
|
+
'patient_last_name',
|
|
32
|
+
'patient_dob',
|
|
33
|
+
'examination_date',
|
|
34
|
+
'center_name',
|
|
35
|
+
'patient_gender_name',
|
|
36
|
+
'endoscope_type',
|
|
37
|
+
'endoscope_sn',
|
|
38
|
+
'examiner_first_name',
|
|
39
|
+
'examiner_last_name',
|
|
40
|
+
'dob_verified',
|
|
41
|
+
'names_verified',
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
def validate_center_name(self, value):
|
|
45
|
+
"""
|
|
46
|
+
Validates that a center with the given natural key exists.
|
|
47
|
+
|
|
48
|
+
Raises a validation error if the specified center does not exist.
|
|
49
|
+
"""
|
|
50
|
+
if value:
|
|
51
|
+
try:
|
|
52
|
+
Center.objects.get_by_natural_key(value)
|
|
53
|
+
return value
|
|
54
|
+
except Center.DoesNotExist:
|
|
55
|
+
raise serializers.ValidationError(f"Center '{value}' does not exist.")
|
|
56
|
+
return value
|
|
57
|
+
|
|
58
|
+
def validate_patient_gender_name(self, value):
|
|
59
|
+
"""
|
|
60
|
+
Validates that a gender with the given name exists.
|
|
61
|
+
|
|
62
|
+
Raises a validation error if no matching Gender is found.
|
|
63
|
+
"""
|
|
64
|
+
if value:
|
|
65
|
+
try:
|
|
66
|
+
Gender.objects.get(name=value)
|
|
67
|
+
return value
|
|
68
|
+
except Gender.DoesNotExist:
|
|
69
|
+
raise serializers.ValidationError(f"Gender '{value}' does not exist.")
|
|
70
|
+
return value
|
|
71
|
+
|
|
72
|
+
def validate(self, data):
|
|
73
|
+
"""
|
|
74
|
+
Validate that patient first and last names, if provided, are not empty strings.
|
|
75
|
+
|
|
76
|
+
Raises a validation error if either `patient_first_name` or `patient_last_name` is present but empty.
|
|
77
|
+
"""
|
|
78
|
+
# Ensure names are not empty if provided
|
|
79
|
+
first_name = data.get('patient_first_name')
|
|
80
|
+
if first_name is not None and not first_name.strip():
|
|
81
|
+
raise serializers.ValidationError({
|
|
82
|
+
'patient_first_name': 'First name cannot be empty.'
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
last_name = data.get('patient_last_name')
|
|
86
|
+
if last_name is not None and not last_name.strip():
|
|
87
|
+
raise serializers.ValidationError({
|
|
88
|
+
'patient_last_name': 'Last name cannot be empty.'
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
return data
|
|
92
|
+
|
|
93
|
+
@transaction.atomic
|
|
94
|
+
def update(self, instance, validated_data):
|
|
95
|
+
"""
|
|
96
|
+
Updates a SensitiveMeta instance with provided data, including related center, gender, and verification state fields.
|
|
97
|
+
|
|
98
|
+
Handles assignment of related Center and Gender objects by name, updates model fields, and manages verification state flags (`dob_verified`, `names_verified`) in the associated state object if provided.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
SensitiveMeta: The updated SensitiveMeta instance.
|
|
102
|
+
"""
|
|
103
|
+
# Extract verification state data
|
|
104
|
+
dob_verified = validated_data.pop('dob_verified', None)
|
|
105
|
+
names_verified = validated_data.pop('names_verified', None)
|
|
106
|
+
|
|
107
|
+
# Extract and handle center update
|
|
108
|
+
center_name = validated_data.pop('center_name', None)
|
|
109
|
+
if center_name:
|
|
110
|
+
try:
|
|
111
|
+
center = Center.objects.get_by_natural_key(center_name)
|
|
112
|
+
instance.center = center
|
|
113
|
+
except Center.DoesNotExist:
|
|
114
|
+
logger.error(f"Center '{center_name}' not found during update")
|
|
115
|
+
raise serializers.ValidationError(f"Center '{center_name}' does not exist.")
|
|
116
|
+
|
|
117
|
+
# Extract and handle gender update
|
|
118
|
+
patient_gender_name = validated_data.pop('patient_gender_name', None)
|
|
119
|
+
if patient_gender_name:
|
|
120
|
+
try:
|
|
121
|
+
gender = Gender.objects.get(name=patient_gender_name)
|
|
122
|
+
instance.patient_gender = gender
|
|
123
|
+
except Gender.DoesNotExist:
|
|
124
|
+
logger.error(f"Gender '{patient_gender_name}' not found during update")
|
|
125
|
+
raise serializers.ValidationError(f"Gender '{patient_gender_name}' does not exist.")
|
|
126
|
+
|
|
127
|
+
# Update regular fields using the model's update_from_dict method
|
|
128
|
+
if validated_data:
|
|
129
|
+
instance.update_from_dict(validated_data)
|
|
130
|
+
|
|
131
|
+
# Update verification state if provided
|
|
132
|
+
if dob_verified is not None or names_verified is not None:
|
|
133
|
+
# Ensure state exists
|
|
134
|
+
state = instance.get_or_create_state()
|
|
135
|
+
|
|
136
|
+
if dob_verified is not None:
|
|
137
|
+
state.dob_verified = dob_verified
|
|
138
|
+
logger.info(f"Updated DOB verification for SensitiveMeta {instance.pk}: {dob_verified}")
|
|
139
|
+
|
|
140
|
+
if names_verified is not None:
|
|
141
|
+
state.names_verified = names_verified
|
|
142
|
+
logger.info(f"Updated names verification for SensitiveMeta {instance.pk}: {names_verified}")
|
|
143
|
+
|
|
144
|
+
state.save()
|
|
145
|
+
|
|
146
|
+
return instance
|
|
147
|
+
|
|
148
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from rest_framework import serializers
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from ...models import SensitiveMeta
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
class SensitiveMetaVerificationSerializer(serializers.Serializer):
|
|
9
|
+
"""
|
|
10
|
+
Simple serializer for bulk verification state updates.
|
|
11
|
+
Used when only updating verification flags.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
sensitive_meta_id = serializers.IntegerField()
|
|
15
|
+
dob_verified = serializers.BooleanField(required=False)
|
|
16
|
+
names_verified = serializers.BooleanField(required=False)
|
|
17
|
+
|
|
18
|
+
def validate_sensitive_meta_id(self, value):
|
|
19
|
+
"""
|
|
20
|
+
Validates that a SensitiveMeta object with the given ID exists and caches it.
|
|
21
|
+
|
|
22
|
+
Raises:
|
|
23
|
+
ValidationError: If no SensitiveMeta object is found with the specified ID.
|
|
24
|
+
"""
|
|
25
|
+
try:
|
|
26
|
+
# Retrieve and cache the SensitiveMeta instance to avoid a second query in the save method.
|
|
27
|
+
self._cached_sensitive_meta = SensitiveMeta.objects.get(id=value)
|
|
28
|
+
return value
|
|
29
|
+
except SensitiveMeta.DoesNotExist:
|
|
30
|
+
raise serializers.ValidationError(f"SensitiveMeta with ID {value} does not exist.")
|
|
31
|
+
|
|
32
|
+
def save(self):
|
|
33
|
+
"""
|
|
34
|
+
Updates the verification state for a specified SensitiveMeta instance.
|
|
35
|
+
|
|
36
|
+
Uses the cached SensitiveMeta object from validation, obtains or creates its verification state,
|
|
37
|
+
updates the `dob_verified` and `names_verified` fields if provided, and saves the changes.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
The updated verification state object.
|
|
41
|
+
"""
|
|
42
|
+
sensitive_meta_id = self.validated_data['sensitive_meta_id']
|
|
43
|
+
dob_verified = self.validated_data.get('dob_verified')
|
|
44
|
+
names_verified = self.validated_data.get('names_verified')
|
|
45
|
+
|
|
46
|
+
# Use the cached instance from the validation step, avoiding a redundant query.
|
|
47
|
+
sensitive_meta = self._cached_sensitive_meta
|
|
48
|
+
state = sensitive_meta.get_or_create_state()
|
|
49
|
+
|
|
50
|
+
if dob_verified is not None:
|
|
51
|
+
state.dob_verified = dob_verified
|
|
52
|
+
|
|
53
|
+
if names_verified is not None:
|
|
54
|
+
state.names_verified = names_verified
|
|
55
|
+
|
|
56
|
+
state.save()
|
|
57
|
+
|
|
58
|
+
logger.info(f"Updated verification state for SensitiveMeta {sensitive_meta_id}")
|
|
59
|
+
return state
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rest_framework import serializers
|
|
3
|
+
from endoreg_db.models import VideoMeta, VideoImportMeta
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class VideoMetaSerializer(serializers.ModelSerializer):
|
|
7
|
+
fps = serializers.FloatField(read_only=True, allow_null=True)
|
|
8
|
+
duration = serializers.FloatField(read_only=True, allow_null=True)
|
|
9
|
+
width = serializers.IntegerField(read_only=True, allow_null=True)
|
|
10
|
+
height = serializers.IntegerField(read_only=True, allow_null=True)
|
|
11
|
+
frame_count = serializers.IntegerField(read_only=True, allow_null=True)
|
|
12
|
+
created_at = serializers.SerializerMethodField()
|
|
13
|
+
|
|
14
|
+
def get_created_at(self, obj):
|
|
15
|
+
# returns created_at if your model has it, else None
|
|
16
|
+
return getattr(obj, "created_at", None)
|
|
17
|
+
|
|
18
|
+
class Meta:
|
|
19
|
+
model = VideoMeta
|
|
20
|
+
fields = (
|
|
21
|
+
"id",
|
|
22
|
+
"fps",
|
|
23
|
+
"duration",
|
|
24
|
+
"width",
|
|
25
|
+
"height",
|
|
26
|
+
"frame_count",
|
|
27
|
+
"created_at",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class VideoImportMetaSerializer(serializers.ModelSerializer):
|
|
32
|
+
file_name = serializers.SerializerMethodField()
|
|
33
|
+
|
|
34
|
+
def get_file_name(self, obj):
|
|
35
|
+
return Path(obj.file_name).name if obj.file_name else None
|
|
36
|
+
|
|
37
|
+
class Meta:
|
|
38
|
+
model = VideoImportMeta
|
|
39
|
+
fields = ("id", "file_name", "video_anonymized")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from .file_overview import FileOverviewSerializer
|
|
2
|
+
from .vop_patient_data import VoPPatientDataSerializer
|
|
3
|
+
from .stats import StatsSerializer
|
|
4
|
+
from .upload_job import UploadJobStatusSerializer, UploadCreateResponseSerializer
|
|
5
|
+
from .translatable_field_mix_in import TranslatableFieldMixin
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"FileOverviewSerializer",
|
|
9
|
+
"VoPPatientDataSerializer",
|
|
10
|
+
"StatsSerializer",
|
|
11
|
+
"UploadJobStatusSerializer",
|
|
12
|
+
"UploadCreateResponseSerializer",
|
|
13
|
+
"TranslatableFieldMixin"
|
|
14
|
+
]
|