endoreg-db 0.3.6__py3-none-any.whl → 0.8.6.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 +92 -3
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -6
- 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 +144 -65
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +88 -62
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +6 -6
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/{model_type → ai_model_type}/data.yaml +6 -6
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -167
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +7 -7
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +8 -8
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +22 -22
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +18 -18
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +18 -18
- endoreg_db/data/case_template/rule/19_create_patient.yaml +16 -16
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -35
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +58 -58
- endoreg_db/data/case_template/template/base.yaml +7 -7
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +2 -2
- endoreg_db/data/case_template/tmp/_rule_value +13 -13
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -21
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +9 -9
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +6 -6
- endoreg_db/data/center/data.yaml +90 -59
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -144
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -48
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -37
- endoreg_db/data/disease/hepatology.yaml +4 -4
- endoreg_db/data/disease/misc.yaml +5 -6
- endoreg_db/data/disease/renal.yaml +4 -4
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +5 -5
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -41
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +19 -19
- endoreg_db/data/distribution/date/patient.yaml +6 -6
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +6 -6
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -132
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +10 -10
- endoreg_db/data/endoscopy_processor/data.yaml +50 -45
- endoreg_db/data/event/cardiology.yaml +15 -28
- endoreg_db/data/event/neurology.yaml +13 -13
- endoreg_db/data/event/surgery.yaml +12 -12
- endoreg_db/data/event/thrombembolism.yaml +19 -19
- endoreg_db/data/examination/examinations/data.yaml +72 -66
- endoreg_db/data/examination/time/data.yaml +47 -47
- endoreg_db/data/examination/time-type/data.yaml +7 -7
- endoreg_db/data/examination/type/data.yaml +17 -5
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +42 -18
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -30
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +5 -5
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -31
- endoreg_db/data/lab_value/coagulation.yaml +54 -49
- endoreg_db/data/lab_value/electrolytes.yaml +228 -190
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -121
- endoreg_db/data/lab_value/hematology.yaml +184 -169
- endoreg_db/data/lab_value/hormones.yaml +59 -53
- endoreg_db/data/lab_value/lipids.yaml +53 -44
- endoreg_db/data/lab_value/misc.yaml +76 -30
- endoreg_db/data/lab_value/renal_function.yaml +12 -11
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/medication/anticoagulation.yaml +64 -64
- endoreg_db/data/medication/tah.yaml +69 -69
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -120
- endoreg_db/data/medication_indication_type/data.yaml +10 -10
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +40 -40
- endoreg_db/data/medication_intake_time/base.yaml +30 -30
- endoreg_db/data/medication_schedule/apixaban.yaml +94 -94
- endoreg_db/data/medication_schedule/ass.yaml +12 -12
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -26
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +5 -5
- endoreg_db/data/pdf_type/data.yaml +46 -28
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -66
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -33
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -308
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -88
- endoreg_db/data/profession/data.yaml +70 -70
- 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/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -55
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -26
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -19
- 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/resource/green_endoscopy_dashboard_Resource.yaml +15 -15
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -12
- endoreg_db/data/unit/concentration.yaml +115 -92
- endoreg_db/data/unit/data.yaml +17 -17
- endoreg_db/data/unit/length.yaml +30 -30
- endoreg_db/data/unit/misc.yaml +19 -19
- endoreg_db/data/unit/rate.yaml +5 -5
- endoreg_db/data/unit/time.yaml +48 -13
- endoreg_db/data/unit/volume.yaml +35 -35
- endoreg_db/data/unit/weight.yaml +37 -37
- endoreg_db/data/waste/data.yaml +11 -11
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -3
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -23
- endoreg_db/forms/settings/__init__.py +8 -8
- endoreg_db/forms/unit.py +5 -5
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +77 -45
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -128
- endoreg_db/management/commands/load_center_data.py +68 -43
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_contraindication_data.py} +40 -40
- endoreg_db/management/commands/load_disease_classification_choices_data.py +40 -40
- endoreg_db/management/commands/load_disease_classification_data.py +40 -40
- endoreg_db/management/commands/load_disease_data.py +61 -39
- endoreg_db/management/commands/load_distribution_data.py +65 -65
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +67 -44
- endoreg_db/management/commands/load_event_data.py +40 -40
- endoreg_db/management/commands/load_examination_data.py +74 -74
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_gender_data.py +43 -43
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +131 -132
- endoreg_db/management/commands/load_information_source.py +50 -44
- endoreg_db/management/commands/load_lab_value_data.py +49 -49
- endoreg_db/management/commands/load_medication_data.py +103 -41
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_indication_type_data.py → load_organ_data.py} +42 -40
- endoreg_db/management/commands/load_pdf_type_data.py +60 -60
- endoreg_db/management/commands/load_profession_data.py +43 -43
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +45 -45
- 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/load_unit_data.py +45 -45
- endoreg_db/management/commands/load_user_groups.py +28 -28
- endoreg_db/management/commands/register_ai_model.py +64 -65
- endoreg_db/management/commands/reset_celery_schedule.py +9 -9
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1857 -582
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +359 -74
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +41 -26
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +15 -6
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +125 -81
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +269 -276
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +86 -73
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +26 -28
- endoreg_db/models/{center → administration/center}/__init__.py +13 -4
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/{persons → administration/person/names}/first_name.py +18 -18
- endoreg_db/models/{persons → administration/person/names}/last_name.py +18 -19
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/{persons → administration/person}/person.py +31 -31
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +47 -26
- endoreg_db/models/{product → administration/product}/reference_product.py +130 -99
- 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 +83 -84
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +19 -19
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +182 -143
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +222 -176
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +89 -70
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +40 -5
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/{persons → other}/gender.py +27 -22
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -16
- endoreg_db/models/other/resource.py +21 -17
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -21
- endoreg_db/models/{unit.py → other/unit.py} +32 -22
- endoreg_db/models/other/waste.py +27 -20
- 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 +27 -24
- endoreg_db/models/{rules → rule}/rule_applicator.py +224 -224
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +16 -18
- endoreg_db/models/{rules → rule}/rule_type.py +19 -21
- endoreg_db/models/{rules → rule}/ruleset.py +17 -19
- 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/queries/__init__.py +4 -4
- endoreg_db/queries/annotations/__init__.py +2 -2
- endoreg_db/queries/annotations/legacy.py +158 -159
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -10
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +5 -8
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/cropping.py +28 -28
- endoreg_db/utils/dataloader.py +175 -92
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +58 -30
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -34
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/ocr.py +190 -197
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -4
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +275 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +187 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -3
- endoreg_db-0.8.6.1.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.1.dist-info/RECORD +793 -0
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.8.6.1.dist-info}/WHEEL +1 -1
- {endoreg_db-0.3.6.dist-info → endoreg_db-0.8.6.1.dist-info/licenses}/LICENSE +674 -674
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/migrations/0002_rawvideofile.py +0 -26
- endoreg_db/migrations/0003_rawvideofile_frames_required.py +0 -18
- endoreg_db/migrations/0004_rename_hash_rawvideofile_video_hash.py +0 -18
- endoreg_db/migrations/0005_ffmpegmeta_remove_videoimportmeta_center_and_more.py +0 -56
- endoreg_db/migrations/0006_rawvideofile_center_alter_videometa_processor.py +0 -25
- endoreg_db/migrations/0007_rawvideofile_processor.py +0 -19
- endoreg_db/migrations/0008_rename_frames_required_rawvideofile_state_frames_required.py +0 -18
- endoreg_db/migrations/0009_sensitivemeta_rawvideofile_sensitive_meta.py +0 -31
- endoreg_db/migrations/0010_rename_endoscope_serial_number_sensitivemeta_endoscope_sn.py +0 -18
- endoreg_db/migrations/0011_rawvideofile_state_sensitive_data_retrieved.py +0 -18
- endoreg_db/migrations/0012_rawvideofile_prediction_dir_and_more.py +0 -109
- endoreg_db/migrations/0013_rawpdffile.py +0 -31
- endoreg_db/migrations/0014_pdftype_alter_rawpdffile_file_pdfmeta.py +0 -38
- endoreg_db/migrations/0015_rename_report_processed_rawpdffile_state_report_processed_and_more.py +0 -31
- endoreg_db/migrations/0016_rawpdffile_state_report_processing_required.py +0 -18
- endoreg_db/migrations/0017_firstname_lastname_center_first_names_and_more.py +0 -37
- endoreg_db/migrations/0018_reportreaderflag_reportreaderconfig.py +0 -37
- endoreg_db/migrations/0019_pdftype_cut_off_above_lines_and_more.py +0 -42
- endoreg_db/migrations/0020_rename_endoscopy_info_line_pdftype_endoscope_info_line.py +0 -18
- endoreg_db/migrations/0021_alter_pdftype_endoscope_info_line.py +0 -19
- endoreg_db/migrations/0022_alter_pdftype_endoscope_info_line.py +0 -19
- endoreg_db/migrations/0023_ttoquestionnaire_alter_pdftype_endoscope_info_line.py +0 -59
- endoreg_db/migrations/0024_remove_ttoquestionnaire_infections_and_more.py +0 -27
- endoreg_db/migrations/0025_event_alter_rawpdffile_file_patientevent.py +0 -42
- endoreg_db/migrations/0026_disease_diseaseclassification_and_more.py +0 -166
- endoreg_db/migrations/0027_labvalue_abbreviation_labvalue_default_normal_range_and_more.py +0 -38
- endoreg_db/migrations/0028_alter_unit_abbreviation.py +0 -18
- endoreg_db/migrations/0029_medicationintaketime_and_more.py +0 -75
- endoreg_db/migrations/0030_medicationindicationtype_and_more.py +0 -101
- endoreg_db/migrations/0031_rename_adapt_to_liver_function_medication_adapt_to_age_and_more.py +0 -38
- endoreg_db/migrations/0032_alter_medicationschedule_therapy_duration_d.py +0 -18
- endoreg_db/migrations/0033_medicationindication_sources.py +0 -18
- endoreg_db/migrations/0034_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0035_alter_medicationindication_sources.py +0 -18
- endoreg_db/migrations/0036_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0037_alter_medicationindication_sources.py +0 -18
- endoreg_db/migrations/0038_emissionfactor_material_product_productgroup_and_more.py +0 -164
- endoreg_db/migrations/0039_referenceproduct_name.py +0 -19
- endoreg_db/migrations/0040_quizanswertype_quizquestiontype_quizquestion_and_more.py +0 -50
- endoreg_db/migrations/0041_gender_patientmedication_medication_indication_and_more.py +0 -40
- endoreg_db/migrations/0042_casetemplateruletype_casetemplaterulevalue_and_more.py +0 -74
- endoreg_db/migrations/0043_casetemplatetype_name_de_casetemplatetype_name_en.py +0 -23
- endoreg_db/migrations/0044_casetemplateruletype_name_de_and_more.py +0 -23
- endoreg_db/migrations/0045_casetemplaterulevalue_value_type.py +0 -19
- endoreg_db/migrations/0046_casetemplaterulevalue_target_field.py +0 -18
- endoreg_db/migrations/0047_casetemplaterule_target_model.py +0 -18
- endoreg_db/migrations/0048_remove_casetemplaterule_chained_rules_and_more.py +0 -22
- endoreg_db/migrations/0049_remove_casetemplaterule_rule_values.py +0 -17
- endoreg_db/migrations/0050_casetemplaterule_rule_values.py +0 -18
- endoreg_db/migrations/0051_remove_casetemplaterule_calling_rules_and_more.py +0 -27
- endoreg_db/migrations/0052_rename_case_template_type_casetemplate_template_type.py +0 -18
- endoreg_db/migrations/0053_patientlabsampletype_patientlabsample_and_more.py +0 -38
- endoreg_db/migrations/0054_multiplecategoricalvaluedistribution_and_more.py +0 -69
- endoreg_db/migrations/0055_remove_casetemplaterule_rule_values_and_more.py +0 -59
- endoreg_db/migrations/0056_datevaluedistribution_and_more.py +0 -32
- endoreg_db/migrations/0057_remove_datevaluedistribution_max_date_and_more.py +0 -72
- endoreg_db/migrations/0058_datevaluedistribution_description_and_more.py +0 -28
- endoreg_db/migrations/0059_casetemplaterule_rule_values.py +0 -18
- endoreg_db/migrations/0060_labvalue__default_date_value_distribution_and_more.py +0 -44
- endoreg_db/migrations/0061_remove_patientlabvalue_date_patientlabvalue_datetime.py +0 -24
- endoreg_db/migrations/0062_labvalue_numeric_precision.py +0 -18
- endoreg_db/migrations/0063_alter_labvalue_numeric_precision.py +0 -18
- endoreg_db/migrations/0064_casetemplaterule_extra_parameters_and_more.py +0 -23
- endoreg_db/migrations/0065_rename__date_value_distribution_casetemplaterule_date_value_distribution_and_more.py +0 -58
- endoreg_db/migrations/0066_alter_patientlabvalue_patient_and_more.py +0 -29
- endoreg_db/migrations/0067_alter_medicationindication_indication_type.py +0 -19
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -2
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.3.6.dist-info/METADATA +0 -33
- endoreg_db-0.3.6.dist-info/RECORD +0 -357
- /endoreg_db/{models/persons/patient/case/__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 → config/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → data/case_template/rule_value/.init} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → data/distribution/multiple_categorical/.init} +0 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import mimetypes
|
|
2
|
+
from django.http import Http404
|
|
3
|
+
from django.urls import reverse
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
from rest_framework.views import APIView
|
|
6
|
+
from rest_framework.response import Response
|
|
7
|
+
from rest_framework.parsers import MultiPartParser, FormParser
|
|
8
|
+
from rest_framework.permissions import AllowAny
|
|
9
|
+
from django.views.decorators.csrf import csrf_exempt
|
|
10
|
+
from django.utils.decorators import method_decorator
|
|
11
|
+
|
|
12
|
+
# Try to import python-magic, but provide fallback if not available
|
|
13
|
+
try:
|
|
14
|
+
import magic
|
|
15
|
+
MAGIC_AVAILABLE = True
|
|
16
|
+
except ImportError:
|
|
17
|
+
MAGIC_AVAILABLE = False
|
|
18
|
+
|
|
19
|
+
from endoreg_db.models.upload_job import UploadJob
|
|
20
|
+
from endoreg_db.serializers.misc.upload_job import (
|
|
21
|
+
UploadJobStatusSerializer,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Try to import celery task, but provide fallback
|
|
25
|
+
try:
|
|
26
|
+
from endoreg_db.tasks.upload_tasks import process_upload_job
|
|
27
|
+
CELERY_AVAILABLE = True
|
|
28
|
+
except ImportError:
|
|
29
|
+
CELERY_AVAILABLE = False
|
|
30
|
+
# Define a dummy function for development
|
|
31
|
+
def process_upload_job(job_id):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@method_decorator(csrf_exempt, name='dispatch')
|
|
36
|
+
class UploadFileView(APIView):
|
|
37
|
+
"""
|
|
38
|
+
Handle file uploads (POST /api/upload/).
|
|
39
|
+
|
|
40
|
+
Accepts multipart/form-data with a 'file' field containing PDF or video files.
|
|
41
|
+
Creates an UploadJob and starts asynchronous processing.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
201 Created: {"upload_id": "<uuid>", "status_url": "/api/upload/<uuid>/status/"}
|
|
45
|
+
400 Bad Request: File validation errors
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
parser_classes = [MultiPartParser, FormParser]
|
|
49
|
+
permission_classes = [AllowAny] # Adjust based on your auth requirements
|
|
50
|
+
|
|
51
|
+
# Maximum file size (1 GiB)
|
|
52
|
+
MAX_FILE_SIZE = 1024 * 1024 * 1024 # 1 GiB in bytes
|
|
53
|
+
|
|
54
|
+
# Allowed MIME types
|
|
55
|
+
ALLOWED_MIME_TYPES = {
|
|
56
|
+
'application/pdf',
|
|
57
|
+
'video/mp4',
|
|
58
|
+
'video/avi',
|
|
59
|
+
'video/quicktime',
|
|
60
|
+
'video/x-msvideo',
|
|
61
|
+
'video/x-ms-wmv'
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
def post(self, request, *args, **kwargs):
|
|
65
|
+
"""
|
|
66
|
+
Handle file upload and create processing job.
|
|
67
|
+
"""
|
|
68
|
+
# Validate file presence
|
|
69
|
+
if 'file' not in request.FILES:
|
|
70
|
+
return Response(
|
|
71
|
+
{'error': 'No file provided. Please include a file in the "file" field.'},
|
|
72
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
uploaded_file = request.FILES['file']
|
|
76
|
+
|
|
77
|
+
# Validate file is not empty
|
|
78
|
+
if not uploaded_file or uploaded_file.size == 0:
|
|
79
|
+
return Response(
|
|
80
|
+
{'error': 'Uploaded file is empty. Please select a valid file.'},
|
|
81
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Validate file size
|
|
85
|
+
if uploaded_file.size > self.MAX_FILE_SIZE:
|
|
86
|
+
return Response(
|
|
87
|
+
{'error': f'File too large. Maximum size is {self.MAX_FILE_SIZE // (1024**3)} GB.'},
|
|
88
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Validate filename
|
|
92
|
+
if not uploaded_file.name or uploaded_file.name.strip() == '':
|
|
93
|
+
return Response(
|
|
94
|
+
{'error': 'Invalid filename. Please ensure the file has a valid name.'},
|
|
95
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# Detect MIME type
|
|
99
|
+
try:
|
|
100
|
+
content_type = self._detect_mime_type(uploaded_file)
|
|
101
|
+
except Exception as e:
|
|
102
|
+
return Response(
|
|
103
|
+
{'error': f'Could not determine file type: {str(e)}'},
|
|
104
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Validate MIME type
|
|
108
|
+
if content_type not in self.ALLOWED_MIME_TYPES:
|
|
109
|
+
return Response(
|
|
110
|
+
{'error': f'Unsupported file type: {content_type}. Allowed types: PDF, MP4, AVI, MOV, WMV.'},
|
|
111
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
# Create upload job
|
|
116
|
+
upload_job = UploadJob.objects.create(
|
|
117
|
+
file=uploaded_file,
|
|
118
|
+
content_type=content_type
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Start asynchronous processing if Celery is available
|
|
122
|
+
if CELERY_AVAILABLE:
|
|
123
|
+
try:
|
|
124
|
+
process_upload_job.delay(str(upload_job.id))
|
|
125
|
+
except Exception as e:
|
|
126
|
+
# If Celery task fails to start, mark job as failed
|
|
127
|
+
upload_job.mark_failed(f'Failed to start processing: {str(e)}')
|
|
128
|
+
return Response(
|
|
129
|
+
{'error': f'Failed to start processing: {str(e)}'},
|
|
130
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
131
|
+
)
|
|
132
|
+
else:
|
|
133
|
+
# For development without Celery, mark as processing immediately
|
|
134
|
+
upload_job.mark_processing()
|
|
135
|
+
# In production, this would be handled by Celery
|
|
136
|
+
# For now, just leave it in processing state
|
|
137
|
+
|
|
138
|
+
# Prepare response
|
|
139
|
+
status_url = reverse('upload_status', kwargs={'id': upload_job.id})
|
|
140
|
+
response_data = {
|
|
141
|
+
'upload_id': str(upload_job.id), # Ensure UUID is converted to string
|
|
142
|
+
'status_url': status_url,
|
|
143
|
+
'message': 'Upload job created successfully'
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
# Return the response data directly since serializer fields are read-only
|
|
147
|
+
return Response(
|
|
148
|
+
response_data,
|
|
149
|
+
status=status.HTTP_201_CREATED
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
except Exception as e:
|
|
153
|
+
return Response(
|
|
154
|
+
{'error': f'Failed to create upload job: {str(e)}'},
|
|
155
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
def _detect_mime_type(self, uploaded_file) -> str:
|
|
159
|
+
"""
|
|
160
|
+
Detect MIME type using python-magic as primary method,
|
|
161
|
+
fallback to mimetypes module.
|
|
162
|
+
"""
|
|
163
|
+
try:
|
|
164
|
+
# Reset file pointer
|
|
165
|
+
uploaded_file.seek(0)
|
|
166
|
+
|
|
167
|
+
# Try python-magic first (more reliable) if available
|
|
168
|
+
if MAGIC_AVAILABLE:
|
|
169
|
+
try:
|
|
170
|
+
# Read first chunk for magic detection
|
|
171
|
+
chunk = uploaded_file.read(2048)
|
|
172
|
+
uploaded_file.seek(0) # Reset again
|
|
173
|
+
|
|
174
|
+
mime_type = magic.from_buffer(chunk, mime=True)
|
|
175
|
+
if mime_type and mime_type != 'application/octet-stream':
|
|
176
|
+
return mime_type
|
|
177
|
+
except Exception:
|
|
178
|
+
pass # Fall back to mimetypes
|
|
179
|
+
|
|
180
|
+
# Fallback to mimetypes module
|
|
181
|
+
mime_type, _ = mimetypes.guess_type(uploaded_file.name)
|
|
182
|
+
if mime_type:
|
|
183
|
+
return mime_type
|
|
184
|
+
|
|
185
|
+
# Last resort - check file extension
|
|
186
|
+
if uploaded_file.name.lower().endswith('.pdf'):
|
|
187
|
+
return 'application/pdf'
|
|
188
|
+
elif uploaded_file.name.lower().endswith(('.mp4', '.m4v')):
|
|
189
|
+
return 'video/mp4'
|
|
190
|
+
elif uploaded_file.name.lower().endswith('.avi'):
|
|
191
|
+
return 'video/avi'
|
|
192
|
+
elif uploaded_file.name.lower().endswith(('.mov', '.qt')):
|
|
193
|
+
return 'video/quicktime'
|
|
194
|
+
elif uploaded_file.name.lower().endswith('.wmv'):
|
|
195
|
+
return 'video/x-ms-wmv'
|
|
196
|
+
|
|
197
|
+
raise ValueError("Could not determine file type")
|
|
198
|
+
|
|
199
|
+
finally:
|
|
200
|
+
# Ensure file pointer is reset
|
|
201
|
+
uploaded_file.seek(0)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class UploadStatusView(APIView):
|
|
205
|
+
"""
|
|
206
|
+
Get upload job status (GET /api/upload/<uuid>/status/).
|
|
207
|
+
|
|
208
|
+
Returns current processing status and relevant metadata.
|
|
209
|
+
Should be polled every 2 seconds by the frontend.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
200 OK: Status information
|
|
213
|
+
404 Not Found: Upload job not found
|
|
214
|
+
"""
|
|
215
|
+
|
|
216
|
+
permission_classes = [AllowAny] # Adjust based on your auth requirements
|
|
217
|
+
|
|
218
|
+
def get(self, request, id, *args, **kwargs):
|
|
219
|
+
"""
|
|
220
|
+
Return the current status of an upload job.
|
|
221
|
+
"""
|
|
222
|
+
try:
|
|
223
|
+
# Look up upload job by UUID
|
|
224
|
+
upload_job = UploadJob.objects.select_related('sensitive_meta').get(id=id)
|
|
225
|
+
|
|
226
|
+
# Serialize the response
|
|
227
|
+
serializer = UploadJobStatusSerializer(upload_job)
|
|
228
|
+
|
|
229
|
+
return Response(
|
|
230
|
+
serializer.data,
|
|
231
|
+
status=status.HTTP_200_OK
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
except UploadJob.DoesNotExist:
|
|
235
|
+
raise Http404("Upload job not found")
|
|
236
|
+
except Exception as e:
|
|
237
|
+
return Response(
|
|
238
|
+
{'error': f'Failed to get upload status: {str(e)}'},
|
|
239
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
240
|
+
)
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
from django.shortcuts import render
|
|
2
|
+
from django.contrib.admin.views.decorators import staff_member_required
|
|
3
|
+
from django.db import transaction
|
|
4
|
+
|
|
5
|
+
from rest_framework import viewsets, status, serializers
|
|
6
|
+
from rest_framework.response import Response
|
|
7
|
+
from rest_framework.decorators import action
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from endoreg_db.models import Patient
|
|
11
|
+
from endoreg_db.serializers.patient import PatientSerializer
|
|
12
|
+
from endoreg_db.models.medical.patient.patient_examination import PatientExamination
|
|
13
|
+
|
|
14
|
+
@staff_member_required # Ensures only staff members can access the page
|
|
15
|
+
def start_examination(request):
|
|
16
|
+
return render(request, 'admin/start_examination.html') # Loads the simple HTML page
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
#TODO Review this view
|
|
20
|
+
class PatientViewSet(viewsets.ModelViewSet):
|
|
21
|
+
"""API endpoint for managing patients."""
|
|
22
|
+
queryset = Patient.objects.all()
|
|
23
|
+
serializer_class = PatientSerializer
|
|
24
|
+
#permission_classes = [IsAuthenticatedOrReadOnly]
|
|
25
|
+
|
|
26
|
+
def perform_create(self, serializer):
|
|
27
|
+
"""Erweiterte Validierung beim Erstellen eines Patienten"""
|
|
28
|
+
try:
|
|
29
|
+
# Zusätzliche Validierung falls nötig
|
|
30
|
+
patient = serializer.save()
|
|
31
|
+
return patient
|
|
32
|
+
except Exception as e:
|
|
33
|
+
raise serializers.ValidationError(f"Fehler beim Erstellen des Patienten: {str(e)}")
|
|
34
|
+
|
|
35
|
+
def update(self, request, *args, **kwargs):
|
|
36
|
+
"""Erweiterte Logik für das Aktualisieren von Patienten"""
|
|
37
|
+
try:
|
|
38
|
+
return super().update(request, *args, **kwargs)
|
|
39
|
+
except Exception as e:
|
|
40
|
+
return Response(
|
|
41
|
+
{"error": f"Fehler beim Aktualisieren des Patienten: {str(e)}"},
|
|
42
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def destroy(self, request, *args, **kwargs):
|
|
46
|
+
"""
|
|
47
|
+
Delete a patient with proper error handling and cascade protection.
|
|
48
|
+
"""
|
|
49
|
+
patient = self.get_object()
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
with transaction.atomic():
|
|
53
|
+
# Check if patient has related examinations
|
|
54
|
+
examination_count = patient.patient_examinations.count() if hasattr(patient, 'patient_examinations') else 0
|
|
55
|
+
finding_count = 0
|
|
56
|
+
|
|
57
|
+
if examination_count > 0:
|
|
58
|
+
finding_count = sum(
|
|
59
|
+
exam.patient_findings.count() if hasattr(exam, 'patient_findings') else 0
|
|
60
|
+
for exam in patient.patient_examinations.all()
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return Response({
|
|
64
|
+
'error': 'Patient cannot be deleted',
|
|
65
|
+
'reason': f'Patient has {examination_count} examination(s) and {finding_count} finding(s).',
|
|
66
|
+
'detail': 'Please remove all related examinations and findings before deleting the patient.'
|
|
67
|
+
}, status=status.HTTP_409_CONFLICT)
|
|
68
|
+
|
|
69
|
+
# Check if this is a real person (additional protection)
|
|
70
|
+
if hasattr(patient, 'is_real_person') and patient.is_real_person:
|
|
71
|
+
return Response({
|
|
72
|
+
'error': 'Cannot delete real patient',
|
|
73
|
+
'reason': 'This patient is marked as a real person.',
|
|
74
|
+
'detail': 'Real patient data cannot be deleted for data protection reasons.'
|
|
75
|
+
}, status=status.HTTP_403_FORBIDDEN)
|
|
76
|
+
|
|
77
|
+
# Perform the deletion
|
|
78
|
+
patient_name = f"{patient.first_name} {patient.last_name}"
|
|
79
|
+
patient.delete()
|
|
80
|
+
|
|
81
|
+
return Response({
|
|
82
|
+
'message': f'Patient "{patient_name}" has been successfully deleted.'
|
|
83
|
+
}, status=status.HTTP_200_OK)
|
|
84
|
+
|
|
85
|
+
except Exception as e:
|
|
86
|
+
return Response({
|
|
87
|
+
'error': 'Patient deletion failed',
|
|
88
|
+
'reason': 'Patient has protected related objects.',
|
|
89
|
+
'detail': str(e)
|
|
90
|
+
}, status=status.HTTP_409_CONFLICT)
|
|
91
|
+
except Exception as e:
|
|
92
|
+
return Response(
|
|
93
|
+
{"error": f"Fehler beim Löschen des Patienten: {str(e)}"},
|
|
94
|
+
status=status.HTTP_400_BAD_REQUEST
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def check_pe_exist(self, request, pk=None):
|
|
98
|
+
"""Check if a patient examination exists.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
request (id): pk of the PatientExamination
|
|
102
|
+
pk (int, optional): _description_. Defaults to None.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
_type_: _description_
|
|
106
|
+
"""
|
|
107
|
+
try:
|
|
108
|
+
PatientExamination.objects.get(pk=pk)
|
|
109
|
+
return Response({"exists": True}, status=status.HTTP_200_OK)
|
|
110
|
+
except PatientExamination.DoesNotExist:
|
|
111
|
+
return Response({"exists": False}, status=status.HTTP_404_NOT_FOUND)
|
|
112
|
+
|
|
113
|
+
@action(detail=True, methods=['get'])
|
|
114
|
+
def check_deletion_safety(self, request, pk=None):
|
|
115
|
+
"""
|
|
116
|
+
Check if a patient can be safely deleted.
|
|
117
|
+
Returns information about related objects.
|
|
118
|
+
"""
|
|
119
|
+
patient = self.get_object()
|
|
120
|
+
|
|
121
|
+
examination_count = patient.patient_examinations.count() if hasattr(patient, 'patient_examinations') else 0
|
|
122
|
+
examinations = patient.patient_examinations.all() if hasattr(patient, 'patient_examinations') else []
|
|
123
|
+
|
|
124
|
+
finding_count = sum(
|
|
125
|
+
exam.patient_findings.count() if hasattr(exam, 'patient_findings') else 0
|
|
126
|
+
for exam in examinations
|
|
127
|
+
)
|
|
128
|
+
video_count = sum(
|
|
129
|
+
1 for exam in examinations
|
|
130
|
+
if hasattr(exam, 'video') and exam.video
|
|
131
|
+
)
|
|
132
|
+
report_count = sum(
|
|
133
|
+
exam.raw_pdf_files.count() if hasattr(exam, 'raw_pdf_files') else 0
|
|
134
|
+
for exam in examinations
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
is_real_person = hasattr(patient, 'is_real_person') and patient.is_real_person
|
|
138
|
+
can_delete = examination_count == 0 and not is_real_person
|
|
139
|
+
|
|
140
|
+
warnings = []
|
|
141
|
+
if is_real_person:
|
|
142
|
+
warnings.append('This patient is marked as a real person')
|
|
143
|
+
if examination_count > 0:
|
|
144
|
+
warnings.append(f'Patient has {examination_count} examination(s)')
|
|
145
|
+
if finding_count > 0:
|
|
146
|
+
warnings.append(f'Patient has {finding_count} finding(s)')
|
|
147
|
+
|
|
148
|
+
return Response({
|
|
149
|
+
'can_delete': can_delete,
|
|
150
|
+
'is_real_person': is_real_person,
|
|
151
|
+
'related_objects': {
|
|
152
|
+
'examinations': examination_count,
|
|
153
|
+
'findings': finding_count,
|
|
154
|
+
'videos': video_count,
|
|
155
|
+
'reports': report_count
|
|
156
|
+
},
|
|
157
|
+
'warnings': warnings
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
@action(detail=False, methods=['get'])
|
|
161
|
+
def patient_count(self, request):
|
|
162
|
+
"""Gibt die Anzahl der Patienten zurück"""
|
|
163
|
+
count = Patient.objects.count()
|
|
164
|
+
return Response({"count": count})
|
|
165
|
+
|
|
166
|
+
@action(detail=True, methods=['post'], url_path='pseudonym')
|
|
167
|
+
def generate_pseudonym(self, request, pk=None):
|
|
168
|
+
"""
|
|
169
|
+
Generate a pseudonym hash for an existing patient.
|
|
170
|
+
|
|
171
|
+
This endpoint generates a deterministic hash based on the patient's
|
|
172
|
+
personal data (name, dob, center) using server-side logic without
|
|
173
|
+
exposing any secrets to the frontend.
|
|
174
|
+
"""
|
|
175
|
+
from endoreg_db.services.pseudonym_service import generate_patient_pseudonym, validate_patient_for_pseudonym
|
|
176
|
+
|
|
177
|
+
patient = self.get_object()
|
|
178
|
+
|
|
179
|
+
try:
|
|
180
|
+
# Validate that patient has required fields
|
|
181
|
+
missing_fields = validate_patient_for_pseudonym(patient)
|
|
182
|
+
if missing_fields:
|
|
183
|
+
return Response({
|
|
184
|
+
'error': 'Missing required fields for pseudonym generation',
|
|
185
|
+
'missing_fields': missing_fields,
|
|
186
|
+
'detail': f'Please provide: {", ".join(missing_fields)}'
|
|
187
|
+
}, status=status.HTTP_400_BAD_REQUEST)
|
|
188
|
+
|
|
189
|
+
# Generate the pseudonym
|
|
190
|
+
patient_hash, persisted = generate_patient_pseudonym(patient)
|
|
191
|
+
|
|
192
|
+
return Response({
|
|
193
|
+
'patient_id': patient.id,
|
|
194
|
+
'patient_hash': patient_hash,
|
|
195
|
+
'source': 'server',
|
|
196
|
+
'persisted': persisted,
|
|
197
|
+
'message': 'Pseudonym generated successfully'
|
|
198
|
+
}, status=status.HTTP_200_OK)
|
|
199
|
+
|
|
200
|
+
except ValueError as e:
|
|
201
|
+
return Response({
|
|
202
|
+
'error': 'Pseudonym generation failed',
|
|
203
|
+
'detail': str(e)
|
|
204
|
+
}, status=status.HTTP_400_BAD_REQUEST)
|
|
205
|
+
except Exception as e:
|
|
206
|
+
return Response({
|
|
207
|
+
'error': 'Internal server error during pseudonym generation',
|
|
208
|
+
'detail': str(e)
|
|
209
|
+
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
210
|
+
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# from rest_framework import viewsets, status
|
|
2
|
+
# from rest_framework.response import Response
|
|
3
|
+
# from django.shortcuts import get_object_or_404
|
|
4
|
+
# from endoreg_db.models import Examination, VideoFile, Finding, FindingClassification
|
|
5
|
+
# from django.db import transaction
|
|
6
|
+
# from django.utils import timezone
|
|
7
|
+
# import logging
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# class VideoExaminationViewSet(viewsets.ModelViewSet):
|
|
11
|
+
# """
|
|
12
|
+
# ViewSet for Video Examination CRUD operations
|
|
13
|
+
# Handles POST and PATCH for video examinations at timestamps
|
|
14
|
+
# """
|
|
15
|
+
# def get_queryset(self):
|
|
16
|
+
# return []
|
|
17
|
+
|
|
18
|
+
# def create(self, request, *args, **kwargs):
|
|
19
|
+
|
|
20
|
+
# logger = logging.getLogger(__name__)
|
|
21
|
+
# try:
|
|
22
|
+
# data = request.data
|
|
23
|
+
# required_fields = ['videoId', 'timestamp', 'examinationTypeId', 'findingId']
|
|
24
|
+
# for field in required_fields:
|
|
25
|
+
# if field not in data or data[field] is None:
|
|
26
|
+
# return Response({'error': f'Missing or null required field: {field}'}, status=status.HTTP_400_BAD_REQUEST)
|
|
27
|
+
# try:
|
|
28
|
+
# video_id = int(data['videoId'])
|
|
29
|
+
# timestamp = float(data['timestamp'])
|
|
30
|
+
# examination_type_id = int(data['examinationTypeId'])
|
|
31
|
+
# finding_id = int(data['findingId'])
|
|
32
|
+
# except (ValueError, TypeError) as e:
|
|
33
|
+
# return Response({'error': f'Invalid data type in request: {str(e)}'}, status=status.HTTP_400_BAD_REQUEST)
|
|
34
|
+
# if timestamp < 0:
|
|
35
|
+
# return Response({'error': 'Timestamp cannot be negative'}, status=status.HTTP_400_BAD_REQUEST)
|
|
36
|
+
# with transaction.atomic():
|
|
37
|
+
# try:
|
|
38
|
+
# video = VideoFile.objects.get(id=video_id)
|
|
39
|
+
# except VideoFile.DoesNotExist:
|
|
40
|
+
# return Response({'error': 'Video not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
41
|
+
# try:
|
|
42
|
+
# examination = Examination.objects.get(id=examination_type_id)
|
|
43
|
+
# except Examination.DoesNotExist:
|
|
44
|
+
# return Response({'error': 'Examination type not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
45
|
+
# try:
|
|
46
|
+
# finding = Finding.objects.get(id=finding_id)
|
|
47
|
+
# except Finding.DoesNotExist:
|
|
48
|
+
# return Response({'error': 'Finding not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
49
|
+
# if data.get('locationClassificationId'):
|
|
50
|
+
# try:
|
|
51
|
+
# FindingClassification.objects.get(id=data['locationClassificationId'], classification_types__name__iexact="location")
|
|
52
|
+
# except FindingClassification.DoesNotExist:
|
|
53
|
+
# return Response({'error': 'Location classification not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
54
|
+
# if data.get('morphologyClassificationId'):
|
|
55
|
+
# try:
|
|
56
|
+
# FindingClassification.objects.get(id=data['morphologyClassificationId'], classification_types__name__iexact="morphology")
|
|
57
|
+
# except FindingClassification.DoesNotExist:
|
|
58
|
+
# return Response({'error': 'Morphology classification not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
59
|
+
# examination_data = {
|
|
60
|
+
# 'id': f"exam_{video.id}_{timestamp}_{examination.id}",
|
|
61
|
+
# 'video_id': video_id,
|
|
62
|
+
# 'timestamp': timestamp,
|
|
63
|
+
# 'examination_type': examination.name,
|
|
64
|
+
# 'finding': finding.name,
|
|
65
|
+
# 'location_classification': data.get('locationClassificationId'),
|
|
66
|
+
# 'location_choice': data.get('locationChoiceId'),
|
|
67
|
+
# 'morphology_classification': data.get('morphologyClassificationId'),
|
|
68
|
+
# 'morphology_choice': data.get('morphologyChoiceId'),
|
|
69
|
+
# 'interventions': data.get('interventionIds', []),
|
|
70
|
+
# 'notes': data.get('notes', ''),
|
|
71
|
+
# 'created_at': timezone.now().isoformat()
|
|
72
|
+
# }
|
|
73
|
+
# logger.info(f"Created video examination for video {video_id} at timestamp {timestamp}")
|
|
74
|
+
# return Response(examination_data, status=status.HTTP_201_CREATED)
|
|
75
|
+
# except Exception as e:
|
|
76
|
+
# logger.error(f"Unexpected error creating examination: {str(e)}")
|
|
77
|
+
# return Response({'error': 'Internal server error while creating examination'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
78
|
+
|
|
79
|
+
# def update(self, request, *args, **kwargs):
|
|
80
|
+
# logger = logging.getLogger(__name__)
|
|
81
|
+
# try:
|
|
82
|
+
# examination_id = kwargs.get('pk')
|
|
83
|
+
# if not examination_id:
|
|
84
|
+
# return Response({'error': 'Examination ID is required'}, status=status.HTTP_400_BAD_REQUEST)
|
|
85
|
+
# data = request.data
|
|
86
|
+
# if 'videoId' in data:
|
|
87
|
+
# try:
|
|
88
|
+
# data['videoId'] = int(data['videoId'])
|
|
89
|
+
# except (ValueError, TypeError):
|
|
90
|
+
# return Response({'error': 'Invalid videoId format'}, status=status.HTTP_400_BAD_REQUEST)
|
|
91
|
+
# if 'timestamp' in data:
|
|
92
|
+
# try:
|
|
93
|
+
# timestamp = float(data['timestamp'])
|
|
94
|
+
# if timestamp < 0:
|
|
95
|
+
# return Response({'error': 'Timestamp cannot be negative'}, status=status.HTTP_400_BAD_REQUEST)
|
|
96
|
+
# data['timestamp'] = timestamp
|
|
97
|
+
# except (ValueError, TypeError):
|
|
98
|
+
# return Response({'error': 'Invalid timestamp format'}, status=status.HTTP_400_BAD_REQUEST)
|
|
99
|
+
# with transaction.atomic():
|
|
100
|
+
# if 'videoId' in data:
|
|
101
|
+
# try:
|
|
102
|
+
# VideoFile.objects.get(id=data['videoId'])
|
|
103
|
+
# except VideoFile.DoesNotExist:
|
|
104
|
+
# return Response({'error': 'Video not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
105
|
+
# if 'examinationTypeId' in data:
|
|
106
|
+
# try:
|
|
107
|
+
# examination_type_id = int(data['examinationTypeId'])
|
|
108
|
+
# Examination.objects.get(id=examination_type_id)
|
|
109
|
+
# except (ValueError, TypeError):
|
|
110
|
+
# return Response({'error': 'Invalid examination type ID format'}, status=status.HTTP_400_BAD_REQUEST)
|
|
111
|
+
# except Examination.DoesNotExist:
|
|
112
|
+
# return Response({'error': 'Examination type not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
113
|
+
# if 'findingId' in data:
|
|
114
|
+
# try:
|
|
115
|
+
# finding_id = int(data['findingId'])
|
|
116
|
+
# Finding.objects.get(id=finding_id)
|
|
117
|
+
# except (ValueError, TypeError):
|
|
118
|
+
# return Response({'error': 'Invalid finding ID format'}, status=status.HTTP_400_BAD_REQUEST)
|
|
119
|
+
# except Finding.DoesNotExist:
|
|
120
|
+
# return Response({'error': 'Finding not found'}, status=status.HTTP_404_NOT_FOUND)
|
|
121
|
+
# examination_data = {
|
|
122
|
+
# 'id': examination_id,
|
|
123
|
+
# 'video_id': data.get('videoId'),
|
|
124
|
+
# 'timestamp': data.get('timestamp'),
|
|
125
|
+
# 'examination_type': data.get('examinationTypeId'),
|
|
126
|
+
# 'finding': data.get('findingId'),
|
|
127
|
+
# 'location_classification': data.get('locationClassificationId'),
|
|
128
|
+
# 'location_choice': data.get('locationChoiceId'),
|
|
129
|
+
# 'morphology_classification': data.get('morphologyClassificationId'),
|
|
130
|
+
# 'morphology_choice': data.get('morphologyChoiceId'),
|
|
131
|
+
# 'interventions': data.get('interventionIds', []),
|
|
132
|
+
# 'notes': data.get('notes', ''),
|
|
133
|
+
# 'updated_at': '2024-01-01T00:00:00Z'
|
|
134
|
+
# }
|
|
135
|
+
# logger.info(f"Updated video examination {examination_id}")
|
|
136
|
+
# return Response(examination_data, status=status.HTTP_200_OK)
|
|
137
|
+
# except Exception as e:
|
|
138
|
+
# logger.error(f"Unexpected error updating examination {examination_id}: {str(e)}")
|
|
139
|
+
# return Response({'error': 'Internal server error while updating examination'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
140
|
+
|
|
141
|
+
# def destroy(self, request, *args, **kwargs):
|
|
142
|
+
# logger = logging.getLogger(__name__)
|
|
143
|
+
# try:
|
|
144
|
+
# examination_id = kwargs.get('pk')
|
|
145
|
+
# if not examination_id:
|
|
146
|
+
# return Response({'error': 'Examination ID is required'}, status=status.HTTP_400_BAD_REQUEST)
|
|
147
|
+
# try:
|
|
148
|
+
# if not str(examination_id).strip():
|
|
149
|
+
# return Response({'error': 'Invalid examination ID format'}, status=status.HTTP_400_BAD_REQUEST)
|
|
150
|
+
# except (ValueError, TypeError):
|
|
151
|
+
# return Response({'error': 'Invalid examination ID format'}, status=status.HTTP_400_BAD_REQUEST)
|
|
152
|
+
# with transaction.atomic():
|
|
153
|
+
# logger.info(f"Deleted video examination {examination_id}")
|
|
154
|
+
# return Response({'message': f'Examination {examination_id} deleted successfully'}, status=status.HTTP_204_NO_CONTENT)
|
|
155
|
+
# except Exception as e:
|
|
156
|
+
# logger.error(f"Unexpected error deleting examination {examination_id}: {str(e)}")
|
|
157
|
+
# return Response({'error': 'Internal server error while deleting examination'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
158
|
+
|
|
159
|
+
# from rest_framework.decorators import api_view
|
|
160
|
+
# @api_view(["GET"])
|
|
161
|
+
# def get_examinations_for_video(request, video_id):
|
|
162
|
+
# _video = get_object_or_404(VideoFile, id=video_id)
|
|
163
|
+
# #TODO no functionality implemented yet
|
|
164
|
+
# return Response([])
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .patient_examination_create import ExaminationCreateView
|
|
2
|
+
from .patient_examination_detail import PatientExaminationDetailView
|
|
3
|
+
from .patient_examination_list import PatientExaminationListView
|
|
4
|
+
from .patient_examination import PatientExaminationViewSet
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
'ExaminationCreateView',
|
|
8
|
+
'PatientExaminationDetailView',
|
|
9
|
+
'PatientExaminationListView',
|
|
10
|
+
'PatientExaminationViewSet'
|
|
11
|
+
]
|