endoreg-db 0.8.5.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/__init__.py +0 -0
- endoreg_db/admin.py +92 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -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/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +91 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- 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/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- 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 +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- 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 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -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/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/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/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- 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 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- 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 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- 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 +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -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/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- 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 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- 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/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- 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/person.py +31 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- 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 -0
- 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 -0
- 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 +613 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +699 -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/medical/hardware/endoscopy_processor.py +182 -0
- 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/medical/patient/patient_lab_value.py +222 -0
- 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/metadata/pdf_meta.py +89 -0
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +730 -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 -0
- 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/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- 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/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- 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 +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -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 -0
- 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 +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/pdf_import.py +1159 -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 +1258 -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 +70 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +226 -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 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- 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 +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- 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 -0
- 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 -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 +76 -0
- endoreg_db/utils/ocr.py +190 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +272 -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 +386 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +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 +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +161 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +61 -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 +329 -0
- endoreg_db/views/video/video_media.py +158 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -0
- endoreg_db-0.8.5.1.dist-info/METADATA +383 -0
- endoreg_db-0.8.5.1.dist-info/RECORD +794 -0
- endoreg_db-0.8.5.1.dist-info/WHEEL +4 -0
- endoreg_db-0.8.5.1.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
from .rule import Rule
|
|
2
|
+
import random
|
|
3
|
+
from django.core.exceptions import ValidationError
|
|
4
|
+
|
|
5
|
+
class RuleApplicator:
|
|
6
|
+
"""
|
|
7
|
+
A class to apply different types of rules to a Django model instance based on the Rule configuration.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
def get_rule_by_name(self, rule_name):
|
|
11
|
+
"""
|
|
12
|
+
A helper method to fetch a rule by name. This can be further customized.
|
|
13
|
+
"""
|
|
14
|
+
# get rule by name which is natural key
|
|
15
|
+
rule = Rule.objects.get_by_natural_key(rule_name)
|
|
16
|
+
return rule
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def apply(self, obj, rule):
|
|
20
|
+
"""
|
|
21
|
+
Applies a specified rule to an object based on the rule type and attributes.
|
|
22
|
+
|
|
23
|
+
Parameters:
|
|
24
|
+
obj (Django model instance): The object to which the rule is applied.
|
|
25
|
+
rule (Rule): The rule instance containing the rule_type and attribute details.
|
|
26
|
+
"""
|
|
27
|
+
rule_type_method = self.get_rule_type_method(rule.rule_type.name)
|
|
28
|
+
if rule_type_method:
|
|
29
|
+
rule_type_method(obj, rule)
|
|
30
|
+
|
|
31
|
+
else:
|
|
32
|
+
raise ValueError(f"Unsupported rule type: {rule.rule_type.name}")
|
|
33
|
+
|
|
34
|
+
def apply_rule_by_name(self, obj, rule_name):
|
|
35
|
+
"""
|
|
36
|
+
A helper method to apply a rule and get a value. This can be further customized.
|
|
37
|
+
"""
|
|
38
|
+
rule = self.get_rule_by_name(rule_name)
|
|
39
|
+
self.apply(obj, rule)
|
|
40
|
+
|
|
41
|
+
def apply_rules_by_name(self, obj, rule_names):
|
|
42
|
+
"""
|
|
43
|
+
A helper method to apply multiple rules and get values. This can be further customized.
|
|
44
|
+
"""
|
|
45
|
+
rules = [self.get_rule_by_name(rule_name) for rule_name in rule_names]
|
|
46
|
+
for rule in rules:
|
|
47
|
+
self.apply(obj, rule)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_rule_type_method(self, rule_type_name):
|
|
51
|
+
"""
|
|
52
|
+
Maps rule type name to the corresponding method.
|
|
53
|
+
"""
|
|
54
|
+
return getattr(self, f"handle_{rule_type_name}", None)
|
|
55
|
+
|
|
56
|
+
def parse_attribute_path(self, obj, attribute_key):
|
|
57
|
+
"""
|
|
58
|
+
Parses the attribute path and applies the value to the correct attribute of a nested object.
|
|
59
|
+
"""
|
|
60
|
+
parts = attribute_key.split('.')
|
|
61
|
+
model_name = parts[0]
|
|
62
|
+
if model_name.lower() != obj.__class__.__name__.lower():
|
|
63
|
+
raise ValidationError(f"Model type mismatch: expected {model_name}, got {obj.__class__.__name__}")
|
|
64
|
+
|
|
65
|
+
# Navigate through the nested attributes
|
|
66
|
+
target = obj
|
|
67
|
+
for part in parts[1:-1]:
|
|
68
|
+
target = getattr(target, part)
|
|
69
|
+
|
|
70
|
+
return target, parts[-1]
|
|
71
|
+
|
|
72
|
+
def set_attribute_value(self, obj, rule):
|
|
73
|
+
"""
|
|
74
|
+
Generic method to set attribute value considering nested paths.
|
|
75
|
+
"""
|
|
76
|
+
target, attribute = self.parse_attribute_path(obj, rule.attribute_key)
|
|
77
|
+
setattr(target, attribute, rule.attribute_dict['value'])
|
|
78
|
+
target.save()
|
|
79
|
+
|
|
80
|
+
#####
|
|
81
|
+
|
|
82
|
+
def handle_case_attribute_set_value(self, obj, rule):
|
|
83
|
+
"""
|
|
84
|
+
Sets a specific attribute to a given value.
|
|
85
|
+
"""
|
|
86
|
+
self.set_attribute_value(obj, rule.attribute_key, rule.attribute_dict["value"])
|
|
87
|
+
|
|
88
|
+
def handle_case_attribute_set_value_range_uniform(self, obj, rule):
|
|
89
|
+
"""
|
|
90
|
+
Sets an attribute to a value within a specified range, selected uniformly.
|
|
91
|
+
"""
|
|
92
|
+
if not hasattr(rule, 'attribute_dtype') or rule.attribute_dtype.name not in ['numeric', 'ordered_categorical']:
|
|
93
|
+
raise ValidationError("Attribute dtype must be numeric or ordered_categorical")
|
|
94
|
+
min_val = rule.attribute_dict["value_min"]
|
|
95
|
+
max_val = rule.attribute_dict["value_max"]
|
|
96
|
+
value = random.uniform(min_val, max_val)
|
|
97
|
+
self.set_attribute_value(obj, rule.attribute_key, value)
|
|
98
|
+
|
|
99
|
+
def handle_case_attribute_set_value_range_norm_dist(self, obj, rule):
|
|
100
|
+
"""
|
|
101
|
+
Sets an attribute to a value within a specified range, based on a normal distribution.
|
|
102
|
+
"""
|
|
103
|
+
if rule.attribute_dtype.name in ['float', "integer"]:
|
|
104
|
+
raise ValidationError("Attribute dtype must be float or integer")
|
|
105
|
+
mean = rule.attribute_dict["value_mean"]
|
|
106
|
+
std_dev = rule.attribute_dict["value_sd"]
|
|
107
|
+
value = random.normalvariate(mean, std_dev)
|
|
108
|
+
self.set_attribute_value(obj, rule.attribute_key, value)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def handle_case_attribute_set_from_list_uniform(self, obj, rule):
|
|
112
|
+
"""
|
|
113
|
+
Selects an attribute value uniformly from a list of choices.
|
|
114
|
+
"""
|
|
115
|
+
choices = rule.attribute_dict["value_choices"]
|
|
116
|
+
value = random.choice(choices)
|
|
117
|
+
self.set_attribute_value(obj, rule.attribute_key, value)
|
|
118
|
+
|
|
119
|
+
def handle_case_attribute_set_from_prop_tuple_list(self, obj, rule):
|
|
120
|
+
"""
|
|
121
|
+
Selects an attribute value based on a list of value-probability tuples.
|
|
122
|
+
"""
|
|
123
|
+
prop_list = rule.attribute_dict["value_prop_tuple_list"]
|
|
124
|
+
total = sum(prop for _, prop in prop_list)
|
|
125
|
+
pick = random.uniform(0, total)
|
|
126
|
+
current = 0
|
|
127
|
+
for value, prop in prop_list:
|
|
128
|
+
current += prop
|
|
129
|
+
if current > pick:
|
|
130
|
+
self.set_attribute_value(obj, rule.attribute_key, value)
|
|
131
|
+
break
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
#####
|
|
135
|
+
|
|
136
|
+
def handle_case_add_patient(self, obj, rule):
|
|
137
|
+
"""Function to add a patient to a case. If the patient already exists, raise an error. Requires the following
|
|
138
|
+
rules in the rule_dict:
|
|
139
|
+
- gender_rule
|
|
140
|
+
- dob_rule
|
|
141
|
+
- event_rules
|
|
142
|
+
- disease_rules
|
|
143
|
+
"""
|
|
144
|
+
from endoreg_db.models import Patient, PatientEvent, PatientDisease, Case
|
|
145
|
+
|
|
146
|
+
# Check if the
|
|
147
|
+
obj:Case = obj
|
|
148
|
+
if obj.patient:
|
|
149
|
+
raise ValueError("Patient already exists in the case")
|
|
150
|
+
|
|
151
|
+
patient = Patient()
|
|
152
|
+
self.apply_rule_by_name(patient, rule.attribute_dict["patient_gender_rule"])
|
|
153
|
+
self.apply_rule_by_name(patient, rule.attribute_dict["patient_dob_rule"])
|
|
154
|
+
self.apply_rules_by_name(patient, rule.attribute_dict["patient_event_rules"])
|
|
155
|
+
self.apply_rules_by_name(patient, rule.attribute_dict["patient_disease_rules"])
|
|
156
|
+
|
|
157
|
+
def handle_case_add_polyp(self, obj, rule):
|
|
158
|
+
"""
|
|
159
|
+
Adds a polyp to the case, processing various polyp characteristics. Requires Rules for each attribute:
|
|
160
|
+
- polyp_location_organ_rule (single rule)
|
|
161
|
+
- polyp_location_organ_part_rule (single rule)
|
|
162
|
+
- polyp_morphology_classification_shape_choices_rule (list of rules)
|
|
163
|
+
- polyp_morphology_classification_chromo_choices_rule (list of rules)
|
|
164
|
+
- polyp_intervention_type_rule (single rule)
|
|
165
|
+
- polyp_intervention_instrument_rule (single rule)
|
|
166
|
+
- polyp_size_mm_rule (single rule)
|
|
167
|
+
|
|
168
|
+
"""
|
|
169
|
+
# Example: create and add a polyp instance based on the rules
|
|
170
|
+
from endoreg_db.models import Polyp # Ensure you have a Polyp model and adjust the import
|
|
171
|
+
from endoreg_db.models import Location
|
|
172
|
+
from endoreg_db.models import EndoscopicIntervention
|
|
173
|
+
from endoreg_db.models import PolypMorphology
|
|
174
|
+
|
|
175
|
+
assert obj.examination.type != None, "Examination type is required"
|
|
176
|
+
|
|
177
|
+
location = Location()
|
|
178
|
+
location.organ = self.apply_rule_by_name(location, rule.attribute_dict["polyp_location_organ_rule"])
|
|
179
|
+
location.organ_part = self.apply_rule_by_name(location, rule.attribute_dict["polyp_location_organ_part_rule"])
|
|
180
|
+
location.save()
|
|
181
|
+
|
|
182
|
+
morphology = PolypMorphology()
|
|
183
|
+
# M2M to ClassificationChoice (linked to Classification which has name as natural key)
|
|
184
|
+
morphology.shape_classification_choices = self.apply_rules_by_name(morphology, rule.attribute_dict["polyp_morphology_classification_shape_choices_rules"])
|
|
185
|
+
# M2M to ClassificationChoice (linked to Classification which has name as natural key)
|
|
186
|
+
morphology.chromo_classification_choices = self.apply_rules_by_name(morphology, rule.attribute_dict["polyp_morphology_classification_chromo_choices_rules"])
|
|
187
|
+
morphology.save()
|
|
188
|
+
|
|
189
|
+
intervention = EndoscopicIntervention()
|
|
190
|
+
intervention.type = self.apply_rule_by_name(intervention, rule.attribute_dict["polyp_intervention_type_rule"])
|
|
191
|
+
intervention.instrument = self.apply_rule_by_name(intervention, rule.attribute_dict["polyp_intervention_instrument_rule"])
|
|
192
|
+
intervention.save()
|
|
193
|
+
|
|
194
|
+
polyp = Polyp()
|
|
195
|
+
polyp.size_mm = self.apply_rule_by_name(polyp, rule.attribute_dict["polyp_size_mm_rule"])
|
|
196
|
+
polyp.location = location
|
|
197
|
+
polyp.morphology = morphology
|
|
198
|
+
polyp.intervention = intervention
|
|
199
|
+
|
|
200
|
+
polyp.save()
|
|
201
|
+
|
|
202
|
+
obj.polyps.add(polyp)
|
|
203
|
+
obj.save()
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# def handle_case_add_esophageal_varices(self, obj, rule):
|
|
207
|
+
# """
|
|
208
|
+
# Handles adding esophageal varices to a case based on the rule.
|
|
209
|
+
# """
|
|
210
|
+
# # Similar to the polyp case, create and add esophageal varices based on the attributes
|
|
211
|
+
# from endoreg_db.models import EsophagealVarices # Ensure this model exists
|
|
212
|
+
# varices = EsophagealVarices()
|
|
213
|
+
# varices.origin = self.apply_rule_by_name(obj, rule.attribute_dict["esophageal_varices_origin_rule"])
|
|
214
|
+
# varices.classification = self.apply_rule_by_name(obj, rule.attribute_dict["esophageal_varices_classification_rule"])
|
|
215
|
+
# varices.location_extent = self.apply_rule_by_name(obj, rule.attribute_dict["esophageal_varices_location_extent_rule"])
|
|
216
|
+
# varices.save()
|
|
217
|
+
# # Assuming a relationship setup
|
|
218
|
+
# obj.esophageal_varices.add(varices)
|
|
219
|
+
# obj.save()
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RuleAttributeDtypeManager(models.Manager):
|
|
5
|
+
def get_by_natural_key(self, name):
|
|
6
|
+
return self.get(name=name)
|
|
7
|
+
|
|
8
|
+
class RuleAttributeDType(models.Model):
|
|
9
|
+
name = models.CharField(max_length=255, unique=True)
|
|
10
|
+
|
|
11
|
+
objects = RuleAttributeDtypeManager()
|
|
12
|
+
|
|
13
|
+
def natural_key(self):
|
|
14
|
+
return (self.name,)
|
|
15
|
+
|
|
16
|
+
def __str__(self):
|
|
17
|
+
return self.name
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class RuleTypeManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class RuleType(models.Model):
|
|
8
|
+
name = models.CharField(max_length=255, unique=True)
|
|
9
|
+
|
|
10
|
+
objects = RuleTypeManager()
|
|
11
|
+
|
|
12
|
+
def natural_key(self):
|
|
13
|
+
return (self.name,)
|
|
14
|
+
|
|
15
|
+
def __str__(self):
|
|
16
|
+
return self.name
|
|
17
|
+
|
|
18
|
+
class Meta:
|
|
19
|
+
verbose_name = 'Rule Type'
|
|
20
|
+
verbose_name_plural = 'Rule Types'
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
class RulesetManager(models.Manager):
|
|
4
|
+
def get_by_natural_key(self, name):
|
|
5
|
+
return self.get(name=name)
|
|
6
|
+
|
|
7
|
+
class Ruleset(models.Model):
|
|
8
|
+
name = models.CharField(max_length=255, unique=True)
|
|
9
|
+
rules = models.ManyToManyField('Rule')
|
|
10
|
+
|
|
11
|
+
objects = RulesetManager()
|
|
12
|
+
|
|
13
|
+
def natural_key(self):
|
|
14
|
+
return (self.name,)
|
|
15
|
+
|
|
16
|
+
def __str__(self):
|
|
17
|
+
return self.name
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from .sensitive_meta import SensitiveMetaState
|
|
2
|
+
from .video import VideoState, AnonymizationStatus
|
|
3
|
+
from .label_video_segment import LabelVideoSegmentState
|
|
4
|
+
from .raw_pdf import RawPdfState
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"SensitiveMetaState",
|
|
8
|
+
"VideoState",
|
|
9
|
+
"LabelVideoSegmentState",
|
|
10
|
+
"AnonymizationStatus",
|
|
11
|
+
"RawPdfState",
|
|
12
|
+
]
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# stats/models.py
|
|
2
|
+
import hashlib, json, uuid
|
|
3
|
+
from django.db import models
|
|
4
|
+
from django.utils import timezone
|
|
5
|
+
from django.conf import settings
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
AuditLedger Model
|
|
10
|
+
|
|
11
|
+
AuditLedger is a model that tracks changes to other models in the database.
|
|
12
|
+
It stores a hash of the previous state, the current state, and the action taken.
|
|
13
|
+
This allows for a complete audit trail of changes made to the database.
|
|
14
|
+
The model includes fields for the timestamp, user who made the change, object type,
|
|
15
|
+
object primary key, action taken, and the data associated with the change.
|
|
16
|
+
The save method computes the hash of the current state and the previous state
|
|
17
|
+
before saving the record to the database.
|
|
18
|
+
The hash is computed using SHA-256 and includes the timestamp, user ID,
|
|
19
|
+
object type, object primary key, action taken, and the data associated with the change.
|
|
20
|
+
The hash is stored in the database to ensure data integrity and to allow for
|
|
21
|
+
verification of the data.
|
|
22
|
+
The model also includes a method to retrieve the last hash from the database
|
|
23
|
+
to ensure that the current hash is always based on the most recent state of the database.
|
|
24
|
+
The model is designed to be immutable, meaning that once a record is created,
|
|
25
|
+
it cannot be modified. This ensures that the audit trail is complete and accurate.
|
|
26
|
+
|
|
27
|
+
Raises:
|
|
28
|
+
RuntimeError: _description_
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
_type_: _description_
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class AuditLedger(models.Model):
|
|
36
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
37
|
+
ts = models.DateTimeField(default=timezone.now, editable=False)
|
|
38
|
+
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
|
|
39
|
+
object_type = models.CharField(max_length=80) # e.g. 'VideoFile'
|
|
40
|
+
object_pk = models.CharField(max_length=40) # UUID or int
|
|
41
|
+
action = models.CharField(max_length=40) # 'created' | 'validated' | …
|
|
42
|
+
data = models.JSONField() # snapshot / diff / metadata
|
|
43
|
+
prev_hash = models.CharField(max_length=64, editable=False)
|
|
44
|
+
hash = models.CharField(max_length=64, editable=False)
|
|
45
|
+
|
|
46
|
+
class Meta:
|
|
47
|
+
ordering = ['ts']
|
|
48
|
+
indexes = [models.Index(fields=['object_type', 'object_pk'])]
|
|
49
|
+
|
|
50
|
+
# ------------------------------------------------------
|
|
51
|
+
def save(self, *args, **kw):
|
|
52
|
+
"""
|
|
53
|
+
Saves a new immutable audit record, computing and linking cryptographic hashes.
|
|
54
|
+
|
|
55
|
+
Raises:
|
|
56
|
+
RuntimeError: If an attempt is made to modify an existing audit record.
|
|
57
|
+
"""
|
|
58
|
+
if self._state.adding: # only on INSERT
|
|
59
|
+
self.prev_hash = self._last_hash()
|
|
60
|
+
self.hash = self._compute_hash()
|
|
61
|
+
else:
|
|
62
|
+
raise RuntimeError("AuditLedger rows are immutable")
|
|
63
|
+
super().save(*args, **kw)
|
|
64
|
+
|
|
65
|
+
# ------------------------------------------------------
|
|
66
|
+
def _last_hash(self) -> str:
|
|
67
|
+
"""
|
|
68
|
+
Retrieves the hash of the most recent audit record.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
The SHA-256 hash of the latest `AuditLedger` entry by timestamp, or a string of 64 zeros if no records exist.
|
|
72
|
+
"""
|
|
73
|
+
last = AuditLedger.objects.order_by('-ts').first()
|
|
74
|
+
return last.hash if last else '0' * 64
|
|
75
|
+
|
|
76
|
+
def _compute_hash(self) -> str:
|
|
77
|
+
"""
|
|
78
|
+
Computes the SHA-256 hash of the current audit record's data.
|
|
79
|
+
|
|
80
|
+
The hash is generated from a JSON-serialized payload containing the timestamp, user ID, object type and primary key, action, associated data, and the previous record's hash. This ensures the integrity and immutability of the audit trail.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
The hexadecimal SHA-256 hash string representing the current audit record.
|
|
84
|
+
"""
|
|
85
|
+
payload = {
|
|
86
|
+
'ts': self.ts.isoformat(),
|
|
87
|
+
'uid': str(self.user_id),
|
|
88
|
+
'obj': f'{self.object_type}:{self.object_pk}',
|
|
89
|
+
'act': self.action,
|
|
90
|
+
'data': self.data,
|
|
91
|
+
'prev': self.prev_hash,
|
|
92
|
+
}
|
|
93
|
+
return hashlib.sha256(json.dumps(payload, sort_keys=True).encode()).hexdigest()
|
|
94
|
+
|
|
95
|
+
def log_validation(user, instance, action: str, extra=None):
|
|
96
|
+
"""
|
|
97
|
+
Creates an audit record for a validation action performed by a user on a specific model instance.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
user: The user performing the action.
|
|
101
|
+
instance: The model instance being validated.
|
|
102
|
+
action: The action performed (e.g., 'validated').
|
|
103
|
+
extra: Optional additional data to include in the audit record.
|
|
104
|
+
"""
|
|
105
|
+
AuditLedger.objects.create(
|
|
106
|
+
user=user,
|
|
107
|
+
object_type=instance.__class__.__name__,
|
|
108
|
+
object_pk=str(instance.pk),
|
|
109
|
+
action=action,
|
|
110
|
+
data=extra or {},
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def _distinct(object_type: str, action: str):
|
|
114
|
+
"""
|
|
115
|
+
Returns the number of distinct objects of a given type that have a specific audit action recorded.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
object_type: The type of object to filter by (e.g., 'VideoFile').
|
|
119
|
+
action: The audit action to filter by (e.g., 'validated').
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
The count of unique object primary keys matching the specified type and action.
|
|
123
|
+
"""
|
|
124
|
+
return (
|
|
125
|
+
AuditLedger.objects
|
|
126
|
+
.filter(object_type=object_type, action=action)
|
|
127
|
+
.values('object_pk')
|
|
128
|
+
.distinct()
|
|
129
|
+
.count()
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
def collect_counters():
|
|
133
|
+
"""
|
|
134
|
+
Aggregates and returns summary statistics for audit actions and object types.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
dict: A dictionary containing counts of distinct cases, videos, annotations,
|
|
138
|
+
anonymizations, images, and breakdowns of video statuses based on audit records.
|
|
139
|
+
"""
|
|
140
|
+
return {
|
|
141
|
+
"totalCases": AuditLedger._distinct("VideoFile", "created"),
|
|
142
|
+
"totalVideos": AuditLedger._distinct("VideoFile", "created"),
|
|
143
|
+
"totalAnnotations": AuditLedger.objects.filter(action="annotation_added").count(),
|
|
144
|
+
"totalAnonymizations": AuditLedger._distinct("VideoFile", "anonymized"),
|
|
145
|
+
"totalImages": AuditLedger._distinct("Image", "created"),
|
|
146
|
+
# video breakdown
|
|
147
|
+
"videosCompleted": AuditLedger._distinct("VideoFile", "validated"),
|
|
148
|
+
"videosAnonym": AuditLedger._distinct("VideoFile", "anonymized"),
|
|
149
|
+
# add more as needed …
|
|
150
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from .abstract import AbstractState
|
|
3
|
+
|
|
4
|
+
class LabelVideoSegmentState(AbstractState):
|
|
5
|
+
"""State for label video segment data."""
|
|
6
|
+
|
|
7
|
+
prediction = models.BooleanField(default=False)
|
|
8
|
+
annotation = models.BooleanField(default=False)
|
|
9
|
+
frames_extracted = models.BooleanField(default=False)
|
|
10
|
+
is_validated = models.BooleanField(default=False)
|
|
11
|
+
|
|
12
|
+
origin = models.OneToOneField(
|
|
13
|
+
"LabelVideoSegment",
|
|
14
|
+
on_delete=models.CASCADE,
|
|
15
|
+
related_name="state",
|
|
16
|
+
null=True,
|
|
17
|
+
blank=True,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
class Meta:
|
|
21
|
+
verbose_name = "Label Video Segment State"
|
|
22
|
+
verbose_name_plural = "Label Video Segment States"
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Defines state tracking models related to PDF processing, including extraction of text and metadata, AI predictions, and anonymization status for RawPdfFile instances.
|
|
3
|
+
"""
|
|
4
|
+
from django.db import models
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
import logging
|
|
7
|
+
from enum import Enum
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from ..media import RawPdfFile
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AnonymizationStatus(str, Enum):
|
|
16
|
+
NOT_STARTED = "not_started"
|
|
17
|
+
PROCESSING_ANONYMIZING = "processing_anonymization"
|
|
18
|
+
DONE = "done"
|
|
19
|
+
VALIDATED = "validated"
|
|
20
|
+
FAILED = "failed"
|
|
21
|
+
STARTED = "started"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class RawPdfState(models.Model):
|
|
25
|
+
"""
|
|
26
|
+
Tracks the processing state of a RawPdfFile instance.
|
|
27
|
+
Uses BooleanFields for clear, distinct states.
|
|
28
|
+
"""
|
|
29
|
+
text_meta_extracted = models.BooleanField(default=False, help_text="True if text metadata (OCR) has been extracted.")
|
|
30
|
+
|
|
31
|
+
# AI / Annotation related states
|
|
32
|
+
initial_prediction_completed = models.BooleanField(default=False, help_text="True if initial AI prediction has run.")
|
|
33
|
+
|
|
34
|
+
# Processing state
|
|
35
|
+
sensitive_meta_processed = models.BooleanField(default=False, help_text="True if the video has been fully processed, meaning a anonymized person was created.")
|
|
36
|
+
|
|
37
|
+
# Anonymization state
|
|
38
|
+
anonymized = models.BooleanField(default=False, help_text="True if the anonymized video file has been created.")
|
|
39
|
+
anonymization_validated = models.BooleanField(default=False, help_text="True if the anonymization process has been validated and confirmed.")
|
|
40
|
+
|
|
41
|
+
# Processing state
|
|
42
|
+
processing_started = models.BooleanField(default=False, help_text="True if the processing has started, but not yet completed.")
|
|
43
|
+
processing_error = models.BooleanField(default=False, help_text="True if an error occurred during processing.")
|
|
44
|
+
|
|
45
|
+
# Timestamps
|
|
46
|
+
date_created = models.DateTimeField(auto_now_add=True)
|
|
47
|
+
date_modified = models.DateTimeField(auto_now=True)
|
|
48
|
+
|
|
49
|
+
was_created = models.BooleanField(default=True, help_text="True if this state was created for the first time.")
|
|
50
|
+
|
|
51
|
+
# PDF metadata extraction state
|
|
52
|
+
pdf_meta_extracted = models.BooleanField(default=False, help_text="True if PDF metadata has been extracted.")
|
|
53
|
+
|
|
54
|
+
if TYPE_CHECKING:
|
|
55
|
+
raw_pdf_file: "RawPdfFile"
|
|
56
|
+
|
|
57
|
+
def __str__(self):
|
|
58
|
+
"""
|
|
59
|
+
Return a string summarizing the RawPdfState instance, including the related PDF file UUID and key processing state flags with timestamps.
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
uuid = self.raw_pdf_file.id
|
|
63
|
+
except Exception:
|
|
64
|
+
uuid = None
|
|
65
|
+
|
|
66
|
+
states = [
|
|
67
|
+
f"TextMetaExtracted={self.text_meta_extracted}",
|
|
68
|
+
f"PredictionDone={self.initial_prediction_completed}",
|
|
69
|
+
f"Anonymized={self.anonymized}",
|
|
70
|
+
f"AnonymizationValidated={self.anonymization_validated}",
|
|
71
|
+
f"SensitiveMetaProcessed={self.sensitive_meta_processed}",
|
|
72
|
+
f"DateCreated={self.date_created.isoformat()}",
|
|
73
|
+
f"DateModified={self.date_modified.isoformat()}"
|
|
74
|
+
]
|
|
75
|
+
return f"RawPdfState(Pdf:{uuid}): {', '.join(states)}"
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def anonymization_status(self) -> AnonymizationStatus:
|
|
79
|
+
"""
|
|
80
|
+
Determines the current anonymization workflow status for the PDF processing state.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
AnonymizationStatus: The current status, reflecting progress or failure in the anonymization process.
|
|
84
|
+
"""
|
|
85
|
+
if getattr(self, "processing_error", False):
|
|
86
|
+
return AnonymizationStatus.FAILED
|
|
87
|
+
if self.anonymization_validated:
|
|
88
|
+
return AnonymizationStatus.VALIDATED
|
|
89
|
+
if self.sensitive_meta_processed:
|
|
90
|
+
return AnonymizationStatus.DONE
|
|
91
|
+
if self.anonymized:
|
|
92
|
+
return AnonymizationStatus.DONE
|
|
93
|
+
if self.initial_prediction_completed:
|
|
94
|
+
return AnonymizationStatus.PROCESSING_ANONYMIZING
|
|
95
|
+
if self.pdf_meta_extracted:
|
|
96
|
+
return AnonymizationStatus.NOT_STARTED
|
|
97
|
+
if self.processing_started:
|
|
98
|
+
return AnonymizationStatus.STARTED
|
|
99
|
+
return AnonymizationStatus.NOT_STARTED
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def mark_processing_started(self, *, save: bool = True) -> None:
|
|
104
|
+
"""
|
|
105
|
+
Mark the processing as started and optionally save the updated state.
|
|
106
|
+
|
|
107
|
+
Parameters:
|
|
108
|
+
save (bool): If True, persist the change to the database immediately. Defaults to True.
|
|
109
|
+
"""
|
|
110
|
+
self.processing_started = True
|
|
111
|
+
if save:
|
|
112
|
+
self.save(update_fields=["processing_started", "date_modified"])
|
|
113
|
+
|
|
114
|
+
# ---- Single‑responsibility mutators ---------------------------------
|
|
115
|
+
def mark_sensitive_meta_processed(self, *, save: bool = True) -> None:
|
|
116
|
+
"""
|
|
117
|
+
Mark the sensitive metadata processing step as completed for this PDF state.
|
|
118
|
+
|
|
119
|
+
Parameters:
|
|
120
|
+
save (bool): If True, immediately saves the updated state to the database.
|
|
121
|
+
"""
|
|
122
|
+
self.sensitive_meta_processed = True
|
|
123
|
+
if save:
|
|
124
|
+
self.save(update_fields=["sensitive_meta_processed", "date_modified"])
|
|
125
|
+
|
|
126
|
+
def mark_anonymization_validated(self, *, save: bool = True) -> None:
|
|
127
|
+
"""
|
|
128
|
+
Mark the anonymization as validated for this PDF processing state.
|
|
129
|
+
|
|
130
|
+
Parameters:
|
|
131
|
+
save (bool): If True, immediately saves the updated state to the database.
|
|
132
|
+
"""
|
|
133
|
+
self.anonymization_validated = True
|
|
134
|
+
if save:
|
|
135
|
+
self.save(update_fields=["anonymization_validated", "date_modified"])
|
|
136
|
+
|
|
137
|
+
def mark_anonymized(self, *, save: bool = True) -> None:
|
|
138
|
+
"""
|
|
139
|
+
Mark the PDF as anonymized and optionally save the updated state.
|
|
140
|
+
|
|
141
|
+
Parameters:
|
|
142
|
+
save (bool): If True, persist the change to the database immediately. Defaults to True.
|
|
143
|
+
"""
|
|
144
|
+
self.anonymized = True
|
|
145
|
+
if save:
|
|
146
|
+
self.save(update_fields=["anonymized", "date_modified"])
|
|
147
|
+
|
|
148
|
+
def mark_initial_prediction_completed(self, *, save: bool = True) -> None:
|
|
149
|
+
"""
|
|
150
|
+
Mark the initial AI prediction step as completed for this PDF processing state.
|
|
151
|
+
|
|
152
|
+
Parameters:
|
|
153
|
+
save (bool): If True, immediately saves the updated state to the database.
|
|
154
|
+
"""
|
|
155
|
+
self.initial_prediction_completed = True
|
|
156
|
+
if save:
|
|
157
|
+
self.save(update_fields=["initial_prediction_completed", "date_modified"])
|
|
158
|
+
|
|
159
|
+
def mark_pdf_meta_extracted(self, *, save: bool = True) -> None:
|
|
160
|
+
"""
|
|
161
|
+
Mark the PDF metadata extraction step as completed for this state.
|
|
162
|
+
|
|
163
|
+
Parameters:
|
|
164
|
+
save (bool): If True, immediately saves the updated state to the database.
|
|
165
|
+
"""
|
|
166
|
+
self.pdf_meta_extracted = True
|
|
167
|
+
if save:
|
|
168
|
+
self.save(update_fields=["pdf_meta_extracted", "date_modified"])
|
|
169
|
+
|
|
170
|
+
def mark_text_meta_extracted(self, *, save: bool = True) -> None:
|
|
171
|
+
"""
|
|
172
|
+
Mark the text metadata extraction step as completed for this PDF processing state.
|
|
173
|
+
|
|
174
|
+
Parameters:
|
|
175
|
+
save (bool): If True, immediately saves the updated state to the database.
|
|
176
|
+
"""
|
|
177
|
+
self.text_meta_extracted = True
|
|
178
|
+
if save:
|
|
179
|
+
self.save(update_fields=["text_meta_extracted", "date_modified"])
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class Meta:
|
|
184
|
+
verbose_name = "Raw PDF Processing State"
|
|
185
|
+
verbose_name_plural = "Raw PDF Processing States"
|
|
186
|
+
|
|
187
|
+
|