endoreg-db 0.8.6.4__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 +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/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 +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/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 +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 -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 +118 -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 +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 -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 +274 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +186 -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 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
from endoreg_db.models import CaseTemplate, CaseTemplateRule, CaseTemplateRuleType
|
|
2
|
+
from endoreg_db.case_generator.lab_sample_factory import LabSampleFactory
|
|
3
|
+
|
|
4
|
+
DEFAULT_CASE_TEMPLATE_NAME = "pre_default_screening_colonoscopy"
|
|
5
|
+
|
|
6
|
+
class CaseGenerator:
|
|
7
|
+
"""
|
|
8
|
+
Provides methods to generate cases based on a template.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(self, template: CaseTemplate = None):
|
|
12
|
+
"""
|
|
13
|
+
Initializes the CaseGenerator with a template.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
template (CaseTemplate, optional): The template to use for case generation. Defaults to the predefined template.
|
|
17
|
+
"""
|
|
18
|
+
self.template = template or CaseTemplate.objects.get(name=DEFAULT_CASE_TEMPLATE_NAME)
|
|
19
|
+
self.lab_sample_factory = LabSampleFactory()
|
|
20
|
+
|
|
21
|
+
# Define available rule types
|
|
22
|
+
rule_type_names = [
|
|
23
|
+
"create-object",
|
|
24
|
+
"set-field-default",
|
|
25
|
+
"set-field-by-distribution",
|
|
26
|
+
"set-field-by-value",
|
|
27
|
+
"set-field-single-choice",
|
|
28
|
+
"set-field-multiple-choice",
|
|
29
|
+
]
|
|
30
|
+
self.available_rule_types = CaseTemplateRuleType.objects.filter(name__in=rule_type_names)
|
|
31
|
+
|
|
32
|
+
def _validate_rule_type(self, rule_type: CaseTemplateRuleType):
|
|
33
|
+
"""
|
|
34
|
+
Validates if the rule type is supported.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
rule_type (CaseTemplateRuleType): The rule type to validate.
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
ValueError: If the rule type is not supported.
|
|
41
|
+
"""
|
|
42
|
+
if rule_type not in self.available_rule_types:
|
|
43
|
+
raise ValueError(f"Rule type {rule_type} is not supported.")
|
|
44
|
+
|
|
45
|
+
def _apply_create_object(self, rule: CaseTemplateRule, parent=None):
|
|
46
|
+
"""
|
|
47
|
+
Applies a create-object rule to generate a model instance.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
rule (CaseTemplateRule): The rule to apply.
|
|
51
|
+
parent (Optional[Model]): The parent object for the rule.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Model: The created model instance.
|
|
55
|
+
"""
|
|
56
|
+
target_model = rule.get_target_model()
|
|
57
|
+
extra_params = rule.extra_parameters or {}
|
|
58
|
+
create_method_info = extra_params.get("create_method", {})
|
|
59
|
+
|
|
60
|
+
assert create_method_info, "Create method must be set for a create-object rule."
|
|
61
|
+
|
|
62
|
+
create_method = getattr(target_model, create_method_info["name"])
|
|
63
|
+
kwargs = create_method_info.get("kwargs", {})
|
|
64
|
+
|
|
65
|
+
if parent:
|
|
66
|
+
kwargs[rule.parent_field] = parent
|
|
67
|
+
|
|
68
|
+
target_instance = create_method(**kwargs)
|
|
69
|
+
target_instance.save()
|
|
70
|
+
|
|
71
|
+
for action in extra_params.get("actions", []):
|
|
72
|
+
action_method = getattr(target_instance, action["name"])
|
|
73
|
+
action_kwargs = action.get("kwargs", {})
|
|
74
|
+
action_method(**action_kwargs)
|
|
75
|
+
|
|
76
|
+
for chained_rule in rule.chained_rules.all():
|
|
77
|
+
self.apply_rule(chained_rule, parent=target_instance)
|
|
78
|
+
|
|
79
|
+
return target_instance
|
|
80
|
+
|
|
81
|
+
def _apply_set_field_by_distribution(self, rule: CaseTemplateRule, parent):
|
|
82
|
+
"""
|
|
83
|
+
Applies a set-field-by-distribution rule.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
rule (CaseTemplateRule): The rule to apply.
|
|
87
|
+
parent (Model): The parent object for the rule.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Model: The updated parent object.
|
|
91
|
+
"""
|
|
92
|
+
assert parent, "Parent must be provided for set-field-by-distribution rules."
|
|
93
|
+
assert rule.target_field, "Target field must be specified for the rule."
|
|
94
|
+
|
|
95
|
+
distribution = rule.get_distribution()
|
|
96
|
+
value = distribution.generate_value()
|
|
97
|
+
|
|
98
|
+
setattr(parent, rule.target_field, value)
|
|
99
|
+
parent.save()
|
|
100
|
+
return parent
|
|
101
|
+
|
|
102
|
+
def apply_rule(self, rule: CaseTemplateRule, parent=None):
|
|
103
|
+
"""
|
|
104
|
+
Applies a rule based on its type to generate a case.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
rule (CaseTemplateRule): The rule to apply.
|
|
108
|
+
parent (Optional[Model]): The parent object for the rule.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Model: The case by applying the rule.
|
|
112
|
+
"""
|
|
113
|
+
self._validate_rule_type(rule.rule_type)
|
|
114
|
+
|
|
115
|
+
if rule.rule_type.name == "create-object":
|
|
116
|
+
return self._apply_create_object(rule, parent)
|
|
117
|
+
|
|
118
|
+
if rule.rule_type.name == "set-field-by-distribution":
|
|
119
|
+
return self._apply_set_field_by_distribution(rule, parent)
|
|
120
|
+
|
|
121
|
+
raise ValueError(f"Unsupported rule type: {rule.rule_type.name}")
|
|
122
|
+
|
|
123
|
+
def generate_case(self, case_template: CaseTemplate = None):
|
|
124
|
+
"""
|
|
125
|
+
Generates a case based on the provided or default template.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
case_template (CaseTemplate, optional): The template to use for case generation. Defaults to None.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Tuple[Model, Model]: The generated patient and medication schedule.
|
|
132
|
+
"""
|
|
133
|
+
case_template = case_template or CaseTemplate.objects.get(name=DEFAULT_CASE_TEMPLATE_NAME)
|
|
134
|
+
|
|
135
|
+
create_patient_rule = case_template.get_create_patient_rule()
|
|
136
|
+
patient = self.apply_rule(create_patient_rule)
|
|
137
|
+
|
|
138
|
+
medication_schedule_rule = case_template.get_create_patient_medication_schedule_rule()
|
|
139
|
+
medication_schedule = self.apply_rule(medication_schedule_rule, parent=patient)
|
|
140
|
+
|
|
141
|
+
return patient, medication_schedule
|
|
142
|
+
|
|
143
|
+
# if not create_new_patient:
|
|
144
|
+
# raise NotImplementedError("Only new patients are supported at the moment.")
|
|
145
|
+
# else:
|
|
146
|
+
# # TODO Implement patient rules
|
|
147
|
+
# patient_rules = None # all rules of type "create_patient"
|
|
148
|
+
# patient = self.generate_patient(patient_rules)
|
|
149
|
+
|
|
150
|
+
# # Generate case based on template
|
|
151
|
+
# rules = self.template.get_rules()
|
|
152
|
+
# chained_rules = set()
|
|
153
|
+
|
|
154
|
+
# for rule in rules:
|
|
155
|
+
# rule_chain = rule.get_all_downward_chained_rules()
|
|
156
|
+
# chained_rules.add(rule)
|
|
157
|
+
# chained_rules.update(rule_chain)
|
|
158
|
+
|
|
159
|
+
# return chained_rules
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from datetime import datetime, timezone
|
|
2
|
+
from endoreg_db.models import Patient, PatientLabSample, PatientLabSampleType
|
|
3
|
+
|
|
4
|
+
class LabSampleFactory:
|
|
5
|
+
"""
|
|
6
|
+
Provides methods to generate lab samples.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self):
|
|
10
|
+
"""
|
|
11
|
+
Initializes the LabSampleFactory.
|
|
12
|
+
"""
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
def create_generic_lab_sample(self, patient: Patient):
|
|
16
|
+
"""
|
|
17
|
+
Generates a generic lab sample for a given patient.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
patient (Patient): The patient for whom the lab sample is generated.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
PatientLabSample: The created lab sample instance.
|
|
24
|
+
"""
|
|
25
|
+
sample_type = PatientLabSampleType.objects.get(name="generic")
|
|
26
|
+
|
|
27
|
+
lab_sample = PatientLabSample.objects.create(
|
|
28
|
+
patient=patient,
|
|
29
|
+
sample_type=sample_type,
|
|
30
|
+
date=datetime.now(tz=timezone.utc)
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
return lab_sample
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from endoreg_db.models import CaseTemplate
|
|
2
|
+
from endoreg_db.case_generator.case_generator import CaseGenerator
|
|
3
|
+
|
|
4
|
+
# TEMPLATE_NAME = "pre_endo-anticoagulation-af-low_risk"
|
|
5
|
+
TEMPLATE_NAME = "pre_default_screening_colonoscopy"
|
|
6
|
+
|
|
7
|
+
def fetch_template(template_name: str = DEFAULT_TEMPLATE_NAME) -> CaseTemplate:
|
|
8
|
+
"""
|
|
9
|
+
Fetches a CaseTemplate by name.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
template_name (str): The name of the template to fetch. Defaults to DEFAULT_TEMPLATE_NAME.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
CaseTemplate: The fetched CaseTemplate instance.
|
|
16
|
+
"""
|
|
17
|
+
return CaseTemplate.objects.get(name=template_name)
|
|
18
|
+
|
|
19
|
+
def initialize_case_generator(template_name: str = DEFAULT_TEMPLATE_NAME) -> CaseGenerator:
|
|
20
|
+
"""
|
|
21
|
+
Initializes a CaseGenerator with the specified template.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
template_name (str): The name of the template to use. Defaults to DEFAULT_TEMPLATE_NAME.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
CaseGenerator: An instance of CaseGenerator initialized with the template.
|
|
28
|
+
"""
|
|
29
|
+
template = fetch_template(template_name)
|
|
30
|
+
return CaseGenerator(template)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Simple video file existence checker and path corrector for VideoFile records.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
import argparse
|
|
10
|
+
|
|
11
|
+
# Parse command-line arguments and environment variables for configuration
|
|
12
|
+
parser = argparse.ArgumentParser(description="Simple video file existence checker and path corrector for VideoFile records.")
|
|
13
|
+
parser.add_argument('--django-base', type=str, default=os.environ.get('ENDOREG_DJANGO_PROJECT_PATH', str(Path(__file__).resolve().parent.parent.parent)),
|
|
14
|
+
help='Path to the Django project base (default: env ENDOREG_DJANGO_PROJECT_PATH or project root)')
|
|
15
|
+
parser.add_argument('--django-settings', type=str, default=os.environ.get('DJANGO_SETTINGS_MODULE', 'dev.dev_settings'),
|
|
16
|
+
help='Django settings module (default: env DJANGO_SETTINGS_MODULE or dev.dev_settings)')
|
|
17
|
+
parser.add_argument('--storage-dir', type=str, default=os.environ.get('ENDOREG_STORAGE_DIR', './storage'),
|
|
18
|
+
help='Path to the storage directory (default: ./storage or $ENDOREG_STORAGE_DIR)')
|
|
19
|
+
args, unknown = parser.parse_known_args()
|
|
20
|
+
|
|
21
|
+
sys.path.insert(0, args.django_base)
|
|
22
|
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', args.django_settings)
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
import django
|
|
26
|
+
django.setup()
|
|
27
|
+
from endoreg_db.models import VideoFile
|
|
28
|
+
DJANGO_AVAILABLE = True
|
|
29
|
+
except Exception as e:
|
|
30
|
+
print(f"Django not available: {e}")
|
|
31
|
+
DJANGO_AVAILABLE = False
|
|
32
|
+
|
|
33
|
+
def find_video_files():
|
|
34
|
+
"""Find all video files in storage directory."""
|
|
35
|
+
storage_dir = Path(args.storage_dir)
|
|
36
|
+
video_files = []
|
|
37
|
+
|
|
38
|
+
for pattern in ['**/*.mp4', '**/*.avi', '**/*.mov', '**/*.mkv']:
|
|
39
|
+
video_files.extend(storage_dir.glob(pattern))
|
|
40
|
+
|
|
41
|
+
return video_files
|
|
42
|
+
|
|
43
|
+
def check_video_file_accessibility(file_path):
|
|
44
|
+
"""Check if a video file is accessible and valid."""
|
|
45
|
+
try:
|
|
46
|
+
if not file_path.exists():
|
|
47
|
+
return False, "File does not exist"
|
|
48
|
+
|
|
49
|
+
if file_path.stat().st_size == 0:
|
|
50
|
+
return False, "File is empty (0 bytes)"
|
|
51
|
+
|
|
52
|
+
if not os.access(file_path, os.R_OK):
|
|
53
|
+
return False, "File is not readable"
|
|
54
|
+
|
|
55
|
+
# Try to read first few bytes to check if it's actually a file
|
|
56
|
+
with open(file_path, 'rb') as f:
|
|
57
|
+
header = f.read(8)
|
|
58
|
+
if len(header) < 8:
|
|
59
|
+
return False, "File too small or corrupted"
|
|
60
|
+
|
|
61
|
+
return True, f"OK - {file_path.stat().st_size / (1024*1024):.1f} MB"
|
|
62
|
+
|
|
63
|
+
except Exception as e:
|
|
64
|
+
return False, f"Error checking file: {e}"
|
|
65
|
+
|
|
66
|
+
def main():
|
|
67
|
+
print("🔍 VIDEO FILE EXISTENCE CHECKER")
|
|
68
|
+
print("=" * 40)
|
|
69
|
+
|
|
70
|
+
# Find all video files
|
|
71
|
+
print("1. Scanning for video files...")
|
|
72
|
+
video_files = find_video_files()
|
|
73
|
+
print(f"Found {len(video_files)} video files in storage directory")
|
|
74
|
+
|
|
75
|
+
if not video_files:
|
|
76
|
+
print("❌ No video files found in storage directory!")
|
|
77
|
+
return
|
|
78
|
+
|
|
79
|
+
# Check each file
|
|
80
|
+
print("\n2. Checking file accessibility...")
|
|
81
|
+
accessible_files = []
|
|
82
|
+
|
|
83
|
+
for video_file in video_files[:10]: # Check first 10
|
|
84
|
+
accessible, message = check_video_file_accessibility(video_file)
|
|
85
|
+
status = "✅" if accessible else "❌"
|
|
86
|
+
print(f"{status} {video_file.name}: {message}")
|
|
87
|
+
|
|
88
|
+
if accessible:
|
|
89
|
+
accessible_files.append(video_file)
|
|
90
|
+
|
|
91
|
+
if not accessible_files:
|
|
92
|
+
print("\n❌ No accessible video files found!")
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
print(f"\n✅ Found {len(accessible_files)} accessible video files")
|
|
96
|
+
|
|
97
|
+
# If Django is available, check database records
|
|
98
|
+
if DJANGO_AVAILABLE:
|
|
99
|
+
print("\n3. Checking database records...")
|
|
100
|
+
try:
|
|
101
|
+
video_5 = VideoFile.objects.get(pk=5)
|
|
102
|
+
print(f"📋 Video ID 5 found in database:")
|
|
103
|
+
print(f" UUID: {video_5.uuid}")
|
|
104
|
+
|
|
105
|
+
# Check different file path attributes
|
|
106
|
+
for attr in ['raw_file', 'processed_file']:
|
|
107
|
+
if hasattr(video_5, attr):
|
|
108
|
+
file_field = getattr(video_5, attr)
|
|
109
|
+
if file_field:
|
|
110
|
+
try:
|
|
111
|
+
file_path = Path(file_field.path)
|
|
112
|
+
accessible, message = check_video_file_accessibility(file_path)
|
|
113
|
+
status = "✅" if accessible else "❌"
|
|
114
|
+
print(f" {attr}: {status} {file_path} ({message})")
|
|
115
|
+
except Exception as e:
|
|
116
|
+
print(f" {attr}: ❌ Error accessing path: {e}")
|
|
117
|
+
else:
|
|
118
|
+
print(f" {attr}: ❌ No file set")
|
|
119
|
+
|
|
120
|
+
# Check if UUID matches any found files
|
|
121
|
+
uuid_str = str(video_5.uuid)
|
|
122
|
+
matching_files = [f for f in accessible_files if uuid_str in str(f)]
|
|
123
|
+
|
|
124
|
+
if matching_files:
|
|
125
|
+
print(f"\n💡 Found matching files for UUID {uuid_str}:")
|
|
126
|
+
for match in matching_files:
|
|
127
|
+
accessible, message = check_video_file_accessibility(match)
|
|
128
|
+
print(f" ✅ {match} ({message})")
|
|
129
|
+
|
|
130
|
+
print(f"\n🔧 SOLUTION: Update VideoFile record to use:")
|
|
131
|
+
print(f" {matching_files[0]}")
|
|
132
|
+
print(f"\n🐍 Django command to fix:")
|
|
133
|
+
print(f" video = VideoFile.objects.get(pk=5)")
|
|
134
|
+
print(f" video.raw_file.name = '{matching_files[0].relative_to(Path(args.storage_dir))}'")
|
|
135
|
+
print(f" video.save()")
|
|
136
|
+
else:
|
|
137
|
+
print(f"\n❌ No files found matching UUID {uuid_str}")
|
|
138
|
+
|
|
139
|
+
except Exception as e:
|
|
140
|
+
print(f"❌ Error checking database: {e}")
|
|
141
|
+
|
|
142
|
+
print(f"\n4. 🎯 QUICK TEST RECOMMENDATION:")
|
|
143
|
+
print(f" Use this accessible file for testing:")
|
|
144
|
+
print(f" {accessible_files[0]}")
|
|
145
|
+
print(f" Size: {accessible_files[0].stat().st_size / (1024*1024):.1f} MB")
|
|
146
|
+
|
|
147
|
+
if __name__ == "__main__":
|
|
148
|
+
main()
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from PIL import Image
|
|
2
|
+
|
|
3
|
+
def crop_and_insert(image:Image, x, y, h, w, bg_color=(255, 255, 255)):
|
|
4
|
+
"""
|
|
5
|
+
Crops a region from an inverted grayscale image and inserts it into a white image of the same size as the original.
|
|
6
|
+
|
|
7
|
+
Parameters:
|
|
8
|
+
- fp: File path or a file object of the original image.
|
|
9
|
+
- x, y: The top-left coordinates of the rectangle to be cropped.
|
|
10
|
+
- h, w: The height and width of the rectangle to be cropped.
|
|
11
|
+
|
|
12
|
+
Returns:
|
|
13
|
+
A PIL Image object containing the original image with the specified region replaced.
|
|
14
|
+
"""
|
|
15
|
+
# Load the original image
|
|
16
|
+
original_image = image
|
|
17
|
+
|
|
18
|
+
# Crop the specified region from the inverted image
|
|
19
|
+
crop_rectangle = (x, y, x + w, y + h)
|
|
20
|
+
cropped_content = original_image.crop(crop_rectangle)
|
|
21
|
+
|
|
22
|
+
# Create a new white image of the same size as the original image
|
|
23
|
+
white_background = Image.new('RGB', original_image.size, bg_color)
|
|
24
|
+
|
|
25
|
+
# Paste the cropped content onto the white image at the specified location
|
|
26
|
+
white_background.paste(cropped_content, (x, y))
|
|
27
|
+
|
|
28
|
+
# The final image can be displayed or saved as needed
|
|
29
|
+
return white_background
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import yaml
|
|
3
|
+
from django.core.exceptions import ObjectDoesNotExist
|
|
4
|
+
from django.db import OperationalError, transaction
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def load_model_data_from_yaml(command, model_name, metadata, verbose):
|
|
8
|
+
"""
|
|
9
|
+
Load model data from YAML files.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
command: Command object for stdout writing.
|
|
13
|
+
model_name: Name of the model being loaded.
|
|
14
|
+
metadata: Metadata including directory and foreign key information.
|
|
15
|
+
verbose: Boolean indicating whether to print verbose output.
|
|
16
|
+
"""
|
|
17
|
+
if verbose:
|
|
18
|
+
command.stdout.write(f"Start loading {model_name}")
|
|
19
|
+
model = metadata["model"]
|
|
20
|
+
dir_path = metadata["dir"]
|
|
21
|
+
foreign_keys = metadata["foreign_keys"]
|
|
22
|
+
foreign_key_models = metadata["foreign_key_models"]
|
|
23
|
+
|
|
24
|
+
_files = [f for f in os.listdir(dir_path) if f.endswith(".yaml")]
|
|
25
|
+
# sort
|
|
26
|
+
_files.sort()
|
|
27
|
+
for file in _files:
|
|
28
|
+
with open(os.path.join(dir_path, file), "r", encoding="utf-8") as file:
|
|
29
|
+
yaml_data = yaml.safe_load(file)
|
|
30
|
+
|
|
31
|
+
load_data_with_foreign_keys(
|
|
32
|
+
command, model, yaml_data, foreign_keys, foreign_key_models, verbose
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def load_data_with_foreign_keys(
|
|
37
|
+
command, model, yaml_data, foreign_keys, foreign_key_models, verbose
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Load YAML data into Django model instances with FK and M2M support.
|
|
41
|
+
|
|
42
|
+
Processes each YAML entry to create or update a model instance. For each entry, the
|
|
43
|
+
function extracts field data and uses the presence of a 'name' field to decide whether
|
|
44
|
+
to update an existing instance or create a new one. Foreign key fields listed in
|
|
45
|
+
foreign_keys are handled by retrieving related objects via natural keys. When a field
|
|
46
|
+
contains a list, it is treated as a many-to-many relationship and the corresponding
|
|
47
|
+
objects are set after the instance is saved. Missing or unresolved foreign keys trigger
|
|
48
|
+
warnings if verbose output is enabled.
|
|
49
|
+
|
|
50
|
+
Parameters:
|
|
51
|
+
model: The Django model class representing the data.
|
|
52
|
+
yaml_data: A list of dictionaries representing YAML entries.
|
|
53
|
+
foreign_keys: A list of foreign key field names to process from each entry.
|
|
54
|
+
foreign_key_models: The corresponding Django model classes for each foreign key.
|
|
55
|
+
verbose: If True, prints detailed output and warnings during processing.
|
|
56
|
+
"""
|
|
57
|
+
for entry in yaml_data:
|
|
58
|
+
fields = entry.get("fields", {})
|
|
59
|
+
name = fields.pop("name", None)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
####################
|
|
63
|
+
#TODO REMOVE AFTER TRANSLATION SUPPORT IS ADDED
|
|
64
|
+
SKIP_NAMES=[
|
|
65
|
+
"name_de", # German name, not used
|
|
66
|
+
"name_en", # English name, not used
|
|
67
|
+
"description_de", # German description
|
|
68
|
+
"description_en", # English description
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# Remove fields that are not needed
|
|
73
|
+
for skip_name in SKIP_NAMES:
|
|
74
|
+
if skip_name in fields:
|
|
75
|
+
fields.pop(skip_name)
|
|
76
|
+
########################
|
|
77
|
+
|
|
78
|
+
m2m_relationships = {} # Store many-to-many relationships
|
|
79
|
+
# print(entry)
|
|
80
|
+
|
|
81
|
+
# Handle foreign keys and many-to-many relationships
|
|
82
|
+
for fk_field, fk_model in zip(foreign_keys, foreign_key_models):
|
|
83
|
+
# Skip fields that are not in the data
|
|
84
|
+
if fk_field not in fields:
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
target_keys = fields.pop(fk_field, None)
|
|
88
|
+
|
|
89
|
+
# Ensure the foreign key exists
|
|
90
|
+
if target_keys is None:
|
|
91
|
+
if verbose:
|
|
92
|
+
command.stdout.write(
|
|
93
|
+
command.style.WARNING(
|
|
94
|
+
f"Foreign key {fk_field} not found in fields"
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
continue # Skip if no foreign key provided
|
|
98
|
+
|
|
99
|
+
# Process many-to-many fields or foreign keys
|
|
100
|
+
if isinstance(target_keys, list): # Assume many-to-many relationship
|
|
101
|
+
related_objects = []
|
|
102
|
+
for key in target_keys:
|
|
103
|
+
try:
|
|
104
|
+
obj = fk_model.objects.get_by_natural_key(key)
|
|
105
|
+
except ObjectDoesNotExist:
|
|
106
|
+
if verbose:
|
|
107
|
+
command.stdout.write(
|
|
108
|
+
command.style.WARNING(
|
|
109
|
+
f"{fk_model.__name__} with key {key} not found"
|
|
110
|
+
)
|
|
111
|
+
)
|
|
112
|
+
continue
|
|
113
|
+
related_objects.append(obj)
|
|
114
|
+
m2m_relationships[fk_field] = related_objects
|
|
115
|
+
else: # Single foreign key relationship
|
|
116
|
+
try:
|
|
117
|
+
obj = fk_model.objects.get_by_natural_key(target_keys)
|
|
118
|
+
except ObjectDoesNotExist:
|
|
119
|
+
if verbose:
|
|
120
|
+
command.stdout.write(
|
|
121
|
+
command.style.WARNING(
|
|
122
|
+
f"{fk_model.__name__} with key {target_keys} not found"
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
continue
|
|
126
|
+
fields[fk_field] = obj
|
|
127
|
+
|
|
128
|
+
# Create or update the main object (avoid update_or_create to prevent SQLite locks)
|
|
129
|
+
def _save_instance():
|
|
130
|
+
if name is None:
|
|
131
|
+
# Try to find an existing object by all provided fields
|
|
132
|
+
obj = model.objects.filter(**fields).first()
|
|
133
|
+
if obj is None:
|
|
134
|
+
obj = model.objects.create(**fields)
|
|
135
|
+
created = True
|
|
136
|
+
else:
|
|
137
|
+
created = False
|
|
138
|
+
else:
|
|
139
|
+
obj = model.objects.filter(name=name).first()
|
|
140
|
+
if obj is None:
|
|
141
|
+
obj = model.objects.create(name=name, **fields)
|
|
142
|
+
created = True
|
|
143
|
+
else:
|
|
144
|
+
# Update fields
|
|
145
|
+
for k, v in fields.items():
|
|
146
|
+
setattr(obj, k, v)
|
|
147
|
+
obj.save()
|
|
148
|
+
created = False
|
|
149
|
+
return obj, created
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
# Attempt save inside a transaction for consistency
|
|
153
|
+
with transaction.atomic():
|
|
154
|
+
obj, created = _save_instance()
|
|
155
|
+
except OperationalError:
|
|
156
|
+
# Retry once on SQLite lock
|
|
157
|
+
obj, created = _save_instance()
|
|
158
|
+
|
|
159
|
+
if created and verbose:
|
|
160
|
+
command.stdout.write(
|
|
161
|
+
command.style.SUCCESS(f"Created {model.__name__} {name}")
|
|
162
|
+
)
|
|
163
|
+
elif verbose:
|
|
164
|
+
pass
|
|
165
|
+
|
|
166
|
+
# Set many-to-many relationships
|
|
167
|
+
for field_name, related_objs in m2m_relationships.items():
|
|
168
|
+
if related_objs: # Only set if there are objects to set
|
|
169
|
+
getattr(obj, field_name).set(related_objs)
|
|
170
|
+
if verbose:
|
|
171
|
+
command.stdout.write(
|
|
172
|
+
command.style.SUCCESS(
|
|
173
|
+
f"Set {len(related_objs)} {field_name} for {model.__name__} {name}"
|
|
174
|
+
)
|
|
175
|
+
)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from datetime import datetime, date, timedelta
|
|
2
|
+
from random import randint
|
|
3
|
+
from calendar import monthrange
|
|
4
|
+
from django.utils import timezone
|
|
5
|
+
import datetime
|
|
6
|
+
|
|
7
|
+
# TODO replace used random_day_by_year function implementation when
|
|
8
|
+
# creating pseudo patients with new function "random date by age_at_date and examination_date"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def random_day_by_age_at_date(age_at_date: int, examination_date: date) -> date:
|
|
12
|
+
"""
|
|
13
|
+
Return a random birth day for a patient with the specified age at the specified examination date.
|
|
14
|
+
"""
|
|
15
|
+
examination_year = examination_date.year
|
|
16
|
+
latest_birthdate = examination_date.replace(year=examination_year - age_at_date)
|
|
17
|
+
valid_dates = [latest_birthdate - timedelta(days=i) for i in range(365)]
|
|
18
|
+
|
|
19
|
+
select = randint(0, len(valid_dates) - 1)
|
|
20
|
+
birth_date = valid_dates[select]
|
|
21
|
+
|
|
22
|
+
return birth_date
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def random_day_by_year(year: int) -> date:
|
|
26
|
+
"""
|
|
27
|
+
Return a random birth day within the specified year.
|
|
28
|
+
"""
|
|
29
|
+
month = randint(1, 12)
|
|
30
|
+
day = randint(1, monthrange(year, month)[1])
|
|
31
|
+
|
|
32
|
+
return date(year, month, day)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def random_day_by_month_year(month: int, year) -> date:
|
|
36
|
+
"""
|
|
37
|
+
Return a random birth day within the specified month and year.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
day = randint(1, monthrange(year, month)[1])
|
|
41
|
+
return date(year, month, day)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def ensure_aware_datetime(dt):
|
|
45
|
+
"""
|
|
46
|
+
Ensures a datetime object is timezone-aware.
|
|
47
|
+
If the datetime is naive (has no timezone info), the current timezone is applied.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
dt: A datetime object that may be naive
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A timezone-aware datetime object
|
|
54
|
+
"""
|
|
55
|
+
if dt is None:
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
if isinstance(dt, datetime.datetime) and timezone.is_naive(dt):
|
|
59
|
+
return timezone.make_aware(dt)
|
|
60
|
+
return dt
|
endoreg_db/utils/env.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
DEBUG = os.getenv("DEBUG", "false").lower() == "true"
|
|
4
|
+
|
|
5
|
+
def get_env_var(var_name: str, default: str = None) -> str | None:
|
|
6
|
+
"""
|
|
7
|
+
Get the value of an environment variable, with an optional default value.
|
|
8
|
+
If the environment variable is set, we need to remove flanking quotation marks and spaces.
|
|
9
|
+
if the environment variable is not set, we set it to the default value.
|
|
10
|
+
:param var_name: The name of the environment variable.
|
|
11
|
+
:param default: The default value to return if the environment variable is not set.
|
|
12
|
+
:return: The value of the environment variable or the default value.
|
|
13
|
+
"""
|
|
14
|
+
value = os.environ.get(var_name)
|
|
15
|
+
if value:
|
|
16
|
+
value = value.strip('"\'') # Strip both single and double quotes
|
|
17
|
+
if DEBUG:
|
|
18
|
+
print(f"Environment variable {var_name}: {value}")
|
|
19
|
+
return value
|
|
20
|
+
return default
|
|
21
|
+
|
|
22
|
+
def set_env_var(var_name: str, value: str) -> None:
|
|
23
|
+
"""
|
|
24
|
+
Set the value of an environment variable.
|
|
25
|
+
:param var_name: The name of the environment variable.
|
|
26
|
+
:param value: The value to set.
|
|
27
|
+
"""
|
|
28
|
+
os.environ[var_name] = value
|
|
29
|
+
if DEBUG:
|
|
30
|
+
print(f"Set environment variable {var_name}: {value}")
|
|
31
|
+
|
|
32
|
+
DJANGO_SETTINGS_MODULE = get_env_var("DJANGO_SETTINGS_MODULE") or "endoreg_db.settings_dev"
|
|
33
|
+
|