endoreg-db 0.8.9.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/__init__.py +0 -0
- endoreg_db/_version.py +34 -0
- endoreg_db/admin.py +97 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +17 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/authz/auth.py +78 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +20 -0
- endoreg_db/authz/middleware.py +84 -0
- endoreg_db/authz/permissions.py +138 -0
- endoreg_db/authz/policy.py +224 -0
- endoreg_db/authz/settings.py +64 -0
- endoreg_db/authz/views_auth.py +70 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +99 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +106 -0
- endoreg_db/config/settings/__init__.py +6 -0
- endoreg_db/config/settings/base.py +148 -0
- endoreg_db/config/settings/case_gen.py +32 -0
- endoreg_db/config/settings/dev.py +108 -0
- endoreg_db/config/settings/keycloak.py +177 -0
- endoreg_db/config/settings/prod.py +66 -0
- endoreg_db/config/settings/test.py +72 -0
- endoreg_db/data/__init__.py +135 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +99 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/event_classification/data.yaml +4 -0
- endoreg_db/data/event_classification_choice/data.yaml +9 -0
- endoreg_db/data/examination/examinations/data.yaml +172 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +5 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +359 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +90 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +97 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/00_generic.yaml +35 -0
- endoreg_db/data/finding/00_generic_complication.yaml +9 -0
- endoreg_db/data/finding/01_gastroscopy_baseline.yaml +88 -0
- endoreg_db/data/finding/01_gastroscopy_observation.yaml +113 -0
- endoreg_db/data/finding/02_colonoscopy_baseline.yaml +53 -0
- endoreg_db/data/finding/02_colonoscopy_hidden.yaml +119 -0
- endoreg_db/data/finding/02_colonoscopy_observation.yaml +152 -0
- endoreg_db/data/finding_classification/00_generic.yaml +44 -0
- endoreg_db/data/finding_classification/00_generic_histology.yaml +28 -0
- endoreg_db/data/finding_classification/00_generic_lesion.yaml +52 -0
- endoreg_db/data/finding_classification/02_colonoscopy_baseline.yaml +83 -0
- endoreg_db/data/finding_classification/02_colonoscopy_histology.yaml +13 -0
- endoreg_db/data/finding_classification/02_colonoscopy_other.yaml +12 -0
- endoreg_db/data/finding_classification/02_colonoscopy_polyp.yaml +101 -0
- endoreg_db/data/finding_classification_choice/00_generic.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_baseline.yaml +23 -0
- endoreg_db/data/finding_classification_choice/00_generic_complication.yaml +15 -0
- endoreg_db/data/finding_classification_choice/00_generic_histology.yaml +21 -0
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_bowel_preparation.yaml +49 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_generic.yaml +19 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_histology.yaml +20 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_location.yaml +248 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_other.yaml +34 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_advanced_imaging.yaml +76 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_polyp_morphology.yaml +75 -0
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/00_generic.yaml +53 -0
- endoreg_db/data/finding_classification_type/02_colonoscopy.yaml +9 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy.yaml +59 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_ablation.yaml +44 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_bleeding.yaml +55 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_resection.yaml +85 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stenosis.yaml +17 -0
- endoreg_db/data/finding_intervention/00_generic_endoscopy_stent.yaml +9 -0
- endoreg_db/data/finding_intervention/01_gastroscopy.yaml +19 -0
- endoreg_db/data/finding_intervention/04_eus.yaml +39 -0
- endoreg_db/data/finding_intervention/05_ercp.yaml +3 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_type/data.yaml +39 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/01_patient_data.yaml +93 -0
- endoreg_db/data/requirement/old/colon_polyp_intervention.yaml +49 -0
- endoreg_db/data/requirement/old/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/old/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement/old/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/old/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/old/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/old/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/old/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/old/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/old/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/old/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/old/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/old/gender.yaml +0 -0
- endoreg_db/data/requirement/old/lab_value.yaml +441 -0
- endoreg_db/data/requirement/old/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/_old/age.yaml +13 -0
- endoreg_db/data/requirement_operator/_old/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/_old/model_operators.yaml +96 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +65 -0
- 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 +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set_type/data.yaml +41 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +32 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +24 -0
- endoreg_db/export/frames/export.py +6 -0
- endoreg_db/export/frames/export_frames_with_labels.py +616 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +4 -0
- endoreg_db/forms/examination_form.py +12 -0
- endoreg_db/forms/patient_finding_intervention_form.py +40 -0
- endoreg_db/forms/patient_form.py +23 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +11 -0
- endoreg_db/forms/unit.py +7 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +48 -0
- endoreg_db/helpers/data_loader.py +280 -0
- endoreg_db/helpers/default_objects.py +414 -0
- endoreg_db/helpers/download_segmentation_model.py +32 -0
- endoreg_db/helpers/interact.py +1 -0
- endoreg_db/helpers/test_video_helper.py +127 -0
- endoreg_db/import_files/__init__.py +27 -0
- endoreg_db/import_files/context/__init__.py +7 -0
- endoreg_db/import_files/context/default_sensitive_meta.py +83 -0
- endoreg_db/import_files/context/ensure_center.py +17 -0
- endoreg_db/import_files/context/file_lock.py +66 -0
- endoreg_db/import_files/context/import_context.py +42 -0
- endoreg_db/import_files/context/validate_directories.py +57 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +99 -0
- endoreg_db/import_files/file_storage/create_video_file.py +104 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +42 -0
- endoreg_db/import_files/file_storage/state_management.py +463 -0
- endoreg_db/import_files/file_storage/storage.py +42 -0
- endoreg_db/import_files/import_service.md +26 -0
- endoreg_db/import_files/processing/__init__.py +11 -0
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +99 -0
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +51 -0
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +107 -0
- endoreg_db/import_files/pseudonymization/__init__.py +0 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +181 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +139 -0
- endoreg_db/import_files/pseudonymization/pseudonymize.py +0 -0
- endoreg_db/import_files/report_import_service.py +147 -0
- endoreg_db/import_files/video_import_service.py +154 -0
- endoreg_db/logger_conf.py +156 -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 +132 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +177 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +419 -0
- endoreg_db/management/commands/export_frame_annot.py +196 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +206 -0
- endoreg_db/management/commands/fix_video_paths.py +186 -0
- endoreg_db/management/commands/import_report.py +361 -0
- endoreg_db/management/commands/list_routes.py +20 -0
- endoreg_db/management/commands/load_ai_model_data.py +83 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +60 -0
- endoreg_db/management/commands/load_base_db_data.py +63 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +39 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +38 -0
- endoreg_db/management/commands/load_disease_classification_data.py +38 -0
- endoreg_db/management/commands/load_disease_data.py +59 -0
- endoreg_db/management/commands/load_distribution_data.py +63 -0
- endoreg_db/management/commands/load_endoscope_data.py +58 -0
- endoreg_db/management/commands/load_event_data.py +39 -0
- endoreg_db/management/commands/load_examination_data.py +78 -0
- endoreg_db/management/commands/load_examination_indication_data.py +85 -0
- endoreg_db/management/commands/load_finding_data.py +115 -0
- endoreg_db/management/commands/load_gender_data.py +37 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +142 -0
- endoreg_db/management/commands/load_information_source.py +46 -0
- endoreg_db/management/commands/load_lab_value_data.py +52 -0
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_medication_data.py +104 -0
- endoreg_db/management/commands/load_name_data.py +36 -0
- endoreg_db/management/commands/load_organ_data.py +39 -0
- endoreg_db/management/commands/load_pdf_type_data.py +58 -0
- endoreg_db/management/commands/load_profession_data.py +40 -0
- endoreg_db/management/commands/load_qualification_data.py +56 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +40 -0
- endoreg_db/management/commands/load_requirement_data.py +207 -0
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +57 -0
- endoreg_db/management/commands/load_shift_data.py +57 -0
- endoreg_db/management/commands/load_tag_data.py +54 -0
- endoreg_db/management/commands/load_unit_data.py +40 -0
- endoreg_db/management/commands/load_user_groups.py +26 -0
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +70 -0
- endoreg_db/management/commands/setup_endoreg_db.py +459 -0
- endoreg_db/management/commands/start_filewatcher.py +115 -0
- endoreg_db/management/commands/storage_management.py +622 -0
- endoreg_db/management/commands/summarize_db_content.py +280 -0
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +189 -0
- endoreg_db/management/commands/video_validation.py +20 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1953 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +322 -0
- endoreg_db/models/administration/__init__.py +95 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +180 -0
- endoreg_db/models/administration/ai/model_type.py +42 -0
- endoreg_db/models/administration/case/__init__.py +5 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +3 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +3 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +85 -0
- endoreg_db/models/administration/center/center_product.py +67 -0
- endoreg_db/models/administration/center/center_resource.py +69 -0
- endoreg_db/models/administration/center/center_shift.py +94 -0
- endoreg_db/models/administration/center/center_waste.py +42 -0
- endoreg_db/models/administration/person/__init__.py +26 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +40 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +44 -0
- endoreg_db/models/administration/person/employee/employee_type.py +50 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +64 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +20 -0
- endoreg_db/models/administration/person/names/last_name.py +20 -0
- endoreg_db/models/administration/person/patient/__init__.py +7 -0
- endoreg_db/models/administration/person/patient/patient.py +488 -0
- endoreg_db/models/administration/person/patient/patient_external_id.py +36 -0
- endoreg_db/models/administration/person/person.py +35 -0
- endoreg_db/models/administration/person/profession/__init__.py +28 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +41 -0
- endoreg_db/models/administration/product/__init__.py +15 -0
- endoreg_db/models/administration/product/product.py +106 -0
- endoreg_db/models/administration/product/product_group.py +41 -0
- endoreg_db/models/administration/product/product_material.py +60 -0
- endoreg_db/models/administration/product/product_weight.py +51 -0
- endoreg_db/models/administration/product/reference_product.py +147 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +43 -0
- endoreg_db/models/administration/qualification/qualification_type.py +39 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +72 -0
- endoreg_db/models/administration/shift/shift.py +57 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +23 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +85 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +61 -0
- endoreg_db/models/label/label.py +91 -0
- endoreg_db/models/label/label_set.py +68 -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 +42 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +611 -0
- endoreg_db/models/label/video_segmentation_label.py +35 -0
- endoreg_db/models/label/video_segmentation_labelset.py +28 -0
- endoreg_db/models/media/__init__.py +23 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +137 -0
- endoreg_db/models/media/pdf/__init__.py +12 -0
- endoreg_db/models/media/pdf/raw_pdf.py +764 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +85 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +46 -0
- endoreg_db/models/media/video/__init__.py +9 -0
- endoreg_db/models/media/video/create_from_file.py +402 -0
- endoreg_db/models/media/video/pipe_1.py +258 -0
- endoreg_db/models/media/video/pipe_2.py +129 -0
- endoreg_db/models/media/video/video_file.py +907 -0
- endoreg_db/models/media/video/video_file_ai.py +828 -0
- endoreg_db/models/media/video/video_file_anonymize.py +524 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +49 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +25 -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 +126 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +233 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +36 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +13 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +24 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +40 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +44 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +30 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +205 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +228 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +107 -0
- endoreg_db/models/media/video/video_file_io.py +272 -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 +58 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +62 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +183 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +198 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +178 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +105 -0
- endoreg_db/models/media/video/video_file_segments.py +317 -0
- endoreg_db/models/media/video/video_metadata.py +67 -0
- endoreg_db/models/media/video/video_processing.py +192 -0
- endoreg_db/models/medical/__init__.py +136 -0
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +29 -0
- endoreg_db/models/medical/disease.py +174 -0
- endoreg_db/models/medical/event.py +154 -0
- endoreg_db/models/medical/examination/__init__.py +20 -0
- endoreg_db/models/medical/examination/examination.py +183 -0
- endoreg_db/models/medical/examination/examination_indication.py +229 -0
- endoreg_db/models/medical/examination/examination_time.py +68 -0
- endoreg_db/models/medical/examination/examination_time_type.py +44 -0
- endoreg_db/models/medical/examination/examination_type.py +47 -0
- endoreg_db/models/medical/finding/__init__.py +20 -0
- endoreg_db/models/medical/finding/finding.py +113 -0
- endoreg_db/models/medical/finding/finding_classification.py +131 -0
- endoreg_db/models/medical/finding/finding_intervention.py +68 -0
- endoreg_db/models/medical/finding/finding_type.py +38 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +77 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +490 -0
- endoreg_db/models/medical/medication/__init__.py +23 -0
- endoreg_db/models/medical/medication/medication.py +45 -0
- endoreg_db/models/medical/medication/medication_indication.py +78 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +58 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +58 -0
- endoreg_db/models/medical/medication/medication_schedule.py +58 -0
- endoreg_db/models/medical/organ/__init__.py +38 -0
- endoreg_db/models/medical/patient/__init__.py +48 -0
- endoreg_db/models/medical/patient/medication_examples.py +56 -0
- endoreg_db/models/medical/patient/patient_disease.py +72 -0
- endoreg_db/models/medical/patient/patient_event.py +80 -0
- endoreg_db/models/medical/patient/patient_examination.py +280 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +57 -0
- endoreg_db/models/medical/patient/patient_finding.py +416 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +231 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +37 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +157 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +247 -0
- endoreg_db/models/medical/patient/patient_medication.py +111 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +152 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +73 -0
- endoreg_db/models/medical/risk/risk_type.py +54 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/model_meta.py +266 -0
- endoreg_db/models/metadata/model_meta_logic.py +485 -0
- endoreg_db/models/metadata/pdf_meta.py +96 -0
- endoreg_db/models/metadata/sensitive_meta.py +345 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1161 -0
- endoreg_db/models/metadata/video_meta.py +459 -0
- endoreg_db/models/metadata/video_prediction_logic.py +232 -0
- endoreg_db/models/metadata/video_prediction_meta.py +319 -0
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +46 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +22 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +163 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +50 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +211 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +23 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +110 -0
- endoreg_db/models/other/gender.py +32 -0
- endoreg_db/models/other/information_source.py +190 -0
- endoreg_db/models/other/material.py +34 -0
- endoreg_db/models/other/resource.py +24 -0
- endoreg_db/models/other/tag.py +32 -0
- endoreg_db/models/other/transport_route.py +40 -0
- endoreg_db/models/other/unit.py +40 -0
- endoreg_db/models/other/waste.py +28 -0
- endoreg_db/models/report/__init__.py +0 -0
- endoreg_db/models/report/images.py +0 -0
- endoreg_db/models/report/report.py +5 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +792 -0
- endoreg_db/models/requirement/requirement_error.py +84 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +137 -0
- endoreg_db/models/requirement/requirement_operator.py +187 -0
- endoreg_db/models/requirement/requirement_set.py +327 -0
- endoreg_db/models/state/__init__.py +13 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/anonymization.py +30 -0
- endoreg_db/models/state/audit_ledger.py +155 -0
- endoreg_db/models/state/label_video_segment.py +31 -0
- endoreg_db/models/state/processing_history/__init__.py +3 -0
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +219 -0
- endoreg_db/models/state/sensitive_meta.py +50 -0
- endoreg_db/models/state/video.py +251 -0
- endoreg_db/models/upload_job.py +100 -0
- endoreg_db/models/utils.py +138 -0
- endoreg_db/queries/__init__.py +3 -0
- endoreg_db/queries/annotations/__init__.py +1 -0
- endoreg_db/queries/annotations/legacy.py +169 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/root_urls.py +27 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +30 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +861 -0
- endoreg_db/serializers/__init__.py +104 -0
- endoreg_db/serializers/administration/__init__.py +13 -0
- endoreg_db/serializers/administration/ai/__init__.py +9 -0
- endoreg_db/serializers/administration/ai/active_model.py +12 -0
- endoreg_db/serializers/administration/ai/ai_model.py +20 -0
- endoreg_db/serializers/administration/ai/model_type.py +12 -0
- endoreg_db/serializers/administration/center.py +14 -0
- endoreg_db/serializers/administration/gender.py +11 -0
- endoreg_db/serializers/anonymization.py +77 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +45 -0
- endoreg_db/serializers/examination/dropdown.py +20 -0
- endoreg_db/serializers/examination_serializer.py +9 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +61 -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 +11 -0
- endoreg_db/serializers/label_video_segment/__init__.py +9 -0
- endoreg_db/serializers/label_video_segment/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/label_video_segment/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +427 -0
- endoreg_db/serializers/meta/__init__.py +13 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +122 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +153 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +62 -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 +72 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +144 -0
- endoreg_db/serializers/misc/stats.py +35 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +74 -0
- endoreg_db/serializers/patient/__init__.py +12 -0
- endoreg_db/serializers/patient/patient.py +103 -0
- endoreg_db/serializers/patient/patient_dropdown.py +35 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +168 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +32 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +47 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +62 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +28 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +40 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +135 -0
- endoreg_db/serializers/pdf/__init__.py +3 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +101 -0
- endoreg_db/serializers/requirements/requirement_schema.py +20 -0
- endoreg_db/serializers/requirements/requirement_sets.py +99 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +301 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/video_file.py +283 -0
- endoreg_db/serializers/video/video_file_brief.py +14 -0
- endoreg_db/serializers/video/video_file_detail.py +96 -0
- endoreg_db/serializers/video/video_file_list.py +100 -0
- endoreg_db/serializers/video/video_processing_history.py +172 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +274 -0
- endoreg_db/services/examination_evaluation.py +172 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +424 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/pdf_import.py +0 -0
- endoreg_db/services/polling_coordinator.py +319 -0
- endoreg_db/services/pseudonym_service.py +94 -0
- endoreg_db/services/report_import.py +13 -0
- endoreg_db/services/segment_sync.py +171 -0
- endoreg_db/services/video_import.py +9 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +56 -0
- endoreg_db/urls/ai.py +14 -0
- endoreg_db/urls/anonymization.py +78 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +34 -0
- endoreg_db/urls/examination.py +63 -0
- endoreg_db/urls/media.py +251 -0
- endoreg_db/urls/patient.py +23 -0
- endoreg_db/urls/requirements.py +15 -0
- endoreg_db/urls/root_urls.py +28 -0
- endoreg_db/urls/stats.py +54 -0
- endoreg_db/urls/upload.py +12 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +97 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/data_loader_for_model_input.py +262 -0
- endoreg_db/utils/ai/data_loader_for_model_training.py +262 -0
- endoreg_db/utils/ai/get.py +6 -0
- endoreg_db/utils/ai/inference_dataset.py +51 -0
- endoreg_db/utils/ai/model_training/config.py +117 -0
- endoreg_db/utils/ai/model_training/dataset.py +74 -0
- endoreg_db/utils/ai/model_training/losses.py +68 -0
- endoreg_db/utils/ai/model_training/metrics.py +78 -0
- endoreg_db/utils/ai/model_training/model_backbones.py +155 -0
- endoreg_db/utils/ai/model_training/model_gastronet_resnet.py +118 -0
- endoreg_db/utils/ai/model_training/trainer_gastronet_multilabel.py +771 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +270 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +293 -0
- endoreg_db/utils/ai/preprocess.py +76 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +32 -0
- endoreg_db/utils/check_video_files.py +175 -0
- endoreg_db/utils/cropping.py +30 -0
- endoreg_db/utils/dataloader.py +285 -0
- endoreg_db/utils/dates.py +59 -0
- endoreg_db/utils/defaults/set_default_center.py +33 -0
- endoreg_db/utils/env.py +37 -0
- endoreg_db/utils/extract_specific_frames.py +87 -0
- endoreg_db/utils/file_operations.py +70 -0
- endoreg_db/utils/fix_video_path_direct.py +157 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +138 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +237 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +82 -0
- endoreg_db/utils/ocr.py +195 -0
- endoreg_db/utils/operation_log.py +87 -0
- endoreg_db/utils/parse_and_generate_yaml.py +45 -0
- endoreg_db/utils/paths.py +159 -0
- endoreg_db/utils/permissions.py +160 -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 +144 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +22 -0
- endoreg_db/utils/product/sum_weights.py +20 -0
- endoreg_db/utils/pydantic_models/__init__.py +5 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +678 -0
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +842 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +114 -0
- endoreg_db/utils/setup_config.py +196 -0
- endoreg_db/utils/storage.py +117 -0
- endoreg_db/utils/translation.py +31 -0
- endoreg_db/utils/uuid.py +5 -0
- endoreg_db/utils/validate_endo_roi.py +33 -0
- endoreg_db/utils/validate_subcategory_dict.py +93 -0
- endoreg_db/utils/validate_video_detailed.py +415 -0
- endoreg_db/utils/video/__init__.py +30 -0
- endoreg_db/utils/video/extract_frames.py +100 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +996 -0
- endoreg_db/utils/video/names.py +47 -0
- endoreg_db/utils/video/streaming_processor.py +386 -0
- endoreg_db/utils/video/video_splitter.py +105 -0
- endoreg_db/versioning.md +79 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +247 -0
- endoreg_db/views/__init__.py +157 -0
- endoreg_db/views/anonymization/__init__.py +31 -0
- endoreg_db/views/anonymization/media_management.py +486 -0
- endoreg_db/views/anonymization/overview.py +307 -0
- endoreg_db/views/anonymization/validate.py +310 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +146 -0
- endoreg_db/views/examination/__init__.py +30 -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 +62 -0
- endoreg_db/views/examination/get_finding_classifications.py +38 -0
- endoreg_db/views/examination/get_findings.py +39 -0
- endoreg_db/views/examination/get_instruments.py +19 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +116 -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 +41 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +54 -0
- endoreg_db/views/media/__init__.py +32 -0
- endoreg_db/views/media/pdf_media.py +411 -0
- endoreg_db/views/media/sensitive_metadata.py +372 -0
- endoreg_db/views/media/video_media.py +275 -0
- endoreg_db/views/meta/__init__.py +7 -0
- endoreg_db/views/meta/sensitive_meta_list.py +102 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +74 -0
- endoreg_db/views/misc/__init__.py +29 -0
- endoreg_db/views/misc/center.py +14 -0
- endoreg_db/views/misc/csrf.py +8 -0
- endoreg_db/views/misc/gender.py +15 -0
- endoreg_db/views/misc/stats.py +255 -0
- endoreg_db/views/misc/upload_views.py +241 -0
- endoreg_db/views/patient/__init__.py +3 -0
- endoreg_db/views/patient/patient.py +253 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +141 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +58 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +72 -0
- endoreg_db/views/patient_examination/video.py +228 -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 +71 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +291 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +75 -0
- endoreg_db/views/report/__init__.py +7 -0
- endoreg_db/views/report/reimport.py +177 -0
- endoreg_db/views/report/report_stream.py +191 -0
- endoreg_db/views/requirement/__init__.py +11 -0
- endoreg_db/views/requirement/evaluate.py +278 -0
- endoreg_db/views/requirement/lookup.py +380 -0
- endoreg_db/views/requirement/lookup_store.py +183 -0
- endoreg_db/views/requirement/requirement_utils.py +87 -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 +266 -0
- endoreg_db/views/video/__init__.py +49 -0
- endoreg_db/views/video/ai/__init__.py +8 -0
- endoreg_db/views/video/ai/label.py +159 -0
- endoreg_db/views/video/correction.py +529 -0
- endoreg_db/views/video/reimport.py +230 -0
- endoreg_db/views/video/segments_crud.py +709 -0
- endoreg_db/views/video/video_apply_mask.py +49 -0
- endoreg_db/views/video/video_correction.py +22 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_metadata.py +101 -0
- endoreg_db/views/video/video_processing_history.py +25 -0
- endoreg_db/views/video/video_remove_frames.py +49 -0
- endoreg_db/views/video/video_stream.py +334 -0
- endoreg_db-0.8.9.32.dist-info/METADATA +404 -0
- endoreg_db-0.8.9.32.dist-info/RECORD +787 -0
- endoreg_db-0.8.9.32.dist-info/WHEEL +4 -0
- endoreg_db-0.8.9.32.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
# Use centralized environment helpers
|
|
5
|
+
from endoreg_db.config.env import env_bool, env_path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Small helper to coerce relative paths to absolute under BASE_DIR
|
|
9
|
+
def _abs_under_base(path_str: str, default_relative: str) -> Path:
|
|
10
|
+
p = env_path(path_str, default_relative)
|
|
11
|
+
return p
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
BASE_DIR = Path(__file__).parent.parent.parent.resolve()
|
|
15
|
+
|
|
16
|
+
# Test assets directory (used in tests and utilities)
|
|
17
|
+
ASSET_DIR = _abs_under_base("ASSET_DIR", "tests/assets")
|
|
18
|
+
RUN_VIDEO_TESTS = env_bool("RUN_VIDEO_TESTS", False)
|
|
19
|
+
|
|
20
|
+
# Internationalization
|
|
21
|
+
LANGUAGE_CODE = "de"
|
|
22
|
+
USE_I18N = True
|
|
23
|
+
USE_TZ = True
|
|
24
|
+
|
|
25
|
+
# Only support German and English
|
|
26
|
+
LANGUAGES = [
|
|
27
|
+
("de", "German"),
|
|
28
|
+
("en", "English"),
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
#ROOT_URLCONF = 'endoreg_db.urls.root_urls'
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Core apps
|
|
36
|
+
INSTALLED_APPS = [
|
|
37
|
+
"endoreg_db.apps.EndoregDbConfig",
|
|
38
|
+
"django.contrib.auth",
|
|
39
|
+
"django.contrib.contenttypes",
|
|
40
|
+
"django.contrib.sessions",
|
|
41
|
+
"django.contrib.messages",
|
|
42
|
+
"django.contrib.staticfiles",
|
|
43
|
+
"rest_framework",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
MIDDLEWARE = [
|
|
47
|
+
"django.middleware.security.SecurityMiddleware",
|
|
48
|
+
"whitenoise.middleware.WhiteNoiseMiddleware",
|
|
49
|
+
"django.contrib.sessions.middleware.SessionMiddleware",
|
|
50
|
+
"django.middleware.common.CommonMiddleware",
|
|
51
|
+
"django.middleware.csrf.CsrfViewMiddleware",
|
|
52
|
+
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
|
53
|
+
"django.contrib.messages.middleware.MessageMiddleware",
|
|
54
|
+
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
# Use a distinct module name to avoid ambiguity and mount API under /api/
|
|
58
|
+
ROOT_URLCONF = "endoreg_db.root_urls"
|
|
59
|
+
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
|
60
|
+
TIME_ZONE = os.environ.get("TIME_ZONE", "Europe/Berlin")
|
|
61
|
+
|
|
62
|
+
STATIC_URL = os.environ.get("STATIC_URL", "/static/")
|
|
63
|
+
STATIC_ROOT = env_path("STATIC_ROOT", "staticfiles")
|
|
64
|
+
|
|
65
|
+
# Media/storage root can be overridden from env (important when embedded)
|
|
66
|
+
MEDIA_URL = os.environ.get("MEDIA_URL", "/media/")
|
|
67
|
+
MEDIA_ROOT = env_path("STORAGE_DIR", "storage")
|
|
68
|
+
|
|
69
|
+
# Caching: provide a default LocMem cache with explicit TIMEOUT for consistency
|
|
70
|
+
CACHES = {
|
|
71
|
+
"default": {
|
|
72
|
+
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
73
|
+
"LOCATION": os.environ.get("CACHE_LOCATION", "endoreg-default-cache"),
|
|
74
|
+
"TIMEOUT": int(os.environ.get("CACHE_TIMEOUT", str(60 * 30))), # 30 minutes default
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
REST_FRAMEWORK = {
|
|
79
|
+
"DEFAULT_THROTTLE_CLASSES": [
|
|
80
|
+
"rest_framework.throttling.UserRateThrottle",
|
|
81
|
+
"rest_framework.throttling.AnonRateThrottle",
|
|
82
|
+
],
|
|
83
|
+
"DEFAULT_THROTTLE_RATES": {
|
|
84
|
+
"user": os.environ.get("DRF_THROTTLE_USER", "100/hour"),
|
|
85
|
+
"anon": os.environ.get("DRF_THROTTLE_ANON", "20/hour"),
|
|
86
|
+
},
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
TEMPLATES = [
|
|
90
|
+
{
|
|
91
|
+
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
|
92
|
+
"DIRS": [],
|
|
93
|
+
"APP_DIRS": True,
|
|
94
|
+
"OPTIONS": {
|
|
95
|
+
"context_processors": [
|
|
96
|
+
"django.template.context_processors.debug",
|
|
97
|
+
"django.template.context_processors.request",
|
|
98
|
+
"django.contrib.auth.context_processors.auth",
|
|
99
|
+
"django.contrib.messages.context_processors.messages",
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
TEST_LOGGER_NAMES = [
|
|
106
|
+
"tests",
|
|
107
|
+
"paths",
|
|
108
|
+
"raw_pdf",
|
|
109
|
+
"patient",
|
|
110
|
+
"default_objects",
|
|
111
|
+
"ffmpeg_wrapper",
|
|
112
|
+
# Video-pipeline modules
|
|
113
|
+
"endoreg_db.models.media.video.video_file",
|
|
114
|
+
"endoreg_db.models.media.video.video_file_anonymize",
|
|
115
|
+
"endoreg_db.models.media.video.pipe_1",
|
|
116
|
+
"endoreg_db.models.media.video.pipe_2",
|
|
117
|
+
"endoreg_db.utils.pipelines.process_video_dir",
|
|
118
|
+
"endoreg_db.models.metadata.sensitive_meta",
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
# TODO implement
|
|
122
|
+
# LOGGING = get_logging_config(
|
|
123
|
+
# TEST_LOGGER_NAMES,
|
|
124
|
+
# file_log_level="INFO",
|
|
125
|
+
# console_log_level="WARNING",
|
|
126
|
+
# )
|
|
127
|
+
__all__ = [
|
|
128
|
+
"BASE_DIR",
|
|
129
|
+
"ASSET_DIR",
|
|
130
|
+
"RUN_VIDEO_TESTS",
|
|
131
|
+
"TEMPLATES",
|
|
132
|
+
"TEST_LOGGER_NAMES",
|
|
133
|
+
"REST_FRAMEWORK",
|
|
134
|
+
"INSTALLED_APPS",
|
|
135
|
+
"MIDDLEWARE",
|
|
136
|
+
"TIME_ZONE",
|
|
137
|
+
"STATIC_URL",
|
|
138
|
+
"STATIC_ROOT",
|
|
139
|
+
"MEDIA_URL",
|
|
140
|
+
"MEDIA_ROOT",
|
|
141
|
+
"CACHES",
|
|
142
|
+
"ROOT_URLCONF",
|
|
143
|
+
"DEFAULT_AUTO_FIELD",
|
|
144
|
+
"LANGUAGE_CODE",
|
|
145
|
+
"USE_I18N",
|
|
146
|
+
"USE_TZ",
|
|
147
|
+
"LANGUAGES",
|
|
148
|
+
]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from .base import * # noqa: F401,F403
|
|
2
|
+
from .base import BASE_DIR
|
|
3
|
+
from endoreg_db.config.env import env_bool, env_str
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
# Persistent test DB
|
|
7
|
+
DEFAULT_TEST_DB_PATH = BASE_DIR / "data" / "tests" / "db" / "test_db.sqlite3"
|
|
8
|
+
TEST_DB_FILE = Path(env_str("TEST_DB_FILE", str(DEFAULT_TEST_DB_PATH)))
|
|
9
|
+
TEST_DB_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
10
|
+
|
|
11
|
+
DEBUG = env_bool("DJANGO_DEBUG", True)
|
|
12
|
+
SECRET_KEY = env_str("DJANGO_SECRET_KEY", "test-insecure-key")
|
|
13
|
+
ALLOWED_HOSTS = env_str("DJANGO_ALLOWED_HOSTS", "*").split(",")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Build DB config without redundant conditionals and avoid passing empty creds
|
|
17
|
+
_db_config = {
|
|
18
|
+
"ENGINE": "django.db.backends.sqlite3",
|
|
19
|
+
"NAME": "casegen_db.sqlite3",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
DATABASES = {"default": _db_config}
|
|
23
|
+
|
|
24
|
+
# Configure cache with explicit TIMEOUT for tests
|
|
25
|
+
CACHES = {
|
|
26
|
+
"default": {
|
|
27
|
+
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
28
|
+
"LOCATION": "endoreg-casegen-cache",
|
|
29
|
+
"TIMEOUT": int(env_str("TEST_CACHE_TIMEOUT", str(60 * 30))),
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from .base import BASE_DIR # noqa: F401
|
|
2
|
+
from endoreg_db.config.env import env_bool, env_str
|
|
3
|
+
from . import keycloak as KEYCLOAK
|
|
4
|
+
DEBUG = env_bool("DJANGO_DEBUG", True)
|
|
5
|
+
SECRET_KEY = env_str("DJANGO_SECRET_KEY", "dev-insecure-key")
|
|
6
|
+
ALLOWED_HOSTS = env_str("DJANGO_ALLOWED_HOSTS", "*").split(",")
|
|
7
|
+
|
|
8
|
+
DB_ENGINE = env_str("DEV_DB_ENGINE", "django.db.backends.sqlite3")
|
|
9
|
+
DB_NAME = env_str("DEV_DB_NAME", str(BASE_DIR / "dev_db.sqlite3"))
|
|
10
|
+
DB_USER = env_str("DEV_DB_USER", "")
|
|
11
|
+
DB_PASSWORD = env_str("DEV_DB_PASSWORD", "")
|
|
12
|
+
DB_HOST = env_str("DEV_DB_HOST", "")
|
|
13
|
+
DB_PORT = env_str("DEV_DB_PORT", "")
|
|
14
|
+
|
|
15
|
+
# Build DB config without redundant conditionals and avoid passing empty creds
|
|
16
|
+
_db_config = {
|
|
17
|
+
"ENGINE": DB_ENGINE,
|
|
18
|
+
"NAME": DB_NAME,
|
|
19
|
+
}
|
|
20
|
+
if not DB_ENGINE.endswith("sqlite3"):
|
|
21
|
+
if DB_USER:
|
|
22
|
+
_db_config["USER"] = DB_USER
|
|
23
|
+
if DB_PASSWORD:
|
|
24
|
+
_db_config["PASSWORD"] = DB_PASSWORD
|
|
25
|
+
if DB_HOST:
|
|
26
|
+
_db_config["HOST"] = DB_HOST
|
|
27
|
+
if DB_PORT:
|
|
28
|
+
_db_config["PORT"] = DB_PORT
|
|
29
|
+
|
|
30
|
+
DATABASES = {"default": _db_config}
|
|
31
|
+
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
# Keycloak / OIDC integration for DEVELOPMENT settings
|
|
34
|
+
# This file extends config/settings/base.py and imports a dedicated
|
|
35
|
+
# Keycloak settings module (config/settings/keycloak.py) so all IdP
|
|
36
|
+
# values live in one place.
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
from .base import * # bring in EVERYTHING from base.py first
|
|
40
|
+
from . import keycloak as KEYCLOAK # import our separate Keycloak config module
|
|
41
|
+
|
|
42
|
+
# ---- Django app & middleware wiring ----------------------------------------
|
|
43
|
+
# Add the mozilla-django-oidc app (gives /oidc/authenticate/, /oidc/callback/, /oidc/logout/)
|
|
44
|
+
# and our small middleware that redirects browsers hitting /api/* to the OIDC login.
|
|
45
|
+
# NOTE: AuthenticationMiddleware is already in base.py and MUST run before our middleware.
|
|
46
|
+
INSTALLED_APPS = INSTALLED_APPS + KEYCLOAK.EXTRA_INSTALLED_APPS
|
|
47
|
+
MIDDLEWARE = MIDDLEWARE + KEYCLOAK.EXTRA_MIDDLEWARE
|
|
48
|
+
|
|
49
|
+
# ---- Authentication backends -----------------------------------------------
|
|
50
|
+
# Order matters: OIDC backend first (handles the OIDC callback, verifies ID token,
|
|
51
|
+
# creates/updates the Django user, syncs Keycloak roles into Django Groups),
|
|
52
|
+
# then the standard Django backend for compatibility/admin.
|
|
53
|
+
AUTHENTICATION_BACKENDS = KEYCLOAK.AUTHENTICATION_BACKENDS
|
|
54
|
+
|
|
55
|
+
# ---- DRF authentication + global permissions --------------------------------
|
|
56
|
+
# DRF will try SessionAuthentication (browser session cookie) first,
|
|
57
|
+
# then our KeycloakJWTAuthentication for API clients that send Bearer tokens.
|
|
58
|
+
# Global permission chain:
|
|
59
|
+
# - EnvironmentAwarePermission: lets everything through in DEBUG, requires auth in prod
|
|
60
|
+
# - PolicyPermission: enforces REQUIRED_ROLES mapping (RBAC) from policy.py
|
|
61
|
+
REST_FRAMEWORK.update({
|
|
62
|
+
"DEFAULT_AUTHENTICATION_CLASSES": KEYCLOAK.REST_FRAMEWORK_DEFAULT_AUTH,
|
|
63
|
+
"DEFAULT_PERMISSION_CLASSES": (
|
|
64
|
+
"endoreg_db.utils.permissions.EnvironmentAwarePermission",
|
|
65
|
+
"endoreg_db.authz.permissions.PolicyPermission",
|
|
66
|
+
),
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
# ---- Django login/logout endpoints ------------------------------------------
|
|
70
|
+
# Where to send users to initiate login (mozilla-django-oidc view),
|
|
71
|
+
# where to land after login if no ?next=..., and where to land after a local logout.
|
|
72
|
+
LOGIN_URL = KEYCLOAK.LOGIN_URL
|
|
73
|
+
LOGIN_REDIRECT_URL = KEYCLOAK.LOGIN_REDIRECT_URL
|
|
74
|
+
LOGOUT_REDIRECT_URL = KEYCLOAK.LOGOUT_REDIRECT_URL
|
|
75
|
+
|
|
76
|
+
# ---- Provider coordinates (realm/client) ------------------------------------
|
|
77
|
+
# Basic Keycloak coordinates that the OIDC library and our code use.
|
|
78
|
+
KEYCLOAK_BASE_URL = KEYCLOAK.KEYCLOAK_BASE_URL
|
|
79
|
+
KEYCLOAK_REALM = KEYCLOAK.KEYCLOAK_REALM
|
|
80
|
+
OIDC_RP_CLIENT_ID = KEYCLOAK.OIDC_RP_CLIENT_ID
|
|
81
|
+
OIDC_RP_CLIENT_SECRET = KEYCLOAK.OIDC_RP_CLIENT_SECRET # TIP: use env var in prod
|
|
82
|
+
OIDC_OP_DISCOVERY_ENDPOINT = KEYCLOAK.OIDC_OP_DISCOVERY_ENDPOINT
|
|
83
|
+
|
|
84
|
+
# ---- Explicit OIDC endpoints (don’t rely only on discovery) -----------------
|
|
85
|
+
# Explicitly set endpoints so /oidc/authenticate/ can build URLs even if discovery is skipped.
|
|
86
|
+
OIDC_OP_AUTHORIZATION_ENDPOINT = KEYCLOAK.OIDC_OP_AUTHORIZATION_ENDPOINT
|
|
87
|
+
OIDC_OP_TOKEN_ENDPOINT = KEYCLOAK.OIDC_OP_TOKEN_ENDPOINT
|
|
88
|
+
OIDC_OP_USER_ENDPOINT = KEYCLOAK.OIDC_OP_USER_ENDPOINT
|
|
89
|
+
OIDC_OP_JWKS_ENDPOINT = KEYCLOAK.OIDC_OP_JWKS_ENDPOINT
|
|
90
|
+
|
|
91
|
+
# ---- Tokens / security flags ------------------------------------------------
|
|
92
|
+
# Verify TLS to Keycloak (False in dev is OK if your machine lacks the CA; True in prod),
|
|
93
|
+
# request standard OIDC scopes, and declare the ID token signing algorithm used by Keycloak.
|
|
94
|
+
OIDC_VERIFY_SSL = KEYCLOAK.OIDC_VERIFY_SSL
|
|
95
|
+
OIDC_RP_SCOPES = KEYCLOAK.OIDC_RP_SCOPES # "openid email profile"
|
|
96
|
+
OIDC_RP_SIGN_ALGO = KEYCLOAK.OIDC_RP_SIGN_ALGO # "RS256" for Keycloak
|
|
97
|
+
|
|
98
|
+
# ---- RP-initiated logout ----------------------------------------------------
|
|
99
|
+
# These enable POST /oidc/logout/ to clear Django session and call Keycloak’s logout
|
|
100
|
+
# using the stored ID token, then redirect back to our app.
|
|
101
|
+
OIDC_OP_LOGOUT_ENDPOINT = KEYCLOAK.OIDC_OP_LOGOUT_ENDPOINT
|
|
102
|
+
OIDC_STORE_ID_TOKEN = KEYCLOAK.OIDC_STORE_ID_TOKEN
|
|
103
|
+
OIDC_LOGOUT_REDIRECT_URL = KEYCLOAK.OIDC_LOGOUT_REDIRECT_URL
|
|
104
|
+
|
|
105
|
+
# ---- Dev helper: force Keycloak login screen each time ----------------------
|
|
106
|
+
# Adds extra params to the authorization request so Keycloak won’t silently SSO you.
|
|
107
|
+
# Great for switching users during testing. Remove/empty in production.
|
|
108
|
+
OIDC_AUTH_REQUEST_EXTRA_PARAMS = KEYCLOAK.OIDC_AUTH_REQUEST_EXTRA_PARAMS
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# config/settings/keycloak.py
|
|
2
|
+
|
|
3
|
+
from endoreg_db.config.env import env_bool, env_str
|
|
4
|
+
|
|
5
|
+
# -----------------------------
|
|
6
|
+
# CORE KEYCLOAK COORDINATES
|
|
7
|
+
# -----------------------------
|
|
8
|
+
|
|
9
|
+
# Base URL of your Keycloak server (scheme + host). Must be reachable by your Django app and the browser.
|
|
10
|
+
KEYCLOAK_BASE_URL = env_str(
|
|
11
|
+
"KEYCLOAK_BASE_URL",
|
|
12
|
+
env_str("KEYCLOAK_SERVER_URL", "https://keycloak.endo-reg.net"),
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# The Keycloak Realm that contains your users, roles, groups, and clients.
|
|
16
|
+
KEYCLOAK_REALM = env_str("KEYCLOAK_REALM", "EndoregDb")
|
|
17
|
+
|
|
18
|
+
# The specific Keycloak "Client" (OIDC client/app) your Django app uses.
|
|
19
|
+
# It must exist in the realm, with Standard Flow enabled, proper redirect URIs, and Web Origins configured.
|
|
20
|
+
OIDC_RP_CLIENT_ID = env_str(
|
|
21
|
+
"OIDC_RP_CLIENT_ID",
|
|
22
|
+
env_str("KEYCLOAK_CLIENT_ID", "endoregdb-api"),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# The client secret for the OIDC client above. This authenticates Django to Keycloak during token exchange.
|
|
26
|
+
# ⚠️ Best practice: load this from environment variables, not hardcoded in git.
|
|
27
|
+
# e.g. from endoreg_db.config.env import env_str; OIDC_RP_CLIENT_SECRET = env_str("OIDC_RP_CLIENT_SECRET", "")
|
|
28
|
+
OIDC_RP_CLIENT_SECRET = env_str(
|
|
29
|
+
"OIDC_RP_CLIENT_SECRET",
|
|
30
|
+
env_str("KEYCLOAK_CLIENT_SECRET", ""),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# -----------------------------
|
|
34
|
+
# DISCOVERY (OPTIONAL – NICE TO HAVE)
|
|
35
|
+
# -----------------------------
|
|
36
|
+
|
|
37
|
+
# OIDC discovery endpoint for your realm. Some libraries can auto-configure using this.
|
|
38
|
+
# We also set explicit endpoints below so the login view doesn't rely solely on discovery.
|
|
39
|
+
OIDC_OP_DISCOVERY_ENDPOINT = env_str(
|
|
40
|
+
"OIDC_OP_DISCOVERY_ENDPOINT",
|
|
41
|
+
f"{KEYCLOAK_BASE_URL}/realms/{KEYCLOAK_REALM}/.well-known/openid-configuration",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# -----------------------------
|
|
45
|
+
# DJANGO LOGIN/LOGOUT ROUTES
|
|
46
|
+
# -----------------------------
|
|
47
|
+
|
|
48
|
+
# Built-in mozilla-django-oidc login entry point. We redirect browsers here when they hit /api/* without a session.
|
|
49
|
+
LOGIN_URL = "/oidc/authenticate/"
|
|
50
|
+
|
|
51
|
+
# Where Django should send the user after a successful login (if there is no ?next=... parameter).
|
|
52
|
+
LOGIN_REDIRECT_URL = "/"
|
|
53
|
+
|
|
54
|
+
# Where to send the user after a local Django logout (not the OIDC logout).
|
|
55
|
+
LOGOUT_REDIRECT_URL = "/"
|
|
56
|
+
|
|
57
|
+
# -----------------------------
|
|
58
|
+
# DJANGO APP / MIDDLEWARE HOOKS
|
|
59
|
+
# -----------------------------
|
|
60
|
+
|
|
61
|
+
# Extra Django apps needed for OIDC login/logout views.
|
|
62
|
+
EXTRA_INSTALLED_APPS = [
|
|
63
|
+
"mozilla_django_oidc", # provides /oidc/authenticate/ and /oidc/callback/ routes
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
# Extra middleware to protect /api/* for browsers (redirect to OIDC if no session).
|
|
67
|
+
# Your custom middleware should come AFTER AuthenticationMiddleware (already in base.py).
|
|
68
|
+
EXTRA_MIDDLEWARE = [
|
|
69
|
+
"endoreg_db.authz.middleware.LoginRequiredForAPIsMiddleware",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
# -----------------------------
|
|
73
|
+
# DRF AUTHENTICATION CHAIN
|
|
74
|
+
# ----------------------------
|
|
75
|
+
|
|
76
|
+
# DRF authentication classes the API will try in order:
|
|
77
|
+
# 1) SessionAuthentication – for browsers (Django session cookie)
|
|
78
|
+
# 2) KeycloakJWTAuthentication – for API clients sending Authorization: Bearer <access_token>
|
|
79
|
+
REST_FRAMEWORK_DEFAULT_AUTH = (
|
|
80
|
+
"rest_framework.authentication.SessionAuthentication",
|
|
81
|
+
"endoreg_db.authz.auth.KeycloakJWTAuthentication",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# -----------------------------
|
|
85
|
+
# DJANGO AUTH BACKENDS
|
|
86
|
+
# -----------------------------
|
|
87
|
+
|
|
88
|
+
# The authentication backends Django calls when handling an OIDC login:
|
|
89
|
+
# - KeycloakOIDCBackend handles the OIDC callback, verifies the ID token, creates/updates the Django user,
|
|
90
|
+
# and syncs roles into Django Groups.
|
|
91
|
+
# - ModelBackend allows normal Django username/password auth (not used in OIDC flow, kept for admin/compat).
|
|
92
|
+
AUTHENTICATION_BACKENDS = (
|
|
93
|
+
"endoreg_db.authz.backends.KeycloakOIDCBackend",
|
|
94
|
+
"django.contrib.auth.backends.ModelBackend",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# -----------------------------
|
|
98
|
+
# TLS / CERT VERIFY (DEV vs PROD)
|
|
99
|
+
# -----------------------------
|
|
100
|
+
|
|
101
|
+
# Whether to verify TLS certificates when Django calls Keycloak (token/jwks endpoints).
|
|
102
|
+
# DEV convenience: False to skip verification if your dev machine lacks the CA chain.
|
|
103
|
+
# PROD: must be True and your system should trust the Keycloak certificate.
|
|
104
|
+
OIDC_VERIFY_SSL = env_bool("OIDC_VERIFY_SSL", False)
|
|
105
|
+
|
|
106
|
+
# -----------------------------
|
|
107
|
+
# EXPLICIT PROVIDER ENDPOINTS
|
|
108
|
+
# -----------------------------
|
|
109
|
+
|
|
110
|
+
# Explicit OIDC endpoints under your realm. Setting these avoids relying solely on discovery at runtime.
|
|
111
|
+
|
|
112
|
+
# Authorization endpoint (where we redirect the browser for the login page)
|
|
113
|
+
OIDC_OP_AUTHORIZATION_ENDPOINT = env_str(
|
|
114
|
+
"OIDC_OP_AUTHORIZATION_ENDPOINT",
|
|
115
|
+
f"{KEYCLOAK_BASE_URL}/realms/{KEYCLOAK_REALM}/protocol/openid-connect/auth",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Token endpoint (Django backend exchanges the auth code for tokens here)
|
|
119
|
+
OIDC_OP_TOKEN_ENDPOINT = env_str(
|
|
120
|
+
"OIDC_OP_TOKEN_ENDPOINT",
|
|
121
|
+
f"{KEYCLOAK_BASE_URL}/realms/{KEYCLOAK_REALM}/protocol/openid-connect/token",
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# UserInfo endpoint (optional user profile; some backends call this after login)
|
|
125
|
+
OIDC_OP_USER_ENDPOINT = env_str(
|
|
126
|
+
"OIDC_OP_USER_ENDPOINT",
|
|
127
|
+
f"{KEYCLOAK_BASE_URL}/realms/{KEYCLOAK_REALM}/protocol/openid-connect/userinfo",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# JWKS endpoint (public keys used to verify signatures on ID/Access tokens)
|
|
131
|
+
OIDC_OP_JWKS_ENDPOINT = env_str(
|
|
132
|
+
"OIDC_OP_JWKS_ENDPOINT",
|
|
133
|
+
f"{KEYCLOAK_BASE_URL}/realms/{KEYCLOAK_REALM}/protocol/openid-connect/certs",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# -----------------------------
|
|
137
|
+
# TOKEN FORMAT / SCOPES
|
|
138
|
+
# -----------------------------
|
|
139
|
+
|
|
140
|
+
# Scopes requested at login. "openid" is required by OIDC; "email" and "profile" give you email/name claims.
|
|
141
|
+
OIDC_RP_SCOPES = env_str("OIDC_RP_SCOPES", "openid email profile")
|
|
142
|
+
|
|
143
|
+
# Algorithm used by Keycloak to sign ID tokens. Keycloak defaults to RS256.
|
|
144
|
+
# This must match the provider, otherwise mozilla-django-oidc will reject the token.
|
|
145
|
+
OIDC_RP_SIGN_ALGO = env_str("OIDC_RP_SIGN_ALGO", "RS256")
|
|
146
|
+
|
|
147
|
+
# -----------------------------
|
|
148
|
+
# LOGOUT (RP-INITIATED) SETTINGS
|
|
149
|
+
# -----------------------------
|
|
150
|
+
|
|
151
|
+
# Keycloak endpoint to terminate the SSO session server-side (RP-initiated logout).
|
|
152
|
+
# mozilla-django-oidc will call this if OIDC_STORE_ID_TOKEN=True and you POST to /oidc/logout/.
|
|
153
|
+
OIDC_OP_LOGOUT_ENDPOINT = env_str(
|
|
154
|
+
"OIDC_OP_LOGOUT_ENDPOINT",
|
|
155
|
+
f"{KEYCLOAK_BASE_URL}/realms/{KEYCLOAK_REALM}/protocol/openid-connect/logout",
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# Store the ID token in the Django session so it can be sent to Keycloak during RP-initiated logout.
|
|
159
|
+
OIDC_STORE_ID_TOKEN = env_bool("OIDC_STORE_ID_TOKEN", True)
|
|
160
|
+
|
|
161
|
+
# Where to redirect the browser after OIDC logout completes.
|
|
162
|
+
OIDC_LOGOUT_REDIRECT_URL = env_str("OIDC_LOGOUT_REDIRECT_URL", "/")
|
|
163
|
+
|
|
164
|
+
# -----------------------------
|
|
165
|
+
# DEV SWITCH: FORCE LOGIN PROMPT
|
|
166
|
+
# -----------------------------
|
|
167
|
+
|
|
168
|
+
# For development/testing: force Keycloak to show the login screen every time (disable silent SSO).
|
|
169
|
+
# This is extremely useful when switching between test users frequently.
|
|
170
|
+
# You can strengthen it further with {"prompt": "login", "max_age": "0"} to force re-auth on every request.
|
|
171
|
+
OIDC_AUTH_REQUEST_EXTRA_PARAMS = {"prompt": "login"}
|
|
172
|
+
|
|
173
|
+
# -----------------------------
|
|
174
|
+
# (Optional) Handy URL:
|
|
175
|
+
# Keycloak user account page for manual sign-out / session checks:
|
|
176
|
+
# https://keycloak.endo-reg.net/realms/EndoregDb/account
|
|
177
|
+
# -----------------------------
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from .base import * # noqa: F401,F403
|
|
4
|
+
from .base import BASE_DIR
|
|
5
|
+
from endoreg_db.config.env import env_bool, env_str
|
|
6
|
+
|
|
7
|
+
DEBUG = env_bool("DJANGO_DEBUG", False)
|
|
8
|
+
SECRET_KEY = env_str("DJANGO_SECRET_KEY")
|
|
9
|
+
pytest_active = "PYTEST_CURRENT_TEST" in os.environ
|
|
10
|
+
if not SECRET_KEY:
|
|
11
|
+
if pytest_active:
|
|
12
|
+
SECRET_KEY = "test-secret-key"
|
|
13
|
+
else:
|
|
14
|
+
raise ValueError("DJANGO_SECRET_KEY environment variable must be set in production")
|
|
15
|
+
ALLOWED_HOSTS = [h for h in env_str("DJANGO_ALLOWED_HOSTS", "").split(",") if h]
|
|
16
|
+
if not ALLOWED_HOSTS:
|
|
17
|
+
if pytest_active:
|
|
18
|
+
ALLOWED_HOSTS = ["*"]
|
|
19
|
+
else:
|
|
20
|
+
raise ValueError(
|
|
21
|
+
"DJANGO_ALLOWED_HOSTS must be set in production (comma-separated list of allowed hosts)"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Require explicit DB engine in production (no default to SQLite)
|
|
25
|
+
DB_ENGINE = env_str("DB_ENGINE")
|
|
26
|
+
if not DB_ENGINE:
|
|
27
|
+
if pytest_active:
|
|
28
|
+
DB_ENGINE = "django.db.backends.sqlite3"
|
|
29
|
+
else:
|
|
30
|
+
raise ValueError("DB_ENGINE must be set in production")
|
|
31
|
+
|
|
32
|
+
# For non-sqlite engines, require DB_NAME; for sqlite, allow default to a file under BASE_DIR
|
|
33
|
+
if DB_ENGINE.endswith("sqlite3"):
|
|
34
|
+
DB_NAME = env_str("DB_NAME", str(BASE_DIR / "prod_sim_db.sqlite3"))
|
|
35
|
+
else:
|
|
36
|
+
DB_NAME = env_str("DB_NAME")
|
|
37
|
+
if not DB_NAME:
|
|
38
|
+
raise ValueError("DB_NAME must be set when using a non-sqlite database engine in production")
|
|
39
|
+
|
|
40
|
+
# Optional credentials/connection params (only include if provided)
|
|
41
|
+
DB_USER = env_str("DB_USER", "")
|
|
42
|
+
DB_PASSWORD = env_str("DB_PASSWORD", "")
|
|
43
|
+
DB_HOST = env_str("DB_HOST", "")
|
|
44
|
+
DB_PORT = env_str("DB_PORT", "")
|
|
45
|
+
|
|
46
|
+
_db_config = {
|
|
47
|
+
"ENGINE": DB_ENGINE,
|
|
48
|
+
"NAME": DB_NAME,
|
|
49
|
+
}
|
|
50
|
+
if not DB_ENGINE.endswith("sqlite3"):
|
|
51
|
+
if DB_USER:
|
|
52
|
+
_db_config["USER"] = DB_USER
|
|
53
|
+
if DB_PASSWORD:
|
|
54
|
+
_db_config["PASSWORD"] = DB_PASSWORD
|
|
55
|
+
if DB_HOST:
|
|
56
|
+
_db_config["HOST"] = DB_HOST
|
|
57
|
+
if DB_PORT:
|
|
58
|
+
_db_config["PORT"] = DB_PORT
|
|
59
|
+
|
|
60
|
+
DATABASES = {"default": _db_config}
|
|
61
|
+
|
|
62
|
+
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
|
|
63
|
+
# Enforce HTTPS by default in production. Override via env only with strong justification.
|
|
64
|
+
SECURE_SSL_REDIRECT = env_bool("SECURE_SSL_REDIRECT", True)
|
|
65
|
+
SESSION_COOKIE_SECURE = env_bool("SESSION_COOKIE_SECURE", True)
|
|
66
|
+
CSRF_COOKIE_SECURE = env_bool("CSRF_COOKIE_SECURE", True)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from endoreg_db.config.env import env_bool, env_str
|
|
4
|
+
|
|
5
|
+
from .base import * # noqa: F401,F403
|
|
6
|
+
from .base import BASE_DIR
|
|
7
|
+
|
|
8
|
+
# Persistent test DB
|
|
9
|
+
DEFAULT_TEST_DB_PATH = BASE_DIR / "data" / "tests" / "db" / "test_db.sqlite3"
|
|
10
|
+
TEST_DB_FILE = Path(env_str("TEST_DB_FILE", str(DEFAULT_TEST_DB_PATH)))
|
|
11
|
+
TEST_DB_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
12
|
+
|
|
13
|
+
DEBUG = env_bool("DJANGO_DEBUG", True)
|
|
14
|
+
SECRET_KEY = env_str("DJANGO_SECRET_KEY", "test-insecure-key")
|
|
15
|
+
ALLOWED_HOSTS = env_str("DJANGO_ALLOWED_HOSTS", "*").split(",")
|
|
16
|
+
|
|
17
|
+
DB_ENGINE = env_str("TEST_DB_ENGINE", "django.db.backends.sqlite3")
|
|
18
|
+
DB_NAME = env_str("TEST_DB_NAME", str(TEST_DB_FILE))
|
|
19
|
+
DB_USER = env_str("TEST_DB_USER", "")
|
|
20
|
+
DB_PASSWORD = env_str("TEST_DB_PASSWORD", "")
|
|
21
|
+
DB_HOST = env_str("TEST_DB_HOST", "")
|
|
22
|
+
DB_PORT = env_str("TEST_DB_PORT", "")
|
|
23
|
+
|
|
24
|
+
# Build DB config without redundant conditionals and avoid passing empty creds
|
|
25
|
+
_db_config = {
|
|
26
|
+
"ENGINE": DB_ENGINE,
|
|
27
|
+
"NAME": DB_NAME,
|
|
28
|
+
}
|
|
29
|
+
if not DB_ENGINE.endswith("sqlite3"):
|
|
30
|
+
if DB_USER:
|
|
31
|
+
_db_config["USER"] = DB_USER
|
|
32
|
+
if DB_PASSWORD:
|
|
33
|
+
_db_config["PASSWORD"] = DB_PASSWORD
|
|
34
|
+
if DB_HOST:
|
|
35
|
+
_db_config["HOST"] = DB_HOST
|
|
36
|
+
if DB_PORT:
|
|
37
|
+
_db_config["PORT"] = DB_PORT
|
|
38
|
+
|
|
39
|
+
DATABASES = {"default": _db_config}
|
|
40
|
+
|
|
41
|
+
# Configure cache with explicit TIMEOUT for tests
|
|
42
|
+
CACHES = {
|
|
43
|
+
"default": {
|
|
44
|
+
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
45
|
+
"LOCATION": "endoreg-test-cache",
|
|
46
|
+
"TIMEOUT": int(env_str("TEST_CACHE_TIMEOUT", str(60 * 30))),
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Faster password hashing
|
|
51
|
+
PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"]
|
|
52
|
+
|
|
53
|
+
# Toggle migrations via env
|
|
54
|
+
if env_str("TEST_DISABLE_MIGRATIONS", "false").lower() == "true":
|
|
55
|
+
|
|
56
|
+
class DisableMigrations:
|
|
57
|
+
def __contains__(self, item):
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
def __getitem__(self, item):
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
#MIGRATION_MODULES = DisableMigrations()
|
|
64
|
+
|
|
65
|
+
INSTALLED_APPS = [
|
|
66
|
+
"django.contrib.admin",
|
|
67
|
+
"django.contrib.auth",
|
|
68
|
+
"django.contrib.contenttypes",
|
|
69
|
+
"django.contrib.sessions",
|
|
70
|
+
"django.contrib.messages",
|
|
71
|
+
"endoreg_db",
|
|
72
|
+
]
|