endoreg-db 0.6.4__py3-none-any.whl → 0.8.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +26 -26
- 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 +12 -0
- endoreg_db/data/ai_model/data.yaml +1 -1
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/center/data.yaml +13 -12
- endoreg_db/data/center_shift/ukw.yaml +9 -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/endoscopy_processor/data.yaml +3 -0
- endoreg_db/data/event/cardiology.yaml +0 -13
- endoreg_db/data/examination/examinations/data.yaml +14 -9
- endoreg_db/data/examination_indication/endoscopy.yaml +30 -30
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +11 -11
- 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 +3 -46
- 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_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
- 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_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
- endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
- 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_colonoscopy.yaml +8 -3
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
- endoreg_db/data/finding_type/data.yaml +23 -10
- endoreg_db/data/gender/data.yaml +8 -1
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/misc.yaml +43 -0
- endoreg_db/data/medication/anticoagulation.yaml +5 -5
- endoreg_db/data/medication/tah.yaml +5 -5
- endoreg_db/data/medication_intake_time/base.yaml +4 -4
- endoreg_db/data/names_first/first_names.yaml +3 -0
- endoreg_db/data/pdf_type/data.yaml +26 -2
- 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-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 +6 -6
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +9 -6
- endoreg_db/data/requirement/disease_hepatology.yaml +1 -1
- endoreg_db/data/requirement/disease_misc.yaml +3 -3
- endoreg_db/data/requirement/disease_renal.yaml +18 -2
- endoreg_db/data/requirement/{colonoscopy_indications.yaml → endoscopy_bleeding_risk.yaml} +6 -3
- endoreg_db/data/requirement/event_cardiology.yaml +17 -17
- 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 +352 -31
- 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 +36 -35
- endoreg_db/data/requirement_operator/model_operators.yaml +13 -7
- 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 +42 -2
- endoreg_db/data/requirement_type/requirement_types.yaml +82 -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/exceptions.py +19 -0
- endoreg_db/forms/patient_finding_intervention_form.py +4 -5
- endoreg_db/forms/patient_form.py +7 -6
- 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 +359 -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_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 +422 -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 +2 -7
- endoreg_db/management/commands/load_base_db_data.py +1 -0
- endoreg_db/management/commands/load_endoscope_data.py +2 -2
- endoreg_db/management/commands/load_examination_indication_data.py +2 -3
- endoreg_db/management/commands/load_finding_data.py +49 -92
- 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_name_data.py +37 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_requirement_data.py +30 -6
- 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/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/migrations/0001_initial.py +625 -813
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/models/__init__.py +270 -307
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
- 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 +6 -1
- 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}/case_template.py +3 -3
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
- endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
- endoreg_db/models/{center → administration/center}/__init__.py +3 -1
- endoreg_db/models/administration/center/center.py +61 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
- 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/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 +9 -0
- endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
- 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 +45 -74
- 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/{annotation → label}/video_segmentation_labelset.py +7 -0
- endoreg_db/models/media/__init__.py +14 -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 +608 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/video/__init__.py +4 -0
- endoreg_db/models/media/video/create_from_file.py +336 -0
- endoreg_db/models/media/video/pipe_1.py +195 -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 +680 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +348 -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 +129 -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 +166 -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_meta.py +11 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
- endoreg_db/models/{disease.py → medical/disease.py} +60 -52
- endoreg_db/models/{event.py → medical/event.py} +31 -54
- endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/{examination → medical/examination}/examination_indication.py +64 -35
- endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
- endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
- endoreg_db/models/{examination → medical/examination}/examination_type.py +1 -7
- 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/{finding → medical/finding}/finding_intervention.py +2 -10
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
- endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
- endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
- endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
- endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
- 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/{persons → medical}/patient/patient_examination_indication.py +21 -9
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/{risk → medical/risk}/risk_type.py +0 -4
- endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +193 -0
- endoreg_db/models/metadata/model_meta_logic.py +236 -0
- endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +643 -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 +17 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
- endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
- endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
- endoreg_db/models/{persons → other}/gender.py +8 -3
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +10 -2
- endoreg_db/models/other/resource.py +6 -2
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +13 -2
- endoreg_db/models/{unit.py → other/unit.py} +16 -6
- endoreg_db/models/other/waste.py +10 -3
- endoreg_db/models/requirement/requirement.py +556 -114
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +4 -132
- 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 +80 -87
- endoreg_db/models/requirement/requirement_operator.py +132 -14
- endoreg_db/models/requirement/requirement_set.py +181 -21
- 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/models/video_metadata.py +66 -0
- endoreg_db/models/video_processing.py +153 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +147 -10
- endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
- endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
- 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 +66 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +152 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/misc/vop_patient_data.py +120 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +241 -0
- endoreg_db/services/lookup_store.py +122 -0
- endoreg_db/services/ollama_api_docs.py +1528 -0
- endoreg_db/services/pdf_import.py +993 -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 +915 -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/urls/__init__.py +72 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +44 -0
- endoreg_db/urls/media.py +32 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/pdf.py +0 -0
- endoreg_db/urls/report.py +78 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +36 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +119 -0
- endoreg_db/urls.py +6 -283
- endoreg_db/utils/__init__.py +66 -57
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
- endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
- endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
- endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/dataloader.py +50 -12
- endoreg_db/utils/dates.py +21 -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/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 +2 -0
- endoreg_db/utils/paths.py +100 -82
- 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/db_config.py +1 -1
- 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/translation.py +27 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +19 -6
- endoreg_db/utils/video/extract_frames.py +37 -70
- endoreg_db/utils/video/ffmpeg_wrapper.py +772 -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 +282 -2
- 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 +63 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/{views.py → auth/keycloak.py} +19 -13
- 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 +9 -0
- endoreg_db/views/media/pdf_media.py +386 -0
- endoreg_db/views/media/video_media.py +272 -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/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +11 -0
- endoreg_db/views/pdf/pdf_media.py +239 -0
- endoreg_db/views/pdf/pdf_stream_views.py +127 -0
- endoreg_db/views/pdf/reimport.py +151 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +483 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +72 -0
- endoreg_db/views/video/correction.py +672 -0
- endoreg_db/views/video/media/__init__.py +23 -0
- endoreg_db/views/video/media/task_status.py +49 -0
- endoreg_db/views/video/media/video_analyze.py +52 -0
- endoreg_db/views/video/media/video_apply_mask.py +48 -0
- endoreg_db/views/video/media/video_correction.py +21 -0
- endoreg_db/views/video/media/video_download_processed.py +58 -0
- endoreg_db/views/video/media/video_media.py +158 -0
- endoreg_db/views/video/media/video_meta.py +29 -0
- endoreg_db/views/video/media/video_processing_history.py +24 -0
- endoreg_db/views/video/media/video_remove_frames.py +48 -0
- endoreg_db/views/video/media/video_reprocess.py +40 -0
- endoreg_db/views/video/reimport.py +192 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
- endoreg_db/views/video/video_examination_viewset.py +329 -0
- endoreg_db/views/video/video_stream.py +188 -0
- endoreg_db-0.8.1.dist-info/METADATA +384 -0
- endoreg_db-0.8.1.dist-info/RECORD +789 -0
- endoreg_db/data/agl_service/data.yaml +0 -19
- endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
- endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
- endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
- endoreg_db/management/commands/_load_model_template.py +0 -41
- endoreg_db/management/commands/delete_all.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/load_active_model_data.py +0 -45
- endoreg_db/management/commands/load_g_play_data.py +0 -113
- endoreg_db/management/commands/load_logging_data.py +0 -39
- endoreg_db/management/commands/load_lx_data.py +0 -64
- 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_intake_time_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_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
- endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
- endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
- endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
- endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
- endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
- endoreg_db/migrations/0009_requirementoperator_requirementsettype_and_more.py +0 -154
- endoreg_db/models/ai_model/active_model.py +0 -9
- endoreg_db/models/ai_model/ai_model.py +0 -90
- endoreg_db/models/ai_model/lightning/__init__.py +0 -3
- endoreg_db/models/ai_model/lightning/predict.py +0 -172
- endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
- endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
- endoreg_db/models/ai_model/model_meta.py +0 -240
- endoreg_db/models/annotation/__init__.py +0 -32
- endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
- endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
- endoreg_db/models/annotation/image_classification.py +0 -86
- endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
- endoreg_db/models/case/__init__.py +0 -1
- endoreg_db/models/case/case.py +0 -34
- endoreg_db/models/center/center.py +0 -51
- endoreg_db/models/center/center_product.py +0 -33
- endoreg_db/models/center/center_waste.py +0 -16
- endoreg_db/models/data_file/__init__.py +0 -39
- endoreg_db/models/data_file/base_classes/__init__.py +0 -7
- endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -98
- endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -127
- endoreg_db/models/data_file/base_classes/abstract_video.py +0 -806
- endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
- endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
- endoreg_db/models/data_file/base_classes/utils.py +0 -58
- endoreg_db/models/data_file/frame.py +0 -29
- endoreg_db/models/data_file/import_classes/__init__.py +0 -18
- 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 -254
- endoreg_db/models/data_file/import_classes/raw_video.py +0 -290
- endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
- endoreg_db/models/data_file/metadata/video_meta.py +0 -199
- endoreg_db/models/data_file/report_file.py +0 -56
- endoreg_db/models/data_file/video/__init__.py +0 -11
- endoreg_db/models/data_file/video/import_meta.py +0 -25
- endoreg_db/models/data_file/video/video.py +0 -196
- endoreg_db/models/data_file/video_segment.py +0 -214
- endoreg_db/models/examination/examination.py +0 -67
- endoreg_db/models/finding/__init__.py +0 -11
- endoreg_db/models/finding/finding.py +0 -75
- endoreg_db/models/finding/finding_location_classification.py +0 -94
- endoreg_db/models/finding/finding_morphology_classification.py +0 -89
- endoreg_db/models/finding/finding_type.py +0 -22
- endoreg_db/models/hardware/__init__.py +0 -2
- endoreg_db/models/information_source.py +0 -65
- endoreg_db/models/laboratory/__init__.py +0 -1
- endoreg_db/models/laboratory/lab_value.py +0 -162
- endoreg_db/models/logging/__init__.py +0 -11
- 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 -27
- endoreg_db/models/lx/__init__.py +0 -4
- endoreg_db/models/lx/client.py +0 -57
- endoreg_db/models/lx/identity.py +0 -34
- endoreg_db/models/lx/permission.py +0 -18
- endoreg_db/models/lx/user.py +0 -16
- endoreg_db/models/network/__init__.py +0 -9
- endoreg_db/models/network/agl_service.py +0 -38
- endoreg_db/models/network/network_device.py +0 -58
- endoreg_db/models/network/network_device_type.py +0 -23
- endoreg_db/models/other/distribution.py +0 -5
- endoreg_db/models/patient/__init__.py +0 -24
- endoreg_db/models/patient/patient_examination.py +0 -182
- endoreg_db/models/patient/patient_finding.py +0 -143
- endoreg_db/models/patient/patient_finding_location.py +0 -120
- endoreg_db/models/patient/patient_finding_morphology.py +0 -166
- endoreg_db/models/permissions/__init__.py +0 -44
- endoreg_db/models/persons/__init__.py +0 -34
- endoreg_db/models/persons/examiner/__init__.py +0 -2
- endoreg_db/models/persons/examiner/examiner.py +0 -60
- endoreg_db/models/persons/examiner/examiner_type.py +0 -2
- endoreg_db/models/persons/patient/__init__.py +0 -8
- endoreg_db/models/persons/patient/patient.py +0 -389
- endoreg_db/models/persons/patient/patient_disease.py +0 -22
- endoreg_db/models/persons/patient/patient_event.py +0 -52
- endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
- endoreg_db/models/persons/patient/patient_medication.py +0 -59
- endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
- endoreg_db/models/persons/portal_user_information.py +0 -27
- endoreg_db/models/prediction/__init__.py +0 -8
- endoreg_db/models/prediction/image_classification.py +0 -51
- endoreg_db/models/prediction/video_prediction_meta.py +0 -306
- endoreg_db/models/product/product.py +0 -110
- endoreg_db/models/product/product_group.py +0 -27
- endoreg_db/models/product/product_material.py +0 -28
- endoreg_db/models/questionnaires/__init__.py +0 -114
- endoreg_db/models/quiz/__init__.py +0 -9
- endoreg_db/models/quiz/quiz_answer.py +0 -41
- endoreg_db/models/quiz/quiz_question.py +0 -54
- 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 -14
- endoreg_db/serializers/center.py +0 -11
- endoreg_db/serializers/examination.py +0 -33
- endoreg_db/serializers/frame.py +0 -9
- endoreg_db/serializers/hardware.py +0 -21
- endoreg_db/serializers/label.py +0 -22
- endoreg_db/serializers/patient.py +0 -33
- endoreg_db/serializers/prediction.py +0 -10
- endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
- endoreg_db/serializers/report_file.py +0 -7
- endoreg_db/serializers/video.py +0 -20
- endoreg_db/serializers/video_segmentation.py +0 -574
- endoreg_db/tests.py +0 -3
- endoreg_db/utils/legacy_ocr.py +0 -201
- endoreg_db/utils/video/transcode_videofile.py +0 -111
- endoreg_db/views/patient_views.py +0 -90
- endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
- endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
- endoreg_db/views/raw_video_meta_validation_views.py +0 -148
- endoreg_db/views/report_views.py +0 -96
- endoreg_db/views/video_segmentation_views.py +0 -166
- endoreg_db-0.6.4.dist-info/METADATA +0 -161
- endoreg_db-0.6.4.dist-info/RECORD +0 -470
- /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
- /endoreg_db/{queries/get/prediction.py → 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/models/{case_template → administration/case/case_template}/__init__.py +0 -0
- /endoreg_db/models/{persons → administration/person}/person.py +0 -0
- /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
- /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
- /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
- /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/__init__.py +0 -0
- /endoreg_db/models/{risk → medical/risk}/risk.py +0 -0
- /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
- /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
- /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
- /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.6.4.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# AI
|
|
2
|
+
from .ai import (
|
|
3
|
+
AiModel,
|
|
4
|
+
ActiveModel,
|
|
5
|
+
ModelType,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
# Case
|
|
9
|
+
from .case import (
|
|
10
|
+
Case,
|
|
11
|
+
CaseTemplate,
|
|
12
|
+
CaseTemplateRule,
|
|
13
|
+
CaseTemplateRuleType,
|
|
14
|
+
CaseTemplateRuleValue,
|
|
15
|
+
CaseTemplateRuleValueType,
|
|
16
|
+
CaseTemplateType,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
# Center
|
|
20
|
+
from .center import (
|
|
21
|
+
Center,
|
|
22
|
+
CenterProduct,
|
|
23
|
+
CenterResource,
|
|
24
|
+
CenterWaste,
|
|
25
|
+
CenterShift,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
#TODO Review module
|
|
30
|
+
# from .permissions import ()
|
|
31
|
+
|
|
32
|
+
# Person
|
|
33
|
+
from .person import (
|
|
34
|
+
Person,
|
|
35
|
+
Examiner,
|
|
36
|
+
Patient,
|
|
37
|
+
PortalUserInfo,
|
|
38
|
+
FirstName,
|
|
39
|
+
LastName,
|
|
40
|
+
Profession,
|
|
41
|
+
Employee,
|
|
42
|
+
EmployeeType,
|
|
43
|
+
EmployeeQualification,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# Product
|
|
47
|
+
from .product import (
|
|
48
|
+
Product,
|
|
49
|
+
ProductMaterial,
|
|
50
|
+
ProductGroup,
|
|
51
|
+
ReferenceProduct,
|
|
52
|
+
ProductWeight,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
from .qualification import (
|
|
56
|
+
Qualification,
|
|
57
|
+
QualificationType,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
from .shift import (
|
|
61
|
+
Shift,
|
|
62
|
+
ShiftType,
|
|
63
|
+
ScheduledDays,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
__all__ = [
|
|
67
|
+
# AI
|
|
68
|
+
"AiModel",
|
|
69
|
+
"ActiveModel",
|
|
70
|
+
"ModelType",
|
|
71
|
+
|
|
72
|
+
# Case
|
|
73
|
+
"Case",
|
|
74
|
+
"CaseTemplate",
|
|
75
|
+
"CaseTemplateRule",
|
|
76
|
+
"CaseTemplateRuleType",
|
|
77
|
+
"CaseTemplateRuleValue",
|
|
78
|
+
"CaseTemplateRuleValueType",
|
|
79
|
+
"CaseTemplateType",
|
|
80
|
+
|
|
81
|
+
# Center
|
|
82
|
+
"Center",
|
|
83
|
+
"CenterProduct",
|
|
84
|
+
"CenterResource",
|
|
85
|
+
"CenterWaste",
|
|
86
|
+
"CenterShift",
|
|
87
|
+
|
|
88
|
+
# Person
|
|
89
|
+
"Person",
|
|
90
|
+
"Patient",
|
|
91
|
+
"Examiner",
|
|
92
|
+
"PortalUserInfo",
|
|
93
|
+
"FirstName",
|
|
94
|
+
"LastName",
|
|
95
|
+
"Profession",
|
|
96
|
+
"Employee",
|
|
97
|
+
"EmployeeType",
|
|
98
|
+
"EmployeeQualification",
|
|
99
|
+
|
|
100
|
+
# Product
|
|
101
|
+
'Product',
|
|
102
|
+
'ProductMaterial',
|
|
103
|
+
'ProductGroup',
|
|
104
|
+
'ReferenceProduct',
|
|
105
|
+
'ProductWeight',
|
|
106
|
+
|
|
107
|
+
# Qualification
|
|
108
|
+
"Qualification",
|
|
109
|
+
"QualificationType",
|
|
110
|
+
|
|
111
|
+
# Shift
|
|
112
|
+
"Shift",
|
|
113
|
+
"ShiftType",
|
|
114
|
+
"ScheduledDays",
|
|
115
|
+
]
|
|
116
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING, Optional
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from endoreg_db.models.metadata import ModelMeta
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ActiveModelManager(models.Manager):
|
|
9
|
+
def get_by_natural_key(self, name):
|
|
10
|
+
return self.get(name=name)
|
|
11
|
+
|
|
12
|
+
class ActiveModel(models.Model):
|
|
13
|
+
"""
|
|
14
|
+
ActiveModel represents an active instance of a model within the application.
|
|
15
|
+
Attributes:
|
|
16
|
+
name (str): A unique identifier for the active model.
|
|
17
|
+
model_meta (ModelMeta, optional): A reference to the metadata of the model. This field acts as a ForeignKey
|
|
18
|
+
to the ModelMeta model and can be null.
|
|
19
|
+
Notes:
|
|
20
|
+
- The model_meta attribute is configured with on_delete=models.SET_NULL, meaning that if the related ModelMeta
|
|
21
|
+
record is deleted, model_meta will be set to null.
|
|
22
|
+
- Type hints for model_meta are provided under a TYPE_CHECKING conditional import to avoid circular dependencies,
|
|
23
|
+
importing ModelMeta only when type checking is performed.
|
|
24
|
+
Managers:
|
|
25
|
+
objects (ActiveModelManager): Custom manager providing specialized query capabilities for ActiveModel instances.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
name = models.CharField(max_length=255, unique=True)
|
|
29
|
+
|
|
30
|
+
model_meta:Optional[models.ForeignKey["ModelMeta"]] = models.ForeignKey(
|
|
31
|
+
'ModelMeta', on_delete=models.SET_NULL,
|
|
32
|
+
blank=True, null=True
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
objects = ActiveModelManager()
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Django model for AI models.
|
|
3
|
+
"""
|
|
4
|
+
from importlib import metadata
|
|
5
|
+
from django.db import models
|
|
6
|
+
from icecream import ic
|
|
7
|
+
from typing import TYPE_CHECKING, Optional, Union
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from .model_type import ModelType
|
|
11
|
+
from ...metadata import ModelMeta
|
|
12
|
+
from ...label import VideoSegmentationLabelSet
|
|
13
|
+
# Forward reference AiModel for use in type hints within the class itself
|
|
14
|
+
from typing import ForwardRef
|
|
15
|
+
AiModelRef = ForwardRef("'AiModel'")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AiModelManager(models.Manager):
|
|
19
|
+
"""
|
|
20
|
+
Manager for AI models with custom query methods.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def get_by_natural_key(self, name: str):
|
|
24
|
+
"""
|
|
25
|
+
Retrieves the AiModel instance with the specified unique name.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
name: The unique identifier of the AiModel to retrieve.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
The AiModel instance matching the given name.
|
|
32
|
+
|
|
33
|
+
Raises:
|
|
34
|
+
AiModel.DoesNotExist: If no AiModel with the specified name exists.
|
|
35
|
+
"""
|
|
36
|
+
return self.get(name=name)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AiModel(models.Model):
|
|
40
|
+
"""
|
|
41
|
+
Represents a generic AI model that encapsulates high-level metadata about the model,
|
|
42
|
+
including names (default, German, and English), a description, categorization details,
|
|
43
|
+
and associated label sets and meta information.
|
|
44
|
+
|
|
45
|
+
name (str): Unique name of the AI model.
|
|
46
|
+
description (str): Optional detailed description of the AI model.
|
|
47
|
+
model_type (str): Optional type/category of the AI model.
|
|
48
|
+
model_subtype (str): Optional subtype within the broader model type.
|
|
49
|
+
video_segmentation_labelset (VideoSegmentationLabelSet): Optional associated label set for video segmentation tasks.
|
|
50
|
+
active_meta (ModelMeta): Optional reference to the currently active ModelMeta instance associated with the model.
|
|
51
|
+
"""
|
|
52
|
+
objects = AiModelManager()
|
|
53
|
+
|
|
54
|
+
name = models.CharField(max_length=255, unique=True)
|
|
55
|
+
|
|
56
|
+
description = models.TextField(blank=True, null=True)
|
|
57
|
+
model_type:Optional[models.ForeignKey[Union["ModelType", None]]] = models.ForeignKey(
|
|
58
|
+
"ModelType",
|
|
59
|
+
on_delete=models.CASCADE,
|
|
60
|
+
related_name="ai_models",
|
|
61
|
+
blank=True,
|
|
62
|
+
null=True,
|
|
63
|
+
)
|
|
64
|
+
model_subtype = models.CharField(max_length=255, blank=True, null=True)
|
|
65
|
+
video_segmentation_labelset:Optional[models.ForeignKey[Union["VideoSegmentationLabelSet", None]]] = models.ForeignKey(
|
|
66
|
+
"VideoSegmentationLabelSet",
|
|
67
|
+
on_delete=models.CASCADE,
|
|
68
|
+
related_name="ai_models",
|
|
69
|
+
blank=True,
|
|
70
|
+
null=True,
|
|
71
|
+
)
|
|
72
|
+
active_meta:Optional[models.ForeignKey[Union["ModelMeta", None]]] = models.ForeignKey(
|
|
73
|
+
"ModelMeta",
|
|
74
|
+
on_delete=models.SET_NULL,
|
|
75
|
+
related_name="active_model",
|
|
76
|
+
blank=True,
|
|
77
|
+
null=True,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if TYPE_CHECKING:
|
|
81
|
+
metadata_versions: models.QuerySet["ModelMeta"]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_version(self, version: int) -> "ModelMeta":
|
|
85
|
+
"""
|
|
86
|
+
Retrieves the ModelMeta instance for the specified version.
|
|
87
|
+
|
|
88
|
+
If the active_meta matches the requested version, it is returned. Otherwise, searches related metadata_versions for a matching version. Raises ValueError if no matching metadata is found.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
version: The version number of the desired ModelMeta.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
The ModelMeta instance corresponding to the specified version.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
ValueError: If no ModelMeta with the given version exists.
|
|
98
|
+
"""
|
|
99
|
+
if self.active_meta is not None and self.active_meta.version == version:
|
|
100
|
+
return self.active_meta
|
|
101
|
+
|
|
102
|
+
# Get the model metadata with the given version
|
|
103
|
+
model_meta = self.metadata_versions.filter(version=version).first()
|
|
104
|
+
if model_meta is not None:
|
|
105
|
+
return model_meta
|
|
106
|
+
|
|
107
|
+
raise ValueError(f"No model metadata found for version {version}.")
|
|
108
|
+
|
|
109
|
+
def get_latest_version(self) -> "ModelMeta":
|
|
110
|
+
"""
|
|
111
|
+
Get the model_metadata object from metadata_versions with the highest version number.
|
|
112
|
+
"""
|
|
113
|
+
if self.active_meta is not None:
|
|
114
|
+
return self.active_meta
|
|
115
|
+
|
|
116
|
+
# Get the latest version of the model metadata
|
|
117
|
+
latest_version = self.metadata_versions.order_by("-version").first()
|
|
118
|
+
if latest_version is not None:
|
|
119
|
+
return latest_version
|
|
120
|
+
|
|
121
|
+
raise ValueError("No model metadata found for this model.")
|
|
122
|
+
|
|
123
|
+
@classmethod
|
|
124
|
+
def set_active_model_meta(cls, model_name: str, meta_name: str, meta_version: int):
|
|
125
|
+
"""
|
|
126
|
+
Sets the active metadata version for the specified AI model.
|
|
127
|
+
|
|
128
|
+
Updates the `active_meta` field of the AiModel identified by `model_name` to the ModelMeta instance matching `meta_name` and `meta_version`.
|
|
129
|
+
"""
|
|
130
|
+
from ...metadata import ModelMeta
|
|
131
|
+
|
|
132
|
+
model = cls.objects.get(name=model_name)
|
|
133
|
+
assert model is not None, "Model not found"
|
|
134
|
+
|
|
135
|
+
ic(f"Getting model meta for {model_name} {meta_name} {meta_version}")
|
|
136
|
+
|
|
137
|
+
model_meta = ModelMeta.objects.get(
|
|
138
|
+
name=meta_name, model=model, version=meta_version
|
|
139
|
+
)
|
|
140
|
+
assert model_meta is not None, "ModelMeta not found"
|
|
141
|
+
|
|
142
|
+
model.active_meta = model_meta
|
|
143
|
+
model.save()
|
|
144
|
+
|
|
145
|
+
ic(
|
|
146
|
+
f"Set active model meta for {model_name} to {meta_name} version {meta_version}"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def natural_key(self):
|
|
150
|
+
"""
|
|
151
|
+
Return the natural key for this model.
|
|
152
|
+
"""
|
|
153
|
+
return (self.name,)
|
|
154
|
+
|
|
155
|
+
def __str__(self):
|
|
156
|
+
return str(self.name)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
from
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
3
|
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from .ai_model import AiModel
|
|
4
6
|
|
|
5
7
|
class ModelTypeManager(models.Manager):
|
|
6
8
|
"""
|
|
@@ -27,6 +29,9 @@ class ModelType(models.Model):
|
|
|
27
29
|
|
|
28
30
|
objects = ModelTypeManager()
|
|
29
31
|
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
ai_models: models.QuerySet["AiModel"]
|
|
34
|
+
|
|
30
35
|
def natural_key(self):
|
|
31
36
|
"""Return the natural key for this model type"""
|
|
32
37
|
return (self.name,)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .case import Case
|
|
2
|
+
from .case_template import (
|
|
3
|
+
CaseTemplate,
|
|
4
|
+
CaseTemplateRule,
|
|
5
|
+
CaseTemplateRuleType,
|
|
6
|
+
CaseTemplateRuleValue,
|
|
7
|
+
CaseTemplateRuleValueType,
|
|
8
|
+
CaseTemplateType,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"Case",
|
|
13
|
+
"CaseTemplate",
|
|
14
|
+
"CaseTemplateRule",
|
|
15
|
+
"CaseTemplateRuleType",
|
|
16
|
+
"CaseTemplateRuleValue",
|
|
17
|
+
"CaseTemplateRuleValueType",
|
|
18
|
+
"CaseTemplateType",
|
|
19
|
+
]
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from ..person import Patient
|
|
6
|
+
from ...medical.patient.patient_examination import PatientExamination
|
|
7
|
+
from django.utils import timezone
|
|
8
|
+
|
|
9
|
+
class Case(models.Model):
|
|
10
|
+
"""
|
|
11
|
+
Represents a clinical case, linking a patient to one or more examinations over a specific period.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
patient (Patient): The patient associated with this case.
|
|
15
|
+
patient_examinations (QuerySet[PatientExamination]): Examinations included in this case.
|
|
16
|
+
hash (str): An optional hash value for the case.
|
|
17
|
+
start_date (datetime): The start date and time of the case.
|
|
18
|
+
end_date (datetime): The end date and time of the case (optional).
|
|
19
|
+
is_active (bool): Indicates if the case is currently active.
|
|
20
|
+
is_closed (bool): Indicates if the case has been closed.
|
|
21
|
+
is_deleted (bool): Indicates if the case is marked as deleted.
|
|
22
|
+
created_at (datetime): Timestamp of case creation.
|
|
23
|
+
updated_at (datetime): Timestamp of last case update.
|
|
24
|
+
"""
|
|
25
|
+
patient = models.ForeignKey(
|
|
26
|
+
'Patient',
|
|
27
|
+
on_delete=models.CASCADE,
|
|
28
|
+
related_name='cases',
|
|
29
|
+
help_text="The patient associated with this case.",
|
|
30
|
+
db_index=True
|
|
31
|
+
)
|
|
32
|
+
patient_examinations = models.ManyToManyField(
|
|
33
|
+
'PatientExamination',
|
|
34
|
+
related_name='cases',
|
|
35
|
+
help_text="The examinations included in this case."
|
|
36
|
+
)
|
|
37
|
+
hash = models.CharField(
|
|
38
|
+
max_length=255,
|
|
39
|
+
blank=True,
|
|
40
|
+
null=True,
|
|
41
|
+
help_text="An optional hash value associated with the case."
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
start_date = models.DateTimeField(
|
|
45
|
+
help_text="The start date and time of the case.",
|
|
46
|
+
db_index=True
|
|
47
|
+
)
|
|
48
|
+
end_date = models.DateTimeField(
|
|
49
|
+
null=True,
|
|
50
|
+
blank=True,
|
|
51
|
+
help_text="The end date and time of the case (optional)."
|
|
52
|
+
)
|
|
53
|
+
is_active = models.BooleanField(
|
|
54
|
+
default=True,
|
|
55
|
+
help_text="Flag indicating if the case is currently active.",
|
|
56
|
+
db_index=True
|
|
57
|
+
)
|
|
58
|
+
is_closed = models.BooleanField(
|
|
59
|
+
default=False,
|
|
60
|
+
help_text="Flag indicating if the case has been closed.",
|
|
61
|
+
db_index=True
|
|
62
|
+
)
|
|
63
|
+
is_deleted = models.BooleanField(
|
|
64
|
+
default=False,
|
|
65
|
+
help_text="Flag indicating if the case is marked as deleted.",
|
|
66
|
+
db_index=True
|
|
67
|
+
)
|
|
68
|
+
created_at = models.DateTimeField(
|
|
69
|
+
auto_now_add=True,
|
|
70
|
+
help_text="The date and time the case was created."
|
|
71
|
+
)
|
|
72
|
+
updated_at = models.DateTimeField(
|
|
73
|
+
auto_now=True,
|
|
74
|
+
help_text="The date and time the case was last updated."
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if TYPE_CHECKING:
|
|
78
|
+
patient: "Patient"
|
|
79
|
+
patient_examinations: models.QuerySet["PatientExamination"]
|
|
80
|
+
|
|
81
|
+
class Meta:
|
|
82
|
+
ordering = ['-start_date', 'patient']
|
|
83
|
+
verbose_name = "Case"
|
|
84
|
+
verbose_name_plural = "Cases"
|
|
85
|
+
|
|
86
|
+
def __str__(self):
|
|
87
|
+
string_representation = f"Case {self.pk} ({self.patient})"
|
|
88
|
+
if self.start_date:
|
|
89
|
+
string_representation += f" - {self.start_date.strftime('%Y-%m-%d')}"
|
|
90
|
+
if self.end_date:
|
|
91
|
+
string_representation += f" - {self.end_date.strftime('%Y-%m-%d')}"
|
|
92
|
+
return string_representation
|
|
93
|
+
|
|
94
|
+
def close(self, end_date=None):
|
|
95
|
+
"""Close this case with optional end date."""
|
|
96
|
+
self.is_closed = True
|
|
97
|
+
self.is_active = False
|
|
98
|
+
if end_date:
|
|
99
|
+
self.end_date = end_date
|
|
100
|
+
elif not self.end_date:
|
|
101
|
+
self.end_date = timezone.now()
|
|
102
|
+
self.save()
|
|
103
|
+
|
|
104
|
+
def reopen(self):
|
|
105
|
+
"""Reopen this case if it was closed."""
|
|
106
|
+
self.is_closed = False
|
|
107
|
+
self.is_active = True
|
|
108
|
+
self.save()
|
|
109
|
+
|
|
110
|
+
def mark_as_deleted(self):
|
|
111
|
+
"""Mark this case as deleted."""
|
|
112
|
+
self.is_deleted = True
|
|
113
|
+
self.is_active = False
|
|
114
|
+
self.save()
|
|
@@ -46,7 +46,7 @@ class CaseTemplate(models.Model):
|
|
|
46
46
|
Returns:
|
|
47
47
|
str: The name of the case template.
|
|
48
48
|
"""
|
|
49
|
-
return self.name
|
|
49
|
+
return str(self.name)
|
|
50
50
|
|
|
51
51
|
def get_rules(self):
|
|
52
52
|
"""
|
|
@@ -96,7 +96,7 @@ class CaseTemplate(models.Model):
|
|
|
96
96
|
Raises:
|
|
97
97
|
ValueError: If multiple such rules exist.
|
|
98
98
|
"""
|
|
99
|
-
from
|
|
99
|
+
from .case_template_rule import CaseTemplateRule
|
|
100
100
|
create_patient_rules = self.rules.filter(rule_type__name="create-object", target_model="Patient")
|
|
101
101
|
if len(create_patient_rules) > 1:
|
|
102
102
|
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'Patient'.")
|
|
@@ -114,7 +114,7 @@ class CaseTemplate(models.Model):
|
|
|
114
114
|
Raises:
|
|
115
115
|
ValueError: If multiple such rules exist.
|
|
116
116
|
"""
|
|
117
|
-
from
|
|
117
|
+
from .case_template_rule import CaseTemplateRule
|
|
118
118
|
create_patient_medication_schedule_rules = self.rules.filter(rule_type__name="create-object", target_model="PatientMedicationSchedule")
|
|
119
119
|
if len(create_patient_medication_schedule_rules) > 1:
|
|
120
120
|
raise ValueError("There can be at most one rule with the rule_type__name 'create-object' and target_model__name 'PatientMedicationSchedule'.")
|
|
@@ -10,13 +10,9 @@ class CaseTemplateRuleType(models.Model):
|
|
|
10
10
|
|
|
11
11
|
Attributes:
|
|
12
12
|
name (str): The name of the rule type.
|
|
13
|
-
name_de (str): The German name of the rule type.
|
|
14
|
-
name_en (str): The English name of the rule type.
|
|
15
13
|
description (str): A description of the rule type.
|
|
16
14
|
"""
|
|
17
15
|
name = models.CharField(max_length=255)
|
|
18
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
19
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
20
16
|
description = models.TextField(blank=True, null=True)
|
|
21
17
|
|
|
22
18
|
objects = CaseTemplateRuleTypeManager()
|
|
@@ -25,7 +21,7 @@ class CaseTemplateRuleType(models.Model):
|
|
|
25
21
|
return (self.name,)
|
|
26
22
|
|
|
27
23
|
def __str__(self):
|
|
28
|
-
return self.name
|
|
24
|
+
return str(self.name)
|
|
29
25
|
|
|
30
26
|
class CaseTemplateRuleManager(models.Manager):
|
|
31
27
|
def get_by_natural_key(self, name):
|
|
@@ -52,8 +48,6 @@ class CaseTemplateRule(models.Model):
|
|
|
52
48
|
Attributes:
|
|
53
49
|
name (str): The name of the case template rule.
|
|
54
50
|
description (str): A description of the case template rule.
|
|
55
|
-
name_de (str): The name of the case template rule in German.
|
|
56
|
-
name_en (str): The name of the case template rule in English.
|
|
57
51
|
rule_type (CaseTemplateRuleType): The type of the rule.
|
|
58
52
|
parent_model (str): The model on which the rule is applied.
|
|
59
53
|
target_field (str): The field of the parent model on which the rule is applied.
|
|
@@ -79,8 +73,6 @@ class CaseTemplateRule(models.Model):
|
|
|
79
73
|
|
|
80
74
|
"""
|
|
81
75
|
name = models.CharField(max_length=255)
|
|
82
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
83
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
84
76
|
description = models.TextField(blank=True, null=True)
|
|
85
77
|
rule_type = models.ForeignKey(
|
|
86
78
|
"CaseTemplateRuleType", on_delete=models.CASCADE
|
|
@@ -124,7 +116,7 @@ class CaseTemplateRule(models.Model):
|
|
|
124
116
|
|
|
125
117
|
:return: A string representation of the rule.
|
|
126
118
|
"""
|
|
127
|
-
return self.name
|
|
119
|
+
return str(self.name)
|
|
128
120
|
|
|
129
121
|
def get_rule_type(self):
|
|
130
122
|
"""
|
|
@@ -193,6 +185,7 @@ class CaseTemplateRule(models.Model):
|
|
|
193
185
|
|
|
194
186
|
def chained_rules_has_self_reference(self):
|
|
195
187
|
"""
|
|
188
|
+
:noindex:
|
|
196
189
|
Check if any directly or indirectly chained rules reference this rule, creating a non-terminating loop.
|
|
197
190
|
Return a list containing a tuple (first_rule, self_referencing_rule) for each self-reference.
|
|
198
191
|
first_rule is the most upward rule in the chain that references the rule.
|
endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py
RENAMED
|
@@ -21,8 +21,6 @@ class CaseTemplateRuleValueType(models.Model):
|
|
|
21
21
|
objects = CaseTemplateRuleValueTypeManager()
|
|
22
22
|
|
|
23
23
|
name = models.CharField(max_length=255)
|
|
24
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
25
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
26
24
|
description = models.TextField(blank=True, null=True)
|
|
27
25
|
|
|
28
26
|
distribution_type = models.CharField(max_length=255, choices=DISTRIBUTION_TYPES)
|
|
@@ -32,7 +30,7 @@ class CaseTemplateRuleValueType(models.Model):
|
|
|
32
30
|
return (self.name,)
|
|
33
31
|
|
|
34
32
|
def __str__(self):
|
|
35
|
-
return self.name
|
|
33
|
+
return str(self.name)
|
|
36
34
|
|
|
37
35
|
class CaseTemplateRuleValueManager(models.Manager):
|
|
38
36
|
def get_by_natural_key(self, name):
|
|
@@ -68,7 +66,7 @@ class CaseTemplateRuleValue(models.Model):
|
|
|
68
66
|
"""
|
|
69
67
|
String representation of the object.
|
|
70
68
|
"""
|
|
71
|
-
return self.name
|
|
69
|
+
return str(self.name)
|
|
72
70
|
|
|
73
71
|
def get_value(self):
|
|
74
72
|
"""
|
|
@@ -15,8 +15,6 @@ class CaseTemplateType(models.Model):
|
|
|
15
15
|
|
|
16
16
|
"""
|
|
17
17
|
name = models.CharField(max_length=255)
|
|
18
|
-
name_de = models.CharField(max_length=255, null=True)
|
|
19
|
-
name_en = models.CharField(max_length=255, null=True)
|
|
20
18
|
description = models.TextField(blank=True, null=True)
|
|
21
19
|
|
|
22
20
|
objects = CaseTemplateTypeManager()
|
|
@@ -25,4 +23,4 @@ class CaseTemplateType(models.Model):
|
|
|
25
23
|
return (self.name,)
|
|
26
24
|
|
|
27
25
|
def __str__(self):
|
|
28
|
-
return self.name
|
|
26
|
+
return str(self.name)
|
|
@@ -2,10 +2,12 @@ from .center import Center
|
|
|
2
2
|
from .center_product import CenterProduct
|
|
3
3
|
from .center_resource import CenterResource
|
|
4
4
|
from .center_waste import CenterWaste
|
|
5
|
+
from .center_shift import CenterShift
|
|
5
6
|
|
|
6
7
|
__all__ = [
|
|
7
8
|
'Center',
|
|
8
9
|
'CenterProduct',
|
|
9
10
|
'CenterResource',
|
|
10
|
-
'CenterWaste'
|
|
11
|
+
'CenterWaste',
|
|
12
|
+
'CenterShift',
|
|
11
13
|
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from ...medical import Endoscope, EndoscopyProcessor
|
|
6
|
+
from ...administration import (
|
|
7
|
+
CenterProduct,
|
|
8
|
+
CenterWaste, CenterResource
|
|
9
|
+
)
|
|
10
|
+
from ...media import AnonymExaminationReport, AnonymHistologyReport
|
|
11
|
+
|
|
12
|
+
class CenterManager(models.Manager):
|
|
13
|
+
def get_by_natural_key(self, name) -> "Center":
|
|
14
|
+
return self.get(name=name)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Center(models.Model):
|
|
18
|
+
objects = CenterManager()
|
|
19
|
+
|
|
20
|
+
# import_id = models.IntegerField(primary_key=True)
|
|
21
|
+
name = models.CharField(max_length=255)
|
|
22
|
+
|
|
23
|
+
first_names = models.ManyToManyField(
|
|
24
|
+
to="FirstName",
|
|
25
|
+
related_name="centers",
|
|
26
|
+
)
|
|
27
|
+
last_names = models.ManyToManyField("LastName", related_name="centers")
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
# first_names: RelatedManager["FirstName"]
|
|
31
|
+
# last_names: RelatedManager["LastName"]
|
|
32
|
+
center_products: models.QuerySet["CenterProduct"]
|
|
33
|
+
center_resources: models.QuerySet["CenterResource"]
|
|
34
|
+
center_wastes: models.QuerySet["CenterWaste"]
|
|
35
|
+
endoscopy_processors: models.QuerySet["EndoscopyProcessor"]
|
|
36
|
+
endoscopes: models.QuerySet["Endoscope"]
|
|
37
|
+
anonymexaminationreport_set: models.QuerySet["AnonymExaminationReport"]
|
|
38
|
+
anonymhistologyreport_set: models.QuerySet["AnonymHistologyReport"]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def get_by_name(cls, name):
|
|
43
|
+
return cls.objects.get(name=name)
|
|
44
|
+
|
|
45
|
+
def natural_key(self) -> tuple[str]:
|
|
46
|
+
return (self.name,)
|
|
47
|
+
|
|
48
|
+
def __str__(self) -> str:
|
|
49
|
+
return str(object=self.name)
|
|
50
|
+
|
|
51
|
+
def get_first_names(self):
|
|
52
|
+
return self.first_names.all()
|
|
53
|
+
|
|
54
|
+
def get_last_names(self):
|
|
55
|
+
return self.last_names.all()
|
|
56
|
+
|
|
57
|
+
def get_endoscopes(self):
|
|
58
|
+
"""
|
|
59
|
+
Returns all Endoscope instances associated with this center.
|
|
60
|
+
"""
|
|
61
|
+
return self.endoscopes.all()
|