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
|
@@ -27,59 +27,59 @@ logger = logging.getLogger(__name__)
|
|
|
27
27
|
def parse_range_header(range_header: str, file_size: int) -> Tuple[int, int]:
|
|
28
28
|
"""
|
|
29
29
|
Parse HTTP Range header and return (start, end) byte positions.
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
Args:
|
|
32
32
|
range_header: HTTP Range header value (e.g., "bytes=0-1023")
|
|
33
33
|
file_size: Total file size in bytes
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
Returns:
|
|
36
36
|
Tuple of (start_byte, end_byte) inclusive
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
Raises:
|
|
39
39
|
ValueError: If range header is invalid
|
|
40
40
|
"""
|
|
41
41
|
# Expected format: "bytes=start-end" or "bytes=start-"
|
|
42
|
-
match = re.match(r
|
|
43
|
-
|
|
42
|
+
match = re.match(r"bytes=(\d+)-(\d*)", range_header)
|
|
43
|
+
|
|
44
44
|
if not match:
|
|
45
45
|
raise ValueError(f"Invalid Range header format: {range_header}")
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
start = int(match.group(1))
|
|
48
48
|
end_str = match.group(2)
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
# If end is not specified, use file size - 1
|
|
51
51
|
end = int(end_str) if end_str else file_size - 1
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
# Validate range
|
|
54
54
|
if start >= file_size or start < 0:
|
|
55
55
|
raise ValueError(f"Start byte {start} is out of range (file size: {file_size})")
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
if end >= file_size:
|
|
58
58
|
end = file_size - 1
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
if start > end:
|
|
61
61
|
raise ValueError(f"Invalid range: start ({start}) > end ({end})")
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
return start, end
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
def stream_file_chunk(file_path: Path, start: int, end: int, chunk_size: int = 8192):
|
|
67
67
|
"""
|
|
68
68
|
Generator that yields chunks of a file within the specified byte range.
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
Args:
|
|
71
71
|
file_path: Path to the file
|
|
72
72
|
start: Start byte position (inclusive)
|
|
73
73
|
end: End byte position (inclusive)
|
|
74
74
|
chunk_size: Size of each chunk to yield
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
Yields:
|
|
77
77
|
Bytes chunks from the file
|
|
78
78
|
"""
|
|
79
|
-
with open(file_path,
|
|
79
|
+
with open(file_path, "rb") as f:
|
|
80
80
|
f.seek(start)
|
|
81
81
|
remaining = end - start + 1 # +1 because end is inclusive
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
while remaining > 0:
|
|
84
84
|
chunk = f.read(min(chunk_size, remaining))
|
|
85
85
|
if not chunk:
|
|
@@ -88,57 +88,72 @@ def stream_file_chunk(file_path: Path, start: int, end: int, chunk_size: int = 8
|
|
|
88
88
|
remaining -= len(chunk)
|
|
89
89
|
|
|
90
90
|
|
|
91
|
-
def _stream_video_file(
|
|
91
|
+
def _stream_video_file(
|
|
92
|
+
vf: VideoFile,
|
|
93
|
+
frontend_origin: str,
|
|
94
|
+
file_type: str = "raw",
|
|
95
|
+
range_header: Optional[str] = None,
|
|
96
|
+
) -> FileResponse | StreamingHttpResponse:
|
|
92
97
|
"""
|
|
93
98
|
Helper function to stream a video file with proper headers, CORS support, and HTTP Range Requests.
|
|
94
|
-
|
|
99
|
+
|
|
95
100
|
Args:
|
|
96
101
|
vf: VideoFile model instance
|
|
97
102
|
frontend_origin: Frontend origin URL for CORS headers
|
|
98
103
|
file_type: Either 'raw' (original video) or 'processed' (anonymized video)
|
|
99
104
|
range_header: HTTP Range header value (e.g., "bytes=0-1023") for partial content requests
|
|
100
|
-
|
|
105
|
+
|
|
101
106
|
Returns:
|
|
102
107
|
FileResponse: HTTP 200 response streaming the entire file (no range header)
|
|
103
108
|
StreamingHttpResponse: HTTP 206 response streaming partial content (with range header)
|
|
104
|
-
|
|
109
|
+
|
|
105
110
|
Raises:
|
|
106
111
|
Http404: If video file not found or cannot be accessed
|
|
107
|
-
|
|
112
|
+
|
|
108
113
|
Note:
|
|
109
114
|
Permissions are handled by the calling view, not in this helper function.
|
|
110
115
|
HTTP 206 Partial Content support is critical for video seeking in browsers.
|
|
111
116
|
"""
|
|
112
117
|
try:
|
|
113
118
|
# Determine which file to stream based on file_type
|
|
114
|
-
if file_type ==
|
|
115
|
-
if
|
|
119
|
+
if file_type == "raw":
|
|
120
|
+
if (
|
|
121
|
+
hasattr(vf, "active_raw_file")
|
|
122
|
+
and vf.active_raw_file
|
|
123
|
+
and hasattr(vf.active_raw_file, "name")
|
|
124
|
+
):
|
|
116
125
|
file_ref = vf.active_raw_file
|
|
117
126
|
else:
|
|
118
127
|
raise Http404("No raw video file available for this entry")
|
|
119
|
-
|
|
120
|
-
elif file_type ==
|
|
121
|
-
if
|
|
128
|
+
|
|
129
|
+
elif file_type == "processed":
|
|
130
|
+
if (
|
|
131
|
+
hasattr(vf, "processed_file")
|
|
132
|
+
and vf.processed_file
|
|
133
|
+
and hasattr(vf.processed_file, "name")
|
|
134
|
+
):
|
|
122
135
|
file_ref = vf.processed_file
|
|
123
136
|
else:
|
|
124
137
|
raise Http404("No processed video file available for this entry")
|
|
125
138
|
else:
|
|
126
|
-
raise ValueError(
|
|
127
|
-
|
|
139
|
+
raise ValueError(
|
|
140
|
+
f"Invalid file_type: {file_type}. Must be 'raw' or 'processed'."
|
|
141
|
+
)
|
|
142
|
+
|
|
128
143
|
# FIX: Handle both relative and absolute paths
|
|
129
144
|
# Django FileField.path returns .name if MEDIA_ROOT is not set
|
|
130
145
|
# Import services store relative paths like "videos/UUID.mp4"
|
|
131
146
|
# We need to resolve to absolute path: STORAGE_DIR / "videos/UUID.mp4"
|
|
132
147
|
file_name = file_ref.name
|
|
133
|
-
|
|
134
|
-
if file_name.startswith(
|
|
148
|
+
|
|
149
|
+
if file_name.startswith("/"):
|
|
135
150
|
# Already absolute path
|
|
136
151
|
path = Path(file_name)
|
|
137
152
|
else:
|
|
138
153
|
# Relative path - make absolute by prepending STORAGE_DIR
|
|
139
154
|
path = STORAGE_DIR / file_name
|
|
140
155
|
logger.debug("Resolved relative path '%s' to absolute: %s", file_name, path)
|
|
141
|
-
|
|
156
|
+
|
|
142
157
|
# Validate file exists on disk
|
|
143
158
|
if not path.exists():
|
|
144
159
|
raise Http404(f"Video file not found on disk: {path}")
|
|
@@ -153,37 +168,39 @@ def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'ra
|
|
|
153
168
|
|
|
154
169
|
# Determine MIME type
|
|
155
170
|
mime, _ = mimetypes.guess_type(str(path))
|
|
156
|
-
content_type = mime or
|
|
157
|
-
|
|
171
|
+
content_type = mime or "video/mp4" # Default to mp4 if detection fails
|
|
172
|
+
|
|
158
173
|
# ✅ NEW: HTTP Range Request support for video seeking
|
|
159
174
|
if range_header:
|
|
160
175
|
try:
|
|
161
176
|
# Parse Range header
|
|
162
177
|
start, end = parse_range_header(range_header, file_size)
|
|
163
|
-
logger.debug(
|
|
164
|
-
|
|
178
|
+
logger.debug(
|
|
179
|
+
"Range request: bytes=%d-%d (total: %d)", start, end, file_size
|
|
180
|
+
)
|
|
181
|
+
|
|
165
182
|
# Stream partial content (HTTP 206)
|
|
166
183
|
response = StreamingHttpResponse(
|
|
167
184
|
stream_file_chunk(path, start, end),
|
|
168
185
|
status=206, # Partial Content
|
|
169
|
-
content_type=content_type
|
|
186
|
+
content_type=content_type,
|
|
170
187
|
)
|
|
171
|
-
|
|
188
|
+
|
|
172
189
|
# Set Range-specific headers
|
|
173
|
-
response[
|
|
174
|
-
response[
|
|
175
|
-
response[
|
|
176
|
-
response[
|
|
177
|
-
|
|
190
|
+
response["Content-Range"] = f"bytes {start}-{end}/{file_size}"
|
|
191
|
+
response["Content-Length"] = str(end - start + 1)
|
|
192
|
+
response["Accept-Ranges"] = "bytes"
|
|
193
|
+
response["Content-Disposition"] = f'inline; filename="{path.name}"'
|
|
194
|
+
|
|
178
195
|
except ValueError as e:
|
|
179
196
|
# Invalid range header - return 416 Range Not Satisfiable
|
|
180
197
|
logger.warning("Invalid Range header: %s", str(e))
|
|
181
198
|
response = StreamingHttpResponse(
|
|
182
199
|
status=416, # Range Not Satisfiable
|
|
183
|
-
content_type=content_type
|
|
200
|
+
content_type=content_type,
|
|
184
201
|
)
|
|
185
|
-
response[
|
|
186
|
-
|
|
202
|
+
response["Content-Range"] = f"bytes */{file_size}"
|
|
203
|
+
|
|
187
204
|
else:
|
|
188
205
|
# No Range header - stream entire file (HTTP 200)
|
|
189
206
|
try:
|
|
@@ -191,19 +208,21 @@ def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'ra
|
|
|
191
208
|
with open(path, "rb") as file_handle:
|
|
192
209
|
response = FileResponse(file_handle, content_type=content_type)
|
|
193
210
|
# Set HTTP headers for video streaming
|
|
194
|
-
response[
|
|
195
|
-
response[
|
|
196
|
-
|
|
197
|
-
|
|
211
|
+
response["Content-Length"] = str(file_size)
|
|
212
|
+
response["Accept-Ranges"] = (
|
|
213
|
+
"bytes" # Enable HTTP range requests for seeking
|
|
214
|
+
)
|
|
215
|
+
response["Content-Disposition"] = f'inline; filename="{path.name}"'
|
|
216
|
+
|
|
198
217
|
except IOError as e:
|
|
199
218
|
raise Http404(f"Cannot open video file: {str(e)}")
|
|
200
|
-
|
|
219
|
+
|
|
201
220
|
# CORS headers for frontend access (both HTTP 200 and 206)
|
|
202
221
|
response["Access-Control-Allow-Origin"] = frontend_origin
|
|
203
222
|
response["Access-Control-Allow-Credentials"] = "true"
|
|
204
|
-
|
|
223
|
+
|
|
205
224
|
return response
|
|
206
|
-
|
|
225
|
+
|
|
207
226
|
except Exception as e:
|
|
208
227
|
# Log unexpected errors but don't expose internal details
|
|
209
228
|
logger.error("Unexpected error in _stream_video_file: %s", str(e))
|
|
@@ -213,18 +232,18 @@ def _stream_video_file(vf: VideoFile, frontend_origin: str, file_type: str = 'ra
|
|
|
213
232
|
class VideoStreamView(APIView):
|
|
214
233
|
"""
|
|
215
234
|
Separate view for video streaming to avoid DRF content negotiation issues.
|
|
216
|
-
|
|
235
|
+
|
|
217
236
|
Supports streaming both raw (original) and processed (anonymized) videos.
|
|
218
|
-
|
|
237
|
+
|
|
219
238
|
Query Parameters:
|
|
220
239
|
type: 'raw' (default) or 'processed' - Selects which video file to stream
|
|
221
240
|
file_type: (deprecated, use 'type') - Legacy parameter for backwards compatibility
|
|
222
|
-
|
|
241
|
+
|
|
223
242
|
Examples:
|
|
224
243
|
GET /api/media/videos/1/?type=raw - Stream original raw video
|
|
225
244
|
GET /api/media/videos/1/?type=processed - Stream anonymized/masked video
|
|
226
245
|
GET /api/videostream/1/ - Default to raw video (legacy endpoint)
|
|
227
|
-
|
|
246
|
+
|
|
228
247
|
Phase 3.2 Implementation:
|
|
229
248
|
- Supports dual video comparison (raw vs processed)
|
|
230
249
|
- Backward compatible with legacy ?file_type= parameter
|
|
@@ -232,74 +251,83 @@ class VideoStreamView(APIView):
|
|
|
232
251
|
- CORS support for frontend access
|
|
233
252
|
- HTTP range support for video seeking
|
|
234
253
|
"""
|
|
254
|
+
|
|
235
255
|
permission_classes = [EnvironmentAwarePermission]
|
|
236
|
-
|
|
256
|
+
|
|
237
257
|
def get(self, request, pk=None):
|
|
238
258
|
"""
|
|
239
259
|
Stream raw or anonymized video file with HTTP Range Request and CORS support.
|
|
240
|
-
|
|
260
|
+
|
|
241
261
|
Supports HTTP 206 Partial Content for video seeking functionality.
|
|
242
|
-
|
|
262
|
+
|
|
243
263
|
Args:
|
|
244
264
|
request: HTTP request object
|
|
245
265
|
pk: Video ID (primary key)
|
|
246
|
-
|
|
266
|
+
|
|
247
267
|
Returns:
|
|
248
268
|
FileResponse: HTTP 200 streaming entire video file (no range header)
|
|
249
269
|
StreamingHttpResponse: HTTP 206 streaming partial content (with range header)
|
|
250
|
-
|
|
270
|
+
|
|
251
271
|
Raises:
|
|
252
272
|
Http404: If video not found or file cannot be accessed
|
|
253
273
|
"""
|
|
254
274
|
if pk is None:
|
|
255
275
|
raise Http404("Video ID is required")
|
|
256
|
-
|
|
276
|
+
|
|
257
277
|
# Initialize variables in outer scope
|
|
258
278
|
video_id_int = None
|
|
259
|
-
|
|
279
|
+
|
|
260
280
|
try:
|
|
261
281
|
# Validate video_id is numeric
|
|
262
282
|
try:
|
|
263
283
|
video_id_int = int(pk)
|
|
264
284
|
except (ValueError, TypeError):
|
|
265
285
|
raise Http404("Invalid video ID format")
|
|
266
|
-
|
|
286
|
+
|
|
267
287
|
# Support both 'type' (frontend standard) and 'file_type' (legacy)
|
|
268
288
|
# Priority: type > file_type > default 'raw'
|
|
269
|
-
file_type =
|
|
289
|
+
file_type = "raw" # Default value
|
|
270
290
|
try:
|
|
271
|
-
file_type_param = request.query_params.get(
|
|
291
|
+
file_type_param = request.query_params.get(
|
|
292
|
+
"type"
|
|
293
|
+
) or request.query_params.get("file_type")
|
|
272
294
|
if file_type_param:
|
|
273
295
|
file_type = file_type_param.lower()
|
|
274
|
-
|
|
275
|
-
if file_type not in [
|
|
276
|
-
logger.warning(
|
|
277
|
-
|
|
278
|
-
|
|
296
|
+
|
|
297
|
+
if file_type not in ["raw", "processed"]:
|
|
298
|
+
logger.warning(
|
|
299
|
+
"Invalid file_type '%s', defaulting to 'raw'", file_type
|
|
300
|
+
)
|
|
301
|
+
file_type = "raw"
|
|
302
|
+
|
|
279
303
|
except Exception as e:
|
|
280
|
-
logger.warning(
|
|
281
|
-
|
|
282
|
-
|
|
304
|
+
logger.warning(
|
|
305
|
+
"Error parsing file_type parameter: %s, defaulting to 'raw'", e
|
|
306
|
+
)
|
|
307
|
+
file_type = "raw"
|
|
308
|
+
|
|
283
309
|
# Fetch video from database
|
|
284
310
|
vf = VideoFile.objects.get(pk=video_id_int)
|
|
285
|
-
|
|
311
|
+
|
|
286
312
|
# Get frontend origin for CORS
|
|
287
|
-
frontend_origin = os.environ.get(
|
|
288
|
-
|
|
313
|
+
frontend_origin = os.environ.get("FRONTEND_ORIGIN", "http://localhost:8000")
|
|
314
|
+
|
|
289
315
|
# ✅ NEW: Extract Range header for HTTP 206 support
|
|
290
|
-
range_header = request.META.get(
|
|
291
|
-
|
|
316
|
+
range_header = request.META.get("HTTP_RANGE")
|
|
317
|
+
|
|
292
318
|
# Stream the video file with optional range support
|
|
293
319
|
return _stream_video_file(vf, frontend_origin, file_type, range_header)
|
|
294
|
-
|
|
320
|
+
|
|
295
321
|
except VideoFile.DoesNotExist:
|
|
296
322
|
raise Http404(f"Video with ID {pk} not found")
|
|
297
|
-
|
|
323
|
+
|
|
298
324
|
except Http404:
|
|
299
325
|
# Re-raise Http404 exceptions as they should bubble up
|
|
300
326
|
raise
|
|
301
|
-
|
|
327
|
+
|
|
302
328
|
except Exception as e:
|
|
303
329
|
# Log unexpected errors and convert to Http404
|
|
304
|
-
logger.error(
|
|
330
|
+
logger.error(
|
|
331
|
+
"Unexpected error in VideoStreamView for video_id=%s: %s", pk, str(e)
|
|
332
|
+
)
|
|
305
333
|
raise Http404("Video streaming failed")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: endoreg-db
|
|
3
|
-
Version: 0.8.9.
|
|
3
|
+
Version: 0.8.9.10
|
|
4
4
|
Summary: EndoReg Db Django App
|
|
5
5
|
Project-URL: Homepage, https://info.coloreg.de
|
|
6
6
|
Project-URL: Repository, https://github.com/wg-lux/endoreg-db
|
|
@@ -22,8 +22,9 @@ Requires-Dist: django-bootstrap5>=25.2
|
|
|
22
22
|
Requires-Dist: django-cors-headers>=4.8.0
|
|
23
23
|
Requires-Dist: django-extensions>=3.2.3
|
|
24
24
|
Requires-Dist: django-filter>=25.1
|
|
25
|
-
Requires-Dist: django-
|
|
25
|
+
Requires-Dist: django-stubs>=5.2.8
|
|
26
26
|
Requires-Dist: django>=5.2.4
|
|
27
|
+
Requires-Dist: djangorestframework-stubs>=3.16.6
|
|
27
28
|
Requires-Dist: djangorestframework>=3.16.1
|
|
28
29
|
Requires-Dist: dotenv>=0.9.9
|
|
29
30
|
Requires-Dist: faker>=37.6.0
|
|
@@ -33,7 +34,7 @@ Requires-Dist: gunicorn>=23.0.0
|
|
|
33
34
|
Requires-Dist: icecream>=2.1.4
|
|
34
35
|
Requires-Dist: librosa==0.11.0
|
|
35
36
|
Requires-Dist: llvmlite>=0.44.0
|
|
36
|
-
Requires-Dist: lx-anonymizer[llm,ocr]==0.8.9.
|
|
37
|
+
Requires-Dist: lx-anonymizer[llm,ocr]==0.8.9.8
|
|
37
38
|
Requires-Dist: moviepy==2.2.1
|
|
38
39
|
Requires-Dist: mozilla-django-oidc>=4.0.1
|
|
39
40
|
Requires-Dist: mypy>=1.16.0
|
|
@@ -45,6 +46,7 @@ Requires-Dist: optimum==1.26.1
|
|
|
45
46
|
Requires-Dist: pandas>=2.2.3
|
|
46
47
|
Requires-Dist: pillow>=11.3.0
|
|
47
48
|
Requires-Dist: pip>=25.2
|
|
49
|
+
Requires-Dist: pre-commit>=4.5.1
|
|
48
50
|
Requires-Dist: pydantic>=2.10.6
|
|
49
51
|
Requires-Dist: pyjwt>=2.10.1
|
|
50
52
|
Requires-Dist: pytesseract>=0.3.13
|
|
@@ -73,6 +75,10 @@ Requires-Dist: torchvision==0.20.1
|
|
|
73
75
|
Requires-Dist: tqdm>=4.67.0
|
|
74
76
|
Requires-Dist: transformers==4.44.2
|
|
75
77
|
Requires-Dist: twine>=6.2.0
|
|
78
|
+
Requires-Dist: types-django-filter>=25.2.0.20251010
|
|
79
|
+
Requires-Dist: types-pyyaml>=6.0.12.20250915
|
|
80
|
+
Requires-Dist: types-requests>=2.32.4.20250913
|
|
81
|
+
Requires-Dist: types-tqdm>=4.67.0.20250809
|
|
76
82
|
Requires-Dist: urllib3>=2.2.3
|
|
77
83
|
Requires-Dist: vector-quantize-pytorch==1.18.5
|
|
78
84
|
Requires-Dist: vocos==0.1.0
|