endoreg-db 0.8.6.1__py3-none-any.whl → 0.8.8.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/authz/auth.py +74 -0
- endoreg_db/authz/backends.py +168 -0
- endoreg_db/authz/management/commands/list_routes.py +18 -0
- endoreg_db/authz/middleware.py +83 -0
- endoreg_db/authz/permissions.py +127 -0
- endoreg_db/authz/policy.py +218 -0
- endoreg_db/authz/views_auth.py +66 -0
- endoreg_db/config/env.py +13 -8
- endoreg_db/data/__init__.py +2 -11
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +3 -3
- 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 +114 -14
- endoreg_db/data/examination/time-type/data.yaml +0 -3
- endoreg_db/data/examination_indication/endoscopy.yaml +108 -173
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +0 -70
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +33 -37
- 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/{yes_no_na.yaml → 00_generic.yaml} +5 -1
- endoreg_db/data/finding_classification_choice/{examination_setting_generic_types.yaml → 00_generic_baseline.yaml} +10 -2
- endoreg_db/data/finding_classification_choice/{complication_generic_types.yaml → 00_generic_complication.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology.yaml → 00_generic_histology.yaml} +1 -4
- endoreg_db/data/finding_classification_choice/00_generic_lesion.yaml +158 -0
- endoreg_db/data/finding_classification_choice/{bowel_preparation.yaml → 02_colonoscopy_bowel_preparation.yaml} +1 -30
- endoreg_db/data/finding_classification_choice/{colonoscopy_not_complete_reason.yaml → 02_colonoscopy_generic.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{histology_polyp.yaml → 02_colonoscopy_histology.yaml} +1 -1
- endoreg_db/data/finding_classification_choice/{colonoscopy_location.yaml → 02_colonoscopy_location.yaml} +23 -4
- 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/{colon_lesion_paris.yaml → 02_colonoscopy_polyp_morphology.yaml} +26 -8
- endoreg_db/data/finding_classification_choice/02_colonoscopy_size.yaml +27 -0
- endoreg_db/data/finding_classification_type/{colonoscopy_basic.yaml → 00_generic.yaml} +18 -13
- 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_type/data.yaml +8 -12
- 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/coloreg_colon_polyp.yaml +49 -0
- endoreg_db/data/requirement_operator/new_operators.yaml +36 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +29 -12
- endoreg_db/data/requirement_set/01_laboratory.yaml +13 -0
- endoreg_db/data/requirement_set/{endoscopy_bleeding_risk.yaml → 02_endoscopy_bleeding_risk.yaml} +0 -6
- endoreg_db/data/requirement_set/90_coloreg.yaml +190 -0
- endoreg_db/data/requirement_set/_old_ +109 -0
- endoreg_db/data/requirement_set_type/data.yaml +21 -0
- endoreg_db/data/setup_config.yaml +4 -4
- endoreg_db/data/tag/requirement_set_tags.yaml +21 -0
- endoreg_db/exceptions.py +4 -2
- endoreg_db/forms/examination_form.py +1 -1
- endoreg_db/helpers/data_loader.py +125 -53
- endoreg_db/helpers/default_objects.py +116 -81
- 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 +81 -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 +43 -0
- endoreg_db/import_files/context/validate_directories.py +56 -0
- endoreg_db/import_files/file_storage/__init__.py +15 -0
- endoreg_db/import_files/file_storage/create_report_file.py +76 -0
- endoreg_db/import_files/file_storage/create_video_file.py +75 -0
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +39 -0
- endoreg_db/import_files/file_storage/state_management.py +400 -0
- endoreg_db/import_files/file_storage/storage.py +36 -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 +94 -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/processing/video_processing/video_cleanup_on_error.py +119 -0
- endoreg_db/import_files/pseudonymization/fake.py +52 -0
- endoreg_db/import_files/pseudonymization/k_anonymity.py +182 -0
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +128 -0
- endoreg_db/import_files/report_import_service.py +141 -0
- endoreg_db/import_files/video_import_service.py +150 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +21 -10
- endoreg_db/management/commands/create_multilabel_model_meta.py +299 -129
- endoreg_db/management/commands/import_report.py +130 -65
- endoreg_db/management/commands/import_video.py +9 -10
- endoreg_db/management/commands/import_video_with_classification.py +2 -2
- endoreg_db/management/commands/list_routes.py +18 -0
- endoreg_db/management/commands/load_ai_model_data.py +5 -5
- endoreg_db/management/commands/load_ai_model_label_data.py +9 -7
- endoreg_db/management/commands/load_base_db_data.py +5 -134
- endoreg_db/management/commands/load_center_data.py +12 -12
- endoreg_db/management/commands/load_contraindication_data.py +14 -16
- endoreg_db/management/commands/load_disease_classification_choices_data.py +15 -18
- endoreg_db/management/commands/load_disease_classification_data.py +15 -18
- endoreg_db/management/commands/load_disease_data.py +25 -28
- endoreg_db/management/commands/load_endoscope_data.py +20 -27
- endoreg_db/management/commands/load_event_data.py +14 -16
- endoreg_db/management/commands/load_examination_data.py +31 -44
- endoreg_db/management/commands/load_examination_indication_data.py +20 -21
- endoreg_db/management/commands/load_finding_data.py +52 -80
- endoreg_db/management/commands/load_information_source.py +21 -23
- endoreg_db/management/commands/load_lab_value_data.py +17 -26
- endoreg_db/management/commands/load_medication_data.py +13 -12
- endoreg_db/management/commands/load_organ_data.py +15 -19
- endoreg_db/management/commands/load_pdf_type_data.py +19 -18
- endoreg_db/management/commands/load_profession_data.py +14 -17
- endoreg_db/management/commands/load_qualification_data.py +20 -23
- endoreg_db/management/commands/load_report_reader_flag_data.py +17 -19
- endoreg_db/management/commands/load_requirement_data.py +62 -39
- endoreg_db/management/commands/load_requirement_set_tags.py +95 -0
- endoreg_db/management/commands/load_risk_data.py +7 -6
- endoreg_db/management/commands/load_shift_data.py +20 -23
- endoreg_db/management/commands/load_tag_data.py +8 -11
- endoreg_db/management/commands/load_unit_data.py +17 -19
- endoreg_db/management/commands/setup_endoreg_db.py +3 -3
- endoreg_db/management/commands/start_filewatcher.py +46 -37
- endoreg_db/management/commands/storage_management.py +271 -203
- endoreg_db/management/commands/validate_video_files.py +1 -5
- endoreg_db/migrations/0001_initial.py +297 -250
- endoreg_db/models/__init__.py +78 -123
- endoreg_db/models/administration/__init__.py +21 -42
- endoreg_db/models/administration/ai/active_model.py +2 -2
- endoreg_db/models/administration/ai/ai_model.py +7 -6
- endoreg_db/models/administration/case/__init__.py +1 -15
- endoreg_db/models/administration/case/case.py +3 -3
- endoreg_db/models/administration/case/case_template/__init__.py +2 -14
- endoreg_db/models/administration/case/case_template/case_template.py +2 -124
- endoreg_db/models/administration/case/case_template/case_template_rule.py +2 -268
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +2 -85
- endoreg_db/models/administration/case/case_template/case_template_type.py +2 -25
- endoreg_db/models/administration/center/center.py +33 -19
- endoreg_db/models/administration/center/center_product.py +12 -9
- endoreg_db/models/administration/center/center_resource.py +25 -19
- endoreg_db/models/administration/center/center_shift.py +21 -17
- endoreg_db/models/administration/center/center_waste.py +16 -8
- endoreg_db/models/administration/person/__init__.py +2 -0
- endoreg_db/models/administration/person/employee/employee.py +10 -5
- endoreg_db/models/administration/person/employee/employee_qualification.py +9 -4
- endoreg_db/models/administration/person/employee/employee_type.py +12 -6
- endoreg_db/models/administration/person/examiner/examiner.py +13 -11
- endoreg_db/models/administration/person/patient/__init__.py +2 -0
- endoreg_db/models/administration/person/patient/patient.py +129 -100
- endoreg_db/models/administration/person/patient/patient_external_id.py +37 -0
- endoreg_db/models/administration/person/person.py +4 -0
- endoreg_db/models/administration/person/profession/__init__.py +8 -4
- endoreg_db/models/administration/person/user/portal_user_information.py +11 -7
- endoreg_db/models/administration/product/product.py +20 -15
- endoreg_db/models/administration/product/product_material.py +17 -18
- endoreg_db/models/administration/product/product_weight.py +12 -8
- endoreg_db/models/administration/product/reference_product.py +23 -55
- endoreg_db/models/administration/qualification/qualification.py +7 -3
- endoreg_db/models/administration/qualification/qualification_type.py +7 -3
- endoreg_db/models/administration/shift/scheduled_days.py +8 -5
- endoreg_db/models/administration/shift/shift.py +16 -12
- endoreg_db/models/administration/shift/shift_type.py +23 -31
- endoreg_db/models/label/__init__.py +8 -9
- endoreg_db/models/label/annotation/image_classification.py +10 -9
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +23 -28
- endoreg_db/models/label/label.py +15 -15
- endoreg_db/models/label/label_set.py +19 -6
- endoreg_db/models/label/label_type.py +1 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +5 -8
- endoreg_db/models/label/label_video_segment/label_video_segment.py +98 -102
- endoreg_db/models/label/video_segmentation_label.py +4 -0
- endoreg_db/models/label/video_segmentation_labelset.py +4 -3
- endoreg_db/models/media/frame/frame.py +22 -22
- endoreg_db/models/media/pdf/raw_pdf.py +194 -194
- endoreg_db/models/media/pdf/report_file.py +25 -29
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +55 -47
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +23 -7
- endoreg_db/models/media/processing_history/__init__.py +5 -0
- endoreg_db/models/media/processing_history/processing_history.py +96 -0
- endoreg_db/models/media/video/__init__.py +1 -0
- endoreg_db/models/media/video/create_from_file.py +139 -77
- endoreg_db/models/media/video/pipe_2.py +8 -9
- endoreg_db/models/media/video/video_file.py +174 -112
- endoreg_db/models/media/video/video_file_ai.py +288 -74
- endoreg_db/models/media/video/video_file_anonymize.py +38 -38
- endoreg_db/models/media/video/video_file_frames/__init__.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +7 -9
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +9 -8
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +38 -45
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +4 -18
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +7 -6
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +6 -8
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +15 -25
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +26 -23
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +23 -14
- endoreg_db/models/media/video/video_file_io.py +113 -61
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +3 -3
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +5 -3
- endoreg_db/models/media/video/video_file_meta/get_fps.py +37 -34
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +19 -25
- endoreg_db/models/media/video/video_file_meta/text_meta.py +41 -38
- endoreg_db/models/media/video/video_file_meta/video_meta.py +14 -7
- endoreg_db/models/media/video/video_file_segments.py +24 -17
- endoreg_db/models/media/video/video_metadata.py +19 -35
- endoreg_db/models/media/video/video_processing.py +96 -95
- endoreg_db/models/medical/contraindication/README.md +1 -0
- endoreg_db/models/medical/contraindication/__init__.py +13 -3
- endoreg_db/models/medical/disease.py +22 -16
- endoreg_db/models/medical/event.py +31 -18
- endoreg_db/models/medical/examination/__init__.py +13 -6
- endoreg_db/models/medical/examination/examination.py +39 -20
- endoreg_db/models/medical/examination/examination_indication.py +30 -95
- endoreg_db/models/medical/examination/examination_time.py +23 -8
- endoreg_db/models/medical/examination/examination_time_type.py +9 -6
- endoreg_db/models/medical/examination/examination_type.py +3 -4
- endoreg_db/models/medical/finding/finding.py +32 -40
- endoreg_db/models/medical/finding/finding_classification.py +42 -72
- endoreg_db/models/medical/finding/finding_intervention.py +25 -22
- endoreg_db/models/medical/finding/finding_type.py +13 -12
- endoreg_db/models/medical/hardware/endoscope.py +26 -26
- endoreg_db/models/medical/hardware/endoscopy_processor.py +2 -2
- endoreg_db/models/medical/laboratory/lab_value.py +62 -91
- endoreg_db/models/medical/medication/medication.py +22 -10
- endoreg_db/models/medical/medication/medication_indication.py +29 -3
- endoreg_db/models/medical/medication/medication_indication_type.py +25 -14
- endoreg_db/models/medical/medication/medication_intake_time.py +31 -19
- endoreg_db/models/medical/medication/medication_schedule.py +27 -16
- endoreg_db/models/medical/organ/__init__.py +15 -12
- endoreg_db/models/medical/patient/medication_examples.py +6 -6
- endoreg_db/models/medical/patient/patient_disease.py +20 -23
- endoreg_db/models/medical/patient/patient_event.py +19 -22
- endoreg_db/models/medical/patient/patient_examination.py +48 -54
- endoreg_db/models/medical/patient/patient_examination_indication.py +16 -14
- endoreg_db/models/medical/patient/patient_finding.py +122 -139
- endoreg_db/models/medical/patient/patient_finding_classification.py +44 -49
- endoreg_db/models/medical/patient/patient_finding_intervention.py +8 -19
- endoreg_db/models/medical/patient/patient_lab_sample.py +28 -23
- endoreg_db/models/medical/patient/patient_lab_value.py +82 -89
- endoreg_db/models/medical/patient/patient_medication.py +27 -38
- endoreg_db/models/medical/patient/patient_medication_schedule.py +28 -36
- endoreg_db/models/medical/risk/risk.py +7 -6
- endoreg_db/models/medical/risk/risk_type.py +8 -5
- endoreg_db/models/metadata/model_meta.py +60 -29
- endoreg_db/models/metadata/model_meta_logic.py +125 -18
- endoreg_db/models/metadata/pdf_meta.py +31 -24
- endoreg_db/models/metadata/sensitive_meta.py +105 -85
- endoreg_db/models/metadata/sensitive_meta_logic.py +198 -103
- endoreg_db/models/metadata/video_meta.py +51 -31
- endoreg_db/models/metadata/video_prediction_logic.py +16 -23
- endoreg_db/models/metadata/video_prediction_meta.py +29 -33
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -29
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +21 -5
- endoreg_db/models/other/distribution/numeric_value_distribution.py +114 -53
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +4 -3
- endoreg_db/models/other/emission/emission_factor.py +18 -8
- endoreg_db/models/other/gender.py +10 -5
- endoreg_db/models/other/information_source.py +50 -29
- endoreg_db/models/other/material.py +9 -5
- endoreg_db/models/other/resource.py +6 -4
- endoreg_db/models/other/tag.py +10 -5
- endoreg_db/models/other/transport_route.py +13 -8
- endoreg_db/models/other/unit.py +10 -6
- endoreg_db/models/other/waste.py +6 -5
- endoreg_db/models/report/report.py +6 -0
- endoreg_db/models/requirement/requirement.py +329 -361
- endoreg_db/models/requirement/requirement_error.py +85 -0
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +268 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +3 -6
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +90 -64
- endoreg_db/models/requirement/requirement_operator.py +103 -112
- endoreg_db/models/requirement/requirement_set.py +74 -57
- endoreg_db/models/state/__init__.py +4 -4
- endoreg_db/models/state/abstract.py +2 -2
- endoreg_db/models/state/anonymization.py +12 -0
- endoreg_db/models/state/audit_ledger.py +49 -51
- endoreg_db/models/state/label_video_segment.py +9 -0
- endoreg_db/models/state/raw_pdf.py +101 -68
- endoreg_db/models/state/sensitive_meta.py +6 -2
- endoreg_db/models/state/video.py +110 -90
- endoreg_db/models/upload_job.py +35 -34
- endoreg_db/models/utils.py +28 -25
- endoreg_db/queries/__init__.py +3 -1
- endoreg_db/root_urls.py +21 -2
- endoreg_db/schemas/examination_evaluation.py +1 -1
- endoreg_db/serializers/__init__.py +2 -10
- endoreg_db/serializers/anonymization.py +18 -10
- endoreg_db/serializers/label_video_segment/label_video_segment.py +2 -29
- endoreg_db/serializers/meta/__init__.py +1 -6
- endoreg_db/serializers/meta/sensitive_meta_detail.py +63 -118
- endoreg_db/serializers/misc/file_overview.py +11 -99
- endoreg_db/serializers/misc/sensitive_patient_data.py +50 -26
- endoreg_db/serializers/patient_examination/patient_examination.py +3 -3
- endoreg_db/serializers/pdf/anony_text_validation.py +39 -23
- endoreg_db/serializers/requirements/requirement_sets.py +92 -22
- endoreg_db/serializers/video/segmentation.py +2 -1
- endoreg_db/serializers/video/video_file_list.py +65 -34
- endoreg_db/serializers/video/video_processing_history.py +20 -5
- endoreg_db/services/__old/pdf_import.py +1487 -0
- endoreg_db/services/__old/video_import.py +1306 -0
- endoreg_db/services/anonymization.py +128 -89
- endoreg_db/services/lookup_service.py +65 -52
- endoreg_db/services/lookup_store.py +2 -2
- endoreg_db/services/pdf_import.py +0 -1382
- endoreg_db/services/report_import.py +10 -0
- endoreg_db/services/video_import.py +6 -1255
- endoreg_db/tasks/upload_tasks.py +79 -70
- endoreg_db/tasks/video_ingest.py +8 -4
- endoreg_db/urls/__init__.py +5 -32
- endoreg_db/urls/ai.py +32 -0
- endoreg_db/urls/media.py +121 -83
- endoreg_db/urls/root_urls.py +29 -0
- endoreg_db/utils/__init__.py +15 -5
- endoreg_db/utils/ai/multilabel_classification_net.py +116 -20
- endoreg_db/utils/case_generator/__init__.py +3 -0
- endoreg_db/utils/dataloader.py +142 -40
- endoreg_db/utils/defaults/set_default_center.py +32 -0
- endoreg_db/utils/names.py +22 -16
- endoreg_db/utils/paths.py +110 -46
- endoreg_db/utils/permissions.py +2 -1
- endoreg_db/utils/pipelines/Readme.md +1 -1
- endoreg_db/utils/pipelines/process_video_dir.py +1 -1
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +655 -0
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +97 -0
- endoreg_db/utils/setup_config.py +8 -5
- endoreg_db/utils/storage.py +115 -0
- endoreg_db/utils/validate_endo_roi.py +8 -2
- endoreg_db/utils/video/ffmpeg_wrapper.py +184 -188
- endoreg_db/views/__init__.py +85 -183
- endoreg_db/views/ai/__init__.py +8 -0
- endoreg_db/views/ai/label.py +155 -0
- endoreg_db/views/anonymization/media_management.py +202 -166
- endoreg_db/views/anonymization/overview.py +99 -67
- endoreg_db/views/anonymization/validate.py +182 -44
- endoreg_db/views/media/__init__.py +7 -20
- endoreg_db/views/media/pdf_media.py +197 -174
- endoreg_db/views/media/sensitive_metadata.py +193 -138
- endoreg_db/views/media/video_media.py +89 -82
- endoreg_db/views/meta/__init__.py +0 -8
- endoreg_db/views/misc/__init__.py +1 -7
- endoreg_db/views/misc/upload_views.py +94 -93
- endoreg_db/views/patient/patient.py +5 -4
- endoreg_db/views/report/__init__.py +5 -7
- endoreg_db/views/{pdf → report}/reimport.py +22 -22
- endoreg_db/views/{pdf/pdf_stream.py → report/report_stream.py} +46 -39
- endoreg_db/views/requirement/evaluate.py +188 -187
- endoreg_db/views/requirement/lookup.py +17 -3
- endoreg_db/views/requirement/lookup_store.py +22 -90
- endoreg_db/views/requirement/requirement_utils.py +89 -0
- endoreg_db/views/video/__init__.py +23 -24
- endoreg_db/views/video/correction.py +201 -172
- endoreg_db/views/video/reimport.py +1 -1
- endoreg_db/views/{media/video_segments.py → video/segments_crud.py} +77 -40
- endoreg_db/views/video/{video_meta.py → video_meta_stats.py} +2 -2
- endoreg_db/views/video/video_stream.py +7 -8
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/METADATA +7 -3
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/RECORD +391 -413
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/WHEEL +1 -1
- endoreg_db/data/finding/anatomy_colon.yaml +0 -128
- endoreg_db/data/finding/colonoscopy.yaml +0 -40
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +0 -56
- endoreg_db/data/finding/complication.yaml +0 -16
- endoreg_db/data/finding/data.yaml +0 -105
- endoreg_db/data/finding/examination_setting.yaml +0 -16
- endoreg_db/data/finding/medication_related.yaml +0 -18
- endoreg_db/data/finding/outcome.yaml +0 -12
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +0 -95
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +0 -25
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +0 -24
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +0 -68
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +0 -80
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +0 -21
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +0 -20
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +0 -26
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +0 -22
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +0 -53
- endoreg_db/data/finding_classification/complication_generic.yaml +0 -25
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +0 -40
- endoreg_db/data/finding_classification/histology_colo.yaml +0 -51
- endoreg_db/data/finding_classification/intervention_required.yaml +0 -26
- endoreg_db/data/finding_classification/medication_related.yaml +0 -23
- endoreg_db/data/finding_classification/visualized.yaml +0 -33
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +0 -32
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +0 -23
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +0 -15
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +0 -17
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +0 -49
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +0 -14
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +0 -36
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +0 -82
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +0 -15
- endoreg_db/data/finding_classification_choice/outcome.yaml +0 -19
- endoreg_db/data/finding_intervention/endoscopy.yaml +0 -43
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +0 -168
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +0 -128
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +0 -32
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +0 -9
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +0 -36
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +0 -79
- endoreg_db/data/requirement/age.yaml +0 -26
- endoreg_db/data/requirement/gender.yaml +0 -25
- endoreg_db/management/commands/init_default_ai_model.py +0 -112
- endoreg_db/management/commands/reset_celery_schedule.py +0 -9
- endoreg_db/management/commands/validate_video.py +0 -204
- endoreg_db/migrations/0002_add_video_correction_models.py +0 -52
- endoreg_db/migrations/0003_add_center_display_name.py +0 -30
- endoreg_db/models/administration/permissions/__init__.py +0 -44
- endoreg_db/models/rule/__init__.py +0 -13
- endoreg_db/models/rule/rule.py +0 -27
- endoreg_db/models/rule/rule_applicator.py +0 -224
- endoreg_db/models/rule/rule_attribute_dtype.py +0 -17
- endoreg_db/models/rule/rule_type.py +0 -20
- endoreg_db/models/rule/ruleset.py +0 -17
- endoreg_db/renames.yml +0 -8
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +0 -223
- endoreg_db/serializers/_old/raw_video_meta_validation.py +0 -179
- endoreg_db/serializers/_old/video.py +0 -71
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +0 -115
- endoreg_db/serializers/meta/report_meta.py +0 -53
- endoreg_db/serializers/report/__init__.py +0 -9
- endoreg_db/serializers/report/mixins.py +0 -45
- endoreg_db/serializers/report/report.py +0 -105
- endoreg_db/serializers/report/report_list.py +0 -22
- endoreg_db/serializers/report/secure_file_url.py +0 -26
- endoreg_db/serializers/video/video_metadata.py +0 -105
- endoreg_db/services/requirements_object.py +0 -147
- endoreg_db/services/storage_aware_video_processor.py +0 -344
- endoreg_db/urls/files.py +0 -6
- endoreg_db/urls/label_video_segment_validate.py +0 -33
- endoreg_db/urls/label_video_segments.py +0 -46
- endoreg_db/urls/report.py +0 -48
- endoreg_db/urls/video.py +0 -61
- endoreg_db/utils/case_generator/case_generator.py +0 -159
- endoreg_db/utils/case_generator/utils.py +0 -30
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +0 -368
- endoreg_db/views/label/__init__.py +0 -5
- endoreg_db/views/label/label.py +0 -15
- endoreg_db/views/label_video_segment/__init__.py +0 -16
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +0 -44
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +0 -50
- endoreg_db/views/label_video_segment/label_video_segment.py +0 -77
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +0 -174
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +0 -73
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +0 -46
- endoreg_db/views/label_video_segment/validate.py +0 -226
- endoreg_db/views/media/segments.py +0 -71
- endoreg_db/views/meta/available_files_list.py +0 -146
- endoreg_db/views/meta/report_meta.py +0 -53
- endoreg_db/views/meta/sensitive_meta_detail.py +0 -148
- endoreg_db/views/misc/secure_file_serving_view.py +0 -80
- endoreg_db/views/misc/secure_file_url_view.py +0 -84
- endoreg_db/views/misc/secure_url_validate.py +0 -79
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +0 -164
- endoreg_db/views/patient_finding_location/__init__.py +0 -5
- endoreg_db/views/patient_finding_location/pfl_create.py +0 -70
- endoreg_db/views/patient_finding_morphology/__init__.py +0 -5
- endoreg_db/views/patient_finding_morphology/pfm_create.py +0 -70
- endoreg_db/views/pdf/__init__.py +0 -8
- endoreg_db/views/report/report_list.py +0 -112
- endoreg_db/views/report/report_with_secure_url.py +0 -28
- endoreg_db/views/report/start_examination.py +0 -7
- endoreg_db/views/video/segmentation.py +0 -274
- endoreg_db/views/video/task_status.py +0 -49
- endoreg_db/views/video/timeline.py +0 -46
- endoreg_db/views/video/video_analyze.py +0 -52
- endoreg_db/views.py +0 -0
- /endoreg_db/data/requirement/{colonoscopy_baseline_austria.yaml → old/colonoscopy_baseline_austria.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_cardiovascular.yaml → old/disease_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_classification_choice_cardiovascular.yaml → old/disease_classification_choice_cardiovascular.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_hepatology.yaml → old/disease_hepatology.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_misc.yaml → old/disease_misc.yaml} +0 -0
- /endoreg_db/data/requirement/{disease_renal.yaml → old/disease_renal.yaml} +0 -0
- /endoreg_db/data/requirement/{endoscopy_bleeding_risk.yaml → old/endoscopy_bleeding_risk.yaml} +0 -0
- /endoreg_db/data/requirement/{event_cardiology.yaml → old/event_cardiology.yaml} +0 -0
- /endoreg_db/data/requirement/{event_requirements.yaml → old/event_requirements.yaml} +0 -0
- /endoreg_db/data/requirement/{finding_colon_polyp.yaml → old/finding_colon_polyp.yaml} +0 -0
- /endoreg_db/{migrations/__init__.py → data/requirement/old/gender.yaml} +0 -0
- /endoreg_db/data/requirement/{lab_value.yaml → old/lab_value.yaml} +0 -0
- /endoreg_db/data/requirement/{medication.yaml → old/medication.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{age.yaml → _old/age.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{lab_operators.yaml → _old/lab_operators.yaml} +0 -0
- /endoreg_db/data/requirement_operator/{model_operators.yaml → _old/model_operators.yaml} +0 -0
- /endoreg_db/{models/media/video/refactor_plan.md → import_files/pseudonymization/__init__.py} +0 -0
- /endoreg_db/{models/media/video/video_file_frames.py → import_files/pseudonymization/pseudonymize.py} +0 -0
- /endoreg_db/models/{metadata/frame_ocr_result.py → report/__init__.py} +0 -0
- /endoreg_db/{urls/sensitive_meta.py → models/report/images.py} +0 -0
- /endoreg_db/utils/requirement_operator_logic/{lab_value_operators.py → _old/lab_value_operators.py} +0 -0
- {endoreg_db-0.8.6.1.dist-info → endoreg_db-0.8.8.9.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Django management command to initialize the default AI model with metadata.
|
|
3
|
-
This command ensures that a default AI model exists with proper ModelMeta records.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from django.core.management.base import BaseCommand
|
|
7
|
-
from django.core.management import call_command
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
#FIXME
|
|
10
|
-
from endoreg_db.data.ai_model_meta import (
|
|
11
|
-
default_multilabel_classification
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
from endoreg_db.models import AiModel
|
|
15
|
-
from endoreg_db.helpers.data_loader import (
|
|
16
|
-
load_ai_model_label_data,
|
|
17
|
-
load_ai_model_data,
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class Command(BaseCommand):
|
|
22
|
-
help = """
|
|
23
|
-
Initialize the default AI model with metadata.
|
|
24
|
-
This command ensures that the default segmentation model exists with proper ModelMeta records.
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
def add_arguments(self, parser):
|
|
28
|
-
"""
|
|
29
|
-
Adds the --force command-line argument to control metadata recreation.
|
|
30
|
-
|
|
31
|
-
The --force flag, when specified, forces the recreation of model metadata even if it already exists.
|
|
32
|
-
"""
|
|
33
|
-
parser.add_argument(
|
|
34
|
-
'--force',
|
|
35
|
-
action='store_true',
|
|
36
|
-
help='Force recreation of the model metadata even if it exists',
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
def handle(self, *args, **options):
|
|
40
|
-
"""
|
|
41
|
-
Initializes the default AI model and its metadata, creating or updating as needed.
|
|
42
|
-
|
|
43
|
-
Loads required AI model label and model data, ensures the presence of a default AI model, and creates associated model metadata if it does not already exist or if the `--force` flag is specified. Generates a dummy weights file if necessary and invokes the metadata creation command. Verifies successful creation and outputs status messages throughout the process.
|
|
44
|
-
"""
|
|
45
|
-
force = options.get('force', False)
|
|
46
|
-
default_multilabel_classification()
|
|
47
|
-
# First ensure the basic AI model data is loaded
|
|
48
|
-
self.stdout.write("Loading AI model label data...")
|
|
49
|
-
load_ai_model_label_data()
|
|
50
|
-
|
|
51
|
-
self.stdout.write("Loading AI model data...")
|
|
52
|
-
load_ai_model_data()
|
|
53
|
-
|
|
54
|
-
# Check if default model exists
|
|
55
|
-
default_model_name = "image_multilabel_classification_colonoscopy_default"
|
|
56
|
-
|
|
57
|
-
try:
|
|
58
|
-
ai_model = AiModel.objects.get(name=default_model_name)
|
|
59
|
-
self.stdout.write(f"Found AI model: {ai_model.name}")
|
|
60
|
-
except AiModel.DoesNotExist:
|
|
61
|
-
self.stdout.write(
|
|
62
|
-
self.style.ERROR(f"AI model '{default_model_name}' not found. Make sure AI model data is loaded.")
|
|
63
|
-
)
|
|
64
|
-
return
|
|
65
|
-
|
|
66
|
-
# Check if model metadata exists
|
|
67
|
-
existing_meta = ai_model.metadata_versions.first()
|
|
68
|
-
if existing_meta and not force:
|
|
69
|
-
self.stdout.write(
|
|
70
|
-
self.style.SUCCESS(f"Model metadata already exists for {ai_model.name}. Use --force to recreate.")
|
|
71
|
-
)
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
# Create default model metadata
|
|
75
|
-
self.stdout.write("Creating default model metadata...")
|
|
76
|
-
|
|
77
|
-
# Use a dummy weights file path for now - in production this should point to actual model weights
|
|
78
|
-
dummy_weights_path = Path(__file__).parent.parent.parent / "assets" / "dummy_model.ckpt"
|
|
79
|
-
|
|
80
|
-
# Create the dummy weights file if it doesn't exist
|
|
81
|
-
dummy_weights_path.parent.mkdir(parents=True, exist_ok=True)
|
|
82
|
-
if not dummy_weights_path.exists():
|
|
83
|
-
dummy_weights_path.write_bytes(b"dummy weights content")
|
|
84
|
-
self.stdout.write(f"Created dummy weights file at {dummy_weights_path}")
|
|
85
|
-
|
|
86
|
-
try:
|
|
87
|
-
# Create ModelMeta using the create_multilabel_model_meta command
|
|
88
|
-
call_command(
|
|
89
|
-
"create_multilabel_model_meta",
|
|
90
|
-
"--model_path", str(dummy_weights_path),
|
|
91
|
-
"--model_name", default_model_name,
|
|
92
|
-
"--image_classification_labelset_name", "multilabel_classification_colonoscopy",
|
|
93
|
-
"--activation_function_name", "sigmoid",
|
|
94
|
-
"--model_meta_version", "1",
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
self.stdout.write(
|
|
98
|
-
self.style.SUCCESS(f"Successfully created model metadata for {default_model_name}")
|
|
99
|
-
)
|
|
100
|
-
|
|
101
|
-
# Verify the model can be retrieved
|
|
102
|
-
from endoreg_db.helpers.default_objects import get_latest_segmentation_model
|
|
103
|
-
model_meta = get_latest_segmentation_model()
|
|
104
|
-
self.stdout.write(
|
|
105
|
-
self.style.SUCCESS(f"Verified: Model metadata can be retrieved: {model_meta}")
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
except Exception as e:
|
|
109
|
-
self.stdout.write(
|
|
110
|
-
self.style.ERROR(f"Failed to create model metadata: {e}")
|
|
111
|
-
)
|
|
112
|
-
raise
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
from django.core.management.base import BaseCommand
|
|
2
|
-
from django_celery_beat.models import PeriodicTask
|
|
3
|
-
|
|
4
|
-
class Command(BaseCommand):
|
|
5
|
-
help = 'Deletes all periodic tasks from the database to reset the schedule'
|
|
6
|
-
|
|
7
|
-
def handle(self, *args, **kwargs):
|
|
8
|
-
PeriodicTask.objects.all().delete()
|
|
9
|
-
self.stdout.write(self.style.SUCCESS('Successfully deleted all periodic tasks.'))
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
from django.core.management.base import BaseCommand
|
|
2
|
-
from endoreg_db.models import VideoFile
|
|
3
|
-
from endoreg_db.helpers.default_objects import get_latest_segmentation_model
|
|
4
|
-
from django.db.models import Q # Add this import
|
|
5
|
-
|
|
6
|
-
# VideoFile instances have a related 'state' (a VideoState object).
|
|
7
|
-
# VideoState uses boolean fields (e.g., state.anonymized, state.initial_prediction_completed)
|
|
8
|
-
# to track the processing status, rather than a single status field with choices.
|
|
9
|
-
# This command interprets combinations of these boolean fields to determine
|
|
10
|
-
# if a video is considered "validated" or "anonymized".
|
|
11
|
-
# The VideoState model itself is defined in endoreg_db/models/state/video.py (or similar)
|
|
12
|
-
# and does not contain an enum like the previously assumed 'VideoFileStateChoices'.
|
|
13
|
-
|
|
14
|
-
class Command(BaseCommand):
|
|
15
|
-
help = "Data extraction and validation of video files in the database and updating their states accordingly."
|
|
16
|
-
|
|
17
|
-
def add_arguments(self, parser):
|
|
18
|
-
"""
|
|
19
|
-
Adds command-line arguments for verbose output, forced revalidation, and anonymization.
|
|
20
|
-
|
|
21
|
-
This method configures the management command to accept optional flags:
|
|
22
|
-
--verbose for detailed output, --force to revalidate all videos regardless of status,
|
|
23
|
-
and --anonymize to anonymize video files during processing.
|
|
24
|
-
"""
|
|
25
|
-
parser.add_argument(
|
|
26
|
-
"--verbose",
|
|
27
|
-
action="store_true",
|
|
28
|
-
help="Display verbose output",
|
|
29
|
-
)
|
|
30
|
-
parser.add_argument(
|
|
31
|
-
"--force",
|
|
32
|
-
action="store_true",
|
|
33
|
-
help="Force revalidation of all video files, even if they are already validated.",
|
|
34
|
-
)
|
|
35
|
-
parser.add_argument(
|
|
36
|
-
"--anonymize",
|
|
37
|
-
action="store_true",
|
|
38
|
-
help="Anonymize video files.",
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
def handle(self, *args, **options):
|
|
42
|
-
"""
|
|
43
|
-
Validates video files stored in the database and updates their validation states.
|
|
44
|
-
|
|
45
|
-
This method processes video files according to the provided command-line options,
|
|
46
|
-
such as verbose output, forced revalidation, or anonymization.
|
|
47
|
-
It interprets the boolean flags in the related VideoState object to determine
|
|
48
|
-
if a video is 'validated' (e.g., initial_prediction_completed and lvs_created are True)
|
|
49
|
-
or 'anonymized' (e.g., anonymized is True).
|
|
50
|
-
"""
|
|
51
|
-
#TODO @maxhild here is some ai generated code for now, not validated yet
|
|
52
|
-
verbose = options["verbose"]
|
|
53
|
-
force = options["force"]
|
|
54
|
-
anonymize_option = options["anonymize"]
|
|
55
|
-
|
|
56
|
-
if verbose:
|
|
57
|
-
self.stdout.write(self.style.SUCCESS("Starting video validation and/or anonymization process..."))
|
|
58
|
-
|
|
59
|
-
# Eager load related state if VideoFile.state is a ForeignKey or OneToOneField
|
|
60
|
-
videos_query = VideoFile.objects.select_related('state').all()
|
|
61
|
-
|
|
62
|
-
# Define conditions for "validated" and "anonymized" based on VideoState boolean fields
|
|
63
|
-
# Validated: initial_prediction_completed = True AND lvs_created = True
|
|
64
|
-
q_validated = Q(state__initial_prediction_completed=True, state__lvs_created=True)
|
|
65
|
-
# Anonymized: anonymized = True
|
|
66
|
-
q_anonymized = Q(state__anonymized=True)
|
|
67
|
-
|
|
68
|
-
if not force:
|
|
69
|
-
if anonymize_option:
|
|
70
|
-
# If anonymization is the goal, process videos not yet anonymized.
|
|
71
|
-
videos_query = videos_query.exclude(q_anonymized)
|
|
72
|
-
else:
|
|
73
|
-
# If only validation is the goal, process videos not yet validated or anonymized.
|
|
74
|
-
videos_query = videos_query.exclude(q_validated | q_anonymized)
|
|
75
|
-
|
|
76
|
-
videos_to_process = list(videos_query)
|
|
77
|
-
|
|
78
|
-
if not videos_to_process:
|
|
79
|
-
if verbose:
|
|
80
|
-
self.stdout.write(self.style.SUCCESS("No videos found requiring processing with the current options."))
|
|
81
|
-
return
|
|
82
|
-
|
|
83
|
-
processed_count = 0
|
|
84
|
-
failed_count = 0
|
|
85
|
-
model_name_for_pipe1 = None
|
|
86
|
-
|
|
87
|
-
try:
|
|
88
|
-
# Attempt to get the model for pipe_1. This might be optional for pipe_1.
|
|
89
|
-
ai_model_meta = get_latest_segmentation_model()
|
|
90
|
-
model_name_for_pipe1 = ai_model_meta.model.name
|
|
91
|
-
if verbose:
|
|
92
|
-
self.stdout.write(self.style.SUCCESS(f"Using model '{model_name_for_pipe1}' for pipe_1 processing."))
|
|
93
|
-
except Exception as e:
|
|
94
|
-
self.stdout.write(self.style.WARNING(f"Could not retrieve segmentation model: {e}. pipe_1 might proceed without a specific model or use a default."))
|
|
95
|
-
# model_name_for_pipe1 can remain None if pipe_1 handles it, or set a default if known.
|
|
96
|
-
|
|
97
|
-
for video in videos_to_process:
|
|
98
|
-
state_summary = "N/A"
|
|
99
|
-
if hasattr(video, 'state') and video.state:
|
|
100
|
-
s = video.state
|
|
101
|
-
state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
102
|
-
|
|
103
|
-
if verbose:
|
|
104
|
-
self.stdout.write(f"Processing video: {video.uuid} (Current state: {state_summary})")
|
|
105
|
-
|
|
106
|
-
try:
|
|
107
|
-
# Determine if pipe_1 needs to run
|
|
108
|
-
needs_pipe_1 = force
|
|
109
|
-
if not force and hasattr(video, 'state') and video.state:
|
|
110
|
-
s = video.state
|
|
111
|
-
is_validated = s.initial_prediction_completed and s.lvs_created
|
|
112
|
-
is_anonymized = s.anonymized
|
|
113
|
-
if not (is_validated or is_anonymized):
|
|
114
|
-
needs_pipe_1 = True
|
|
115
|
-
elif not force: # No state object, assume it needs processing
|
|
116
|
-
needs_pipe_1 = True
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if needs_pipe_1:
|
|
120
|
-
if verbose:
|
|
121
|
-
self.stdout.write(f"Running pipe_1 for video {video.uuid} (force={force})...")
|
|
122
|
-
if not model_name_for_pipe1 and verbose:
|
|
123
|
-
self.stdout.write(self.style.WARNING(f"Attempting pipe_1 for {video.uuid} without a specific model name."))
|
|
124
|
-
|
|
125
|
-
success_pipe_1 = video.pipe_1(model_name=model_name_for_pipe1)
|
|
126
|
-
video.refresh_from_db()
|
|
127
|
-
|
|
128
|
-
new_state_summary = "N/A"
|
|
129
|
-
if hasattr(video, 'state') and video.state:
|
|
130
|
-
s = video.state
|
|
131
|
-
new_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
132
|
-
|
|
133
|
-
if not success_pipe_1:
|
|
134
|
-
raise Exception(f"pipe_1 validation failed for video {video.uuid}. State after attempt: {new_state_summary}")
|
|
135
|
-
|
|
136
|
-
if verbose:
|
|
137
|
-
self.stdout.write(self.style.SUCCESS(f"Video {video.uuid} successfully passed pipe_1. New state: {new_state_summary}"))
|
|
138
|
-
elif verbose:
|
|
139
|
-
self.stdout.write(f"Video {video.uuid} already meets validation criteria or is anonymized, skipping pipe_1 (force=False).")
|
|
140
|
-
|
|
141
|
-
# Anonymization step
|
|
142
|
-
if anonymize_option:
|
|
143
|
-
should_anonymize = False
|
|
144
|
-
current_state_summary_for_anonym = "N/A"
|
|
145
|
-
if hasattr(video, 'state') and video.state:
|
|
146
|
-
s = video.state
|
|
147
|
-
current_state_summary_for_anonym = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
148
|
-
is_validated_for_anonymization = s.initial_prediction_completed and s.lvs_created
|
|
149
|
-
is_currently_anonymized = s.anonymized
|
|
150
|
-
if force or (is_validated_for_anonymization and not is_currently_anonymized):
|
|
151
|
-
should_anonymize = True
|
|
152
|
-
elif force: # No state, but force anonymize
|
|
153
|
-
should_anonymize = True
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if should_anonymize:
|
|
157
|
-
if verbose:
|
|
158
|
-
self.stdout.write(f"Attempting to anonymize video: {video.uuid} (force={force}, current_state_before_anonym={current_state_summary_for_anonym}).")
|
|
159
|
-
|
|
160
|
-
if hasattr(video, 'anonymize_video_content'):
|
|
161
|
-
video.anonymize_video_content()
|
|
162
|
-
video.refresh_from_db()
|
|
163
|
-
else:
|
|
164
|
-
self.stdout.write(self.style.ERROR(f"Video model does not have 'anonymize_video_content' method. Skipping anonymization for {video.uuid}."))
|
|
165
|
-
# Potentially raise an error or handle as a failure
|
|
166
|
-
|
|
167
|
-
post_anonym_state_summary = "N/A"
|
|
168
|
-
is_now_anonymized = False
|
|
169
|
-
if hasattr(video, 'state') and video.state:
|
|
170
|
-
s = video.state
|
|
171
|
-
post_anonym_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
172
|
-
is_now_anonymized = s.anonymized
|
|
173
|
-
|
|
174
|
-
if is_now_anonymized:
|
|
175
|
-
if verbose:
|
|
176
|
-
self.stdout.write(self.style.SUCCESS(f"Video {video.uuid} successfully anonymized. New state: {post_anonym_state_summary}"))
|
|
177
|
-
else:
|
|
178
|
-
if hasattr(video, 'anonymize_video_content'): # Only raise if we attempted
|
|
179
|
-
raise Exception(f"Anonymization called but video is not marked as anonymized for video {video.uuid}. Current state: {post_anonym_state_summary}")
|
|
180
|
-
|
|
181
|
-
elif hasattr(video, 'state') and video.state and video.state.anonymized and verbose: # Already anonymized
|
|
182
|
-
self.stdout.write(f"Video {video.uuid} is already anonymized.")
|
|
183
|
-
elif verbose:
|
|
184
|
-
self.stdout.write(f"Skipping anonymization for video {video.uuid} (not validated for anonymization, or already anonymized and not forced).")
|
|
185
|
-
|
|
186
|
-
processed_count += 1
|
|
187
|
-
except Exception as e:
|
|
188
|
-
failed_count += 1
|
|
189
|
-
video.refresh_from_db()
|
|
190
|
-
error_state_summary = "N/A"
|
|
191
|
-
if hasattr(video, 'state') and video.state:
|
|
192
|
-
s = video.state
|
|
193
|
-
error_state_summary = f"anonymized={s.anonymized}, predicted={s.initial_prediction_completed}, lvs_created={s.lvs_created}"
|
|
194
|
-
self.stdout.write(self.style.ERROR(f"Error processing video {video.uuid}: {e}. State after error: {error_state_summary}"))
|
|
195
|
-
# Optionally, explicitly set an error state if the methods don't do it reliably:
|
|
196
|
-
# if hasattr(video, 'state') and video.state: # Further checks would depend on how an error state is defined with booleans
|
|
197
|
-
# # video.state.set_status(VideoFile.VideoFileStateChoices.ERROR, message=f"Validation command error: {str(e)[:250]}") # Old way
|
|
198
|
-
# # video.state.save() # New way would involve setting specific boolean flags to indicate error
|
|
199
|
-
pass
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
if verbose:
|
|
203
|
-
self.stdout.write(self.style.SUCCESS(f"Video processing finished. Succeeded: {processed_count}, Failed: {failed_count}."))
|
|
204
|
-
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# Generated by Django 5.2.5 on 2025-10-09 10:12
|
|
2
|
-
|
|
3
|
-
import django.db.models.deletion
|
|
4
|
-
from django.db import migrations, models
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Migration(migrations.Migration):
|
|
8
|
-
|
|
9
|
-
dependencies = [
|
|
10
|
-
('endoreg_db', '0001_initial'),
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
operations = [
|
|
14
|
-
migrations.CreateModel(
|
|
15
|
-
name='VideoMetadata',
|
|
16
|
-
fields=[
|
|
17
|
-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
18
|
-
('sensitive_frame_count', models.IntegerField(blank=True, help_text='Number of frames detected as containing sensitive information', null=True)),
|
|
19
|
-
('sensitive_ratio', models.FloatField(blank=True, help_text='Ratio of sensitive frames to total frames (0.0-1.0)', null=True)),
|
|
20
|
-
('sensitive_frame_ids', models.TextField(blank=True, help_text='JSON array of sensitive frame indices (0-based)', null=True)),
|
|
21
|
-
('analyzed_at', models.DateTimeField(auto_now=True, help_text='Timestamp of last analysis')),
|
|
22
|
-
('video', models.OneToOneField(help_text='Video file this metadata belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='metadata', to='endoreg_db.videofile')),
|
|
23
|
-
],
|
|
24
|
-
options={
|
|
25
|
-
'verbose_name': 'Video Metadata',
|
|
26
|
-
'verbose_name_plural': 'Video Metadata',
|
|
27
|
-
'db_table': 'video_metadata',
|
|
28
|
-
},
|
|
29
|
-
),
|
|
30
|
-
migrations.CreateModel(
|
|
31
|
-
name='VideoProcessingHistory',
|
|
32
|
-
fields=[
|
|
33
|
-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
34
|
-
('operation', models.CharField(choices=[('mask_overlay', 'Mask Overlay'), ('frame_removal', 'Frame Removal'), ('analysis', 'Sensitivity Analysis'), ('reprocessing', 'Full Reprocessing')], help_text='Type of processing operation', max_length=50)),
|
|
35
|
-
('status', models.CharField(choices=[('pending', 'Pending'), ('running', 'Running'), ('success', 'Success'), ('failure', 'Failure'), ('cancelled', 'Cancelled')], default='pending', help_text='Current status of the operation', max_length=20)),
|
|
36
|
-
('config', models.JSONField(default=dict, help_text='Operation configuration (mask settings, frame list, etc.)')),
|
|
37
|
-
('output_file', models.CharField(blank=True, help_text='Path to output file (relative to MEDIA_ROOT)', max_length=500)),
|
|
38
|
-
('details', models.TextField(blank=True, help_text='Additional details or error messages')),
|
|
39
|
-
('task_id', models.CharField(blank=True, help_text='Celery task ID for progress tracking', max_length=100)),
|
|
40
|
-
('created_at', models.DateTimeField(auto_now_add=True, help_text='When the operation was started')),
|
|
41
|
-
('completed_at', models.DateTimeField(blank=True, help_text='When the operation completed (success or failure)', null=True)),
|
|
42
|
-
('video', models.ForeignKey(help_text='Video file this operation was performed on', on_delete=django.db.models.deletion.CASCADE, related_name='processing_history', to='endoreg_db.videofile')),
|
|
43
|
-
],
|
|
44
|
-
options={
|
|
45
|
-
'verbose_name': 'Video Processing History',
|
|
46
|
-
'verbose_name_plural': 'Video Processing Histories',
|
|
47
|
-
'db_table': 'video_processing_history',
|
|
48
|
-
'ordering': ['-created_at'],
|
|
49
|
-
'indexes': [models.Index(fields=['video', '-created_at'], name='video_proce_video_i_98ffe0_idx'), models.Index(fields=['task_id'], name='video_proce_task_id_ec8b15_idx'), models.Index(fields=['status'], name='video_proce_status_6f71fd_idx')],
|
|
50
|
-
},
|
|
51
|
-
),
|
|
52
|
-
]
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
from django.db import migrations, models
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def populate_display_name(apps, schema_editor):
|
|
5
|
-
Center = apps.get_model('endoreg_db', 'Center')
|
|
6
|
-
for center in Center.objects.all():
|
|
7
|
-
if not center.display_name:
|
|
8
|
-
center.display_name = center.name
|
|
9
|
-
center.save(update_fields=['display_name'])
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def reset_display_name(apps, schema_editor):
|
|
13
|
-
Center = apps.get_model('endoreg_db', 'Center')
|
|
14
|
-
Center.objects.update(display_name='')
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class Migration(migrations.Migration):
|
|
18
|
-
|
|
19
|
-
dependencies = [
|
|
20
|
-
('endoreg_db', '0002_add_video_correction_models'),
|
|
21
|
-
]
|
|
22
|
-
|
|
23
|
-
operations = [
|
|
24
|
-
migrations.AddField(
|
|
25
|
-
model_name='center',
|
|
26
|
-
name='display_name',
|
|
27
|
-
field=models.CharField(blank=True, default='', max_length=255),
|
|
28
|
-
),
|
|
29
|
-
migrations.RunPython(populate_display_name, reset_display_name),
|
|
30
|
-
]
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# from django.contrib.contenttypes.models import ContentType
|
|
2
|
-
# from django.contrib.auth.models import Permission
|
|
3
|
-
# from endoreg_db.models import * # Import your models here
|
|
4
|
-
# from django.db import transaction
|
|
5
|
-
|
|
6
|
-
# # Step 1: Define model to category mappings
|
|
7
|
-
# # Assuming every model class name is unique across your entire Django project
|
|
8
|
-
# model_categories = {
|
|
9
|
-
# 'SensitiveModel1': 'sensitive',
|
|
10
|
-
# 'SensitiveModel2': 'sensitive',
|
|
11
|
-
# 'DevelopmentModel1': 'development',
|
|
12
|
-
# 'DevelopmentModel2': 'development',
|
|
13
|
-
# # Add all models you have, mapping them to either 'sensitive', 'development', or 'all'
|
|
14
|
-
# }
|
|
15
|
-
|
|
16
|
-
# # Step 2: Define permissions for each category
|
|
17
|
-
# category_permissions = {
|
|
18
|
-
# 'sensitive': ['view', 'edit', 'delete'],
|
|
19
|
-
# 'development': ['view', 'edit'],
|
|
20
|
-
# 'all': ['view'],
|
|
21
|
-
# }
|
|
22
|
-
|
|
23
|
-
# @transaction.atomic
|
|
24
|
-
# def create_permissions_for_all_models():
|
|
25
|
-
# for model_class_name, category in model_categories.items():
|
|
26
|
-
# model_class = globals().get(model_class_name)
|
|
27
|
-
# if model_class is None:
|
|
28
|
-
# print(f"Model {model_class_name} not found.")
|
|
29
|
-
# continue
|
|
30
|
-
|
|
31
|
-
# content_type = ContentType.objects.get_for_model(model_class)
|
|
32
|
-
# permissions = category_permissions.get(category, [])
|
|
33
|
-
|
|
34
|
-
# for permission_codename in permissions:
|
|
35
|
-
# permission_name = f"Can {permission_codename} {model_class_name}"
|
|
36
|
-
# permission, created = Permission.objects.get_or_create(
|
|
37
|
-
# codename=f"{permission_codename}_{model_class_name.lower()}",
|
|
38
|
-
# defaults={'name': permission_name, 'content_type': content_type},
|
|
39
|
-
# )
|
|
40
|
-
# if created:
|
|
41
|
-
# print(f"Created permission: {permission_name}")
|
|
42
|
-
|
|
43
|
-
# # Run the function to create and assign permissions based on categories
|
|
44
|
-
# create_permissions_for_all_models()
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
from .rule_type import RuleType
|
|
2
|
-
from .rule import Rule
|
|
3
|
-
from .ruleset import Ruleset
|
|
4
|
-
from .rule_attribute_dtype import RuleAttributeDType
|
|
5
|
-
from .rule_applicator import RuleApplicator
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"RuleType",
|
|
9
|
-
"Rule",
|
|
10
|
-
"Ruleset",
|
|
11
|
-
"RuleAttributeDType",
|
|
12
|
-
"RuleApplicator",
|
|
13
|
-
]
|
endoreg_db/models/rule/rule.py
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
from django.db import models
|
|
2
|
-
|
|
3
|
-
class RuleManager(models.Manager):
|
|
4
|
-
def get_by_natural_key(self, name):
|
|
5
|
-
return self.get(name=name)
|
|
6
|
-
|
|
7
|
-
class Rule(models.Model):
|
|
8
|
-
name = models.CharField(max_length=255, unique=True)
|
|
9
|
-
description = models.TextField(blank=True, null=True)
|
|
10
|
-
attribute_key = models.CharField(max_length=255)
|
|
11
|
-
rule_type = models.ForeignKey("RuleType", on_delete=models.CASCADE)
|
|
12
|
-
attribute_dtype = models.ForeignKey("RuleAttributeDType", on_delete=models.CASCADE)
|
|
13
|
-
|
|
14
|
-
objects = RuleManager()
|
|
15
|
-
|
|
16
|
-
class Meta:
|
|
17
|
-
verbose_name = 'Rule'
|
|
18
|
-
verbose_name_plural = 'Rules'
|
|
19
|
-
|
|
20
|
-
def natural_key(self):
|
|
21
|
-
"""
|
|
22
|
-
Return a tuple representing the natural key for this Rule instance.
|
|
23
|
-
|
|
24
|
-
Returns:
|
|
25
|
-
tuple: A one-element tuple containing the Rule's unique name.
|
|
26
|
-
"""
|
|
27
|
-
return (self.name,)
|