endoreg-db 0.8.8.9__py3-none-any.whl → 0.8.9.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of endoreg-db might be problematic. Click here for more details.
- endoreg_db/admin.py +10 -5
- endoreg_db/apps.py +4 -7
- endoreg_db/authz/auth.py +1 -0
- endoreg_db/authz/backends.py +1 -1
- endoreg_db/authz/management/commands/list_routes.py +2 -0
- endoreg_db/authz/middleware.py +8 -7
- endoreg_db/authz/permissions.py +21 -10
- endoreg_db/authz/policy.py +14 -19
- endoreg_db/authz/views_auth.py +14 -10
- endoreg_db/codemods/rename_datetime_fields.py +8 -1
- endoreg_db/exceptions.py +5 -2
- endoreg_db/forms/__init__.py +0 -1
- endoreg_db/forms/examination_form.py +4 -3
- endoreg_db/forms/patient_finding_intervention_form.py +30 -8
- endoreg_db/forms/patient_form.py +9 -13
- endoreg_db/forms/questionnaires/__init__.py +1 -1
- endoreg_db/forms/settings/__init__.py +4 -1
- endoreg_db/forms/unit.py +2 -1
- endoreg_db/helpers/count_db.py +17 -14
- endoreg_db/helpers/default_objects.py +2 -1
- endoreg_db/helpers/download_segmentation_model.py +4 -3
- endoreg_db/helpers/interact.py +0 -5
- endoreg_db/helpers/test_video_helper.py +33 -25
- endoreg_db/import_files/__init__.py +1 -1
- endoreg_db/import_files/context/__init__.py +1 -1
- endoreg_db/import_files/context/default_sensitive_meta.py +11 -9
- endoreg_db/import_files/context/ensure_center.py +4 -4
- endoreg_db/import_files/context/file_lock.py +3 -3
- endoreg_db/import_files/context/import_context.py +11 -12
- endoreg_db/import_files/context/validate_directories.py +1 -0
- endoreg_db/import_files/file_storage/create_report_file.py +57 -34
- endoreg_db/import_files/file_storage/create_video_file.py +64 -35
- endoreg_db/import_files/file_storage/sensitive_meta_storage.py +5 -2
- endoreg_db/import_files/file_storage/state_management.py +146 -83
- endoreg_db/import_files/file_storage/storage.py +5 -1
- endoreg_db/import_files/processing/report_processing/report_anonymization.py +24 -19
- endoreg_db/import_files/processing/sensitive_meta_adapter.py +3 -3
- endoreg_db/import_files/processing/video_processing/video_anonymization.py +18 -18
- endoreg_db/import_files/pseudonymization/k_anonymity.py +8 -9
- endoreg_db/import_files/pseudonymization/k_pseudonymity.py +16 -5
- endoreg_db/import_files/report_import_service.py +36 -30
- endoreg_db/import_files/video_import_service.py +27 -23
- endoreg_db/logger_conf.py +56 -40
- endoreg_db/management/__init__.py +1 -1
- endoreg_db/management/commands/__init__.py +1 -1
- endoreg_db/management/commands/check_auth.py +45 -38
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +53 -2
- endoreg_db/management/commands/create_multilabel_model_meta.py +54 -19
- endoreg_db/management/commands/fix_missing_patient_data.py +105 -71
- endoreg_db/management/commands/fix_video_paths.py +75 -54
- endoreg_db/management/commands/import_report.py +1 -3
- endoreg_db/management/commands/list_routes.py +2 -0
- endoreg_db/management/commands/load_ai_model_data.py +8 -2
- endoreg_db/management/commands/load_ai_model_label_data.py +0 -1
- endoreg_db/management/commands/load_center_data.py +3 -3
- endoreg_db/management/commands/load_distribution_data.py +35 -38
- endoreg_db/management/commands/load_endoscope_data.py +0 -3
- endoreg_db/management/commands/load_examination_data.py +20 -4
- endoreg_db/management/commands/load_finding_data.py +18 -3
- endoreg_db/management/commands/load_gender_data.py +17 -24
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +95 -85
- endoreg_db/management/commands/load_information_source.py +0 -3
- endoreg_db/management/commands/load_lab_value_data.py +14 -3
- endoreg_db/management/commands/load_legacy_data.py +303 -0
- endoreg_db/management/commands/load_name_data.py +1 -2
- endoreg_db/management/commands/load_pdf_type_data.py +4 -8
- endoreg_db/management/commands/load_profession_data.py +0 -1
- endoreg_db/management/commands/load_report_reader_flag_data.py +0 -4
- endoreg_db/management/commands/load_requirement_data.py +6 -2
- endoreg_db/management/commands/load_unit_data.py +0 -4
- endoreg_db/management/commands/load_user_groups.py +5 -7
- endoreg_db/management/commands/model_input.py +169 -0
- endoreg_db/management/commands/register_ai_model.py +22 -16
- endoreg_db/management/commands/setup_endoreg_db.py +110 -32
- endoreg_db/management/commands/storage_management.py +14 -8
- endoreg_db/management/commands/summarize_db_content.py +154 -63
- endoreg_db/management/commands/train_image_multilabel_model.py +144 -0
- endoreg_db/management/commands/validate_video_files.py +82 -50
- endoreg_db/management/commands/video_validation.py +4 -6
- endoreg_db/migrations/0001_initial.py +112 -63
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +8 -0
- endoreg_db/models/administration/ai/active_model.py +5 -5
- endoreg_db/models/administration/ai/ai_model.py +41 -18
- endoreg_db/models/administration/ai/model_type.py +1 -0
- endoreg_db/models/administration/case/case.py +22 -22
- endoreg_db/models/administration/center/__init__.py +5 -5
- endoreg_db/models/administration/center/center.py +6 -2
- endoreg_db/models/administration/center/center_resource.py +18 -4
- endoreg_db/models/administration/center/center_shift.py +3 -1
- endoreg_db/models/administration/center/center_waste.py +6 -2
- endoreg_db/models/administration/person/__init__.py +1 -1
- endoreg_db/models/administration/person/employee/__init__.py +1 -1
- endoreg_db/models/administration/person/employee/employee_type.py +3 -1
- endoreg_db/models/administration/person/examiner/__init__.py +1 -1
- endoreg_db/models/administration/person/examiner/examiner.py +10 -2
- endoreg_db/models/administration/person/names/first_name.py +6 -4
- endoreg_db/models/administration/person/names/last_name.py +4 -3
- endoreg_db/models/administration/person/patient/__init__.py +1 -1
- endoreg_db/models/administration/person/patient/patient.py +0 -1
- endoreg_db/models/administration/person/patient/patient_external_id.py +0 -1
- endoreg_db/models/administration/person/person.py +1 -1
- endoreg_db/models/administration/product/__init__.py +7 -6
- endoreg_db/models/administration/product/product.py +6 -2
- endoreg_db/models/administration/product/product_group.py +9 -7
- endoreg_db/models/administration/product/product_material.py +9 -2
- endoreg_db/models/administration/product/reference_product.py +64 -15
- endoreg_db/models/administration/qualification/qualification.py +3 -1
- endoreg_db/models/administration/shift/shift.py +3 -1
- endoreg_db/models/administration/shift/shift_type.py +12 -4
- endoreg_db/models/aidataset/__init__.py +5 -0
- endoreg_db/models/aidataset/aidataset.py +193 -0
- endoreg_db/models/label/__init__.py +1 -1
- endoreg_db/models/label/label.py +10 -2
- endoreg_db/models/label/label_set.py +3 -1
- endoreg_db/models/label/label_video_segment/_create_from_video.py +6 -2
- endoreg_db/models/label/label_video_segment/label_video_segment.py +148 -44
- endoreg_db/models/media/__init__.py +12 -5
- endoreg_db/models/media/frame/__init__.py +1 -1
- endoreg_db/models/media/frame/frame.py +34 -8
- endoreg_db/models/media/pdf/__init__.py +2 -1
- endoreg_db/models/media/pdf/raw_pdf.py +11 -4
- endoreg_db/models/media/pdf/report_file.py +6 -2
- endoreg_db/models/media/pdf/report_reader/__init__.py +3 -3
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +15 -5
- endoreg_db/models/media/video/create_from_file.py +20 -41
- endoreg_db/models/media/video/pipe_1.py +75 -30
- endoreg_db/models/media/video/pipe_2.py +37 -12
- endoreg_db/models/media/video/video_file.py +36 -24
- endoreg_db/models/media/video/video_file_ai.py +235 -70
- endoreg_db/models/media/video/video_file_anonymize.py +240 -65
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +6 -1
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +3 -1
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +30 -9
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +95 -29
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +13 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +4 -1
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +15 -3
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +15 -3
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +7 -2
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +109 -23
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +111 -27
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +46 -13
- endoreg_db/models/media/video/video_file_io.py +85 -33
- endoreg_db/models/media/video/video_file_meta/__init__.py +6 -6
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +17 -4
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +28 -7
- endoreg_db/models/media/video/video_file_meta/get_fps.py +46 -13
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +81 -20
- endoreg_db/models/media/video/video_file_meta/text_meta.py +61 -20
- endoreg_db/models/media/video/video_file_meta/video_meta.py +40 -12
- endoreg_db/models/media/video/video_file_segments.py +118 -27
- endoreg_db/models/media/video/video_metadata.py +25 -6
- endoreg_db/models/media/video/video_processing.py +54 -15
- endoreg_db/models/medical/__init__.py +3 -13
- endoreg_db/models/medical/contraindication/__init__.py +3 -1
- endoreg_db/models/medical/disease.py +18 -6
- endoreg_db/models/medical/event.py +6 -2
- endoreg_db/models/medical/examination/__init__.py +5 -1
- endoreg_db/models/medical/examination/examination.py +22 -6
- endoreg_db/models/medical/examination/examination_indication.py +23 -7
- endoreg_db/models/medical/examination/examination_time.py +6 -2
- endoreg_db/models/medical/finding/__init__.py +3 -1
- endoreg_db/models/medical/finding/finding.py +37 -12
- endoreg_db/models/medical/finding/finding_classification.py +27 -8
- endoreg_db/models/medical/finding/finding_intervention.py +19 -6
- endoreg_db/models/medical/finding/finding_type.py +3 -1
- endoreg_db/models/medical/hardware/__init__.py +1 -1
- endoreg_db/models/medical/hardware/endoscope.py +14 -2
- endoreg_db/models/medical/laboratory/__init__.py +1 -1
- endoreg_db/models/medical/laboratory/lab_value.py +139 -39
- endoreg_db/models/medical/medication/__init__.py +7 -3
- endoreg_db/models/medical/medication/medication.py +3 -1
- endoreg_db/models/medical/medication/medication_indication.py +3 -1
- endoreg_db/models/medical/medication/medication_indication_type.py +11 -3
- endoreg_db/models/medical/medication/medication_intake_time.py +3 -1
- endoreg_db/models/medical/medication/medication_schedule.py +3 -1
- endoreg_db/models/medical/patient/__init__.py +2 -10
- endoreg_db/models/medical/patient/medication_examples.py +3 -14
- endoreg_db/models/medical/patient/patient_disease.py +17 -5
- endoreg_db/models/medical/patient/patient_event.py +12 -4
- endoreg_db/models/medical/patient/patient_examination.py +52 -15
- endoreg_db/models/medical/patient/patient_examination_indication.py +15 -4
- endoreg_db/models/medical/patient/patient_finding.py +105 -29
- endoreg_db/models/medical/patient/patient_finding_classification.py +41 -12
- endoreg_db/models/medical/patient/patient_finding_intervention.py +11 -3
- endoreg_db/models/medical/patient/patient_lab_sample.py +6 -2
- endoreg_db/models/medical/patient/patient_lab_value.py +42 -10
- endoreg_db/models/medical/patient/patient_medication.py +25 -7
- endoreg_db/models/medical/patient/patient_medication_schedule.py +34 -10
- endoreg_db/models/metadata/model_meta.py +40 -12
- endoreg_db/models/metadata/model_meta_logic.py +51 -16
- endoreg_db/models/metadata/sensitive_meta.py +65 -28
- endoreg_db/models/metadata/sensitive_meta_logic.py +28 -26
- endoreg_db/models/metadata/video_meta.py +146 -39
- endoreg_db/models/metadata/video_prediction_logic.py +70 -21
- endoreg_db/models/metadata/video_prediction_meta.py +80 -27
- endoreg_db/models/operation_log.py +63 -0
- endoreg_db/models/other/__init__.py +10 -10
- endoreg_db/models/other/distribution/__init__.py +9 -7
- endoreg_db/models/other/distribution/base_value_distribution.py +3 -1
- endoreg_db/models/other/distribution/date_value_distribution.py +19 -5
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +3 -1
- endoreg_db/models/other/distribution/numeric_value_distribution.py +34 -9
- endoreg_db/models/other/emission/__init__.py +1 -1
- endoreg_db/models/other/emission/emission_factor.py +9 -3
- endoreg_db/models/other/information_source.py +15 -5
- endoreg_db/models/other/material.py +3 -1
- endoreg_db/models/other/transport_route.py +3 -1
- endoreg_db/models/other/unit.py +6 -2
- endoreg_db/models/report/report.py +0 -1
- endoreg_db/models/requirement/requirement.py +84 -27
- endoreg_db/models/requirement/requirement_error.py +5 -6
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +1 -1
- endoreg_db/models/requirement/requirement_evaluation/evaluate_with_dependencies.py +8 -8
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +3 -3
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +24 -8
- endoreg_db/models/requirement/requirement_operator.py +28 -8
- endoreg_db/models/requirement/requirement_set.py +34 -11
- endoreg_db/models/state/__init__.py +1 -0
- endoreg_db/models/state/audit_ledger.py +9 -2
- endoreg_db/models/{media → state}/processing_history/__init__.py +1 -3
- endoreg_db/models/state/processing_history/processing_history.py +136 -0
- endoreg_db/models/state/raw_pdf.py +0 -1
- endoreg_db/models/state/video.py +2 -3
- endoreg_db/models/utils.py +4 -2
- endoreg_db/queries/__init__.py +2 -6
- endoreg_db/queries/annotations/__init__.py +1 -3
- endoreg_db/queries/annotations/legacy.py +37 -26
- endoreg_db/root_urls.py +3 -4
- endoreg_db/schemas/examination_evaluation.py +3 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +249 -163
- endoreg_db/serializers/__init__.py +2 -8
- endoreg_db/serializers/administration/__init__.py +1 -2
- endoreg_db/serializers/administration/ai/__init__.py +0 -1
- endoreg_db/serializers/administration/ai/active_model.py +3 -1
- endoreg_db/serializers/administration/ai/ai_model.py +5 -3
- endoreg_db/serializers/administration/ai/model_type.py +3 -1
- endoreg_db/serializers/administration/center.py +7 -2
- endoreg_db/serializers/administration/gender.py +4 -2
- endoreg_db/serializers/anonymization.py +13 -13
- endoreg_db/serializers/evaluation/examination_evaluation.py +0 -1
- endoreg_db/serializers/examination/__init__.py +1 -1
- endoreg_db/serializers/examination/base.py +12 -13
- endoreg_db/serializers/examination/dropdown.py +6 -7
- endoreg_db/serializers/examination_serializer.py +3 -6
- endoreg_db/serializers/finding/__init__.py +1 -1
- endoreg_db/serializers/finding/finding.py +14 -7
- endoreg_db/serializers/finding_classification/__init__.py +3 -3
- endoreg_db/serializers/finding_classification/choice.py +3 -3
- endoreg_db/serializers/finding_classification/classification.py +2 -4
- endoreg_db/serializers/label_video_segment/__init__.py +5 -3
- endoreg_db/serializers/{label → label_video_segment}/image_classification_annotation.py +5 -5
- endoreg_db/serializers/label_video_segment/label/__init__.py +6 -0
- endoreg_db/serializers/{label → label_video_segment/label}/label.py +1 -1
- endoreg_db/serializers/label_video_segment/label_video_segment.py +338 -228
- endoreg_db/serializers/meta/__init__.py +1 -2
- endoreg_db/serializers/meta/sensitive_meta_detail.py +28 -13
- endoreg_db/serializers/meta/sensitive_meta_update.py +51 -46
- endoreg_db/serializers/meta/sensitive_meta_verification.py +19 -16
- endoreg_db/serializers/misc/__init__.py +2 -2
- endoreg_db/serializers/misc/file_overview.py +11 -7
- endoreg_db/serializers/misc/stats.py +10 -8
- endoreg_db/serializers/misc/translatable_field_mix_in.py +6 -6
- endoreg_db/serializers/misc/upload_job.py +32 -29
- endoreg_db/serializers/patient/__init__.py +2 -1
- endoreg_db/serializers/patient/patient.py +32 -15
- endoreg_db/serializers/patient/patient_dropdown.py +11 -3
- endoreg_db/serializers/patient_examination/__init__.py +1 -1
- endoreg_db/serializers/patient_examination/patient_examination.py +67 -40
- endoreg_db/serializers/patient_finding/__init__.py +1 -1
- endoreg_db/serializers/patient_finding/patient_finding.py +2 -1
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +17 -9
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +26 -17
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +7 -5
- endoreg_db/serializers/patient_finding/patient_finding_list.py +10 -11
- endoreg_db/serializers/patient_finding/patient_finding_write.py +36 -27
- endoreg_db/serializers/pdf/__init__.py +1 -3
- endoreg_db/serializers/requirements/requirement_schema.py +1 -6
- endoreg_db/serializers/sensitive_meta_serializer.py +100 -81
- endoreg_db/serializers/video/__init__.py +2 -2
- endoreg_db/serializers/video/{segmentation.py → video_file.py} +66 -47
- endoreg_db/serializers/video/video_file_brief.py +6 -2
- endoreg_db/serializers/video/video_file_detail.py +36 -23
- endoreg_db/serializers/video/video_file_list.py +4 -2
- endoreg_db/serializers/video/video_processing_history.py +54 -50
- endoreg_db/services/__init__.py +1 -1
- endoreg_db/services/anonymization.py +2 -2
- endoreg_db/services/examination_evaluation.py +40 -17
- endoreg_db/services/model_meta_from_hf.py +76 -0
- endoreg_db/services/polling_coordinator.py +101 -70
- endoreg_db/services/pseudonym_service.py +27 -22
- endoreg_db/services/report_import.py +6 -3
- endoreg_db/services/segment_sync.py +75 -59
- endoreg_db/services/video_import.py +6 -7
- endoreg_db/urls/__init__.py +2 -2
- endoreg_db/urls/ai.py +7 -25
- endoreg_db/urls/anonymization.py +61 -15
- endoreg_db/urls/auth.py +4 -4
- endoreg_db/urls/classification.py +4 -9
- endoreg_db/urls/examination.py +27 -18
- endoreg_db/urls/media.py +27 -34
- endoreg_db/urls/patient.py +11 -7
- endoreg_db/urls/requirements.py +3 -1
- endoreg_db/urls/root_urls.py +2 -3
- endoreg_db/urls/stats.py +24 -16
- endoreg_db/urls/upload.py +3 -11
- endoreg_db/utils/__init__.py +14 -15
- endoreg_db/utils/ai/__init__.py +1 -1
- 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 +2 -1
- endoreg_db/utils/ai/inference_dataset.py +14 -15
- 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 +21 -6
- endoreg_db/utils/ai/predict.py +4 -4
- endoreg_db/utils/ai/preprocess.py +19 -11
- endoreg_db/utils/calc_duration_seconds.py +4 -4
- endoreg_db/utils/case_generator/lab_sample_factory.py +3 -4
- endoreg_db/utils/check_video_files.py +74 -47
- endoreg_db/utils/cropping.py +10 -9
- endoreg_db/utils/dataloader.py +11 -3
- endoreg_db/utils/dates.py +3 -4
- endoreg_db/utils/defaults/set_default_center.py +7 -6
- endoreg_db/utils/env.py +6 -2
- endoreg_db/utils/extract_specific_frames.py +24 -9
- endoreg_db/utils/file_operations.py +30 -18
- endoreg_db/utils/fix_video_path_direct.py +57 -41
- endoreg_db/utils/frame_anonymization_utils.py +157 -157
- endoreg_db/utils/hashs.py +3 -18
- endoreg_db/utils/links/requirement_link.py +96 -52
- endoreg_db/utils/ocr.py +30 -25
- endoreg_db/utils/operation_log.py +61 -0
- endoreg_db/utils/parse_and_generate_yaml.py +12 -13
- endoreg_db/utils/paths.py +6 -6
- endoreg_db/utils/permissions.py +40 -24
- endoreg_db/utils/pipelines/process_video_dir.py +50 -26
- endoreg_db/utils/product/sum_emissions.py +5 -3
- endoreg_db/utils/product/sum_weights.py +4 -2
- endoreg_db/utils/pydantic_models/__init__.py +3 -4
- endoreg_db/utils/requirement_operator_logic/_old/lab_value_operators.py +207 -107
- endoreg_db/utils/requirement_operator_logic/_old/model_evaluators.py +252 -65
- endoreg_db/utils/requirement_operator_logic/new_operator_logic.py +27 -10
- endoreg_db/utils/setup_config.py +21 -5
- endoreg_db/utils/storage.py +3 -1
- endoreg_db/utils/translation.py +19 -15
- endoreg_db/utils/uuid.py +1 -0
- endoreg_db/utils/validate_endo_roi.py +12 -4
- endoreg_db/utils/validate_subcategory_dict.py +26 -24
- endoreg_db/utils/validate_video_detailed.py +207 -149
- endoreg_db/utils/video/__init__.py +7 -3
- endoreg_db/utils/video/extract_frames.py +30 -18
- endoreg_db/utils/video/ffmpeg_wrapper.py +217 -52
- endoreg_db/utils/video/names.py +11 -6
- endoreg_db/utils/video/streaming_processor.py +175 -101
- endoreg_db/utils/video/video_splitter.py +30 -19
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +59 -50
- endoreg_db/views/__init__.py +0 -20
- endoreg_db/views/anonymization/__init__.py +6 -2
- endoreg_db/views/anonymization/media_management.py +2 -6
- endoreg_db/views/anonymization/overview.py +34 -1
- endoreg_db/views/anonymization/validate.py +79 -18
- endoreg_db/views/auth/__init__.py +1 -1
- endoreg_db/views/auth/keycloak.py +16 -14
- endoreg_db/views/examination/__init__.py +12 -15
- endoreg_db/views/examination/examination.py +5 -5
- endoreg_db/views/examination/examination_manifest_cache.py +5 -5
- endoreg_db/views/examination/get_finding_classification_choices.py +8 -5
- endoreg_db/views/examination/get_finding_classifications.py +9 -7
- endoreg_db/views/examination/get_findings.py +8 -10
- endoreg_db/views/examination/get_instruments.py +3 -2
- endoreg_db/views/examination/get_interventions.py +1 -1
- endoreg_db/views/finding/__init__.py +2 -2
- endoreg_db/views/finding/finding.py +58 -54
- endoreg_db/views/finding/get_classifications.py +1 -1
- endoreg_db/views/finding/get_interventions.py +1 -1
- endoreg_db/views/finding_classification/__init__.py +5 -5
- endoreg_db/views/finding_classification/finding_classification.py +5 -6
- endoreg_db/views/finding_classification/get_classification_choices.py +3 -4
- endoreg_db/views/media/__init__.py +13 -13
- endoreg_db/views/media/pdf_media.py +9 -9
- endoreg_db/views/media/sensitive_metadata.py +10 -7
- endoreg_db/views/media/video_media.py +4 -4
- endoreg_db/views/meta/__init__.py +1 -1
- endoreg_db/views/meta/sensitive_meta_list.py +20 -22
- endoreg_db/views/meta/sensitive_meta_verification.py +14 -11
- endoreg_db/views/misc/__init__.py +6 -34
- endoreg_db/views/misc/center.py +2 -1
- endoreg_db/views/misc/csrf.py +2 -1
- endoreg_db/views/misc/gender.py +2 -1
- endoreg_db/views/misc/stats.py +141 -106
- endoreg_db/views/patient/__init__.py +1 -3
- endoreg_db/views/patient/patient.py +141 -99
- endoreg_db/views/patient_examination/__init__.py +5 -5
- endoreg_db/views/patient_examination/patient_examination.py +43 -42
- endoreg_db/views/patient_examination/patient_examination_create.py +10 -15
- endoreg_db/views/patient_examination/patient_examination_detail.py +12 -15
- endoreg_db/views/patient_examination/patient_examination_list.py +21 -17
- endoreg_db/views/patient_examination/video.py +114 -80
- endoreg_db/views/patient_finding/__init__.py +1 -1
- endoreg_db/views/patient_finding/patient_finding.py +17 -10
- endoreg_db/views/patient_finding/patient_finding_optimized.py +127 -95
- endoreg_db/views/patient_finding_classification/__init__.py +1 -1
- endoreg_db/views/patient_finding_classification/pfc_create.py +35 -27
- endoreg_db/views/report/reimport.py +1 -1
- endoreg_db/views/report/report_stream.py +5 -8
- endoreg_db/views/requirement/__init__.py +2 -1
- endoreg_db/views/requirement/evaluate.py +7 -9
- endoreg_db/views/requirement/lookup.py +2 -3
- endoreg_db/views/requirement/lookup_store.py +0 -1
- endoreg_db/views/requirement/requirement_utils.py +2 -4
- endoreg_db/views/stats/__init__.py +4 -4
- endoreg_db/views/stats/stats_views.py +152 -115
- endoreg_db/views/video/__init__.py +18 -27
- endoreg_db/views/{ai → video/ai}/__init__.py +2 -2
- endoreg_db/views/{ai → video/ai}/label.py +20 -16
- endoreg_db/views/video/correction.py +5 -6
- endoreg_db/views/video/reimport.py +134 -99
- endoreg_db/views/video/segments_crud.py +134 -44
- endoreg_db/views/video/video_apply_mask.py +13 -12
- endoreg_db/views/video/video_correction.py +2 -1
- endoreg_db/views/video/video_download_processed.py +15 -15
- endoreg_db/views/video/video_meta_stats.py +7 -6
- endoreg_db/views/video/video_processing_history.py +3 -2
- endoreg_db/views/video/video_remove_frames.py +13 -12
- endoreg_db/views/video/video_stream.py +110 -82
- {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
- {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +436 -433
- endoreg_db/import_files/processing/video_processing/video_cleanup_on_error.py +0 -119
- endoreg_db/management/commands/import_fallback_video.py +0 -203
- endoreg_db/management/commands/import_video.py +0 -422
- endoreg_db/management/commands/import_video_with_classification.py +0 -367
- endoreg_db/models/media/processing_history/processing_history.py +0 -96
- endoreg_db/serializers/label/__init__.py +0 -7
- endoreg_db/serializers/label_video_segment/_lvs_create.py +0 -149
- endoreg_db/serializers/label_video_segment/_lvs_update.py +0 -138
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +0 -149
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +0 -99
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +0 -163
- endoreg_db/services/__old/pdf_import.py +0 -1487
- endoreg_db/services/__old/video_import.py +0 -1306
- endoreg_db/tasks/upload_tasks.py +0 -216
- endoreg_db/tasks/video_ingest.py +0 -161
- endoreg_db/tasks/video_processing_tasks.py +0 -327
- endoreg_db/views/misc/translation.py +0 -182
- {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.8.9.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
|
@@ -7,33 +7,28 @@ from typing import Optional, Union
|
|
|
7
7
|
|
|
8
8
|
from endoreg_db.import_files.context.file_lock import file_lock
|
|
9
9
|
from endoreg_db.import_files.context.import_context import ImportContext
|
|
10
|
-
from endoreg_db.import_files.
|
|
11
|
-
ReportAnonymizer,
|
|
12
|
-
)
|
|
13
|
-
|
|
10
|
+
from endoreg_db.import_files.context.validate_directories import validate_directories
|
|
14
11
|
from endoreg_db.import_files.file_storage.create_report_file import (
|
|
15
12
|
create_or_retrieve_report_file,
|
|
16
13
|
)
|
|
17
14
|
from endoreg_db.import_files.file_storage.state_management import (
|
|
18
|
-
finalize_report_success,
|
|
19
15
|
finalize_failure,
|
|
16
|
+
finalize_report_success,
|
|
20
17
|
mark_instance_processing_started,
|
|
21
18
|
)
|
|
22
|
-
from endoreg_db.import_files.context.validate_directories import validate_directories
|
|
23
|
-
|
|
24
19
|
from endoreg_db.import_files.file_storage.storage import create_sensitive_copy
|
|
25
|
-
from endoreg_db.
|
|
26
|
-
|
|
27
|
-
SENSITIVE_REPORT_DIR,
|
|
20
|
+
from endoreg_db.import_files.processing.report_processing.report_anonymization import (
|
|
21
|
+
ReportAnonymizer,
|
|
28
22
|
)
|
|
29
|
-
|
|
23
|
+
from endoreg_db.models.media import RawPdfFile
|
|
24
|
+
from endoreg_db.utils.paths import SENSITIVE_REPORT_DIR
|
|
30
25
|
|
|
31
26
|
logger = logging.getLogger(__name__)
|
|
32
27
|
|
|
33
28
|
|
|
34
29
|
class ReportImportService:
|
|
35
30
|
"""
|
|
36
|
-
Service for importing and anonymizing report (
|
|
31
|
+
Service for importing and anonymizing report (report) files.
|
|
37
32
|
|
|
38
33
|
Responsibilities:
|
|
39
34
|
- Acquire file lock
|
|
@@ -49,9 +44,8 @@ class ReportImportService:
|
|
|
49
44
|
self.anonymizer = ReportAnonymizer()
|
|
50
45
|
self.processing_context: Optional[ImportContext] = None
|
|
51
46
|
self.current_report: Optional[RawPdfFile] = None
|
|
52
|
-
|
|
53
|
-
validate_directories()
|
|
54
47
|
|
|
48
|
+
validate_directories()
|
|
55
49
|
|
|
56
50
|
def import_and_anonymize(
|
|
57
51
|
self,
|
|
@@ -68,35 +62,49 @@ class ReportImportService:
|
|
|
68
62
|
file_path=Path(file_path),
|
|
69
63
|
center_name=center_name,
|
|
70
64
|
delete_source=delete_source,
|
|
71
|
-
file_type="report"
|
|
65
|
+
file_type="report",
|
|
66
|
+
original_path=Path(file_path),
|
|
72
67
|
)
|
|
73
68
|
self.logger.info("validating and preparing file")
|
|
74
69
|
if not ctx.file_path.exists():
|
|
75
70
|
raise FileNotFoundError(f"Video file not found: {file_path}")
|
|
76
71
|
|
|
77
|
-
ctx.sensitive_path = create_sensitive_copy(
|
|
78
|
-
ctx.file_path,
|
|
79
|
-
SENSITIVE_REPORT_DIR
|
|
80
|
-
)
|
|
72
|
+
ctx.sensitive_path = create_sensitive_copy(ctx.file_path, SENSITIVE_REPORT_DIR)
|
|
81
73
|
|
|
82
74
|
with file_lock(ctx.file_path):
|
|
83
75
|
logger.info("Acquired file lock for %s", ctx.file_path)
|
|
84
76
|
|
|
85
77
|
# create or retrieve RawPdfFile + update history
|
|
86
|
-
ctx.current_report, needs_processing =
|
|
78
|
+
ctx.current_report, processed, needs_processing = (
|
|
79
|
+
create_or_retrieve_report_file(ctx)
|
|
80
|
+
)
|
|
87
81
|
ctx.current_report.get_or_create_state()
|
|
88
|
-
assert
|
|
82
|
+
assert ctx.current_report.state is not None
|
|
89
83
|
ctx.current_report = ctx.current_report
|
|
90
|
-
|
|
91
|
-
|
|
84
|
+
|
|
85
|
+
if processed == True or retry == True:
|
|
86
|
+
ctx.retry = True
|
|
87
|
+
|
|
92
88
|
# Retry is a forced overwrite of needs processing - therefore the retry will cause full deletion of processed files using finalize failure.
|
|
93
|
-
if
|
|
89
|
+
if (
|
|
90
|
+
ctx.retry
|
|
91
|
+
and needs_processing
|
|
92
|
+
and not ctx.current_report.state.anonymization_validated
|
|
93
|
+
):
|
|
94
94
|
# ensure clean slate for forced reprocessing
|
|
95
95
|
finalize_failure(ctx)
|
|
96
|
-
ctx.current_report, needs_processing =
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
ctx.current_report, processed, needs_processing = (
|
|
97
|
+
create_or_retrieve_report_file(ctx)
|
|
98
|
+
)
|
|
99
|
+
assert needs_processing is True
|
|
100
|
+
elif not needs_processing and not ctx.retry:
|
|
99
101
|
return ctx.current_report
|
|
102
|
+
else:
|
|
103
|
+
finalize_failure(ctx)
|
|
104
|
+
ctx.current_report, processed, needs_processing = (
|
|
105
|
+
create_or_retrieve_report_file(ctx)
|
|
106
|
+
)
|
|
107
|
+
assert needs_processing is True
|
|
100
108
|
|
|
101
109
|
mark_instance_processing_started(ctx.current_report, ctx)
|
|
102
110
|
try:
|
|
@@ -117,7 +125,7 @@ class ReportImportService:
|
|
|
117
125
|
try:
|
|
118
126
|
ctx = self.anonymizer.anonymize_report(ctx)
|
|
119
127
|
except Exception as e:
|
|
120
|
-
logger.error(f"
|
|
128
|
+
logger.error(f"report Extraction failed for the second time. {e}")
|
|
121
129
|
raise
|
|
122
130
|
|
|
123
131
|
logger.info(
|
|
@@ -137,5 +145,3 @@ class ReportImportService:
|
|
|
137
145
|
# mark failure in history
|
|
138
146
|
finalize_failure(ctx)
|
|
139
147
|
raise
|
|
140
|
-
|
|
141
|
-
|
|
@@ -10,7 +10,7 @@ from endoreg_db.import_files.context import (
|
|
|
10
10
|
)
|
|
11
11
|
from endoreg_db.import_files.file_storage.state_management import (
|
|
12
12
|
finalize_failure,
|
|
13
|
-
finalize_video_success
|
|
13
|
+
finalize_video_success,
|
|
14
14
|
)
|
|
15
15
|
from endoreg_db.import_files.file_storage.storage import create_sensitive_copy
|
|
16
16
|
from endoreg_db.import_files.file_storage.create_video_file import (
|
|
@@ -21,7 +21,9 @@ from endoreg_db.import_files.file_storage.state_management import (
|
|
|
21
21
|
mark_instance_processing_started,
|
|
22
22
|
)
|
|
23
23
|
from endoreg_db.models import VideoFile
|
|
24
|
-
from endoreg_db.import_files.processing.video_processing.video_anonymization import
|
|
24
|
+
from endoreg_db.import_files.processing.video_processing.video_anonymization import (
|
|
25
|
+
VideoAnonymizer,
|
|
26
|
+
)
|
|
25
27
|
from endoreg_db.utils.paths import (
|
|
26
28
|
SENSITIVE_VIDEO_DIR,
|
|
27
29
|
)
|
|
@@ -55,16 +57,15 @@ class VideoImportService:
|
|
|
55
57
|
self.anonymizer = VideoAnonymizer()
|
|
56
58
|
self.processing_context: Optional[ImportContext] = None
|
|
57
59
|
self.current_video: Optional[VideoFile] = None
|
|
58
|
-
|
|
60
|
+
|
|
59
61
|
validate_directories()
|
|
60
|
-
|
|
61
62
|
|
|
62
63
|
def import_and_anonymize(
|
|
63
64
|
self,
|
|
64
65
|
file_path: Union[Path, str],
|
|
65
66
|
center_name: str,
|
|
66
67
|
processor_name: str,
|
|
67
|
-
retry:bool = False,
|
|
68
|
+
retry: bool = False,
|
|
68
69
|
delete_source: bool = True,
|
|
69
70
|
) -> "VideoFile | None":
|
|
70
71
|
"""
|
|
@@ -76,41 +77,43 @@ class VideoImportService:
|
|
|
76
77
|
center_name=center_name,
|
|
77
78
|
processor_name=processor_name,
|
|
78
79
|
delete_source=delete_source,
|
|
79
|
-
file_type="video"
|
|
80
|
+
file_type="video",
|
|
80
81
|
)
|
|
81
82
|
self.logger.info("validating and preparing file")
|
|
82
83
|
if not ctx.file_path.exists():
|
|
83
84
|
raise FileNotFoundError(f"Video file not found: {file_path}")
|
|
84
85
|
|
|
85
|
-
ctx.sensitive_path = create_sensitive_copy(
|
|
86
|
-
ctx.file_path,
|
|
87
|
-
SENSITIVE_VIDEO_DIR
|
|
88
|
-
)
|
|
86
|
+
ctx.sensitive_path = create_sensitive_copy(ctx.file_path, SENSITIVE_VIDEO_DIR)
|
|
89
87
|
|
|
90
88
|
with file_lock(ctx.file_path):
|
|
91
89
|
logger.info("Acquired file lock for %s", ctx.file_path)
|
|
92
90
|
|
|
93
|
-
|
|
94
91
|
# create or retrieve VideoFile + update history
|
|
95
|
-
ctx.current_video, needs_processing = (
|
|
92
|
+
ctx.current_video, processed, needs_processing = (
|
|
96
93
|
create_or_retrieve_video_file(ctx)
|
|
97
94
|
)
|
|
98
95
|
ctx.current_video.get_or_create_state()
|
|
99
|
-
assert
|
|
96
|
+
assert ctx.current_video.state is not None
|
|
100
97
|
ctx.current_video = ctx.current_video
|
|
101
|
-
|
|
98
|
+
|
|
102
99
|
ctx.retry = retry
|
|
103
100
|
# Retry is a forced overwrite of needs processing - therefore the retry will cause full deletion of processed files using finalize failure.
|
|
104
101
|
|
|
105
|
-
if
|
|
102
|
+
if (
|
|
103
|
+
retry
|
|
104
|
+
and needs_processing
|
|
105
|
+
and not ctx.current_video.state.anonymization_validated
|
|
106
|
+
):
|
|
106
107
|
finalize_failure(ctx)
|
|
107
|
-
ctx.current_video, needs_processing =
|
|
108
|
-
|
|
108
|
+
ctx.current_video, processed, needs_processing = (
|
|
109
|
+
create_or_retrieve_video_file(ctx)
|
|
110
|
+
)
|
|
111
|
+
assert needs_processing is True
|
|
109
112
|
elif not needs_processing and not retry:
|
|
110
113
|
return ctx.current_video
|
|
111
114
|
|
|
112
115
|
mark_instance_processing_started(ctx.current_video, ctx)
|
|
113
|
-
try:
|
|
116
|
+
try:
|
|
114
117
|
# --- Anonymization with fallback ---
|
|
115
118
|
try:
|
|
116
119
|
ctx = self.anonymizer.anonymize_video(ctx)
|
|
@@ -128,20 +131,21 @@ class VideoImportService:
|
|
|
128
131
|
try:
|
|
129
132
|
ctx = self.anonymizer.anonymize_video(ctx)
|
|
130
133
|
except Exception as e:
|
|
131
|
-
logger.error(
|
|
134
|
+
logger.error(
|
|
135
|
+
f"Video Extraction failed for the second time. {e}"
|
|
136
|
+
)
|
|
132
137
|
raise
|
|
133
138
|
logger.info(
|
|
134
139
|
"Secondary video anonymization succeeded for %s",
|
|
135
140
|
ctx.file_path,
|
|
136
141
|
)
|
|
137
142
|
logger.info(f"Anonymized Video is located at: {ctx.anonymized_path}")
|
|
138
|
-
|
|
143
|
+
|
|
139
144
|
# --- Finalize success: history + move anonymized file ---
|
|
140
145
|
finalize_video_success(ctx)
|
|
141
|
-
|
|
146
|
+
|
|
142
147
|
return ctx.current_video
|
|
143
|
-
|
|
144
|
-
|
|
148
|
+
|
|
145
149
|
except Exception as exc:
|
|
146
150
|
logger.exception(
|
|
147
151
|
"Video import/anonymization failed for %s: %s", ctx.file_path, exc
|
endoreg_db/logger_conf.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import logging
|
|
2
1
|
from pathlib import Path
|
|
3
2
|
import os
|
|
4
3
|
|
|
@@ -6,6 +5,7 @@ LOG_DIR = Path("data/logs")
|
|
|
6
5
|
DEFAULT_FILE_LOG_LEVEL = "INFO"
|
|
7
6
|
DEFAULT_CONSOLE_LOG_LEVEL = "WARNING"
|
|
8
7
|
|
|
8
|
+
|
|
9
9
|
def clear_log_files(logger_names, log_dir=None):
|
|
10
10
|
"""
|
|
11
11
|
Clears specified log files in the log directory.
|
|
@@ -20,8 +20,10 @@ def clear_log_files(logger_names, log_dir=None):
|
|
|
20
20
|
log_dir.mkdir(parents=True, exist_ok=True)
|
|
21
21
|
|
|
22
22
|
# Files to manage
|
|
23
|
-
log_files_to_clear = [
|
|
24
|
-
|
|
23
|
+
log_files_to_clear = [
|
|
24
|
+
log_dir / f"{logger_name}.log" for logger_name in logger_names
|
|
25
|
+
]
|
|
26
|
+
log_files_to_clear.append(log_dir / "root.log") # Add root log file
|
|
25
27
|
|
|
26
28
|
# Clear existing log files in the directory managed by this config
|
|
27
29
|
for log_file in log_files_to_clear:
|
|
@@ -34,7 +36,10 @@ def clear_log_files(logger_names, log_dir=None):
|
|
|
34
36
|
# Optionally, create the log file to ensure it exists after clearing
|
|
35
37
|
# log_file.touch() # Removed touch to just clear
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
|
|
40
|
+
def get_logging_config(
|
|
41
|
+
logger_names, file_log_level=None, console_log_level=None, log_dir=None
|
|
42
|
+
):
|
|
38
43
|
"""
|
|
39
44
|
Generates Django LOGGING configuration dynamically.
|
|
40
45
|
|
|
@@ -47,38 +52,42 @@ def get_logging_config(logger_names, file_log_level=None, console_log_level=None
|
|
|
47
52
|
Returns:
|
|
48
53
|
dict: The Django LOGGING configuration dictionary.
|
|
49
54
|
"""
|
|
50
|
-
file_log_level = file_log_level or os.environ.get(
|
|
51
|
-
|
|
55
|
+
file_log_level = file_log_level or os.environ.get(
|
|
56
|
+
"FILE_LOG_LEVEL", DEFAULT_FILE_LOG_LEVEL
|
|
57
|
+
)
|
|
58
|
+
console_log_level = console_log_level or os.environ.get(
|
|
59
|
+
"CONSOLE_LOG_LEVEL", DEFAULT_CONSOLE_LOG_LEVEL
|
|
60
|
+
)
|
|
52
61
|
log_dir = log_dir or LOG_DIR
|
|
53
62
|
|
|
54
63
|
# Ensure log directory exists
|
|
55
64
|
log_dir.mkdir(parents=True, exist_ok=True)
|
|
56
65
|
|
|
57
66
|
handlers = {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
67
|
+
"console": {
|
|
68
|
+
"level": console_log_level, # Use console level
|
|
69
|
+
"class": "logging.StreamHandler",
|
|
70
|
+
"formatter": "standard",
|
|
62
71
|
},
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
72
|
+
"file_root": { # Handler for the root logger's file
|
|
73
|
+
"level": file_log_level, # Use file level
|
|
74
|
+
"class": "logging.FileHandler",
|
|
75
|
+
"filename": log_dir / "root.log",
|
|
76
|
+
"formatter": "standard",
|
|
68
77
|
},
|
|
69
78
|
}
|
|
70
79
|
loggers = {
|
|
71
80
|
# Root logger configuration - logs INFO+ to file, WARNING+ to console
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
81
|
+
"": {
|
|
82
|
+
"handlers": ["console", "file_root"], # Use both handlers
|
|
83
|
+
"level": file_log_level, # Set to lowest level needed (INFO for file)
|
|
84
|
+
"propagate": False, # Root logger doesn't propagate further
|
|
76
85
|
},
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
86
|
+
# Django's default logger
|
|
87
|
+
"django": {
|
|
88
|
+
"handlers": ["console", "file_root"], # Log to console and root file
|
|
89
|
+
"level": file_log_level, # Or your preferred level, ensure it's captured by root file
|
|
90
|
+
"propagate": False, # Don't propagate Django logs to avoid double handling by root
|
|
82
91
|
},
|
|
83
92
|
}
|
|
84
93
|
|
|
@@ -86,33 +95,34 @@ def get_logging_config(logger_names, file_log_level=None, console_log_level=None
|
|
|
86
95
|
for name in logger_names:
|
|
87
96
|
handler_name = f"file_{name}"
|
|
88
97
|
handlers[handler_name] = {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
"level": file_log_level, # Use file level
|
|
99
|
+
"class": "logging.FileHandler",
|
|
100
|
+
"filename": log_dir / f"{name}.log",
|
|
101
|
+
"formatter": "standard",
|
|
93
102
|
}
|
|
94
103
|
loggers[name] = {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
"handlers": [handler_name], # Log only to its own file directly
|
|
105
|
+
"level": file_log_level, # Use file level
|
|
106
|
+
"propagate": True, # Propagate to root logger (which handles console and root.log)
|
|
98
107
|
}
|
|
99
108
|
|
|
100
109
|
return {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
"version": 1,
|
|
111
|
+
"disable_existing_loggers": False,
|
|
112
|
+
"formatters": {
|
|
113
|
+
"standard": {
|
|
114
|
+
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
106
115
|
},
|
|
107
116
|
},
|
|
108
|
-
|
|
109
|
-
|
|
117
|
+
"handlers": handlers,
|
|
118
|
+
"loggers": loggers,
|
|
110
119
|
}
|
|
111
120
|
|
|
121
|
+
|
|
112
122
|
# Example usage (optional, for testing the function itself)
|
|
113
123
|
if __name__ == "__main__":
|
|
114
124
|
test_loggers = ["app1", "app2", "database"]
|
|
115
|
-
log_directory = Path("data/logs_test")
|
|
125
|
+
log_directory = Path("data/logs_test") # Use a test directory
|
|
116
126
|
|
|
117
127
|
# Optionally clear logs before configuring logging
|
|
118
128
|
print("Clearing logs...")
|
|
@@ -120,8 +130,14 @@ if __name__ == "__main__":
|
|
|
120
130
|
print("Log clearing complete.")
|
|
121
131
|
|
|
122
132
|
# Get logging configuration
|
|
123
|
-
logging_config = get_logging_config(
|
|
133
|
+
logging_config = get_logging_config(
|
|
134
|
+
test_loggers,
|
|
135
|
+
file_log_level="DEBUG",
|
|
136
|
+
console_log_level="WARNING",
|
|
137
|
+
log_dir=log_directory,
|
|
138
|
+
)
|
|
124
139
|
import json
|
|
140
|
+
|
|
125
141
|
print("\nGenerated Logging Configuration:")
|
|
126
142
|
print(json.dumps(logging_config, indent=4))
|
|
127
143
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# Management commands package
|
|
1
|
+
# Management commands package
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# Management commands
|
|
1
|
+
# Management commands
|
|
@@ -4,68 +4,71 @@ Management command to check and configure authentication settings.
|
|
|
4
4
|
|
|
5
5
|
from django.core.management.base import BaseCommand
|
|
6
6
|
from django.conf import settings
|
|
7
|
-
from rest_framework.permissions import IsAuthenticated, AllowAny
|
|
8
7
|
import os
|
|
9
8
|
|
|
10
9
|
|
|
11
10
|
class Command(BaseCommand):
|
|
12
|
-
help =
|
|
11
|
+
help = "Check and configure authentication settings based on environment"
|
|
13
12
|
|
|
14
13
|
def add_arguments(self, parser):
|
|
15
14
|
parser.add_argument(
|
|
16
|
-
|
|
17
|
-
choices=[
|
|
18
|
-
default=
|
|
19
|
-
help=
|
|
15
|
+
"--mode",
|
|
16
|
+
choices=["check", "dev", "prod"],
|
|
17
|
+
default="check",
|
|
18
|
+
help="Mode: check current settings, set dev mode, or set prod mode",
|
|
20
19
|
)
|
|
21
20
|
parser.add_argument(
|
|
22
|
-
|
|
23
|
-
action=
|
|
24
|
-
help=
|
|
21
|
+
"--show-permissions",
|
|
22
|
+
action="store_true",
|
|
23
|
+
help="Show which permission classes will be used",
|
|
25
24
|
)
|
|
26
25
|
|
|
27
26
|
def handle(self, *args, **options):
|
|
28
|
-
mode = options[
|
|
29
|
-
|
|
30
|
-
if mode ==
|
|
27
|
+
mode = options["mode"]
|
|
28
|
+
|
|
29
|
+
if mode == "check":
|
|
31
30
|
self.check_current_settings()
|
|
32
|
-
elif mode ==
|
|
31
|
+
elif mode == "dev":
|
|
33
32
|
self.set_dev_mode()
|
|
34
|
-
elif mode ==
|
|
33
|
+
elif mode == "prod":
|
|
35
34
|
self.set_prod_mode()
|
|
36
|
-
|
|
37
|
-
if options[
|
|
35
|
+
|
|
36
|
+
if options["show_permissions"]:
|
|
38
37
|
self.show_permission_classes()
|
|
39
38
|
|
|
40
39
|
def check_current_settings(self):
|
|
41
40
|
"""Check current authentication configuration."""
|
|
42
|
-
debug_mode = getattr(settings,
|
|
43
|
-
settings_module = os.environ.get(
|
|
44
|
-
|
|
45
|
-
self.stdout.write("\n" + "="*50)
|
|
41
|
+
debug_mode = getattr(settings, "DEBUG", False)
|
|
42
|
+
settings_module = os.environ.get("DJANGO_SETTINGS_MODULE", "Unknown")
|
|
43
|
+
|
|
44
|
+
self.stdout.write("\n" + "=" * 50)
|
|
46
45
|
self.stdout.write("🔍 AUTHENTICATION CONFIGURATION CHECK")
|
|
47
|
-
self.stdout.write("="*50)
|
|
48
|
-
|
|
46
|
+
self.stdout.write("=" * 50)
|
|
47
|
+
|
|
49
48
|
self.stdout.write(f"Settings Module: {settings_module}")
|
|
50
49
|
self.stdout.write(f"DEBUG Mode: {debug_mode}")
|
|
51
|
-
|
|
50
|
+
|
|
52
51
|
if debug_mode:
|
|
53
|
-
self.stdout.write(
|
|
52
|
+
self.stdout.write(
|
|
53
|
+
self.style.WARNING("🔓 Authentication: DISABLED (AllowAny)")
|
|
54
|
+
)
|
|
54
55
|
self.stdout.write(" - All API endpoints are accessible without login")
|
|
55
56
|
self.stdout.write(" - Suitable for development and testing")
|
|
56
57
|
else:
|
|
57
|
-
self.stdout.write(
|
|
58
|
+
self.stdout.write(
|
|
59
|
+
self.style.SUCCESS("🔒 Authentication: ENABLED (IsAuthenticated)")
|
|
60
|
+
)
|
|
58
61
|
self.stdout.write(" - API endpoints require valid authentication")
|
|
59
62
|
self.stdout.write(" - Suitable for production deployment")
|
|
60
|
-
|
|
63
|
+
|
|
61
64
|
# Check if Keycloak is configured
|
|
62
|
-
keycloak_server = getattr(settings,
|
|
65
|
+
keycloak_server = getattr(settings, "KEYCLOAK_SERVER_URL", None)
|
|
63
66
|
if keycloak_server:
|
|
64
67
|
self.stdout.write(f"Keycloak Server: {keycloak_server}")
|
|
65
68
|
else:
|
|
66
69
|
self.stdout.write(self.style.WARNING("⚠️ Keycloak not configured"))
|
|
67
|
-
|
|
68
|
-
self.stdout.write("="*50 + "\n")
|
|
70
|
+
|
|
71
|
+
self.stdout.write("=" * 50 + "\n")
|
|
69
72
|
|
|
70
73
|
def set_dev_mode(self):
|
|
71
74
|
"""Instructions for setting development mode."""
|
|
@@ -79,7 +82,9 @@ class Command(BaseCommand):
|
|
|
79
82
|
self.stdout.write("2. Or run with explicit settings:")
|
|
80
83
|
self.stdout.write(" python manage.py runserver --settings=dev.dev_settings")
|
|
81
84
|
self.stdout.write("")
|
|
82
|
-
self.stdout.write(
|
|
85
|
+
self.stdout.write(
|
|
86
|
+
"This will set DEBUG=True and disable authentication requirements."
|
|
87
|
+
)
|
|
83
88
|
|
|
84
89
|
def set_prod_mode(self):
|
|
85
90
|
"""Instructions for setting production mode."""
|
|
@@ -94,23 +99,25 @@ class Command(BaseCommand):
|
|
|
94
99
|
self.stdout.write(" export DJANGO_SECRET_KEY='your-secure-secret-key'")
|
|
95
100
|
self.stdout.write(" export KEYCLOAK_CLIENT_SECRET='your-keycloak-secret'")
|
|
96
101
|
self.stdout.write("")
|
|
97
|
-
self.stdout.write(
|
|
102
|
+
self.stdout.write(
|
|
103
|
+
"This will set DEBUG=False and enable authentication requirements."
|
|
104
|
+
)
|
|
98
105
|
|
|
99
106
|
def show_permission_classes(self):
|
|
100
107
|
"""Show which permission classes are being used."""
|
|
101
|
-
debug_mode = getattr(settings,
|
|
102
|
-
|
|
103
|
-
self.stdout.write("\n" + "="*40)
|
|
108
|
+
debug_mode = getattr(settings, "DEBUG", False)
|
|
109
|
+
|
|
110
|
+
self.stdout.write("\n" + "=" * 40)
|
|
104
111
|
self.stdout.write("🔐 PERMISSION CLASSES IN USE")
|
|
105
|
-
self.stdout.write("="*40)
|
|
106
|
-
|
|
112
|
+
self.stdout.write("=" * 40)
|
|
113
|
+
|
|
107
114
|
if debug_mode:
|
|
108
115
|
permission_class = "AllowAny"
|
|
109
116
|
icon = "🔓"
|
|
110
117
|
else:
|
|
111
118
|
permission_class = "IsAuthenticated"
|
|
112
119
|
icon = "🔒"
|
|
113
|
-
|
|
120
|
+
|
|
114
121
|
self.stdout.write(f"{icon} Current Mode: {permission_class}")
|
|
115
122
|
self.stdout.write("")
|
|
116
123
|
self.stdout.write("Views using dynamic permissions:")
|
|
@@ -122,4 +129,4 @@ class Command(BaseCommand):
|
|
|
122
129
|
self.stdout.write(" • video_segment_detail_view")
|
|
123
130
|
self.stdout.write(" • video_segments_by_label_id_view")
|
|
124
131
|
self.stdout.write(" • video_segments_by_label_name_view")
|
|
125
|
-
self.stdout.write("="*40 + "\n")
|
|
132
|
+
self.stdout.write("=" * 40 + "\n")
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
Django management command to create ModelMeta from Hugging Face model.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
5
|
from django.core.files.base import ContentFile
|
|
8
6
|
from django.core.management.base import BaseCommand, CommandError
|
|
9
7
|
from huggingface_hub import hf_hub_download
|
|
@@ -124,3 +122,56 @@ class Command(BaseCommand):
|
|
|
124
122
|
|
|
125
123
|
traceback.print_exc()
|
|
126
124
|
raise CommandError("ModelMeta creation failed") from e
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# TODO Review slimmed down version using service endoreg_db/services/model_meta_from_hf.py
|
|
128
|
+
# your management command file
|
|
129
|
+
# from django.core.management.base import BaseCommand, CommandError
|
|
130
|
+
|
|
131
|
+
# from endoreg_db.services.model_meta_from_hf import ensure_model_meta_from_hf
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# class Command(BaseCommand):
|
|
135
|
+
# help = "Create ModelMeta by downloading model from Hugging Face"
|
|
136
|
+
|
|
137
|
+
# def add_arguments(self, parser):
|
|
138
|
+
# parser.add_argument(
|
|
139
|
+
# "--model_id",
|
|
140
|
+
# type=str,
|
|
141
|
+
# default="wg-lux/colo_segmentation_RegNetX800MF_base",
|
|
142
|
+
# )
|
|
143
|
+
# parser.add_argument(
|
|
144
|
+
# "--model_name",
|
|
145
|
+
# type=str,
|
|
146
|
+
# default="image_multilabel_classification_colonoscopy_default",
|
|
147
|
+
# )
|
|
148
|
+
# parser.add_argument(
|
|
149
|
+
# "--labelset_name",
|
|
150
|
+
# type=str,
|
|
151
|
+
# default="multilabel_classification_colonoscopy_default",
|
|
152
|
+
# )
|
|
153
|
+
# parser.add_argument(
|
|
154
|
+
# "--meta_version",
|
|
155
|
+
# type=str,
|
|
156
|
+
# default="1",
|
|
157
|
+
# )
|
|
158
|
+
# parser.add_argument(
|
|
159
|
+
# "--labelset_version",
|
|
160
|
+
# type=int,
|
|
161
|
+
# default=None,
|
|
162
|
+
# )
|
|
163
|
+
|
|
164
|
+
# def handle(self, *args, **options):
|
|
165
|
+
# try:
|
|
166
|
+
# model_meta = ensure_model_meta_from_hf(
|
|
167
|
+
# model_id=options["model_id"],
|
|
168
|
+
# model_name=options["model_name"],
|
|
169
|
+
# labelset_name=options["labelset_name"],
|
|
170
|
+
# meta_version=options["meta_version"],
|
|
171
|
+
# labelset_version=options.get("labelset_version"),
|
|
172
|
+
# )
|
|
173
|
+
# self.stdout.write(
|
|
174
|
+
# self.style.SUCCESS(f"Successfully ensured ModelMeta: {model_meta}")
|
|
175
|
+
# )
|
|
176
|
+
# except Exception as e:
|
|
177
|
+
# raise CommandError(f"ModelMeta creation failed: {e}") from e
|