endoreg-db 0.8.4.4__py3-none-any.whl → 0.8.6.1__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/management/commands/load_ai_model_data.py +2 -1
- endoreg_db/management/commands/setup_endoreg_db.py +11 -7
- endoreg_db/models/media/pdf/raw_pdf.py +241 -97
- endoreg_db/models/media/video/pipe_1.py +30 -33
- endoreg_db/models/media/video/video_file.py +300 -187
- endoreg_db/models/metadata/model_meta_logic.py +15 -1
- endoreg_db/models/metadata/sensitive_meta_logic.py +391 -70
- endoreg_db/serializers/__init__.py +26 -55
- endoreg_db/serializers/misc/__init__.py +1 -1
- endoreg_db/serializers/misc/file_overview.py +65 -35
- endoreg_db/serializers/misc/{vop_patient_data.py → sensitive_patient_data.py} +1 -1
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/lookup_service.py +228 -58
- endoreg_db/services/lookup_store.py +174 -30
- endoreg_db/services/pdf_import.py +585 -282
- endoreg_db/services/video_import.py +340 -101
- endoreg_db/urls/__init__.py +36 -23
- endoreg_db/urls/label_video_segments.py +2 -0
- endoreg_db/urls/media.py +3 -2
- endoreg_db/views/__init__.py +6 -3
- endoreg_db/views/media/pdf_media.py +3 -1
- endoreg_db/views/media/video_media.py +1 -1
- endoreg_db/views/media/video_segments.py +187 -259
- endoreg_db/views/pdf/__init__.py +5 -8
- endoreg_db/views/pdf/pdf_stream.py +187 -0
- endoreg_db/views/pdf/reimport.py +110 -94
- endoreg_db/views/requirement/lookup.py +171 -287
- endoreg_db/views/video/__init__.py +0 -2
- endoreg_db/views/video/video_examination_viewset.py +202 -289
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.6.1.dist-info}/METADATA +1 -1
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.6.1.dist-info}/RECORD +33 -34
- endoreg_db/views/pdf/pdf_media.py +0 -239
- endoreg_db/views/pdf/pdf_stream_views.py +0 -127
- endoreg_db/views/video/video_media.py +0 -158
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.6.1.dist-info}/WHEEL +0 -0
- {endoreg_db-0.8.4.4.dist-info → endoreg_db-0.8.6.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
from endoreg_db.models import SensitiveMeta, VideoFile
|
|
2
|
-
from endoreg_db.serializers import SensitiveMetaUpdateSerializer
|
|
3
|
-
from endoreg_db.serializers.video.video_file_detail import VideoDetailSerializer
|
|
4
|
-
from endoreg_db.utils.permissions import EnvironmentAwarePermission
|
|
5
|
-
from endoreg_db.views.video.segmentation import _stream_video_file
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
from django.db import transaction
|
|
9
|
-
from django.shortcuts import get_object_or_404
|
|
10
|
-
from rest_framework import status
|
|
11
|
-
from rest_framework.response import Response
|
|
12
|
-
from rest_framework.views import APIView
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
import os
|
|
16
|
-
|
|
17
|
-
import logging
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class VideoMediaView(APIView):
|
|
22
|
-
"""
|
|
23
|
-
One endpoint that does
|
|
24
|
-
GET /api/media/videos/ → next video meta
|
|
25
|
-
GET /api/media/videos/?last_id=7
|
|
26
|
-
GET /api/media/videos/42/ → meta for id 42
|
|
27
|
-
GET /api/media/videos/42/ (Accept≠JSON) → byte‐range stream
|
|
28
|
-
PATCH /api/media/videos/42/ → update sensitive meta and handle raw file deletion
|
|
29
|
-
"""
|
|
30
|
-
permission_classes = [EnvironmentAwarePermission]
|
|
31
|
-
|
|
32
|
-
# ---------- GET ----------
|
|
33
|
-
def get(self, request, pk=None):
|
|
34
|
-
# Prüfe explizit auf Streaming-Anfrage via Query-Parameter
|
|
35
|
-
wants_stream = request.query_params.get("stream") is not None or request.query_params.get("type") is not None
|
|
36
|
-
|
|
37
|
-
if pk and wants_stream: # STREAM
|
|
38
|
-
vf = get_object_or_404(VideoFile, pk=pk)
|
|
39
|
-
file_type = (request.query_params.get("type") or "auto").lower()
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return _stream_video_file(
|
|
43
|
-
vf,
|
|
44
|
-
os.getenv("FRONTEND_ORIGIN", "*"),
|
|
45
|
-
file_type
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
# META (list or single) - nur wenn kein Streaming gewünscht
|
|
49
|
-
if pk: # detail JSON
|
|
50
|
-
vf = get_object_or_404(VideoFile, pk=pk)
|
|
51
|
-
else:
|
|
52
|
-
last_id = request.query_params.get("last_id")
|
|
53
|
-
if last_id is not None:
|
|
54
|
-
try:
|
|
55
|
-
last_id = int(last_id)
|
|
56
|
-
except (ValueError, TypeError):
|
|
57
|
-
return Response(
|
|
58
|
-
{"error": "Invalid last_id parameter"},
|
|
59
|
-
status=status.HTTP_400_BAD_REQUEST
|
|
60
|
-
)
|
|
61
|
-
vf = VideoFile.objects.next_after(last_id)
|
|
62
|
-
if not vf:
|
|
63
|
-
return Response({"error": "No more videos"}, status=404)
|
|
64
|
-
|
|
65
|
-
ser = VideoDetailSerializer(vf, context={"request": request})
|
|
66
|
-
return Response(ser.data, status=status.HTTP_200_OK)
|
|
67
|
-
|
|
68
|
-
# ---------- PATCH ----------
|
|
69
|
-
@transaction.atomic
|
|
70
|
-
def patch(self, request, pk=None):
|
|
71
|
-
sm_id = request.data.get("sensitive_meta_id")
|
|
72
|
-
if not sm_id:
|
|
73
|
-
return Response(
|
|
74
|
-
{"error": "sensitive_meta_id is required"},
|
|
75
|
-
status=status.HTTP_400_BAD_REQUEST
|
|
76
|
-
)
|
|
77
|
-
try:
|
|
78
|
-
sm_id = int(sm_id)
|
|
79
|
-
except (ValueError, TypeError):
|
|
80
|
-
return Response(
|
|
81
|
-
{"error": "Invalid sensitive_meta_id"},
|
|
82
|
-
status=status.HTTP_400_BAD_REQUEST
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
sm = get_object_or_404(SensitiveMeta, pk=sm_id)
|
|
86
|
-
|
|
87
|
-
# Check if this is a validation acceptance (is_verified being set to True)
|
|
88
|
-
is_accepting_validation = request.data.get("is_verified", False)
|
|
89
|
-
delete_raw_files = request.data.get("delete_raw_files", False)
|
|
90
|
-
|
|
91
|
-
# If user is accepting validation, automatically set delete_raw_files to True
|
|
92
|
-
if is_accepting_validation:
|
|
93
|
-
delete_raw_files = True
|
|
94
|
-
logger.info(f"Validation accepted for SensitiveMeta {sm_id}, marking raw files for deletion")
|
|
95
|
-
|
|
96
|
-
ser = SensitiveMetaUpdateSerializer(sm, data=request.data, partial=True)
|
|
97
|
-
ser.is_valid(raise_exception=True)
|
|
98
|
-
updated_sm = ser.save()
|
|
99
|
-
|
|
100
|
-
# Handle raw file deletion if requested or if validation was accepted
|
|
101
|
-
if delete_raw_files and updated_sm.is_verified:
|
|
102
|
-
try:
|
|
103
|
-
# Find associated video file
|
|
104
|
-
video_file = VideoFile.objects.filter(sensitive_meta=updated_sm).first()
|
|
105
|
-
if video_file:
|
|
106
|
-
self._schedule_raw_file_deletion(video_file)
|
|
107
|
-
logger.info(f"Scheduled raw file deletion for video {video_file.uuid}")
|
|
108
|
-
else:
|
|
109
|
-
logger.warning(f"No video file found for SensitiveMeta {sm_id}")
|
|
110
|
-
except Exception as e:
|
|
111
|
-
logger.error(f"Error scheduling raw file deletion for SensitiveMeta {sm_id}: {e}")
|
|
112
|
-
# Don't fail the entire request if deletion scheduling fails
|
|
113
|
-
|
|
114
|
-
return Response(ser.data, status=status.HTTP_200_OK)
|
|
115
|
-
|
|
116
|
-
def _schedule_raw_file_deletion(self, video_file):
|
|
117
|
-
"""
|
|
118
|
-
Schedule deletion of raw video file after validation acceptance.
|
|
119
|
-
Uses the existing cleanup mechanism from the anonymization pipeline.
|
|
120
|
-
"""
|
|
121
|
-
try:
|
|
122
|
-
# Import here to avoid circular imports
|
|
123
|
-
from django.db import transaction
|
|
124
|
-
|
|
125
|
-
def cleanup_raw_files():
|
|
126
|
-
"""Cleanup function to be called after transaction commit"""
|
|
127
|
-
try:
|
|
128
|
-
if hasattr(video_file, 'raw_video_file') and video_file.raw_video_file:
|
|
129
|
-
raw_file = video_file.raw_video_file
|
|
130
|
-
if raw_file.file and os.path.exists(raw_file.file.path):
|
|
131
|
-
logger.info(f"Deleting raw video file: {raw_file.file.path}")
|
|
132
|
-
os.remove(raw_file.file.path)
|
|
133
|
-
raw_file.file = None
|
|
134
|
-
raw_file.save()
|
|
135
|
-
logger.info(f"Successfully deleted raw video file for video {video_file.uuid}")
|
|
136
|
-
else:
|
|
137
|
-
logger.info(f"Raw video file already deleted or not found for video {video_file.uuid}")
|
|
138
|
-
else:
|
|
139
|
-
logger.info(f"No raw video file found for video {video_file.uuid}")
|
|
140
|
-
|
|
141
|
-
# Also delete any associated raw frames if they exist
|
|
142
|
-
if hasattr(video_file, 'raw_frames_dir'):
|
|
143
|
-
frames_dir = getattr(video_file, 'raw_frames_dir', None)
|
|
144
|
-
if frames_dir and os.path.exists(frames_dir):
|
|
145
|
-
import shutil
|
|
146
|
-
logger.info(f"Deleting raw frames directory: {frames_dir}")
|
|
147
|
-
shutil.rmtree(frames_dir)
|
|
148
|
-
logger.info(f"Successfully deleted raw frames for video {video_file.uuid}")
|
|
149
|
-
|
|
150
|
-
except Exception as e:
|
|
151
|
-
logger.error(f"Error during raw file cleanup for video {video_file.uuid}: {e}")
|
|
152
|
-
|
|
153
|
-
# Schedule cleanup after transaction commits
|
|
154
|
-
transaction.on_commit(cleanup_raw_files)
|
|
155
|
-
|
|
156
|
-
except Exception as e:
|
|
157
|
-
logger.error(f"Error scheduling raw file deletion for video {video_file.uuid}: {e}")
|
|
158
|
-
raise
|
|
File without changes
|
|
File without changes
|