endoreg-db 0.8.2__py3-none-any.whl → 0.8.2.2__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/config/__init__.py +0 -0
- endoreg_db/helpers/default_objects.py +48 -29
- endoreg_db/management/commands/import_video.py +5 -3
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/models/administration/center/center.py +7 -1
- endoreg_db/models/media/pdf/raw_pdf.py +31 -26
- endoreg_db/models/media/video/create_from_file.py +26 -4
- endoreg_db/models/media/video/video_file.py +89 -57
- endoreg_db/models/media/video/video_file_anonymize.py +2 -1
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +12 -0
- endoreg_db/models/media/video/video_file_io.py +4 -2
- endoreg_db/models/metadata/sensitive_meta.py +6 -6
- endoreg_db/models/metadata/video_meta.py +2 -2
- endoreg_db/services/pdf_import.py +131 -15
- endoreg_db/services/pseudonym_service.py +1 -1
- endoreg_db/services/video_import.py +400 -387
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/utils/paths.py +2 -10
- endoreg_db/utils/video/ffmpeg_wrapper.py +67 -4
- endoreg_db/views/anonymization/validate.py +75 -34
- endoreg_db/views/video/correction.py +8 -6
- {endoreg_db-0.8.2.dist-info → endoreg_db-0.8.2.2.dist-info}/METADATA +2 -2
- {endoreg_db-0.8.2.dist-info → endoreg_db-0.8.2.2.dist-info}/RECORD +25 -23
- endoreg_db/services/ollama_api_docs.py +0 -1528
- {endoreg_db-0.8.2.dist-info → endoreg_db-0.8.2.2.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.2.dist-info → endoreg_db-0.8.2.2.dist-info}/licenses/LICENSE +0 -0
|
File without changes
|
endoreg_db/utils/paths.py
CHANGED
|
@@ -8,19 +8,12 @@ It provides a unified dictionary 'data_paths' for accessing all path objects.
|
|
|
8
8
|
from logging import getLogger
|
|
9
9
|
logger = getLogger(__name__)
|
|
10
10
|
|
|
11
|
-
import os
|
|
12
11
|
from pathlib import Path
|
|
13
12
|
from typing import Dict
|
|
14
|
-
import dotenv
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
if not os.environ.get("PYTEST_CURRENT_TEST"):
|
|
18
|
-
dotenv.load_dotenv()
|
|
19
|
-
else:
|
|
20
|
-
logger.debug("Skipping .env load under pytest")
|
|
14
|
+
from endoreg_db.config.env import env_path
|
|
21
15
|
|
|
22
|
-
|
|
23
|
-
STORAGE_DIR = Path(os.getenv("STORAGE_DIR"))
|
|
16
|
+
STORAGE_DIR = env_path("STORAGE_DIR", "storage")
|
|
24
17
|
|
|
25
18
|
# Resolve STORAGE_DIR from env or default under BASE_DIR
|
|
26
19
|
#def _resolve_storage_dir() -> Path:
|
|
@@ -36,7 +29,6 @@ STORAGE_DIR = Path(os.getenv("STORAGE_DIR"))
|
|
|
36
29
|
STORAGE_DIR.mkdir(parents=True, exist_ok=True)
|
|
37
30
|
|
|
38
31
|
PREFIX_RAW = "raw_"
|
|
39
|
-
STORAGE_DIR_NAME = "data"
|
|
40
32
|
IMPORT_DIR_NAME = "import"
|
|
41
33
|
EXPORT_DIR_NAME = "export"
|
|
42
34
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import subprocess
|
|
2
3
|
import json
|
|
3
4
|
import logging
|
|
5
|
+
from functools import lru_cache
|
|
4
6
|
from pathlib import Path
|
|
5
7
|
from typing import List, Dict, Optional, Tuple
|
|
6
8
|
import cv2
|
|
@@ -13,6 +15,67 @@ logger = logging.getLogger("ffmpeg_wrapper")
|
|
|
13
15
|
_nvenc_available = None
|
|
14
16
|
_preferred_encoder = None
|
|
15
17
|
|
|
18
|
+
|
|
19
|
+
@lru_cache(maxsize=1)
|
|
20
|
+
def _resolve_ffmpeg_executable() -> Optional[str]:
|
|
21
|
+
"""Locate the ffmpeg executable using multiple discovery strategies."""
|
|
22
|
+
# 1) Explicit overrides via env vars
|
|
23
|
+
env_candidates = [
|
|
24
|
+
os.environ.get("FFMPEG_EXECUTABLE"),
|
|
25
|
+
os.environ.get("FFMPEG_BINARY"),
|
|
26
|
+
os.environ.get("FFMPEG_PATH"),
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
# 2) Django settings overrides (if Django is configured)
|
|
30
|
+
try:
|
|
31
|
+
from django.conf import settings # type: ignore
|
|
32
|
+
|
|
33
|
+
env_candidates.extend(
|
|
34
|
+
getattr(settings, attr)
|
|
35
|
+
for attr in ("FFMPEG_EXECUTABLE", "FFMPEG_BINARY", "FFMPEG_PATH")
|
|
36
|
+
if hasattr(settings, attr)
|
|
37
|
+
)
|
|
38
|
+
except Exception:
|
|
39
|
+
# Django might not be configured for every consumer
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
# Normalize and verify explicit candidates
|
|
43
|
+
for candidate in env_candidates:
|
|
44
|
+
if not candidate:
|
|
45
|
+
continue
|
|
46
|
+
candidate_path = Path(candidate)
|
|
47
|
+
if candidate_path.is_dir():
|
|
48
|
+
candidate_path = candidate_path / "ffmpeg"
|
|
49
|
+
if candidate_path.exists() and os.access(candidate_path, os.X_OK):
|
|
50
|
+
logger.debug("Using ffmpeg executable override at %s", candidate_path)
|
|
51
|
+
return str(candidate_path)
|
|
52
|
+
|
|
53
|
+
# 3) PATH lookup (shutil.which)
|
|
54
|
+
via_path = shutil.which("ffmpeg")
|
|
55
|
+
if via_path:
|
|
56
|
+
return via_path
|
|
57
|
+
|
|
58
|
+
# 4) Common fallback locations (useful for Nix-based environments)
|
|
59
|
+
nix_store = Path("/nix/store")
|
|
60
|
+
if nix_store.exists():
|
|
61
|
+
patterns = (
|
|
62
|
+
"*-ffmpeg-*/bin/ffmpeg",
|
|
63
|
+
"*-ffmpeg-headless-*/bin/ffmpeg",
|
|
64
|
+
"*-ffmpeg-headless*/bin/ffmpeg",
|
|
65
|
+
)
|
|
66
|
+
for pattern in patterns:
|
|
67
|
+
matches = sorted(nix_store.glob(pattern))
|
|
68
|
+
if matches:
|
|
69
|
+
logger.debug("Discovered ffmpeg in nix store at %s", matches[-1])
|
|
70
|
+
return str(matches[-1])
|
|
71
|
+
|
|
72
|
+
# 5) Final fallback to standard Unix locations
|
|
73
|
+
for fallback in (Path("/usr/bin/ffmpeg"), Path("/usr/local/bin/ffmpeg")):
|
|
74
|
+
if fallback.exists() and os.access(fallback, os.X_OK):
|
|
75
|
+
return str(fallback)
|
|
76
|
+
|
|
77
|
+
return None
|
|
78
|
+
|
|
16
79
|
def _detect_nvenc_support() -> bool:
|
|
17
80
|
"""
|
|
18
81
|
Detect if NVIDIA NVENC hardware acceleration is available.
|
|
@@ -163,7 +226,7 @@ def is_ffmpeg_available() -> bool:
|
|
|
163
226
|
Returns:
|
|
164
227
|
True if FFmpeg is found in the PATH; otherwise, False.
|
|
165
228
|
"""
|
|
166
|
-
return
|
|
229
|
+
return _resolve_ffmpeg_executable() is not None
|
|
167
230
|
|
|
168
231
|
def check_ffmpeg_availability():
|
|
169
232
|
"""
|
|
@@ -607,8 +670,8 @@ def extract_frames(
|
|
|
607
670
|
Returns:
|
|
608
671
|
A list of Path objects for the extracted frames.
|
|
609
672
|
"""
|
|
610
|
-
#
|
|
611
|
-
ffmpeg_executable =
|
|
673
|
+
# Resolve ffmpeg executable with multiple fallbacks
|
|
674
|
+
ffmpeg_executable = _resolve_ffmpeg_executable()
|
|
612
675
|
if not ffmpeg_executable:
|
|
613
676
|
error_msg = "ffmpeg command not found. Ensure FFmpeg is installed and in the system's PATH."
|
|
614
677
|
logger.error(error_msg)
|
|
@@ -691,7 +754,7 @@ def extract_frame_range(
|
|
|
691
754
|
logger.warning("extract_frame_range called with start_frame (%d) >= end_frame (%d). No frames to extract.", start_frame, end_frame)
|
|
692
755
|
return []
|
|
693
756
|
|
|
694
|
-
ffmpeg_executable =
|
|
757
|
+
ffmpeg_executable = _resolve_ffmpeg_executable()
|
|
695
758
|
if not ffmpeg_executable:
|
|
696
759
|
error_msg = "ffmpeg command not found. Ensure FFmpeg is installed and in the system's PATH."
|
|
697
760
|
logger.error(error_msg)
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, cast
|
|
3
|
+
|
|
4
|
+
from django.db import transaction
|
|
1
5
|
from rest_framework import status
|
|
2
6
|
from rest_framework.response import Response
|
|
3
7
|
from rest_framework.views import APIView
|
|
4
|
-
|
|
5
|
-
from endoreg_db.models import
|
|
8
|
+
|
|
9
|
+
from endoreg_db.models import RawPdfFile, VideoFile
|
|
6
10
|
from endoreg_db.serializers.anonymization import SensitiveMetaValidateSerializer
|
|
7
11
|
|
|
8
12
|
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
9
16
|
class AnonymizationValidateView(APIView):
|
|
10
17
|
"""
|
|
11
18
|
POST /api/anonymization/<int:file_id>/validate/
|
|
@@ -32,35 +39,69 @@ class AnonymizationValidateView(APIView):
|
|
|
32
39
|
# Serializer-Validierung mit deutscher Datums-Priorität
|
|
33
40
|
serializer = SensitiveMetaValidateSerializer(data=request.data or {})
|
|
34
41
|
serializer.is_valid(raise_exception=True)
|
|
35
|
-
|
|
36
|
-
payload
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
42
|
+
validated_data = cast(Dict[str, Any], serializer.validated_data)
|
|
43
|
+
payload: Dict[str, Any] = dict(validated_data)
|
|
44
|
+
if "is_verified" not in payload:
|
|
45
|
+
payload["is_verified"] = True
|
|
46
|
+
|
|
47
|
+
file_type = payload.get("file_type")
|
|
48
|
+
|
|
49
|
+
# Try Video first (unless explicitly requesting PDF)
|
|
50
|
+
if file_type in (None, "video"):
|
|
51
|
+
video = VideoFile.objects.select_related("center").filter(pk=file_id).first()
|
|
52
|
+
if video is not None:
|
|
53
|
+
prepared_payload = self._prepare_payload(payload, video)
|
|
54
|
+
try:
|
|
55
|
+
ok = video.validate_metadata_annotation(prepared_payload)
|
|
56
|
+
except Exception: # pragma: no cover - defensive safety net
|
|
57
|
+
logger.exception("Video validation crashed for id=%s", file_id)
|
|
58
|
+
return Response(
|
|
59
|
+
{"error": "Video validation encountered an unexpected error."},
|
|
60
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
if not ok:
|
|
64
|
+
return Response({"error": "Video validation failed."}, status=status.HTTP_400_BAD_REQUEST)
|
|
65
|
+
|
|
66
|
+
return Response({"message": "Video validated."}, status=status.HTTP_200_OK)
|
|
67
|
+
|
|
68
|
+
if file_type == "video":
|
|
69
|
+
return Response({"error": f"Video {file_id} not found."}, status=status.HTTP_404_NOT_FOUND)
|
|
70
|
+
|
|
71
|
+
# Then PDF (unless explicitly requesting Video)
|
|
72
|
+
if file_type in (None, "pdf"):
|
|
73
|
+
pdf = RawPdfFile.objects.select_related("center").filter(pk=file_id).first()
|
|
74
|
+
if pdf is not None:
|
|
75
|
+
prepared_payload = self._prepare_payload(payload, pdf)
|
|
76
|
+
try:
|
|
77
|
+
ok = pdf.validate_metadata_annotation(prepared_payload)
|
|
78
|
+
except Exception: # pragma: no cover - defensive safety net
|
|
79
|
+
logger.exception("PDF validation crashed for id=%s", file_id)
|
|
80
|
+
return Response(
|
|
81
|
+
{"error": "PDF validation encountered an unexpected error."},
|
|
82
|
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if not ok:
|
|
86
|
+
return Response({"error": "PDF validation failed."}, status=status.HTTP_400_BAD_REQUEST)
|
|
87
|
+
|
|
88
|
+
return Response({"message": "PDF validated."}, status=status.HTTP_200_OK)
|
|
89
|
+
|
|
90
|
+
if file_type == "pdf":
|
|
91
|
+
return Response({"error": f"PDF {file_id} not found."}, status=status.HTTP_404_NOT_FOUND)
|
|
92
|
+
|
|
93
|
+
return Response({"error": f"Item {file_id} not found as video or pdf."}, status=status.HTTP_404_NOT_FOUND)
|
|
94
|
+
|
|
95
|
+
@staticmethod
|
|
96
|
+
def _prepare_payload(base_payload: Dict[str, Any], file_obj: Any) -> Dict[str, Any]:
|
|
97
|
+
"""Return a fresh payload tailored for the given file object."""
|
|
98
|
+
|
|
99
|
+
prepared = dict(base_payload)
|
|
100
|
+
prepared.pop("file_type", None)
|
|
101
|
+
|
|
102
|
+
center = getattr(file_obj, "center", None)
|
|
103
|
+
center_name = getattr(center, "name", None)
|
|
104
|
+
if center_name and not prepared.get("center_name"):
|
|
105
|
+
prepared["center_name"] = center_name
|
|
106
|
+
|
|
107
|
+
return prepared
|
|
@@ -64,15 +64,17 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
|
|
|
64
64
|
return {'segments_updated': 0, 'segments_deleted': 0, 'segments_unchanged': 0}
|
|
65
65
|
|
|
66
66
|
removed_frames = sorted(set(removed_frames)) # Ensure sorted and unique
|
|
67
|
-
segments = LabelVideoSegment.objects.filter(
|
|
67
|
+
segments = LabelVideoSegment.objects.filter(
|
|
68
|
+
video_file=video
|
|
69
|
+
).order_by('start_frame_number')
|
|
68
70
|
|
|
69
71
|
segments_updated = 0
|
|
70
72
|
segments_deleted = 0
|
|
71
73
|
segments_unchanged = 0
|
|
72
74
|
|
|
73
75
|
for segment in segments:
|
|
74
|
-
original_start = segment.
|
|
75
|
-
original_end = segment.
|
|
76
|
+
original_start = segment.start_frame_number
|
|
77
|
+
original_end = segment.end_frame_number
|
|
76
78
|
|
|
77
79
|
# Count frames removed before this segment
|
|
78
80
|
frames_before = sum(1 for f in removed_frames if f < original_start)
|
|
@@ -99,9 +101,9 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
|
|
|
99
101
|
f"{original_start}-{original_end} → {new_start}-{new_end} "
|
|
100
102
|
f"(before: {frames_before}, within: {frames_within})"
|
|
101
103
|
)
|
|
102
|
-
segment.
|
|
103
|
-
segment.
|
|
104
|
-
segment.save()
|
|
104
|
+
segment.start_frame_number = new_start
|
|
105
|
+
segment.end_frame_number = new_end
|
|
106
|
+
segment.save(update_fields=["start_frame_number", "end_frame_number"])
|
|
105
107
|
segments_updated += 1
|
|
106
108
|
else:
|
|
107
109
|
# No change needed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: endoreg-db
|
|
3
|
-
Version: 0.8.2
|
|
3
|
+
Version: 0.8.2.2
|
|
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
|
|
@@ -33,7 +33,7 @@ Requires-Dist: gunicorn>=23.0.0
|
|
|
33
33
|
Requires-Dist: icecream>=2.1.4
|
|
34
34
|
Requires-Dist: librosa==0.11.0
|
|
35
35
|
Requires-Dist: llvmlite>=0.44.0
|
|
36
|
-
Requires-Dist: lx-anonymizer[llm,ocr]>=0.8.2
|
|
36
|
+
Requires-Dist: lx-anonymizer[llm,ocr]>=0.8.2.2
|
|
37
37
|
Requires-Dist: moviepy==2.2.1
|
|
38
38
|
Requires-Dist: mypy>=1.16.0
|
|
39
39
|
Requires-Dist: numpy>=2.2.3
|
|
@@ -13,6 +13,7 @@ endoreg_db/api/views/finding_descriptions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
|
|
|
13
13
|
endoreg_db/assets/dummy_model.ckpt,sha256=NAw5JDdrpV5bpZgdHXhmlQeo6TocKwQ_LQRzmqIm2Dw,21
|
|
14
14
|
endoreg_db/codemods/readme.md,sha256=mVOAevESOuN0WSTMI3tJPbuuGE3ROASp9s21bpf-LOs,3958
|
|
15
15
|
endoreg_db/codemods/rename_datetime_fields.py,sha256=ulLfte1erPrde2ovOHXT9qubitPceu_JT9uCkxLlKc4,2900
|
|
16
|
+
endoreg_db/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
17
|
endoreg_db/config/env.py,sha256=S244AQRkDP0PpP0MPaShgqeBJgI1BQknfER1_vUFMD4,2673
|
|
17
18
|
endoreg_db/data/__init__.py,sha256=Wqu24f5-FVKE5pis0wGDYsMHOTkieN40b10S5zU5240,5932
|
|
18
19
|
endoreg_db/data/db_summary.csv,sha256=K4PcufVHQ64H1i2MbCShMxReEa96I8cL6IfwCVpqF2M,1225
|
|
@@ -239,7 +240,7 @@ endoreg_db/forms/settings/__init__.py,sha256=xKCYyRS1tEAWsm5C9OrG0Btqgitzuh_s31O
|
|
|
239
240
|
endoreg_db/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
240
241
|
endoreg_db/helpers/count_db.py,sha256=IkdgvDPM5xq7DgFn8Bp1rgpXOtmLzPfLpZy-5cFTEPg,1951
|
|
241
242
|
endoreg_db/helpers/data_loader.py,sha256=Kn5MyRRuul-bDtLtqg2gn4E2OKt1-5HkjjD3QcwWyPM,6324
|
|
242
|
-
endoreg_db/helpers/default_objects.py,sha256
|
|
243
|
+
endoreg_db/helpers/default_objects.py,sha256=g1ZeSsqEEp9kbeMpCUr7MyNXVvcqnhdj3wWtgtJY5Cs,13928
|
|
243
244
|
endoreg_db/helpers/download_segmentation_model.py,sha256=VZ8BU7QkYpZkr8kpkUrnuvDBkirmLhuf2rHC2jRBILM,1053
|
|
244
245
|
endoreg_db/helpers/interact.py,sha256=EAiUP_5CXCauKcYYEoUo-Ot3FqE5n1Rm4UX6mkC06IY,174
|
|
245
246
|
endoreg_db/helpers/test_video_helper.py,sha256=4iIjH3Xe-5krhLffQLJO16XtxKJpM9wplpWUocmwWeg,4695
|
|
@@ -252,7 +253,7 @@ endoreg_db/management/commands/fix_missing_patient_data.py,sha256=5TPUTOQwI2fVh3
|
|
|
252
253
|
endoreg_db/management/commands/fix_video_paths.py,sha256=7LLwc38oX3B_tYWbLJA43Li_KBO3m5Lyw0CF6YqN5rU,7145
|
|
253
254
|
endoreg_db/management/commands/import_fallback_video.py,sha256=PhSBqyHevGgOZieZsj3NBfPJ656wqEkdCWrp2NSb538,9590
|
|
254
255
|
endoreg_db/management/commands/import_report.py,sha256=vFst-NeQdL-w62yoH4kDamq-2Hos5GW90vLTO2-hfYI,13168
|
|
255
|
-
endoreg_db/management/commands/import_video.py,sha256=
|
|
256
|
+
endoreg_db/management/commands/import_video.py,sha256=s6Eurpl-zy91-uGlM9vAVh22DzC_t_5F6k79MMXluOo,17999
|
|
256
257
|
endoreg_db/management/commands/import_video_with_classification.py,sha256=ulZH5jvAWu_pJ1kI9B3hbIO1-p_BReY0zbIQDS_d9OI,14726
|
|
257
258
|
endoreg_db/management/commands/init_default_ai_model.py,sha256=98yBigGZ5gkA-b1LPcvzS5x2jAms3pX58fU-TEAcjKw,4669
|
|
258
259
|
endoreg_db/management/commands/load_ai_model_data.py,sha256=QDyWPjIC1ga13Ou67_mnE8HUGTAK0uF2LLQ12sE-95E,2747
|
|
@@ -307,6 +308,7 @@ endoreg_db/mermaid/patient_creation.md,sha256=P0U50Pejxn_AATzHTJ3U9iydoEVSnpRjGE
|
|
|
307
308
|
endoreg_db/mermaid/video_segmentation_annotation.md,sha256=oouo5htDabP8m-W86C6aWXyIxi1A7zAoPqa3o5xr354,536
|
|
308
309
|
endoreg_db/migrations/0001_initial.py,sha256=xfdlddGyRGvwKbm77E4gPRWsgJWZvXs6aw_G-f1Eszo,121558
|
|
309
310
|
endoreg_db/migrations/0002_add_video_correction_models.py,sha256=EFnABa4FClf6DwytRiG15Ws-aZwZ1ZgACnl6r2dNUxs,3691
|
|
311
|
+
endoreg_db/migrations/0003_add_center_display_name.py,sha256=F13-IUe1q6XjVzE5-oMTAVx4oo_jvMcLpDiHtrTfQL4,873
|
|
310
312
|
endoreg_db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
311
313
|
endoreg_db/models/__init__.py,sha256=JyucmAkGkbzKiLrnZKKUTsJb0bk1DqJC6cRsKtNbfgQ,7086
|
|
312
314
|
endoreg_db/models/upload_job.py,sha256=lSsyv2d5jZxI8jAKlBU7dXi4jhEIKYjJKt8gZlwRz94,3000
|
|
@@ -326,7 +328,7 @@ endoreg_db/models/administration/case/case_template/case_template_rule.py,sha256
|
|
|
326
328
|
endoreg_db/models/administration/case/case_template/case_template_rule_value.py,sha256=TToGxdc2UVT-xrNvpCCfCd9ejsqpIwI3Vzyl13xF7Zg,2689
|
|
327
329
|
endoreg_db/models/administration/case/case_template/case_template_type.py,sha256=tnwBNRGONl87gGbf0LGEso65wIEsKX2lDZixCfvpbqs,653
|
|
328
330
|
endoreg_db/models/administration/center/__init__.py,sha256=VQj0PFNjzY_nwRlvOHnrA0Agle2YFCbRX0yrDeBHawY,299
|
|
329
|
-
endoreg_db/models/administration/center/center.py,sha256=
|
|
331
|
+
endoreg_db/models/administration/center/center.py,sha256=o4F9dSqkWoH0a3XCvlwliRiMKTxYJjYq2X3OR7wjaOM,2133
|
|
330
332
|
endoreg_db/models/administration/center/center_product.py,sha256=sMYntr_9j9Qp0DlO0G6DLNKtcPWuR2wwnwPM1ISVJTU,1947
|
|
331
333
|
endoreg_db/models/administration/center/center_resource.py,sha256=y03EFO5sSlrjuU7w5vZzfZZSFzudUQgKH7gJohclYC0,2017
|
|
332
334
|
endoreg_db/models/administration/center/center_shift.py,sha256=IC7OyexkA5fGvMD6g4gdpROlRXwjA2I7-tNmAufMY0w,2471
|
|
@@ -377,21 +379,21 @@ endoreg_db/models/media/__init__.py,sha256=HxAH8NMqf-ftRsQmVQj4VlSHiTsdECGYLdseM
|
|
|
377
379
|
endoreg_db/models/media/frame/__init__.py,sha256=25WriZHocR82rbHr_IMIgBt5z-mkV2O0LVWUpJRnQ5E,45
|
|
378
380
|
endoreg_db/models/media/frame/frame.py,sha256=6BvNKTAGsC_Q0S27nrvZ2cySDy3LSu5HCxrNcZwIEsA,4408
|
|
379
381
|
endoreg_db/models/media/pdf/__init__.py,sha256=1fimtZK5LUuP_yqETN6pMj0hxKXuQqeLb1DP5wPmtT4,343
|
|
380
|
-
endoreg_db/models/media/pdf/raw_pdf.py,sha256=
|
|
382
|
+
endoreg_db/models/media/pdf/raw_pdf.py,sha256=sBm5C1Pr4N4n8oQw_nNMLN5cnl3efQ-WKWby2_xBauk,26185
|
|
381
383
|
endoreg_db/models/media/pdf/report_file.py,sha256=6Vt_TJSB3qaF26qXbyjRSn-s_zN5y4e-PPrN8ZbYS9s,4296
|
|
382
384
|
endoreg_db/models/media/pdf/report_reader/__init__.py,sha256=LiMooVstXRay5qcB-uZW0wxbcdUvPrfAs_xBwWiuuWc,166
|
|
383
385
|
endoreg_db/models/media/pdf/report_reader/report_reader_config.py,sha256=wYVDmPSmNIuCTpaaWqoLVgVZFYW-dqGpnAyVBqRLqXE,3445
|
|
384
386
|
endoreg_db/models/media/pdf/report_reader/report_reader_flag.py,sha256=j9tjbLRenxpWfeaseALl8rV2Dqem9YaM_duS1iJkARU,536
|
|
385
387
|
endoreg_db/models/media/video/__init__.py,sha256=oHh-iHRrdh4AO4gISJj84k129AFLVvjbwKNd9Q3w4Vk,65
|
|
386
|
-
endoreg_db/models/media/video/create_from_file.py,sha256=
|
|
388
|
+
endoreg_db/models/media/video/create_from_file.py,sha256=3n4bbzFteEOFDUuEikP0x-StCKI5R5IhyKC7o3kLZ6Y,15128
|
|
387
389
|
endoreg_db/models/media/video/pipe_1.py,sha256=hOII3BCiMpxgpDKpV5h52-O2XTqKlb4YArxuH2fWyck,9402
|
|
388
390
|
endoreg_db/models/media/video/pipe_2.py,sha256=DnMxW0uOqSsf7-0n9Rlvn7u89U4Jpkv7n6hFpQfUjkQ,4964
|
|
389
391
|
endoreg_db/models/media/video/refactor_plan.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
390
|
-
endoreg_db/models/media/video/video_file.py,sha256=
|
|
392
|
+
endoreg_db/models/media/video/video_file.py,sha256=txlxR8d1OBgt3UEkWvLcGSyLarh0jXLw-z0SAV5KOok,26789
|
|
391
393
|
endoreg_db/models/media/video/video_file_ai.py,sha256=3ABea52FOF1qlrlxHdYhz_M3Kmqfzqtgq7M0prl-FAo,18819
|
|
392
|
-
endoreg_db/models/media/video/video_file_anonymize.py,sha256=
|
|
394
|
+
endoreg_db/models/media/video/video_file_anonymize.py,sha256=pet1UfSsbSHJJZxq6gDPifAfBWpGyEpD1jEQuSQi0Gg,16027
|
|
393
395
|
endoreg_db/models/media/video/video_file_frames.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
394
|
-
endoreg_db/models/media/video/video_file_io.py,sha256=
|
|
396
|
+
endoreg_db/models/media/video/video_file_io.py,sha256=9y3jBiIHA3Rw5pWczGbf13u-EcKiZQIuDserq2vOwuk,7921
|
|
395
397
|
endoreg_db/models/media/video/video_file_meta.py,sha256=H0DvZ6pt5XUdkgDmHcBFCSsjOeW5q7McE1Zo3ArBF6s,443
|
|
396
398
|
endoreg_db/models/media/video/video_file_segments.py,sha256=42oc2go3VWtNY1gsjp4kLbfQb5Qtl-aMbnAuKN3vum4,8647
|
|
397
399
|
endoreg_db/models/media/video/video_file_frames/__init__.py,sha256=X1eX1o5X8PVaWwdejtQcSdkG_mvYGXXvlnzF8tE7Lck,2060
|
|
@@ -406,7 +408,7 @@ endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py,sha256=tgdfN
|
|
|
406
408
|
endoreg_db/models/media/video/video_file_frames/_get_frame_range.py,sha256=D9LDrRlNOVxguZ2Vdns4K1h6Iw9ggzEAAh8HUsz98B8,1258
|
|
407
409
|
endoreg_db/models/media/video/video_file_frames/_get_frames.py,sha256=_sLvBwz1uRDJYDMDfFqwRy60tbjs48leqTyZkksXpAk,919
|
|
408
410
|
endoreg_db/models/media/video/video_file_frames/_initialize_frames.py,sha256=mPkgI1V82aoFLcTf3TO8yq9fBYXKcxQ3Up14ktRzJjI,6638
|
|
409
|
-
endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py,sha256=
|
|
411
|
+
endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py,sha256=jN_jqEG9cLogdPmQDjZ2VH5FB2WPFkxe_4j-9dm7e_I,6055
|
|
410
412
|
endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py,sha256=ZyoJNKUEOtJctosfgRsRd5ZMAgQsM8slrqquxQ8-QY4,3432
|
|
411
413
|
endoreg_db/models/media/video/video_file_meta/__init__.py,sha256=gERNjbOgaqtqMeUDb9E2TkuPt-1to7UzR1wf7yTgS10,645
|
|
412
414
|
endoreg_db/models/media/video/video_file_meta/get_crop_template.py,sha256=du-okbn9KfLg4CB6HcqvIDmsHH-m5fjZSQXwkBMEBiM,1619
|
|
@@ -463,9 +465,9 @@ endoreg_db/models/metadata/frame_ocr_result.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
|
|
|
463
465
|
endoreg_db/models/metadata/model_meta.py,sha256=aZH6Bz5Ss874Knvg1b3Kgq6gU8kVzPHXneunZJNF4yw,7111
|
|
464
466
|
endoreg_db/models/metadata/model_meta_logic.py,sha256=yiIWbxxykUp6VB_7imRqSXcO0RS5GuoYP83O48TyKws,8987
|
|
465
467
|
endoreg_db/models/metadata/pdf_meta.py,sha256=BTmpSgqxmPKi0apcNjyrZAS4AFKCPXVdBd6VBeyyv6E,3174
|
|
466
|
-
endoreg_db/models/metadata/sensitive_meta.py,sha256=
|
|
468
|
+
endoreg_db/models/metadata/sensitive_meta.py,sha256=yyaQ2AyaN1HUfh8JUv5cH2M0Cj03FFhItaz2Ng3IGMY,13020
|
|
467
469
|
endoreg_db/models/metadata/sensitive_meta_logic.py,sha256=Oh7ssZQEPfKGfRMF5nXKJpOIxXx-Xibd3rpOu-bQilk,29988
|
|
468
|
-
endoreg_db/models/metadata/video_meta.py,sha256=
|
|
470
|
+
endoreg_db/models/metadata/video_meta.py,sha256=c6xWdLW3uNqJ5VPJXHCxXA3mbXw-b0uR54-TOS3qL2Q,14966
|
|
469
471
|
endoreg_db/models/metadata/video_prediction_logic.py,sha256=j5N82mHtiomeeIaf1HA65kT5d0htQfJmbI2bJb8mpxQ,7677
|
|
470
472
|
endoreg_db/models/metadata/video_prediction_meta.py,sha256=EyfctAAAVcW9L0gf76ZBc9-G8MLMcD-tc2kkjaaLH4w,10592
|
|
471
473
|
endoreg_db/models/other/__init__.py,sha256=CC2sksOcwa6jPzKN_EXXk6B1dni_H1LXV0b79w4mkVE,894
|
|
@@ -593,14 +595,13 @@ endoreg_db/services/examination_evaluation.py,sha256=jx9IL2PIoBzjiITzs00c1XucE7A
|
|
|
593
595
|
endoreg_db/services/finding_description_service.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
594
596
|
endoreg_db/services/lookup_service.py,sha256=A2t07-qlQhFEeNvOhez0GU0sxi7mnN0MIlhYzxj4W1U,10581
|
|
595
597
|
endoreg_db/services/lookup_store.py,sha256=8sB2HmJQrnzq5Vfqt-UdaJLHYMRZCxnui9BCCXscnJE,4856
|
|
596
|
-
endoreg_db/services/
|
|
597
|
-
endoreg_db/services/pdf_import.py,sha256=SH68WgBKkxZ-5w87FIeabYYa1Wp8pOLOAzaxI7U9yhk,41407
|
|
598
|
+
endoreg_db/services/pdf_import.py,sha256=_ll_Vng1SpI7mEKxNRYuNttVnehuJFpKjQGDB8OX7no,47133
|
|
598
599
|
endoreg_db/services/polling_coordinator.py,sha256=alnPB-kdMyxbYaxQN9fki9dKrwmAsY3s68bUHWDSNeI,10662
|
|
599
|
-
endoreg_db/services/pseudonym_service.py,sha256=
|
|
600
|
+
endoreg_db/services/pseudonym_service.py,sha256=CJhbtRa6K6SPbphgCZgEMi8AFQtB18CUoBDttFnxEoM,3126
|
|
600
601
|
endoreg_db/services/requirements_object.py,sha256=290zf8AEbVtCoHhW4Jr7_ud-RvrqYmb1Nz9UBHtTnc0,6164
|
|
601
602
|
endoreg_db/services/segment_sync.py,sha256=YgHvIHkbW4mqCu0ACf3zjRSZnNfxWwt4gh5syUVXuE0,6400
|
|
602
603
|
endoreg_db/services/storage_aware_video_processor.py,sha256=kKFK64vXLeBSVkp1YJonU3gFDTeXZ8C4qb9QZZB99SE,13420
|
|
603
|
-
endoreg_db/services/video_import.py,sha256=
|
|
604
|
+
endoreg_db/services/video_import.py,sha256=YjnkB5qja72WV2TsnYuD7VrIrhIZl_kDUshgnPMqqlc,52549
|
|
604
605
|
endoreg_db/tasks/upload_tasks.py,sha256=OJq7DhNwcbWdXzHY8jz5c51BCVkPN5gSWOz-6Fx6W5M,7799
|
|
605
606
|
endoreg_db/tasks/video_ingest.py,sha256=kxFuYkHijINV0VabQKCFVpJRv6eCAw07tviONurDgg8,5265
|
|
606
607
|
endoreg_db/tasks/video_processing_tasks.py,sha256=KjcERRJ1TZzmavBpvr6OsvSTUViU0PR1ECWnEdzu2Js,14140
|
|
@@ -619,6 +620,7 @@ endoreg_db/urls/media.py,sha256=skIwOoHmDuHH-TFsZOHmFdu_whAk9qhTjLSpYgvRo1k,1088
|
|
|
619
620
|
endoreg_db/urls/patient.py,sha256=VLKFbEiNgpfYLWFisbHidyoUnoQuEzj1U0SgZDpdPDM,588
|
|
620
621
|
endoreg_db/urls/report.py,sha256=9i3sOSofB7_PHGByr3DMghZFtcbjKf_U5PVSlxu9d4I,1917
|
|
621
622
|
endoreg_db/urls/requirements.py,sha256=5d-SD_7nsTA9YXlBeWdZuh-mXh26BkgH29fFBaTLjU8,455
|
|
623
|
+
endoreg_db/urls/sensitive_meta.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
622
624
|
endoreg_db/urls/stats.py,sha256=2NQotfsHREF3gTOKQ5AT4XM1wvmEChSvDIrKMSFR2-Q,1796
|
|
623
625
|
endoreg_db/urls/upload.py,sha256=H6O8lqvGlyQhwdO1OY1RNInDgh3b_CPkDf6lIYMNApY,365
|
|
624
626
|
endoreg_db/urls/video.py,sha256=3yRDVGX5ZS5SuQTszoDsOqcUgboFNZj9BWCjd2pPcog,2874
|
|
@@ -638,7 +640,7 @@ endoreg_db/utils/mime_types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
638
640
|
endoreg_db/utils/names.py,sha256=6OKOSmXeAKv5XVs86_IjlQ7klyF3zLkvVQz9Bl7Lf0o,2745
|
|
639
641
|
endoreg_db/utils/ocr.py,sha256=LvyABxX5OZhIeXw2pI6af8_xTj7nHQQoKGh5kNsrv7o,7136
|
|
640
642
|
endoreg_db/utils/parse_and_generate_yaml.py,sha256=k7y0fl9Jbb_LNryeJYd6tebklRlu1-P70dJ-4sxvEZs,1626
|
|
641
|
-
endoreg_db/utils/paths.py,sha256=
|
|
643
|
+
endoreg_db/utils/paths.py,sha256=1nquyA3mZB8b_EtFW3SSyG020tu8t0HGYNng4b-6B2k,3452
|
|
642
644
|
endoreg_db/utils/permissions.py,sha256=IqxG9IqJBSZuxvT1ItVgGS8fMzkA2OLdDV6y8mKHSuo,5096
|
|
643
645
|
endoreg_db/utils/requirement_helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
644
646
|
endoreg_db/utils/translation.py,sha256=77Xel12pAGo0rQ0NxB7nfejvMb0GBjEmhC3I7mcU91I,1256
|
|
@@ -672,7 +674,7 @@ endoreg_db/utils/requirement_operator_logic/lab_value_operators.py,sha256=tL3I0x
|
|
|
672
674
|
endoreg_db/utils/requirement_operator_logic/model_evaluators.py,sha256=eu1n2wLm_vH-ebEOqIS2y6sZ9tV7b5wIeMQt2SG9QEQ,16655
|
|
673
675
|
endoreg_db/utils/video/__init__.py,sha256=EOAcatQ8bI1f3LhkE2E3YOzmm0FHqulk0O-jjZBgZFg,823
|
|
674
676
|
endoreg_db/utils/video/extract_frames.py,sha256=Pj9_pyfiwy-CFWiT4qysXn6VLCC-dQ1HpXOyyGqq0zE,3180
|
|
675
|
-
endoreg_db/utils/video/ffmpeg_wrapper.py,sha256=
|
|
677
|
+
endoreg_db/utils/video/ffmpeg_wrapper.py,sha256=7O4W9uFcO581N-4EFjkvLuQRC-mQlUEEy409agXL3Cw,33585
|
|
676
678
|
endoreg_db/utils/video/names.py,sha256=m268j2Ynt94OYH6dYxeL8gzU5ODtFJD4OmzS7l0nBPU,1449
|
|
677
679
|
endoreg_db/utils/video/streaming_processor.py,sha256=C-39DtxhSnL7B2cObFE5k829VLXl_Fl0KQFrFP368JA,13747
|
|
678
680
|
endoreg_db/utils/video/video_splitter.py,sha256=EZEnhNjaUva_9VxjcjScgRSrxsEuifhBjlwIMLX1qaA,3698
|
|
@@ -681,7 +683,7 @@ endoreg_db/views/__init__.py,sha256=pjQ1k1mptb0cL7yeaLOavfu0y27GVtnTLcObrmrYG5M,
|
|
|
681
683
|
endoreg_db/views/anonymization/__init__.py,sha256=s1_r9j0jPJsKHy1-isjFAlRF3Cw0o8EXxyUP7Xv1Kqo,698
|
|
682
684
|
endoreg_db/views/anonymization/media_management.py,sha256=ObiXjPa-KsSGs3IfmABE-TVzQZ2U6yJioFh64T7TtKY,16799
|
|
683
685
|
endoreg_db/views/anonymization/overview.py,sha256=fA4a4tZ4tbnWf3BUP6heAtqmHvinixUnDoI3dqPjTE0,8320
|
|
684
|
-
endoreg_db/views/anonymization/validate.py,sha256=
|
|
686
|
+
endoreg_db/views/anonymization/validate.py,sha256=KTHUgGL9uei_qYGkMPVm_Zdh1W5TNB2tpmnZ-YCzsA4,4743
|
|
685
687
|
endoreg_db/views/auth/__init__.py,sha256=i9KZEEKCb2sn2A1Gg0trTIbWzQ1cPiAIN-o7sBUaMtQ,214
|
|
686
688
|
endoreg_db/views/auth/keycloak.py,sha256=tgjQVfZwdyrbY437oXrOjs1j-2FYcTmUxG7obV_-GW8,4188
|
|
687
689
|
endoreg_db/views/examination/__init__.py,sha256=IBtbzExQB6VYy43AMCG6Fxq2uF5htyHXpYZxiI9C28Q,1206
|
|
@@ -768,7 +770,7 @@ endoreg_db/views/requirement_lookup/lookup_store.py,sha256=47DEQpj8HBSa-_TImW-5J
|
|
|
768
770
|
endoreg_db/views/stats/__init__.py,sha256=VHxrW0-RAWYki_89jWWJ0TrD7Nb0D3m-VjYV6bvP2k4,259
|
|
769
771
|
endoreg_db/views/stats/stats_views.py,sha256=v9ue1BKXdcApOgyolgNiT3hazx1xSVVvo26r91IozWY,8656
|
|
770
772
|
endoreg_db/views/video/__init__.py,sha256=jKPKJMmucfVZeTbh2Fy-ynMR2y9CkJv4Q-wmHJk19zE,1361
|
|
771
|
-
endoreg_db/views/video/correction.py,sha256=
|
|
773
|
+
endoreg_db/views/video/correction.py,sha256=0ZaWqi4Fb-xJ9571d4-P2aJwohdka6djdlS8GFEs8as,25144
|
|
772
774
|
endoreg_db/views/video/reimport.py,sha256=gSDBQ_Bam2xpJIj1SIMoLKnoBDBRgQ9V_TZdK9OICrI,8959
|
|
773
775
|
endoreg_db/views/video/segmentation.py,sha256=jzsLB95rYnHALSX2E_QNpAM9BpE1pbteOBxcAr_EjZo,11758
|
|
774
776
|
endoreg_db/views/video/task_status.py,sha256=PXaesTS4R7Uhu9WBaTL4lscpOschVqyR32zVDUuSbfw,1770
|
|
@@ -784,7 +786,7 @@ endoreg_db/views/video/video_processing_history.py,sha256=mhFuS8RG5GV8E-lTtuD0qr
|
|
|
784
786
|
endoreg_db/views/video/video_remove_frames.py,sha256=2FmvNrSPM0fUXiBxINN6vBUUDCqDlBkNcGR3WsLDgKo,1696
|
|
785
787
|
endoreg_db/views/video/video_reprocess.py,sha256=IVlt_ASldNy5BywOecgkl1OT7l2SRijf78PUutMansA,1294
|
|
786
788
|
endoreg_db/views/video/video_stream.py,sha256=kLyuf0ORTmsLeYUQkTQ6iRYqlIQozWhMMR3Lhfe_trk,12148
|
|
787
|
-
endoreg_db-0.8.2.dist-info/METADATA,sha256=
|
|
788
|
-
endoreg_db-0.8.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
789
|
-
endoreg_db-0.8.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
790
|
-
endoreg_db-0.8.2.dist-info/RECORD,,
|
|
789
|
+
endoreg_db-0.8.2.2.dist-info/METADATA,sha256=Ymaw-cCyIyl7E2OufDwxcQP47MKMWJPNlgbXdCG5F-w,14772
|
|
790
|
+
endoreg_db-0.8.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
791
|
+
endoreg_db-0.8.2.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
792
|
+
endoreg_db-0.8.2.2.dist-info/RECORD,,
|