endoreg-db 0.8.9.2__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 +89 -122
- 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/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 -4
- 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/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.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/METADATA +9 -3
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/RECORD +434 -431
- 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.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.9.2.dist-info → endoreg_db-0.8.9.10.dist-info}/licenses/LICENSE +0 -0
|
@@ -42,16 +42,24 @@ class Command(BaseCommand):
|
|
|
42
42
|
force_recreate = options.get("force_recreate", False)
|
|
43
43
|
yaml_only = options.get("yaml_only", False)
|
|
44
44
|
|
|
45
|
-
self.stdout.write(
|
|
45
|
+
self.stdout.write(
|
|
46
|
+
self.style.SUCCESS("🚀 Starting EndoReg DB embedded app setup...")
|
|
47
|
+
)
|
|
46
48
|
|
|
47
49
|
if yaml_only:
|
|
48
|
-
self.stdout.write(
|
|
50
|
+
self.stdout.write(
|
|
51
|
+
self.style.WARNING(
|
|
52
|
+
"📋 YAML-only mode: Will not auto-generate missing metadata"
|
|
53
|
+
)
|
|
54
|
+
)
|
|
49
55
|
|
|
50
56
|
# Step 1: Load base database data
|
|
51
57
|
self.stdout.write("\n📊 Step 1: Loading base database data...")
|
|
52
58
|
try:
|
|
53
59
|
call_command("load_base_db_data")
|
|
54
|
-
self.stdout.write(
|
|
60
|
+
self.stdout.write(
|
|
61
|
+
self.style.SUCCESS("✅ Base database data loaded successfully")
|
|
62
|
+
)
|
|
55
63
|
except Exception as e:
|
|
56
64
|
self.stdout.write(self.style.ERROR(f"❌ Failed to load base data: {e}"))
|
|
57
65
|
return
|
|
@@ -65,9 +73,13 @@ class Command(BaseCommand):
|
|
|
65
73
|
self.stdout.write("Using database caching - creating cache table...")
|
|
66
74
|
try:
|
|
67
75
|
call_command("createcachetable")
|
|
68
|
-
self.stdout.write(
|
|
76
|
+
self.stdout.write(
|
|
77
|
+
self.style.SUCCESS("✅ Cache table created successfully")
|
|
78
|
+
)
|
|
69
79
|
except Exception as e:
|
|
70
|
-
self.stdout.write(
|
|
80
|
+
self.stdout.write(
|
|
81
|
+
self.style.ERROR(f"❌ Failed to create cache table: {e}")
|
|
82
|
+
)
|
|
71
83
|
return
|
|
72
84
|
else:
|
|
73
85
|
self.stdout.write("Using in-memory caching - skipping cache table creation")
|
|
@@ -79,18 +91,26 @@ class Command(BaseCommand):
|
|
|
79
91
|
self.stdout.write("\n🤖 Step 3: Loading AI model data...")
|
|
80
92
|
try:
|
|
81
93
|
call_command("load_ai_model_data")
|
|
82
|
-
self.stdout.write(
|
|
94
|
+
self.stdout.write(
|
|
95
|
+
self.style.SUCCESS("✅ AI model data loaded successfully")
|
|
96
|
+
)
|
|
83
97
|
except Exception as e:
|
|
84
|
-
self.stdout.write(
|
|
98
|
+
self.stdout.write(
|
|
99
|
+
self.style.ERROR(f"❌ Failed to load AI model data: {e}")
|
|
100
|
+
)
|
|
85
101
|
return
|
|
86
102
|
|
|
87
103
|
# Step 4: Load AI model label data
|
|
88
104
|
self.stdout.write("\n🏷️ Step 4: Loading AI model label data...")
|
|
89
105
|
try:
|
|
90
106
|
call_command("load_ai_model_label_data")
|
|
91
|
-
self.stdout.write(
|
|
107
|
+
self.stdout.write(
|
|
108
|
+
self.style.SUCCESS("✅ AI model label data loaded successfully")
|
|
109
|
+
)
|
|
92
110
|
except Exception as e:
|
|
93
|
-
self.stdout.write(
|
|
111
|
+
self.stdout.write(
|
|
112
|
+
self.style.ERROR(f"❌ Failed to load AI model label data: {e}")
|
|
113
|
+
)
|
|
94
114
|
return
|
|
95
115
|
|
|
96
116
|
# Step 5: Create model metadata
|
|
@@ -109,12 +129,20 @@ class Command(BaseCommand):
|
|
|
109
129
|
ai_model = AiModel.objects.filter(name=default_model_name).first()
|
|
110
130
|
|
|
111
131
|
if not ai_model:
|
|
112
|
-
self.stdout.write(
|
|
132
|
+
self.stdout.write(
|
|
133
|
+
self.style.ERROR(
|
|
134
|
+
f"❌ AI model '{default_model_name}' not found"
|
|
135
|
+
)
|
|
136
|
+
)
|
|
113
137
|
return
|
|
114
138
|
|
|
115
139
|
existing_meta = ai_model.metadata_versions.first()
|
|
116
140
|
if existing_meta and not force_recreate:
|
|
117
|
-
self.stdout.write(
|
|
141
|
+
self.stdout.write(
|
|
142
|
+
self.style.SUCCESS(
|
|
143
|
+
"✅ Model metadata already exists (use --force-recreate to recreate)"
|
|
144
|
+
)
|
|
145
|
+
)
|
|
118
146
|
else:
|
|
119
147
|
# Try to create model metadata using configurable approach
|
|
120
148
|
model_path = self._find_model_weights_file()
|
|
@@ -129,34 +157,56 @@ class Command(BaseCommand):
|
|
|
129
157
|
if force_recreate:
|
|
130
158
|
call_command_kwargs["bump_version"] = True
|
|
131
159
|
|
|
132
|
-
call_command(
|
|
133
|
-
|
|
160
|
+
call_command(
|
|
161
|
+
"create_multilabel_model_meta", **call_command_kwargs
|
|
162
|
+
)
|
|
163
|
+
self.stdout.write(
|
|
164
|
+
self.style.SUCCESS(
|
|
165
|
+
"✅ AI model metadata created successfully"
|
|
166
|
+
)
|
|
167
|
+
)
|
|
134
168
|
else:
|
|
135
|
-
self.stdout.write(
|
|
169
|
+
self.stdout.write(
|
|
170
|
+
self.style.WARNING(
|
|
171
|
+
"⚠️ Model weights file not found. AI features may not work properly."
|
|
172
|
+
)
|
|
173
|
+
)
|
|
136
174
|
|
|
137
175
|
except Exception as e:
|
|
138
|
-
self.stdout.write(
|
|
176
|
+
self.stdout.write(
|
|
177
|
+
self.style.ERROR(f"❌ Failed to create AI model metadata: {e}")
|
|
178
|
+
)
|
|
139
179
|
return
|
|
140
180
|
|
|
141
181
|
# Step 5.5: Validate and fix AI model active metadata
|
|
142
182
|
self.stdout.write("\n🔧 Step 5.5: Validating AI model active metadata...")
|
|
143
183
|
try:
|
|
144
184
|
self._validate_and_fix_ai_model_metadata(yaml_only)
|
|
145
|
-
self.stdout.write(
|
|
185
|
+
self.stdout.write(
|
|
186
|
+
self.style.SUCCESS("✅ AI model metadata validation completed")
|
|
187
|
+
)
|
|
146
188
|
except Exception as e:
|
|
147
|
-
self.stdout.write(
|
|
189
|
+
self.stdout.write(
|
|
190
|
+
self.style.ERROR(f"❌ Failed to validate AI model metadata: {e}")
|
|
191
|
+
)
|
|
148
192
|
return
|
|
149
193
|
|
|
150
194
|
# Step 6: Verification
|
|
151
195
|
self.stdout.write("\n🔍 Step 6: Verifying setup...")
|
|
152
196
|
try:
|
|
153
197
|
self._verify_setup()
|
|
154
|
-
self.stdout.write(
|
|
198
|
+
self.stdout.write(
|
|
199
|
+
self.style.SUCCESS("✅ Setup verification completed successfully")
|
|
200
|
+
)
|
|
155
201
|
except Exception as e:
|
|
156
202
|
self.stdout.write(self.style.ERROR(f"❌ Setup verification failed: {e}"))
|
|
157
203
|
return
|
|
158
204
|
|
|
159
|
-
self.stdout.write(
|
|
205
|
+
self.stdout.write(
|
|
206
|
+
self.style.SUCCESS(
|
|
207
|
+
"\n🎉 EndoReg DB embedded app setup completed successfully!"
|
|
208
|
+
)
|
|
209
|
+
)
|
|
160
210
|
self.stdout.write("\nNext steps:")
|
|
161
211
|
# self.stdout.write("1. Run migrations: python manage.py migrate")
|
|
162
212
|
self.stdout.write("1. Create superuser: python manage.py createsuperuser")
|
|
@@ -176,12 +226,19 @@ class Command(BaseCommand):
|
|
|
176
226
|
# If no local weights found and HuggingFace fallback is enabled
|
|
177
227
|
hf_config = setup_config.get_huggingface_config()
|
|
178
228
|
if hf_config.get("enabled", True):
|
|
179
|
-
self.stdout.write(
|
|
229
|
+
self.stdout.write(
|
|
230
|
+
"📦 No local model weights found — attempting HuggingFace download..."
|
|
231
|
+
)
|
|
180
232
|
try:
|
|
181
233
|
if not ModelMeta.objects.exists():
|
|
182
234
|
ModelMeta.setup_default_from_huggingface(
|
|
183
|
-
hf_config.get(
|
|
184
|
-
|
|
235
|
+
hf_config.get(
|
|
236
|
+
"repo_id", "wg-lux/colo_segmentation_RegNetX800MF_base"
|
|
237
|
+
),
|
|
238
|
+
labelset_name=hf_config.get(
|
|
239
|
+
"labelset_name",
|
|
240
|
+
"multilabel_classification_colonoscopy_default",
|
|
241
|
+
),
|
|
185
242
|
)
|
|
186
243
|
self.stdout.write("✅ Default ModelMeta created from HuggingFace.")
|
|
187
244
|
|
|
@@ -216,7 +273,9 @@ class Command(BaseCommand):
|
|
|
216
273
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
|
|
217
274
|
existing_tables = [row[0] for row in cursor.fetchall()]
|
|
218
275
|
|
|
219
|
-
missing_tables = [
|
|
276
|
+
missing_tables = [
|
|
277
|
+
table for table in required_tables if table not in existing_tables
|
|
278
|
+
]
|
|
220
279
|
if missing_tables:
|
|
221
280
|
raise Exception(f"Missing required tables: {missing_tables}")
|
|
222
281
|
|
|
@@ -262,7 +321,9 @@ class Command(BaseCommand):
|
|
|
262
321
|
|
|
263
322
|
if metadata_count == 0:
|
|
264
323
|
if yaml_only:
|
|
265
|
-
self.stdout.write(
|
|
324
|
+
self.stdout.write(
|
|
325
|
+
f" ⚠️ YAML-only mode: Skipping auto-generation for {model.name}"
|
|
326
|
+
)
|
|
266
327
|
continue
|
|
267
328
|
|
|
268
329
|
# Create metadata for models that don't have any
|
|
@@ -275,7 +336,10 @@ class Command(BaseCommand):
|
|
|
275
336
|
except LabelSet.DoesNotExist:
|
|
276
337
|
labelset = LabelSet.objects.first()
|
|
277
338
|
if not labelset:
|
|
278
|
-
labelset = LabelSet.objects.create(
|
|
339
|
+
labelset = LabelSet.objects.create(
|
|
340
|
+
name="default_colonoscopy_labels",
|
|
341
|
+
description="Default colonoscopy classification labels",
|
|
342
|
+
)
|
|
279
343
|
|
|
280
344
|
# Create basic metadata WITH weights if available
|
|
281
345
|
weights_file = self._find_model_weights_file()
|
|
@@ -330,7 +394,9 @@ class Command(BaseCommand):
|
|
|
330
394
|
|
|
331
395
|
# Check if the metadata has weights - if not, try to assign them
|
|
332
396
|
if not first_meta.weights:
|
|
333
|
-
self.stdout.write(
|
|
397
|
+
self.stdout.write(
|
|
398
|
+
" Metadata exists but no weights assigned, attempting to add weights..."
|
|
399
|
+
)
|
|
334
400
|
weights_file = self._find_model_weights_file()
|
|
335
401
|
if weights_file:
|
|
336
402
|
from pathlib import Path
|
|
@@ -338,7 +404,9 @@ class Command(BaseCommand):
|
|
|
338
404
|
from endoreg_db.utils.paths import STORAGE_DIR
|
|
339
405
|
|
|
340
406
|
try:
|
|
341
|
-
weights_path = str(
|
|
407
|
+
weights_path = str(
|
|
408
|
+
Path(weights_file).relative_to(STORAGE_DIR)
|
|
409
|
+
)
|
|
342
410
|
except ValueError:
|
|
343
411
|
# Copy weights to storage if not already there
|
|
344
412
|
import shutil
|
|
@@ -348,22 +416,32 @@ class Command(BaseCommand):
|
|
|
348
416
|
dest_path = weights_dir / Path(weights_file).name
|
|
349
417
|
shutil.copy2(weights_file, dest_path)
|
|
350
418
|
weights_path = str(dest_path.relative_to(STORAGE_DIR))
|
|
351
|
-
self.stdout.write(
|
|
419
|
+
self.stdout.write(
|
|
420
|
+
f" Copied weights to: {dest_path}"
|
|
421
|
+
)
|
|
352
422
|
|
|
353
423
|
# Assign the relative path to the FileField
|
|
354
424
|
first_meta.weights.name = weights_path
|
|
355
425
|
first_meta.save(update_fields=["weights"])
|
|
356
|
-
self.stdout.write(
|
|
426
|
+
self.stdout.write(
|
|
427
|
+
f" Added weights to existing metadata: {weights_path}"
|
|
428
|
+
)
|
|
357
429
|
|
|
358
430
|
model.active_meta = first_meta
|
|
359
431
|
model.save()
|
|
360
432
|
fixed_count += 1
|
|
361
|
-
self.stdout.write(
|
|
433
|
+
self.stdout.write(
|
|
434
|
+
f" ✅ Set active metadata: {first_meta.name} v{first_meta.version}"
|
|
435
|
+
)
|
|
362
436
|
else:
|
|
363
|
-
self.stdout.write(
|
|
437
|
+
self.stdout.write(
|
|
438
|
+
f" ⚠️ No metadata versions available for {model.name}"
|
|
439
|
+
)
|
|
364
440
|
|
|
365
441
|
else:
|
|
366
|
-
self.stdout.write(
|
|
442
|
+
self.stdout.write(
|
|
443
|
+
f" ✅ Model {model.name} has active metadata: {model.active_meta}"
|
|
444
|
+
)
|
|
367
445
|
|
|
368
446
|
# Verify all models can get latest version
|
|
369
447
|
self.stdout.write("\nTesting model metadata access...")
|
|
@@ -266,7 +266,7 @@ class Command(BaseCommand):
|
|
|
266
266
|
for video in completed_videos:
|
|
267
267
|
try:
|
|
268
268
|
# Find frame directories for this video
|
|
269
|
-
video_frame_dirs = list(frames_dir.glob(f"*{video.
|
|
269
|
+
video_frame_dirs = list(frames_dir.glob(f"*{video.video_hash}*"))
|
|
270
270
|
|
|
271
271
|
for frame_dir in video_frame_dirs:
|
|
272
272
|
if frame_dir.is_dir():
|
|
@@ -277,11 +277,13 @@ class Command(BaseCommand):
|
|
|
277
277
|
|
|
278
278
|
total_freed += dir_size
|
|
279
279
|
self.stdout.write(
|
|
280
|
-
f" Removed frames for {video.
|
|
280
|
+
f" Removed frames for {video.video_hash}: {dir_size / (1024**2):.1f} MB"
|
|
281
281
|
)
|
|
282
282
|
|
|
283
283
|
except Exception as e:
|
|
284
|
-
logger.warning(
|
|
284
|
+
logger.warning(
|
|
285
|
+
f"Failed to clean frames for video {video.video_hash}: {e}"
|
|
286
|
+
)
|
|
285
287
|
continue
|
|
286
288
|
|
|
287
289
|
self.stdout.write(f"✅ Frames cleanup: {total_freed / (1024**3):.2f} GB freed")
|
|
@@ -410,7 +412,7 @@ class Command(BaseCommand):
|
|
|
410
412
|
f"Found {old_videos.count()} processed videos older than {max_age_days} days"
|
|
411
413
|
)
|
|
412
414
|
|
|
413
|
-
except Exception
|
|
415
|
+
except Exception:
|
|
414
416
|
# Fallback: try different date field names
|
|
415
417
|
try:
|
|
416
418
|
old_videos = VideoFile.objects.filter(
|
|
@@ -443,11 +445,13 @@ class Command(BaseCommand):
|
|
|
443
445
|
|
|
444
446
|
total_freed += file_size
|
|
445
447
|
self.stdout.write(
|
|
446
|
-
f" Removed processed video {video.
|
|
448
|
+
f" Removed processed video {video.video_hash}: {file_size / (1024**2):.1f} MB"
|
|
447
449
|
)
|
|
448
450
|
|
|
449
451
|
except Exception as e:
|
|
450
|
-
logger.warning(
|
|
452
|
+
logger.warning(
|
|
453
|
+
f"Failed to clean processed video {video.video_hash}: {e}"
|
|
454
|
+
)
|
|
451
455
|
continue
|
|
452
456
|
|
|
453
457
|
self.stdout.write(
|
|
@@ -558,7 +562,9 @@ class Command(BaseCommand):
|
|
|
558
562
|
freed = self._cleanup_processed_video_file(video)
|
|
559
563
|
total_freed += freed
|
|
560
564
|
except Exception as e:
|
|
561
|
-
logger.warning(
|
|
565
|
+
logger.warning(
|
|
566
|
+
f"Failed to clean processed video {video.video_hash}: {e}"
|
|
567
|
+
)
|
|
562
568
|
continue
|
|
563
569
|
|
|
564
570
|
except Exception as e:
|
|
@@ -582,7 +588,7 @@ class Command(BaseCommand):
|
|
|
582
588
|
video.processed_file = None
|
|
583
589
|
video.save(update_fields=["processed_file"])
|
|
584
590
|
self.stdout.write(
|
|
585
|
-
f" Removed processed video {video.
|
|
591
|
+
f" Removed processed video {video.video_hash}: {file_size / (1024**2):.1f} MB"
|
|
586
592
|
)
|
|
587
593
|
return file_size
|
|
588
594
|
return 0
|