endoreg-db 0.4.5__py3-none-any.whl → 0.8.6.3__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.
- endoreg_db/admin.py +90 -1
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +12 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +76 -4
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/{label → ai_model_label}/label/data.yaml +27 -1
- 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_meta/default_multilabel_classification.yaml +27 -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/center/data.yaml +40 -9
- endoreg_db/data/center_shift/ukw.yaml +9 -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/misc.yaml +1 -2
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +34 -28
- endoreg_db/data/examination/type/data.yaml +12 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +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 +24 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +7 -1
- endoreg_db/data/lab_value/coagulation.yaml +6 -1
- endoreg_db/data/lab_value/electrolytes.yaml +39 -1
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +12 -0
- endoreg_db/data/lab_value/hematology.yaml +17 -2
- endoreg_db/data/lab_value/hormones.yaml +6 -0
- endoreg_db/data/lab_value/lipids.yaml +12 -3
- endoreg_db/data/lab_value/misc.yaml +48 -2
- endoreg_db/data/lab_value/renal_function.yaml +2 -1
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_indication/anticoagulation.yaml +48 -53
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- 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 +30 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/pdf_type/data.yaml +27 -9
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +4 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/unit/concentration.yaml +23 -0
- endoreg_db/data/unit/time.yaml +36 -1
- endoreg_db/exceptions.py +19 -0
- endoreg_db/forms/__init__.py +3 -1
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
- 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 +58 -26
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +174 -118
- endoreg_db/management/commands/load_center_data.py +46 -21
- endoreg_db/management/commands/{load_logging_data.py → load_contraindication_data.py} +4 -2
- endoreg_db/management/commands/load_disease_data.py +29 -7
- endoreg_db/management/commands/{load_endoscope_type_data.py → load_endoscope_data.py} +30 -7
- 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_green_endoscopy_wuerzburg_data.py +0 -1
- endoreg_db/management/commands/load_information_source.py +13 -7
- endoreg_db/management/commands/load_lab_value_data.py +3 -3
- endoreg_db/management/commands/load_medication_data.py +83 -21
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/{load_medication_intake_time_data.py → load_organ_data.py} +7 -5
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/register_ai_model.py +1 -1
- endoreg_db/management/commands/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 +1234 -944
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/__init__.py +339 -53
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/{ai_model → administration/ai}/model_type.py +19 -4
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +10 -1
- endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +60 -16
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +6 -13
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +21 -8
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +9 -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/{persons → administration/person/names}/first_name.py +1 -1
- endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/{product → administration/product}/product_weight.py +21 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +44 -13
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -1
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +53 -54
- 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/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +68 -29
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +68 -22
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +32 -13
- 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 +36 -1
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +14 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +15 -3
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/{rules → rule}/rule.py +6 -3
- endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
- endoreg_db/models/{rules → rule}/rule_type.py +0 -2
- endoreg_db/models/{rules → rule}/ruleset.py +0 -2
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -10
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -1
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- 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/dataloader.py +118 -35
- 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 +29 -1
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +123 -4
- 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/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/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 +187 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -3
- endoreg_db-0.8.6.3.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.3.dist-info/RECORD +793 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info}/WHEEL +1 -1
- endoreg_db/data/active_model/data.yaml +0 -3
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/label/label-set/data.yaml +0 -18
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.py +0 -18
- endoreg_db/management/commands/delete_legacy_images.py +0 -19
- endoreg_db/management/commands/delete_legacy_videos.py +0 -17
- endoreg_db/management/commands/extract_legacy_video_frames.py +0 -18
- endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
- endoreg_db/management/commands/fix_auth_permission.py +0 -20
- endoreg_db/management/commands/import_legacy_images.py +0 -94
- endoreg_db/management/commands/import_legacy_videos.py +0 -76
- endoreg_db/management/commands/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_endoscopy_processor_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_label_data.py +0 -67
- endoreg_db/management/commands/load_medication_indication_data.py +0 -63
- endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
- endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
- endoreg_db/management/commands/load_network_data.py +0 -57
- endoreg_db/migrations/0002_anonymizedimagelabel_anonymousimageannotation_and_more.py +0 -55
- endoreg_db/migrations/0003_anonymousimageannotation_original_image_url_and_more.py +0 -39
- endoreg_db/migrations/0004_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0005_uploadedfile_alter_rawpdffile_file_anonymizedfile.py +0 -40
- endoreg_db/migrations/0006_alter_rawpdffile_file.py +0 -20
- endoreg_db/migrations/0007_networkdevicelogentry_datetime_and_more.py +0 -43
- endoreg_db/models/ai_model/__init__.py +0 -3
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/model_meta.py +0 -24
- endoreg_db/models/annotation/__init__.py +0 -3
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -60
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -80
- endoreg_db/models/annotation/image_classification.py +0 -27
- endoreg_db/models/center/center.py +0 -25
- endoreg_db/models/center/center_product.py +0 -34
- endoreg_db/models/center/center_resource.py +0 -19
- endoreg_db/models/center/center_waste.py +0 -11
- endoreg_db/models/data_file/__init__.py +0 -6
- endoreg_db/models/data_file/base_classes/__init__.py +0 -2
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -51
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -201
- endoreg_db/models/data_file/frame.py +0 -45
- endoreg_db/models/data_file/import_classes/__init__.py +0 -32
- endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
- endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
- endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
- endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -188
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -343
- endoreg_db/models/data_file/metadata/__init__.py +0 -3
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -31
- endoreg_db/models/data_file/metadata/video_meta.py +0 -133
- endoreg_db/models/data_file/report_file.py +0 -89
- endoreg_db/models/data_file/video/__init__.py +0 -7
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -25
- endoreg_db/models/data_file/video_segment.py +0 -107
- endoreg_db/models/disease.py +0 -56
- endoreg_db/models/emission/__init__.py +0 -1
- endoreg_db/models/emission/emission_factor.py +0 -20
- endoreg_db/models/event.py +0 -22
- endoreg_db/models/examination/__init__.py +0 -4
- endoreg_db/models/examination/examination.py +0 -26
- endoreg_db/models/examination/examination_time.py +0 -27
- endoreg_db/models/examination/examination_time_type.py +0 -24
- endoreg_db/models/examination/examination_type.py +0 -18
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/hardware/endoscope.py +0 -44
- endoreg_db/models/information_source.py +0 -29
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -102
- endoreg_db/models/legacy_data/__init__.py +0 -3
- endoreg_db/models/legacy_data/image.py +0 -34
- endoreg_db/models/logging/__init__.py +0 -4
- endoreg_db/models/logging/agl_service.py +0 -19
- endoreg_db/models/logging/base.py +0 -22
- endoreg_db/models/logging/log_type.py +0 -23
- endoreg_db/models/logging/network_device.py +0 -24
- endoreg_db/models/medication/__init__.py +0 -1
- endoreg_db/models/medication/medication.py +0 -148
- endoreg_db/models/network/__init__.py +0 -3
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -53
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -215
- endoreg_db/models/patient_examination/__init__.py +0 -35
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -7
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -16
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/case/case.py +0 -30
- endoreg_db/models/persons/patient/patient.py +0 -216
- endoreg_db/models/persons/patient/patient_disease.py +0 -16
- endoreg_db/models/persons/patient/patient_event.py +0 -22
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -106
- endoreg_db/models/persons/patient/patient_medication.py +0 -44
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -28
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -2
- endoreg_db/models/prediction/image_classification.py +0 -37
- endoreg_db/models/prediction/video_prediction_meta.py +0 -244
- endoreg_db/models/product/__init__.py +0 -5
- endoreg_db/models/product/product.py +0 -97
- endoreg_db/models/product/product_group.py +0 -19
- endoreg_db/models/product/product_material.py +0 -24
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -2
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- endoreg_db/models/report_reader/__init__.py +0 -2
- endoreg_db/models/report_reader/report_reader_config.py +0 -53
- endoreg_db/models/rules/__init__.py +0 -5
- endoreg_db/queries/get/__init__.py +0 -6
- endoreg_db/queries/get/center.py +0 -42
- endoreg_db/queries/get/model.py +0 -13
- endoreg_db/queries/get/patient.py +0 -14
- endoreg_db/queries/get/patient_examination.py +0 -20
- endoreg_db/queries/get/report_file.py +0 -33
- endoreg_db/queries/get/video.py +0 -31
- endoreg_db/serializers/ai_model.py +0 -19
- endoreg_db/serializers/annotation.py +0 -17
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -13
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -10
- endoreg_db/serializers/prediction.py +0 -15
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -27
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video_metadata.py +0 -87
- endoreg_db-0.4.5.dist-info/METADATA +0 -34
- endoreg_db-0.4.5.dist-info/RECORD +0 -316
- /endoreg_db/{data/distribution/numeric/.init → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{models/persons/patient/case/__init__.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → config/__init__.py} +0 -0
- /endoreg_db/data/{label → ai_model_label}/label-type/data.yaml +0 -0
- /endoreg_db/data/{model_type → ai_model_type}/data.yaml +0 -0
- /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
- /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
- /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
- /endoreg_db/management/commands/{load_report_reader_flag.py → load_report_reader_flag_data.py} +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- {endoreg_db-0.4.5.dist-info → endoreg_db-0.8.6.3.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
from typing import List, Optional, TYPE_CHECKING # Modified import
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
from endoreg_db.models import (
|
|
6
|
+
PatientDisease, Disease, DiseaseClassificationChoice,
|
|
7
|
+
Event,
|
|
8
|
+
PatientEvent, Examination, ExaminationIndication, ExaminationIndicationClassificationChoice,
|
|
9
|
+
PatientExamination, PatientExaminationIndication,
|
|
10
|
+
PatientFinding,
|
|
11
|
+
Finding,
|
|
12
|
+
FindingIntervention,
|
|
13
|
+
FindingClassification,
|
|
14
|
+
FindingClassificationChoice,
|
|
15
|
+
LabValue,
|
|
16
|
+
PatientLabValue,
|
|
17
|
+
PatientLabSample,
|
|
18
|
+
PatientLabSampleType,
|
|
19
|
+
PatientMedication, # Added
|
|
20
|
+
PatientMedicationSchedule, # Added
|
|
21
|
+
Medication, # Added
|
|
22
|
+
MedicationIndication, # Added
|
|
23
|
+
MedicationIntakeTime, # Added
|
|
24
|
+
MedicationSchedule, # Added
|
|
25
|
+
)
|
|
26
|
+
if TYPE_CHECKING: # Added for Patient import
|
|
27
|
+
from endoreg_db.models.administration.person.patient import Patient
|
|
28
|
+
|
|
29
|
+
class RequirementLinks(BaseModel):
|
|
30
|
+
"""
|
|
31
|
+
A class representing a dictionary of models related to a requirement.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
# requirement_types (List[RequirementType]): A List of requirement types.
|
|
35
|
+
# operators (List[RequirementOperator]): A List of operators.
|
|
36
|
+
# requirement_sets (List[RequirementSet]): A List of requirement sets.
|
|
37
|
+
examinations (List[Examination]): A List of examinations.
|
|
38
|
+
examination_indications (List[ExaminationIndication]): A List of examination indications.
|
|
39
|
+
lab_values (List[LabValue]): A List of lab values.
|
|
40
|
+
diseases (List[Disease]): A List of diseases.
|
|
41
|
+
disease_classification_choices (List[DiseaseClassificationChoice]): A List of disease classification choices.
|
|
42
|
+
events (List[Event]): A List of events.
|
|
43
|
+
findings (List[Finding]): A List of findings.
|
|
44
|
+
finding_morphology_classification_choices (List[FindingMorphologyClassificationChoice]): A List of finding morphology classification choices.
|
|
45
|
+
finding_location_classification_choices (List[FindingLocationClassificationChoice]): A List of finding location classification choices.
|
|
46
|
+
finding_interventions (List[FindingIntervention]): A List of finding interventions.
|
|
47
|
+
"""
|
|
48
|
+
model_config = {"arbitrary_types_allowed": True}
|
|
49
|
+
#
|
|
50
|
+
# requirement_types: Optional[List["RequirementType"]] = None
|
|
51
|
+
# operators: Optional[List["RequirementOperator"]] = None
|
|
52
|
+
# The following model import causes circular import
|
|
53
|
+
#requirement_sets: Optional[List["RequirementSet"]] = None
|
|
54
|
+
examinations: List["Examination"] = Field(default_factory=list)
|
|
55
|
+
examination_indications: List["ExaminationIndication"] = Field(default_factory=list)
|
|
56
|
+
examination_indication_classification_choices: List["ExaminationIndicationClassificationChoice"] = Field(default_factory=list)
|
|
57
|
+
patient_examinations: List["PatientExamination"] = Field(default_factory=list)
|
|
58
|
+
|
|
59
|
+
patient_examination_indication: List["PatientExaminationIndication"] = Field(default_factory=list)
|
|
60
|
+
lab_values: List["LabValue"] = Field(default_factory=list)
|
|
61
|
+
patient_lab_values: List["PatientLabValue"] = Field(default_factory=list)
|
|
62
|
+
patient_lab_samples: List["PatientLabSample"] = Field(default_factory=list)
|
|
63
|
+
patient_diseases: List["PatientDisease"] = Field(default_factory=list)
|
|
64
|
+
diseases: List["Disease"] = Field(default_factory=list)
|
|
65
|
+
disease_classification_choices: List["DiseaseClassificationChoice"] = Field(default_factory=list)
|
|
66
|
+
events: List["Event"] = Field(default_factory=list)
|
|
67
|
+
patient_events: List["PatientEvent"] = Field(default_factory=list)
|
|
68
|
+
patient_findings: List["PatientFinding"] = Field(default_factory=list)
|
|
69
|
+
findings: List["Finding"] = Field(default_factory=list)
|
|
70
|
+
finding_classification_choices: List["FindingClassificationChoice"] = Field(default_factory=list)
|
|
71
|
+
finding_classifications: List["FindingClassification"] = Field(default_factory=list) # Added for direct classification checks if needed
|
|
72
|
+
finding_interventions: List["FindingIntervention"] = Field(default_factory=list)
|
|
73
|
+
patient_lab_sample_types: List["PatientLabSampleType"] = Field(default_factory=list)
|
|
74
|
+
patient_medications: List["PatientMedication"] = Field(default_factory=list) # Added
|
|
75
|
+
patient_medication_schedules: List["PatientMedicationSchedule"] = Field(default_factory=list) # Added
|
|
76
|
+
# Added direct medication-related fields
|
|
77
|
+
medications: List["Medication"] = Field(default_factory=list)
|
|
78
|
+
medication_indications: List["MedicationIndication"] = Field(default_factory=list)
|
|
79
|
+
medication_intake_times: List["MedicationIntakeTime"] = Field(default_factory=list)
|
|
80
|
+
medication_schedules: List["MedicationSchedule"] = Field(default_factory=list)
|
|
81
|
+
|
|
82
|
+
def get_first_patient(self) -> Optional["Patient"]:
|
|
83
|
+
"""
|
|
84
|
+
Retrieves the first Patient instance found through the linked patient-specific models.
|
|
85
|
+
Iterates through various patient-related lists and returns the .patient attribute
|
|
86
|
+
from the first relevant object found.
|
|
87
|
+
"""
|
|
88
|
+
if self.patient_lab_values:
|
|
89
|
+
for plv in self.patient_lab_values:
|
|
90
|
+
if hasattr(plv, 'sample') and plv.sample and \
|
|
91
|
+
hasattr(plv.sample, 'patient') and plv.sample.patient:
|
|
92
|
+
return plv.sample.patient
|
|
93
|
+
if self.patient_lab_samples:
|
|
94
|
+
for pls in self.patient_lab_samples:
|
|
95
|
+
if hasattr(pls, 'patient') and pls.patient:
|
|
96
|
+
return pls.patient
|
|
97
|
+
if self.patient_examinations:
|
|
98
|
+
for pe in self.patient_examinations:
|
|
99
|
+
if hasattr(pe, 'patient') and pe.patient:
|
|
100
|
+
return pe.patient
|
|
101
|
+
if self.patient_diseases:
|
|
102
|
+
for pd in self.patient_diseases:
|
|
103
|
+
if hasattr(pd, 'patient') and pd.patient:
|
|
104
|
+
return pd.patient
|
|
105
|
+
if self.patient_events:
|
|
106
|
+
for pev in self.patient_events:
|
|
107
|
+
if hasattr(pev, 'patient') and pev.patient:
|
|
108
|
+
return pev.patient
|
|
109
|
+
if self.patient_findings:
|
|
110
|
+
for pf in self.patient_findings:
|
|
111
|
+
if hasattr(pf, 'patient') and pf.patient:
|
|
112
|
+
return pf.patient
|
|
113
|
+
# Check PatientMedication
|
|
114
|
+
if self.patient_medications:
|
|
115
|
+
for pm in self.patient_medications:
|
|
116
|
+
if hasattr(pm, 'patient') and pm.patient:
|
|
117
|
+
return pm.patient
|
|
118
|
+
# Check PatientMedicationSchedule
|
|
119
|
+
if self.patient_medication_schedules:
|
|
120
|
+
for pms in self.patient_medication_schedules:
|
|
121
|
+
if hasattr(pms, 'patient') and pms.patient:
|
|
122
|
+
return pms.patient
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def data_model_dict(self):
|
|
127
|
+
"""
|
|
128
|
+
Provides access to the data model dictionary used for requirement type parsing.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
The `data_model_dict` imported from the requirement type parser module.
|
|
132
|
+
"""
|
|
133
|
+
from endoreg_db.models.requirement.requirement_evaluation.requirement_type_parser import data_model_dict
|
|
134
|
+
return data_model_dict
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def data_model_dict_reverse(self):
|
|
138
|
+
"""
|
|
139
|
+
Provides a reverse mapping dictionary for data model types used in requirement evaluation.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
The `data_model_dict_reverse` dictionary imported from the requirement type parser module.
|
|
143
|
+
"""
|
|
144
|
+
from endoreg_db.models.requirement.requirement_evaluation.requirement_type_parser import data_model_dict_reverse
|
|
145
|
+
|
|
146
|
+
return data_model_dict_reverse
|
|
147
|
+
|
|
148
|
+
def match_any(self, other:"RequirementLinks") -> bool:
|
|
149
|
+
"""
|
|
150
|
+
Determines if any linked model in this instance is also present in another RequirementLinks instance.
|
|
151
|
+
|
|
152
|
+
Compares each list attribute of both instances and returns True if any element in any list overlaps.
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
other_dict = other.model_dump()
|
|
156
|
+
self_dict = self.model_dump()
|
|
157
|
+
for key in self_dict:
|
|
158
|
+
# print(f"Checking key: {key}") # This is a debug print, can be removed
|
|
159
|
+
if key in other_dict and self_dict[key] and other_dict[key]:
|
|
160
|
+
if any(item in other_dict[key] for item in self_dict[key]):
|
|
161
|
+
return True
|
|
162
|
+
return False # Ensure False is returned if no match is found
|
|
163
|
+
|
|
164
|
+
def active(self) -> dict[str, list]:
|
|
165
|
+
"""
|
|
166
|
+
Returns a dictionary of all non-empty linked model lists.
|
|
167
|
+
|
|
168
|
+
Only attributes with non-empty lists are included in the returned dictionary.
|
|
169
|
+
"""
|
|
170
|
+
active_links_dict = {}
|
|
171
|
+
# Use model_dump() to iterate field data reliably (pydantic v2)
|
|
172
|
+
for field_name, field_value in self.model_dump().items():
|
|
173
|
+
if isinstance(field_value, list) and field_value:
|
|
174
|
+
active_links_dict[field_name] = field_value
|
|
175
|
+
return active_links_dict
|
|
176
|
+
|
|
177
|
+
def __repr__(self):
|
|
178
|
+
"""
|
|
179
|
+
Returns a concise string summarizing the counts of each linked model list in the instance.
|
|
180
|
+
"""
|
|
181
|
+
data = self.model_dump()
|
|
182
|
+
fields = [
|
|
183
|
+
'examinations', 'examination_indications', 'patient_examinations',
|
|
184
|
+
'lab_values', 'patient_lab_values', 'patient_diseases', 'diseases',
|
|
185
|
+
'disease_classification_choices', 'events', 'patient_events', 'findings',
|
|
186
|
+
'patient_findings', 'finding_classification_choices', 'finding_interventions',
|
|
187
|
+
'patient_medications', 'patient_medication_schedules', 'medications',
|
|
188
|
+
'medication_indications', 'medication_intake_times', 'medication_schedules'
|
|
189
|
+
]
|
|
190
|
+
parts = [f"{f}={len(data.get(f, []))}" for f in fields]
|
|
191
|
+
return f"RequirementLinks({', '.join(parts)})"
|
|
192
|
+
|
|
193
|
+
|
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Use faker library to generate fake names by gender
|
|
2
|
+
# Use german names by default
|
|
3
|
+
|
|
4
|
+
from faker import Faker
|
|
5
|
+
import gender_guesser.detector as gender_detector
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def create_mock_examiner_name() -> tuple[str, str]:
|
|
9
|
+
"""
|
|
10
|
+
Generate a mock examiner's name using the Faker library.
|
|
11
|
+
This function creates a tuple with a first name and a last name for a mock examiner. It utilizes the "de_DE" locale for generating German names.
|
|
12
|
+
Returns:
|
|
13
|
+
tuple[str, str]: A tuple containing the first name and the last name.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
fake = Faker("de_DE")
|
|
17
|
+
first_name = fake.first_name()
|
|
18
|
+
last_name = fake.last_name()
|
|
19
|
+
return first_name, last_name
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def create_mock_patient_name(gender: str) -> tuple[str, str]:
|
|
23
|
+
"""
|
|
24
|
+
Generate a mock patient's name based on the provided gender using the Faker library.
|
|
25
|
+
This function creates a tuple with a first name and a last name for a mock patient. It utilizes the "de_DE" locale for generating German names. When the input gender string is checked:
|
|
26
|
+
- If it contains "male", a male name is generated.
|
|
27
|
+
- If it contains "female", a female name is generated.
|
|
28
|
+
- Otherwise, a generic name is generated without considering gender.
|
|
29
|
+
Parameters:
|
|
30
|
+
gender (str): A string indicating the gender to be used for generating the name.
|
|
31
|
+
Returns:
|
|
32
|
+
tuple[str, str]: A tuple containing the first name and the last name.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
fake = Faker("de_DE")
|
|
36
|
+
|
|
37
|
+
if "male" in gender.lower():
|
|
38
|
+
gender = "male"
|
|
39
|
+
elif "female" in gender.lower():
|
|
40
|
+
gender = "female"
|
|
41
|
+
|
|
42
|
+
if gender == "male":
|
|
43
|
+
first_name = fake.first_name_male()
|
|
44
|
+
last_name = fake.last_name_male()
|
|
45
|
+
|
|
46
|
+
elif gender == "female":
|
|
47
|
+
first_name = fake.first_name_female()
|
|
48
|
+
last_name = fake.last_name_female()
|
|
49
|
+
|
|
50
|
+
else:
|
|
51
|
+
first_name = fake.first_name()
|
|
52
|
+
last_name = fake.last_name()
|
|
53
|
+
|
|
54
|
+
return first_name, last_name
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def guess_name_gender(name: str) -> str:
|
|
58
|
+
"""
|
|
59
|
+
Guesses the gender for a given name by using a gender detector and retrieving the corresponding Gender model instance.
|
|
60
|
+
Parameters:
|
|
61
|
+
name (str): The name for which the gender is to be determined.
|
|
62
|
+
Returns:
|
|
63
|
+
Gender: The Gender object corresponding to the detected gender name.
|
|
64
|
+
Raises:
|
|
65
|
+
Gender.DoesNotExist: If no Gender object matching the detected gender is found.
|
|
66
|
+
Exception: For any other exceptions that occur during gender detection or database lookup.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
from endoreg_db.models import Gender
|
|
70
|
+
|
|
71
|
+
detector = gender_detector.Detector(case_sensitive=False)
|
|
72
|
+
gender_name = detector.get_gender(name)
|
|
73
|
+
gender = Gender.objects.get(name=gender_name)
|
|
74
|
+
if not gender:
|
|
75
|
+
gender = Gender.objects.get(name="unknown")
|
|
76
|
+
return gender
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import yaml
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
# get this files path
|
|
5
|
+
file_path = Path(__file__)
|
|
6
|
+
module_root = file_path.parent.parent
|
|
7
|
+
data_dir = module_root / "data"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def collect_center_names(
|
|
11
|
+
):
|
|
12
|
+
input_file_path = data_dir / "center/data.yaml"
|
|
13
|
+
fist_name_dir = data_dir / "names_first"
|
|
14
|
+
last_name_dir = data_dir / "names_last"
|
|
15
|
+
# Load the input YAML file
|
|
16
|
+
with open(input_file_path, 'r', encoding='utf-8') as file:
|
|
17
|
+
data = yaml.safe_load(file)
|
|
18
|
+
|
|
19
|
+
# Containers for first and last names
|
|
20
|
+
first_names_set = set()
|
|
21
|
+
last_names_set = set()
|
|
22
|
+
|
|
23
|
+
# Extract first and last names from the YAML data
|
|
24
|
+
for entry in data:
|
|
25
|
+
fields = entry.get('fields', {})
|
|
26
|
+
first_names_set.update(fields.get('first_names', []))
|
|
27
|
+
last_names_set.update(fields.get('last_names', []))
|
|
28
|
+
|
|
29
|
+
# Create a list of dictionaries for first and last names
|
|
30
|
+
first_names_data = [
|
|
31
|
+
{"model": "endoreg_db.first_name", "fields": {"name": name}}
|
|
32
|
+
for name in sorted(first_names_set)
|
|
33
|
+
]
|
|
34
|
+
last_names_data = [
|
|
35
|
+
{"model": "endoreg_db.last_name", "fields": {"name": name}}
|
|
36
|
+
for name in sorted(last_names_set)
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
# Write the data to separate YAML files
|
|
40
|
+
with open(fist_name_dir/"first_names.yaml", "w", encoding='utf-8') as first_file:
|
|
41
|
+
yaml.dump(first_names_data, first_file, allow_unicode=True, sort_keys=False)
|
|
42
|
+
|
|
43
|
+
with open(last_name_dir/"last_names.yaml", "w", encoding='utf-8') as last_file:
|
|
44
|
+
yaml.dump(last_names_data, last_file, allow_unicode=True, sort_keys=False)
|
|
45
|
+
|
|
46
|
+
# print("Generated first_names.yaml and last_names.yaml successfully.")
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Centralizes path management for the application.
|
|
3
|
+
|
|
4
|
+
This module sets up all necessary directories for storage and import operations.
|
|
5
|
+
It provides a unified dictionary 'data_paths' for accessing all path objects.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from logging import getLogger
|
|
9
|
+
|
|
10
|
+
from sphinx.search import no
|
|
11
|
+
logger = getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Dict
|
|
15
|
+
import os
|
|
16
|
+
# Alternative approach using env_path helper, deprecated since monorepo setup. Alright for single install, env is always preferred.
|
|
17
|
+
#from endoreg_db.config.env import env_path
|
|
18
|
+
|
|
19
|
+
STORAGE_DIR = Path(os.getenv("STORAGE_DIR", "storage"))
|
|
20
|
+
|
|
21
|
+
storage_dir_env = os.getenv("STORAGE_DIR")
|
|
22
|
+
if storage_dir_env is None:
|
|
23
|
+
raise RuntimeError("STORAGE_DIR environment variable is not set.")
|
|
24
|
+
storage_dir_str = Path(storage_dir_env)
|
|
25
|
+
STORAGE_DIR = storage_dir_str
|
|
26
|
+
if not STORAGE_DIR.exists():
|
|
27
|
+
STORAGE_DIR.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
|
|
29
|
+
PREFIX_RAW = "raw_"
|
|
30
|
+
IMPORT_DIR_NAME = "import"
|
|
31
|
+
EXPORT_DIR_NAME = "export"
|
|
32
|
+
|
|
33
|
+
VIDEO_DIR_NAME = "videos"
|
|
34
|
+
ANONYM_VIDEO_DIR_NAME = "anonym_videos" # Added for processed videos
|
|
35
|
+
FRAME_DIR_NAME = "frames"
|
|
36
|
+
PDF_DIR_NAME = "pdfs" # Changed from reports
|
|
37
|
+
WEIGHTS_DIR_NAME = "model_weights"
|
|
38
|
+
EXAMINATION_DIR_NAME = "examinations"
|
|
39
|
+
|
|
40
|
+
RAW_VIDEO_DIR_NAME = f"{PREFIX_RAW}videos"
|
|
41
|
+
RAW_FRAME_DIR_NAME = f"{PREFIX_RAW}frames"
|
|
42
|
+
RAW_PDF_DIR_NAME = f"{PREFIX_RAW}pdfs" # Changed from reports
|
|
43
|
+
|
|
44
|
+
# Define data subdirectories under STORAGE_DIR
|
|
45
|
+
VIDEO_DIR = STORAGE_DIR / VIDEO_DIR_NAME
|
|
46
|
+
ANONYM_VIDEO_DIR = STORAGE_DIR / ANONYM_VIDEO_DIR_NAME # Added
|
|
47
|
+
FRAME_DIR = STORAGE_DIR / FRAME_DIR_NAME
|
|
48
|
+
PDF_DIR = STORAGE_DIR / PDF_DIR_NAME # Changed
|
|
49
|
+
WEIGHTS_DIR = STORAGE_DIR / WEIGHTS_DIR_NAME
|
|
50
|
+
RAW_VIDEO_DIR = STORAGE_DIR / RAW_VIDEO_DIR_NAME
|
|
51
|
+
RAW_FRAME_DIR = STORAGE_DIR / RAW_FRAME_DIR_NAME
|
|
52
|
+
RAW_PDF_DIR = STORAGE_DIR / RAW_PDF_DIR_NAME # Changed
|
|
53
|
+
|
|
54
|
+
IMPORT_DIR = STORAGE_DIR / IMPORT_DIR_NAME
|
|
55
|
+
VIDEO_IMPORT_DIR = IMPORT_DIR / VIDEO_DIR_NAME
|
|
56
|
+
FRAME_IMPORT_DIR = IMPORT_DIR / FRAME_DIR_NAME
|
|
57
|
+
PDF_IMPORT_DIR = IMPORT_DIR / PDF_DIR_NAME # Changed
|
|
58
|
+
WEIGHTS_IMPORT_DIR = IMPORT_DIR / WEIGHTS_DIR_NAME
|
|
59
|
+
|
|
60
|
+
EXPORT_DIR = STORAGE_DIR / EXPORT_DIR_NAME
|
|
61
|
+
|
|
62
|
+
data_paths:Dict[str,Path] = {
|
|
63
|
+
"storage": STORAGE_DIR,
|
|
64
|
+
"video": VIDEO_DIR,
|
|
65
|
+
"anonym_video": ANONYM_VIDEO_DIR, # Added
|
|
66
|
+
"frame": FRAME_DIR,
|
|
67
|
+
"pdf": PDF_DIR, # Changed
|
|
68
|
+
"import": IMPORT_DIR,
|
|
69
|
+
"video_import": VIDEO_IMPORT_DIR,
|
|
70
|
+
"frame_import": FRAME_IMPORT_DIR,
|
|
71
|
+
"pdf_import": PDF_IMPORT_DIR, # Changed
|
|
72
|
+
"raw_video": RAW_VIDEO_DIR,
|
|
73
|
+
"raw_frame": RAW_FRAME_DIR,
|
|
74
|
+
"raw_pdf": RAW_PDF_DIR, # Changed
|
|
75
|
+
"weights": WEIGHTS_DIR,
|
|
76
|
+
"weights_import": WEIGHTS_IMPORT_DIR,
|
|
77
|
+
"export": EXPORT_DIR,
|
|
78
|
+
"video_export": EXPORT_DIR / VIDEO_DIR_NAME,
|
|
79
|
+
"anonym_video_export": EXPORT_DIR / ANONYM_VIDEO_DIR_NAME, # Added
|
|
80
|
+
"frame_export": EXPORT_DIR / FRAME_DIR_NAME,
|
|
81
|
+
"pdf_export": EXPORT_DIR / PDF_DIR_NAME, # Changed
|
|
82
|
+
"weights_export": EXPORT_DIR / WEIGHTS_DIR_NAME,
|
|
83
|
+
"examination_export": EXPORT_DIR / EXAMINATION_DIR_NAME,
|
|
84
|
+
"raw_video_export": EXPORT_DIR / RAW_VIDEO_DIR_NAME,
|
|
85
|
+
"raw_frame_export": EXPORT_DIR / RAW_FRAME_DIR_NAME,
|
|
86
|
+
"raw_pdf_export": EXPORT_DIR / RAW_PDF_DIR_NAME, # Changed
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
logger.info(f"Storage directory: {STORAGE_DIR.resolve()}")
|
|
90
|
+
logger.info(f"Export directory: {EXPORT_DIR.resolve()}")
|
|
91
|
+
|
|
92
|
+
# for key, path in data_paths.items():
|
|
93
|
+
# path.mkdir(parents=True, exist_ok=True)
|
|
94
|
+
|
|
95
|
+
# logger.info(f"{key.capitalize()} directory: {path.resolve()}")
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Dynamic permission utilities that adapt to environment settings.
|
|
3
|
+
|
|
4
|
+
This module provides permission classes that automatically adjust based on
|
|
5
|
+
the DEBUG setting and other environment configurations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from django.conf import settings
|
|
9
|
+
from rest_framework.permissions import IsAuthenticated, AllowAny, BasePermission
|
|
10
|
+
from rest_framework.decorators import permission_classes as drf_permission_classes
|
|
11
|
+
from functools import wraps
|
|
12
|
+
import logging
|
|
13
|
+
import os
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DynamicAuthPermission:
|
|
19
|
+
"""
|
|
20
|
+
Permission class that adapts based on environment settings.
|
|
21
|
+
|
|
22
|
+
- In DEBUG mode: Allows access without authentication
|
|
23
|
+
- In production (DEBUG=False): Requires authentication
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def get_permission_classes():
|
|
28
|
+
"""
|
|
29
|
+
Returns appropriate permission classes based on current settings.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
list: Permission classes to use
|
|
33
|
+
"""
|
|
34
|
+
if getattr(settings, 'DEBUG', False):
|
|
35
|
+
logger.info("DEBUG mode detected - allowing unauthenticated access")
|
|
36
|
+
return [AllowAny]
|
|
37
|
+
else:
|
|
38
|
+
logger.info("Production mode detected - requiring authentication")
|
|
39
|
+
return [IsAuthenticated]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def dynamic_permission_classes(force_auth=None):
|
|
43
|
+
"""
|
|
44
|
+
Decorator that applies permission classes based on environment settings.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
force_auth (bool, optional):
|
|
48
|
+
- True: Always require authentication regardless of DEBUG
|
|
49
|
+
- False: Always allow access regardless of DEBUG
|
|
50
|
+
- None: Use environment-based logic (default)
|
|
51
|
+
"""
|
|
52
|
+
def decorator(view_func):
|
|
53
|
+
@wraps(view_func)
|
|
54
|
+
def wrapper(*args, **kwargs):
|
|
55
|
+
return view_func(*args, **kwargs)
|
|
56
|
+
|
|
57
|
+
# Determine permission classes
|
|
58
|
+
if force_auth is True:
|
|
59
|
+
permission_cls = [IsAuthenticated]
|
|
60
|
+
logger.info(f"View {view_func.__name__} - forced authentication required")
|
|
61
|
+
elif force_auth is False:
|
|
62
|
+
permission_cls = [AllowAny]
|
|
63
|
+
logger.info(f"View {view_func.__name__} - forced public access")
|
|
64
|
+
else:
|
|
65
|
+
permission_cls = DynamicAuthPermission.get_permission_classes()
|
|
66
|
+
logger.info(f"View {view_func.__name__} - dynamic permissions: {permission_cls}")
|
|
67
|
+
|
|
68
|
+
# Apply the permission classes decorator
|
|
69
|
+
return drf_permission_classes(permission_cls)(wrapper)
|
|
70
|
+
|
|
71
|
+
return decorator
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_auth_required():
|
|
75
|
+
"""
|
|
76
|
+
Simple function to check if authentication is required in current environment.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
bool: True if authentication is required, False otherwise
|
|
80
|
+
"""
|
|
81
|
+
return not getattr(settings, 'DEBUG', False)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def is_debug_mode():
|
|
85
|
+
"""
|
|
86
|
+
Robustly determine if debug mode is enabled, checking both Django settings and environment variable.
|
|
87
|
+
Also treats active pytest sessions as debug to simplify API tests.
|
|
88
|
+
"""
|
|
89
|
+
truthy = {"1", "true", "yes", "on"}
|
|
90
|
+
env_debug = str(os.environ.get("DJANGO_DEBUG", "false")).lower() in truthy
|
|
91
|
+
settings_debug = bool(getattr(settings, 'DEBUG', False))
|
|
92
|
+
pytest_active = "PYTEST_CURRENT_TEST" in os.environ
|
|
93
|
+
result = settings_debug or env_debug or pytest_active
|
|
94
|
+
logger.info(f"is_debug_mode: env={env_debug}, settings={settings_debug}, pytest={pytest_active}, result={result}")
|
|
95
|
+
return result
|
|
96
|
+
|
|
97
|
+
# Compute default permission classes each call to avoid stale values during tests
|
|
98
|
+
|
|
99
|
+
def get_debug_permissions():
|
|
100
|
+
return [AllowAny] if is_debug_mode() else [IsAuthenticated]
|
|
101
|
+
|
|
102
|
+
# Export a name for convenience, but prefer calling get_debug_permissions() in views
|
|
103
|
+
DEBUG_PERMISSIONS = get_debug_permissions()
|
|
104
|
+
ALWAYS_AUTH_PERMISSIONS = [IsAuthenticated]
|
|
105
|
+
ALWAYS_PUBLIC_PERMISSIONS = [AllowAny]
|
|
106
|
+
|
|
107
|
+
# Log the current permission mode
|
|
108
|
+
if is_debug_mode():
|
|
109
|
+
logger.info("🔓 Authentication disabled for DEBUG mode (robust check)")
|
|
110
|
+
else:
|
|
111
|
+
logger.info("🔒 Authentication required for production mode (robust check)")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class EnvironmentAwarePermission(BasePermission):
|
|
115
|
+
"""
|
|
116
|
+
Custom permission class that can be used directly in DRF views.
|
|
117
|
+
Honors both Django settings.DEBUG and DJANGO_DEBUG env var.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
def has_permission(self, request, view):
|
|
121
|
+
"""
|
|
122
|
+
Check if the request has permission.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
request: The Django request object
|
|
126
|
+
view: The DRF view
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
bool: True if permission granted, False otherwise
|
|
130
|
+
"""
|
|
131
|
+
if is_debug_mode():
|
|
132
|
+
logger.debug(f"DEBUG mode - granting access to {view.__class__.__name__}")
|
|
133
|
+
return True
|
|
134
|
+
# In production, require authentication
|
|
135
|
+
is_authenticated = bool(getattr(request, 'user', None) and request.user.is_authenticated)
|
|
136
|
+
logger.debug(f"Production mode - authentication check for {view.__class__.__name__}: {is_authenticated}")
|
|
137
|
+
return is_authenticated
|
|
138
|
+
|
|
139
|
+
def has_object_permission(self, request, view, obj):
|
|
140
|
+
"""
|
|
141
|
+
Object-level permission check.
|
|
142
|
+
"""
|
|
143
|
+
return self.has_permission(request, view)
|