endoreg-db 0.8.4.4__py3-none-any.whl → 0.8.8.0__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/authz/auth.py +74 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +18 -0
- endoreg_db/authz/middleware.py +83 -0
- endoreg_db/authz/permissions.py +127 -0
- endoreg_db/authz/policy.py +218 -0
- endoreg_db/authz/views_auth.py +66 -0
- endoreg_db/config/env.py +13 -8
- endoreg_db/data/__init__.py +8 -31
- endoreg_db/data/_examples/disease.yaml +55 -0
- endoreg_db/data/_examples/disease_classification.yaml +13 -0
- endoreg_db/data/_examples/disease_classification_choice.yaml +62 -0
- endoreg_db/data/_examples/event.yaml +64 -0
- endoreg_db/data/_examples/examination.yaml +72 -0
- endoreg_db/data/_examples/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/_examples/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/_examples/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/_examples/finding/complication.yaml +16 -0
- endoreg_db/data/_examples/finding/data.yaml +105 -0
- endoreg_db/data/_examples/finding/examination_setting.yaml +16 -0
- endoreg_db/data/_examples/finding/medication_related.yaml +18 -0
- endoreg_db/data/_examples/finding/outcome.yaml +12 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_bowel_preparation.yaml +68 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/_examples/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/_examples/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/_examples/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/_examples/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/_examples/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/_examples/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/_examples/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/_examples/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/_examples/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/_examples/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/_examples/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/_examples/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/_examples/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/_examples/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/_examples/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/_examples/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/_examples/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/_examples/finding_type/data.yaml +43 -0
- endoreg_db/data/_examples/requirement/age.yaml +26 -0
- endoreg_db/data/_examples/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/_examples/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/_examples/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/_examples/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/_examples/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/_examples/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/_examples/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/_examples/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/_examples/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/_examples/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/_examples/requirement/gender.yaml +25 -0
- endoreg_db/data/_examples/requirement/lab_value.yaml +441 -0
- endoreg_db/data/_examples/requirement/medication.yaml +93 -0
- endoreg_db/data/_examples/requirement_operator/age.yaml +13 -0
- endoreg_db/data/_examples/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/_examples/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/_examples/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/_examples/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/_examples/yaml_examples.xlsx +0 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +4 -3
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +43 -70
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +22 -52
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +31 -62
- endoreg_db/data/finding_classification/histology_colo.yaml +28 -36
- endoreg_db/data/requirement/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +31 -12
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/02_endoscopy_bleeding_risk.yaml +46 -0
- endoreg_db/data/requirement_set/90_coloreg.yaml +178 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set_type/data.yaml +21 -0
- endoreg_db/data/setup_config.yaml +4 -4
- endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
- endoreg_db/exceptions.py +5 -2
- endoreg_db/helpers/data_loader.py +1 -1
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
- endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
- endoreg_db/management/commands/import_video.py +9 -10
- endoreg_db/management/commands/import_video_with_classification.py +1 -1
- endoreg_db/management/commands/init_default_ai_model.py +1 -1
- endoreg_db/management/commands/list_routes.py +18 -0
- endoreg_db/management/commands/load_ai_model_data.py +2 -1
- endoreg_db/management/commands/load_center_data.py +12 -12
- endoreg_db/management/commands/load_requirement_data.py +60 -31
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/setup_endoreg_db.py +14 -10
- endoreg_db/management/commands/storage_management.py +271 -203
- endoreg_db/migrations/0001_initial.py +1799 -1300
- endoreg_db/migrations/0002_requirementset_depends_on.py +18 -0
- endoreg_db/migrations/_old/0001_initial.py +1857 -0
- endoreg_db/migrations/_old/0004_employee_city_employee_post_code_employee_street_and_more.py +68 -0
- endoreg_db/migrations/_old/0004_remove_casetemplate_rules_and_more.py +77 -0
- endoreg_db/migrations/_old/0005_merge_20251111_1003.py +14 -0
- endoreg_db/migrations/_old/0006_sensitivemeta_anonymized_text_and_more.py +68 -0
- endoreg_db/migrations/_old/0007_remove_rule_attribute_dtype_remove_rule_rule_type_and_more.py +89 -0
- endoreg_db/migrations/_old/0008_remove_event_event_classification_and_more.py +27 -0
- endoreg_db/migrations/_old/0009_alter_modelmeta_options_and_more.py +21 -0
- endoreg_db/models/__init__.py +78 -123
- endoreg_db/models/administration/__init__.py +21 -42
- endoreg_db/models/administration/ai/active_model.py +2 -2
- endoreg_db/models/administration/ai/ai_model.py +7 -6
- endoreg_db/models/administration/case/__init__.py +1 -15
- endoreg_db/models/administration/case/case.py +3 -3
- endoreg_db/models/administration/case/case_template/__init__.py +2 -14
- endoreg_db/models/administration/case/case_template/case_template.py +2 -124
- endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
- endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
- endoreg_db/models/administration/center/center.py +33 -19
- endoreg_db/models/administration/center/center_product.py +12 -9
- endoreg_db/models/administration/center/center_resource.py +25 -19
- endoreg_db/models/administration/center/center_shift.py +21 -17
- endoreg_db/models/administration/center/center_waste.py +16 -8
- endoreg_db/models/administration/person/__init__.py +2 -0
- endoreg_db/models/administration/person/employee/employee.py +10 -5
- endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
- endoreg_db/models/administration/person/employee/employee_type.py +12 -6
- endoreg_db/models/administration/person/examiner/examiner.py +13 -11
- endoreg_db/models/administration/person/patient/__init__.py +2 -0
- endoreg_db/models/administration/person/patient/patient.py +103 -100
- endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
- endoreg_db/models/administration/person/person.py +4 -0
- endoreg_db/models/administration/person/profession/__init__.py +8 -4
- endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
- endoreg_db/models/administration/product/product.py +20 -15
- endoreg_db/models/administration/product/product_material.py +17 -18
- endoreg_db/models/administration/product/product_weight.py +12 -8
- endoreg_db/models/administration/product/reference_product.py +23 -55
- endoreg_db/models/administration/qualification/qualification.py +7 -3
- endoreg_db/models/administration/qualification/qualification_type.py +7 -3
- endoreg_db/models/administration/shift/scheduled_days.py +8 -5
- endoreg_db/models/administration/shift/shift.py +16 -12
- endoreg_db/models/administration/shift/shift_type.py +23 -31
- endoreg_db/models/label/__init__.py +7 -8
- endoreg_db/models/label/annotation/image_classification.py +10 -9
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +8 -5
- endoreg_db/models/label/label.py +15 -15
- endoreg_db/models/label/label_set.py +19 -6
- endoreg_db/models/label/label_type.py +1 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
- endoreg_db/models/label/label_video_segment/label_video_segment.py +76 -102
- endoreg_db/models/label/video_segmentation_label.py +4 -0
- endoreg_db/models/label/video_segmentation_labelset.py +4 -3
- endoreg_db/models/media/frame/frame.py +22 -22
- endoreg_db/models/media/pdf/raw_pdf.py +249 -177
- endoreg_db/models/media/pdf/report_file.py +25 -29
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +30 -46
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
- endoreg_db/models/media/video/__init__.py +1 -0
- endoreg_db/models/media/video/create_from_file.py +48 -56
- endoreg_db/models/media/video/pipe_1.py +30 -33
- endoreg_db/models/media/video/pipe_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +359 -204
- endoreg_db/models/media/video/video_file_ai.py +288 -74
- endoreg_db/models/media/video/video_file_anonymize.py +38 -38
- endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
- endoreg_db/models/media/video/video_file_io.py +109 -62
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
- endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
- endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
- endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
- endoreg_db/models/media/video/video_file_segments.py +24 -17
- endoreg_db/models/media/video/video_metadata.py +19 -35
- endoreg_db/models/media/video/video_processing.py +96 -95
- endoreg_db/models/medical/contraindication/__init__.py +13 -3
- endoreg_db/models/medical/disease.py +22 -16
- endoreg_db/models/medical/event.py +31 -18
- endoreg_db/models/medical/examination/__init__.py +13 -6
- endoreg_db/models/medical/examination/examination.py +17 -18
- endoreg_db/models/medical/examination/examination_indication.py +26 -25
- endoreg_db/models/medical/examination/examination_time.py +16 -6
- endoreg_db/models/medical/examination/examination_time_type.py +9 -6
- endoreg_db/models/medical/examination/examination_type.py +3 -4
- endoreg_db/models/medical/finding/finding.py +38 -39
- endoreg_db/models/medical/finding/finding_classification.py +37 -48
- endoreg_db/models/medical/finding/finding_intervention.py +27 -22
- endoreg_db/models/medical/finding/finding_type.py +13 -12
- endoreg_db/models/medical/hardware/endoscope.py +20 -26
- endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
- endoreg_db/models/medical/laboratory/lab_value.py +62 -91
- endoreg_db/models/medical/medication/medication.py +22 -10
- endoreg_db/models/medical/medication/medication_indication.py +29 -3
- endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
- endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
- endoreg_db/models/medical/medication/medication_schedule.py +27 -16
- endoreg_db/models/medical/organ/__init__.py +15 -12
- endoreg_db/models/medical/patient/medication_examples.py +1 -5
- endoreg_db/models/medical/patient/patient_disease.py +20 -23
- endoreg_db/models/medical/patient/patient_event.py +19 -22
- endoreg_db/models/medical/patient/patient_examination.py +48 -54
- endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
- endoreg_db/models/medical/patient/patient_finding.py +122 -139
- endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
- endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
- endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
- endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
- endoreg_db/models/medical/patient/patient_medication.py +27 -38
- endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
- endoreg_db/models/medical/risk/risk.py +7 -6
- endoreg_db/models/medical/risk/risk_type.py +8 -5
- endoreg_db/models/metadata/model_meta.py +60 -29
- endoreg_db/models/metadata/model_meta_logic.py +139 -18
- endoreg_db/models/metadata/pdf_meta.py +19 -24
- endoreg_db/models/metadata/sensitive_meta.py +102 -85
- endoreg_db/models/metadata/sensitive_meta_logic.py +383 -43
- endoreg_db/models/metadata/video_meta.py +51 -31
- endoreg_db/models/metadata/video_prediction_logic.py +16 -23
- endoreg_db/models/metadata/video_prediction_meta.py +29 -33
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
- endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
- endoreg_db/models/other/emission/emission_factor.py +18 -8
- endoreg_db/models/other/gender.py +10 -5
- endoreg_db/models/other/information_source.py +25 -25
- endoreg_db/models/other/material.py +9 -5
- endoreg_db/models/other/resource.py +6 -4
- endoreg_db/models/other/tag.py +10 -5
- endoreg_db/models/other/transport_route.py +13 -8
- endoreg_db/models/other/unit.py +10 -6
- endoreg_db/models/other/waste.py +6 -5
- endoreg_db/models/requirement/requirement.py +580 -272
- endoreg_db/models/requirement/requirement_error.py +85 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
- endoreg_db/models/requirement/requirement_operator.py +36 -33
- endoreg_db/models/requirement/requirement_set.py +74 -57
- endoreg_db/models/state/__init__.py +4 -4
- endoreg_db/models/state/abstract.py +2 -2
- endoreg_db/models/state/anonymization.py +12 -0
- endoreg_db/models/state/audit_ledger.py +46 -47
- endoreg_db/models/state/label_video_segment.py +9 -0
- endoreg_db/models/state/raw_pdf.py +40 -46
- endoreg_db/models/state/sensitive_meta.py +6 -2
- endoreg_db/models/state/video.py +58 -53
- endoreg_db/models/upload_job.py +32 -55
- endoreg_db/models/utils.py +1 -2
- endoreg_db/root_urls.py +21 -2
- endoreg_db/serializers/__init__.py +26 -57
- endoreg_db/serializers/anonymization.py +18 -10
- endoreg_db/serializers/meta/report_meta.py +1 -1
- endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
- endoreg_db/serializers/misc/__init__.py +1 -1
- endoreg_db/serializers/misc/file_overview.py +33 -91
- endoreg_db/serializers/misc/{vop_patient_data.py → sensitive_patient_data.py} +1 -1
- endoreg_db/serializers/requirements/requirement_sets.py +92 -22
- endoreg_db/serializers/video/segmentation.py +2 -1
- endoreg_db/serializers/video/video_processing_history.py +20 -5
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/anonymization.py +75 -73
- endoreg_db/services/lookup_service.py +256 -73
- endoreg_db/services/lookup_store.py +174 -30
- endoreg_db/services/pdf_import.py +711 -310
- endoreg_db/services/storage_aware_video_processor.py +140 -114
- endoreg_db/services/video_import.py +266 -117
- endoreg_db/urls/__init__.py +27 -27
- endoreg_db/urls/label_video_segments.py +2 -0
- endoreg_db/urls/media.py +108 -66
- endoreg_db/urls/root_urls.py +29 -0
- endoreg_db/utils/__init__.py +15 -5
- endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/dataloader.py +88 -16
- endoreg_db/utils/defaults/set_default_center.py +32 -0
- endoreg_db/utils/names.py +22 -16
- endoreg_db/utils/permissions.py +2 -1
- endoreg_db/utils/pipelines/process_video_dir.py +1 -1
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +414 -127
- endoreg_db/utils/setup_config.py +8 -5
- endoreg_db/utils/storage.py +115 -0
- endoreg_db/utils/validate_endo_roi.py +8 -2
- endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
- endoreg_db/views/__init__.py +5 -12
- endoreg_db/views/anonymization/media_management.py +198 -163
- endoreg_db/views/anonymization/overview.py +4 -1
- endoreg_db/views/anonymization/validate.py +174 -40
- endoreg_db/views/media/__init__.py +2 -0
- endoreg_db/views/media/pdf_media.py +131 -150
- endoreg_db/views/media/sensitive_metadata.py +46 -6
- endoreg_db/views/media/video_media.py +89 -82
- endoreg_db/views/media/video_segments.py +187 -260
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -63
- endoreg_db/views/patient/patient.py +5 -4
- endoreg_db/views/pdf/__init__.py +5 -8
- endoreg_db/views/pdf/pdf_stream.py +186 -0
- endoreg_db/views/pdf/pdf_stream_views.py +0 -127
- endoreg_db/views/pdf/reimport.py +86 -91
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +186 -288
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +0 -4
- endoreg_db/views/video/correction.py +2 -2
- endoreg_db/views/video/video_examination_viewset.py +202 -289
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/RECORD +350 -255
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/rule/__init__.py +0 -13
- endoreg_db/models/rule/rule.py +0 -27
- endoreg_db/models/rule/rule_applicator.py +0 -224
- endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
- endoreg_db/models/rule/rule_type.py +0 -20
- endoreg_db/models/rule/ruleset.py +0 -17
- endoreg_db/serializers/video/video_metadata.py +0 -105
- endoreg_db/urls/report.py +0 -48
- endoreg_db/urls/video.py +0 -61
- endoreg_db/utils/case_generator/case_generator.py +0 -159
- endoreg_db/utils/case_generator/utils.py +0 -30
- endoreg_db/views/pdf/pdf_media.py +0 -239
- endoreg_db/views/report/__init__.py +0 -9
- endoreg_db/views/report/report_list.py +0 -112
- endoreg_db/views/report/report_with_secure_url.py +0 -28
- endoreg_db/views/report/start_examination.py +0 -7
- endoreg_db/views/video/video_media.py +0 -158
- endoreg_db/views.py +0 -0
- /endoreg_db/data/{requirement_set → _examples/requirement_set}/endoscopy_bleeding_risk.yaml +0 -0
- /endoreg_db/migrations/{0002_add_video_correction_models.py → _old/0002_add_video_correction_models.py} +0 -0
- /endoreg_db/migrations/{0003_add_center_display_name.py → _old/0003_add_center_display_name.py} +0 -0
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.8.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
from django.db import models
|
|
2
1
|
from typing import TYPE_CHECKING
|
|
3
2
|
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
|
-
from .
|
|
6
|
+
from ...other.emission import EmissionFactor
|
|
6
7
|
from ...other.resource import Resource
|
|
7
8
|
from ...other.unit import Unit
|
|
8
|
-
from
|
|
9
|
-
|
|
9
|
+
from .center import Center
|
|
10
|
+
|
|
11
|
+
|
|
10
12
|
class CenterResource(models.Model):
|
|
11
13
|
name = models.CharField(max_length=255, null=True)
|
|
12
14
|
center = models.ForeignKey(
|
|
@@ -16,34 +18,38 @@ class CenterResource(models.Model):
|
|
|
16
18
|
)
|
|
17
19
|
quantity = models.FloatField()
|
|
18
20
|
resource = models.ForeignKey("Resource", on_delete=models.CASCADE)
|
|
19
|
-
transport_emission_factor = models.ForeignKey(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
transport_emission_factor = models.ForeignKey(
|
|
22
|
+
"EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="center_resource_transport_emission_factor"
|
|
23
|
+
)
|
|
24
|
+
use_emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True, related_name="center_resource_use_emission_factor")
|
|
23
25
|
year = models.IntegerField()
|
|
24
26
|
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
25
|
-
|
|
27
|
+
|
|
26
28
|
if TYPE_CHECKING:
|
|
27
|
-
center: "Center"
|
|
28
|
-
resource: "Resource"
|
|
29
|
-
transport_emission_factor: "EmissionFactor"
|
|
30
|
-
use_emission_factor: "EmissionFactor"
|
|
31
|
-
unit: "Unit"
|
|
29
|
+
center: models.ForeignKey["Center"]
|
|
30
|
+
resource: models.ForeignKey["Resource"]
|
|
31
|
+
transport_emission_factor: models.ForeignKey["EmissionFactor|None"]
|
|
32
|
+
use_emission_factor: models.ForeignKey["EmissionFactor|None"]
|
|
33
|
+
unit: models.ForeignKey["Unit|None"]
|
|
32
34
|
|
|
33
35
|
def __str__(self):
|
|
34
|
-
|
|
36
|
+
return f"CenterResource {self.pk} - {self.name if self.name else 'No Name'}"
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
def display_str(self) -> str:
|
|
39
|
+
"""Return a verbose description of the center resource."""
|
|
40
|
+
result_string = f"{self.name}:\n"
|
|
38
41
|
|
|
39
42
|
result_string += "\tCenter\t-\t" + str(self.center) + "\n"
|
|
40
43
|
result_string += "\tResource\t-\t" + str(self.resource) + "\n"
|
|
41
44
|
result_string += "\tQuantity\t-\t" + str(self.quantity) + "\n"
|
|
42
45
|
result_string += "\tYear\t-\t" + str(self.year) + "\n"
|
|
43
46
|
result_string += "\tUnit\t-\t" + str(self.unit) + "\n"
|
|
44
|
-
|
|
47
|
+
|
|
48
|
+
if self.transport_emission_factor is not None:
|
|
49
|
+
result_string += "\tTransport Emission Factor\t-\t" + str(self.transport_emission_factor) + "\n"
|
|
50
|
+
|
|
45
51
|
result_string += "\tUse Emission Factor\t-\t" + str(self.use_emission_factor) + "\n"
|
|
46
52
|
|
|
47
53
|
result_string += "\n"
|
|
48
54
|
|
|
49
|
-
return result_string
|
|
55
|
+
return result_string
|
|
@@ -1,30 +1,35 @@
|
|
|
1
|
+
from decimal import Decimal
|
|
2
|
+
from typing import TYPE_CHECKING, cast
|
|
3
|
+
|
|
1
4
|
from django.db import models
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
3
5
|
|
|
4
6
|
if TYPE_CHECKING:
|
|
5
7
|
from endoreg_db.models import (
|
|
6
8
|
Center,
|
|
7
|
-
Shift,
|
|
8
9
|
ScheduledDays,
|
|
10
|
+
Shift,
|
|
9
11
|
)
|
|
10
12
|
|
|
13
|
+
|
|
11
14
|
class CenterShiftManager(models.Manager):
|
|
12
15
|
def get_by_natural_key(self, name):
|
|
13
16
|
"""
|
|
14
17
|
Retrieves a CenterShift instance by its unique name.
|
|
15
|
-
|
|
18
|
+
|
|
16
19
|
Args:
|
|
17
20
|
name: The unique identifier of the CenterShift.
|
|
18
|
-
|
|
21
|
+
|
|
19
22
|
Returns:
|
|
20
23
|
The CenterShift instance with the specified name.
|
|
21
24
|
"""
|
|
22
25
|
return self.get(name=name)
|
|
23
26
|
|
|
27
|
+
|
|
24
28
|
class CenterShift(models.Model):
|
|
25
29
|
"""
|
|
26
30
|
Model representing a center shift.
|
|
27
31
|
"""
|
|
32
|
+
|
|
28
33
|
name = models.CharField(max_length=255, unique=True)
|
|
29
34
|
description = models.TextField(blank=True, null=True)
|
|
30
35
|
|
|
@@ -46,43 +51,42 @@ class CenterShift(models.Model):
|
|
|
46
51
|
related_name="center_shifts",
|
|
47
52
|
)
|
|
48
53
|
|
|
49
|
-
#TODO add validator; the value should be between 0 and 1
|
|
54
|
+
# TODO add validator; the value should be between 0 and 1
|
|
50
55
|
estimated_presence_fraction = models.DecimalField(
|
|
51
56
|
max_digits=5,
|
|
52
57
|
decimal_places=4,
|
|
53
|
-
default=0
|
|
58
|
+
default=Decimal("0"),
|
|
54
59
|
)
|
|
55
60
|
|
|
56
61
|
if TYPE_CHECKING:
|
|
57
|
-
center: "Center"
|
|
58
|
-
shift: "Shift"
|
|
59
|
-
scheduled_days
|
|
62
|
+
center: models.ForeignKey["Center"]
|
|
63
|
+
shift: models.ForeignKey["Shift"]
|
|
64
|
+
scheduled_days = cast(models.manager.RelatedManager["ScheduledDays"], scheduled_days)
|
|
60
65
|
|
|
61
66
|
def __str__(self):
|
|
62
67
|
"""
|
|
63
68
|
Returns a string representation of the center shift, combining the center and shift.
|
|
64
69
|
"""
|
|
65
70
|
return f"{self.center} - {self.shift}"
|
|
66
|
-
|
|
71
|
+
|
|
67
72
|
def initialize_scheduled_days(self):
|
|
68
73
|
# shift_types
|
|
69
74
|
"""
|
|
70
75
|
Initializes scheduled days for the center shift.
|
|
71
|
-
|
|
76
|
+
|
|
72
77
|
This method is a placeholder and does not perform any actions.
|
|
73
78
|
"""
|
|
74
79
|
pass
|
|
75
|
-
|
|
76
|
-
def get_scheduled_days(self, infer
|
|
80
|
+
|
|
81
|
+
def get_scheduled_days(self, infer=True):
|
|
77
82
|
"""
|
|
78
83
|
Retrieves the scheduled days associated with this center shift.
|
|
79
|
-
|
|
84
|
+
|
|
80
85
|
If no scheduled days are found and `infer` is False, raises a ValueError. Otherwise, returns the queryset of scheduled days, which may be empty.
|
|
81
86
|
"""
|
|
82
87
|
sd = self.scheduled_days.all()
|
|
83
88
|
if not sd.exists():
|
|
84
89
|
if not infer:
|
|
85
90
|
raise ValueError("No scheduled days found for this center shift.")
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return sd
|
|
91
|
+
|
|
92
|
+
return sd
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
from django.db import models
|
|
2
1
|
from typing import TYPE_CHECKING
|
|
3
2
|
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
|
-
from .center import Center
|
|
6
|
-
from ...other.waste import Waste
|
|
7
|
-
from ...other.unit import Unit
|
|
8
6
|
from ...other.emission import EmissionFactor
|
|
9
|
-
|
|
7
|
+
from ...other.unit import Unit
|
|
8
|
+
from ...other.waste import Waste
|
|
9
|
+
from .center import Center
|
|
10
|
+
|
|
11
|
+
|
|
10
12
|
class CenterWaste(models.Model):
|
|
11
13
|
center: models.ForeignKey["Center"] = models.ForeignKey(
|
|
12
14
|
"Center",
|
|
@@ -16,9 +18,15 @@ class CenterWaste(models.Model):
|
|
|
16
18
|
year = models.IntegerField()
|
|
17
19
|
waste: models.ForeignKey["Waste"] = models.ForeignKey("Waste", on_delete=models.CASCADE)
|
|
18
20
|
quantity = models.FloatField()
|
|
19
|
-
unit
|
|
20
|
-
emission_factor
|
|
21
|
-
|
|
21
|
+
unit = models.ForeignKey("Unit", on_delete=models.SET_NULL, null=True)
|
|
22
|
+
emission_factor = models.ForeignKey("EmissionFactor", on_delete=models.SET_NULL, null=True)
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
center: models.ForeignKey["Center"]
|
|
26
|
+
waste: models.ForeignKey["Waste"]
|
|
27
|
+
unit: models.ForeignKey["Unit|None"]
|
|
28
|
+
emission_factor: models.ForeignKey["EmissionFactor|None"]
|
|
29
|
+
|
|
22
30
|
def __str__(self) -> str:
|
|
23
31
|
"""
|
|
24
32
|
Returns a formatted string summarizing the waste record, including quantity, unit,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from .person import Person
|
|
2
2
|
from .patient import (
|
|
3
3
|
Patient,
|
|
4
|
+
PatientExternalID,
|
|
4
5
|
)
|
|
5
6
|
from .examiner import Examiner
|
|
6
7
|
from .user.portal_user_information import PortalUserInfo
|
|
@@ -13,6 +14,7 @@ from .employee import Employee, EmployeeType, EmployeeQualification
|
|
|
13
14
|
__all__ = [
|
|
14
15
|
"Person",
|
|
15
16
|
"Patient",
|
|
17
|
+
"PatientExternalID",
|
|
16
18
|
"Examiner",
|
|
17
19
|
"PortalUserInfo",
|
|
18
20
|
"FirstName",
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
from django.db import models
|
|
2
1
|
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
3
5
|
from ..person import Person
|
|
6
|
+
|
|
4
7
|
if TYPE_CHECKING:
|
|
5
8
|
from endoreg_db.models import (
|
|
6
|
-
EmployeeType,
|
|
7
9
|
EmployeeQualification,
|
|
10
|
+
EmployeeType,
|
|
8
11
|
)
|
|
9
12
|
|
|
13
|
+
|
|
10
14
|
class Employee(Person):
|
|
11
15
|
"""
|
|
12
16
|
Model representing an employee.
|
|
13
17
|
"""
|
|
18
|
+
|
|
14
19
|
employee_type = models.ForeignKey(
|
|
15
20
|
"EmployeeType",
|
|
16
21
|
on_delete=models.CASCADE,
|
|
@@ -18,9 +23,9 @@ class Employee(Person):
|
|
|
18
23
|
)
|
|
19
24
|
|
|
20
25
|
if TYPE_CHECKING:
|
|
21
|
-
employee_type: "EmployeeType"
|
|
22
|
-
qualification
|
|
23
|
-
|
|
26
|
+
employee_type: models.ForeignKey["EmployeeType"]
|
|
27
|
+
# qualification is a OneToOneField defined in the EmployeeQualification model
|
|
28
|
+
qualification: models.OneToOneField["EmployeeQualification"]
|
|
24
29
|
|
|
25
30
|
def __str__(self):
|
|
26
31
|
"""
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, cast
|
|
2
|
+
|
|
1
3
|
from django.db import models
|
|
2
4
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
4
5
|
if TYPE_CHECKING:
|
|
6
|
+
from django.db.models.manager import RelatedManager
|
|
7
|
+
|
|
5
8
|
from endoreg_db.models import (
|
|
6
9
|
Employee,
|
|
7
10
|
Qualification,
|
|
8
11
|
)
|
|
9
12
|
|
|
13
|
+
|
|
10
14
|
class EmployeeQualification(models.Model):
|
|
11
15
|
"""
|
|
12
16
|
Model representing an employee's qualification.
|
|
13
17
|
"""
|
|
18
|
+
|
|
14
19
|
employee = models.OneToOneField(
|
|
15
20
|
"Employee",
|
|
16
21
|
on_delete=models.CASCADE,
|
|
@@ -23,12 +28,12 @@ class EmployeeQualification(models.Model):
|
|
|
23
28
|
|
|
24
29
|
if TYPE_CHECKING:
|
|
25
30
|
employee: models.ForeignKey["Employee"]
|
|
26
|
-
qualifications
|
|
31
|
+
qualifications = cast(RelatedManager[Qualification], qualifications)
|
|
27
32
|
|
|
28
33
|
def __str__(self):
|
|
29
34
|
"""
|
|
30
35
|
Returns a human-readable string summarizing the employee and their qualifications.
|
|
31
|
-
|
|
36
|
+
|
|
32
37
|
If the employee has qualifications, lists them separated by commas; otherwise, indicates that no qualifications are assigned.
|
|
33
38
|
"""
|
|
34
39
|
qualification_list = self.qualifications.all()
|
|
@@ -36,4 +41,4 @@ class EmployeeQualification(models.Model):
|
|
|
36
41
|
# Assuming Qualification model has a decent __str__ representation
|
|
37
42
|
qual_names = ", ".join(str(q) for q in qualification_list)
|
|
38
43
|
return f"{self.employee} - Qualifications: {qual_names}"
|
|
39
|
-
return f"{self.employee} - No qualifications assigned"
|
|
44
|
+
return f"{self.employee} - No qualifications assigned"
|
|
@@ -1,25 +1,29 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, cast
|
|
2
|
+
|
|
1
3
|
from django.db import models
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
6
|
from endoreg_db.models import (
|
|
6
|
-
Qualification,
|
|
7
7
|
Employee,
|
|
8
|
+
Qualification,
|
|
8
9
|
)
|
|
9
10
|
|
|
11
|
+
|
|
10
12
|
class EmployeeTypeManager(models.Manager):
|
|
11
13
|
def get_queryset(self):
|
|
12
14
|
"""
|
|
13
15
|
Returns a queryset of active employee types.
|
|
14
|
-
|
|
16
|
+
|
|
15
17
|
Only employee types with is_active set to True are included in the queryset.
|
|
16
18
|
"""
|
|
17
19
|
return super().get_queryset().filter(is_active=True)
|
|
18
|
-
|
|
20
|
+
|
|
21
|
+
|
|
19
22
|
class EmployeeType(models.Model):
|
|
20
23
|
"""
|
|
21
24
|
Model representing an employee type.
|
|
22
25
|
"""
|
|
26
|
+
|
|
23
27
|
name = models.CharField(max_length=255, unique=True)
|
|
24
28
|
description = models.TextField(blank=True, null=True)
|
|
25
29
|
is_active = models.BooleanField(default=True)
|
|
@@ -30,8 +34,10 @@ class EmployeeType(models.Model):
|
|
|
30
34
|
)
|
|
31
35
|
|
|
32
36
|
if TYPE_CHECKING:
|
|
33
|
-
qualifications
|
|
34
|
-
|
|
37
|
+
qualifications = cast(models.manager.RelatedManager["Qualification"], qualifications)
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def employees(self) -> models.QuerySet["Employee"]: ...
|
|
35
41
|
|
|
36
42
|
objects = EmployeeTypeManager()
|
|
37
43
|
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
from ..person import Person
|
|
3
|
-
from endoreg_db.utils import get_examiner_hash, create_mock_examiner_name
|
|
4
1
|
from typing import TYPE_CHECKING
|
|
5
2
|
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
from endoreg_db.utils import create_mock_examiner_name, get_examiner_hash
|
|
6
|
+
|
|
6
7
|
from ....utils import DJANGO_NAME_SALT
|
|
8
|
+
from ..person import Person
|
|
9
|
+
|
|
7
10
|
if TYPE_CHECKING:
|
|
8
11
|
from endoreg_db.models import administration
|
|
12
|
+
|
|
13
|
+
|
|
9
14
|
class Examiner(Person):
|
|
10
|
-
center = models.ForeignKey(
|
|
11
|
-
"Center", on_delete=models.CASCADE, blank=True, null=True
|
|
12
|
-
)
|
|
15
|
+
center = models.ForeignKey("Center", on_delete=models.CASCADE, blank=True, null=True)
|
|
13
16
|
hash = models.CharField(max_length=255, unique=True)
|
|
14
17
|
|
|
15
18
|
if TYPE_CHECKING:
|
|
16
|
-
center: "administration.Center"
|
|
17
|
-
portal_user_info: "administration.PortalUserInfo"
|
|
19
|
+
center: models.ForeignKey["administration.Center|None"]
|
|
20
|
+
portal_user_info: models.OneToOneField["administration.PortalUserInfo"]
|
|
18
21
|
|
|
19
22
|
def __str__(self):
|
|
20
23
|
return self.first_name + " " + self.last_name
|
|
@@ -28,11 +31,10 @@ class Examiner(Person):
|
|
|
28
31
|
|
|
29
32
|
if isinstance(first_name, FirstName):
|
|
30
33
|
first_name = str(first_name.name)
|
|
31
|
-
|
|
34
|
+
|
|
32
35
|
if isinstance(last_name, LastName):
|
|
33
36
|
last_name = str(last_name.name)
|
|
34
37
|
|
|
35
|
-
|
|
36
38
|
real_hash = get_examiner_hash(
|
|
37
39
|
first_name=first_name,
|
|
38
40
|
last_name=last_name,
|
|
@@ -42,7 +44,7 @@ class Examiner(Person):
|
|
|
42
44
|
|
|
43
45
|
if substitute_names:
|
|
44
46
|
name_tuple = create_mock_examiner_name()
|
|
45
|
-
|
|
47
|
+
|
|
46
48
|
else:
|
|
47
49
|
name_tuple = (first_name, last_name)
|
|
48
50
|
defaults = dict(
|