endoreg-db 0.8.3.3__py3-none-any.whl → 0.8.6.5__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.

Files changed (41) hide show
  1. endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +23 -1
  2. endoreg_db/data/setup_config.yaml +38 -0
  3. endoreg_db/management/commands/create_model_meta_from_huggingface.py +1 -2
  4. endoreg_db/management/commands/load_ai_model_data.py +18 -15
  5. endoreg_db/management/commands/setup_endoreg_db.py +218 -33
  6. endoreg_db/models/media/pdf/raw_pdf.py +241 -97
  7. endoreg_db/models/media/video/pipe_1.py +30 -33
  8. endoreg_db/models/media/video/video_file.py +300 -187
  9. endoreg_db/models/medical/hardware/endoscopy_processor.py +10 -1
  10. endoreg_db/models/metadata/model_meta_logic.py +34 -45
  11. endoreg_db/models/metadata/sensitive_meta_logic.py +555 -150
  12. endoreg_db/serializers/__init__.py +26 -55
  13. endoreg_db/serializers/misc/__init__.py +1 -1
  14. endoreg_db/serializers/misc/file_overview.py +65 -35
  15. endoreg_db/serializers/misc/{vop_patient_data.py → sensitive_patient_data.py} +1 -1
  16. endoreg_db/serializers/video_examination.py +198 -0
  17. endoreg_db/services/lookup_service.py +228 -58
  18. endoreg_db/services/lookup_store.py +174 -30
  19. endoreg_db/services/pdf_import.py +585 -282
  20. endoreg_db/services/video_import.py +493 -240
  21. endoreg_db/urls/__init__.py +36 -23
  22. endoreg_db/urls/label_video_segments.py +2 -0
  23. endoreg_db/urls/media.py +103 -66
  24. endoreg_db/utils/setup_config.py +177 -0
  25. endoreg_db/views/__init__.py +5 -3
  26. endoreg_db/views/media/pdf_media.py +3 -1
  27. endoreg_db/views/media/video_media.py +1 -1
  28. endoreg_db/views/media/video_segments.py +187 -259
  29. endoreg_db/views/pdf/__init__.py +5 -8
  30. endoreg_db/views/pdf/pdf_stream.py +186 -0
  31. endoreg_db/views/pdf/reimport.py +110 -94
  32. endoreg_db/views/requirement/lookup.py +171 -287
  33. endoreg_db/views/video/__init__.py +0 -2
  34. endoreg_db/views/video/video_examination_viewset.py +202 -289
  35. {endoreg_db-0.8.3.3.dist-info → endoreg_db-0.8.6.5.dist-info}/METADATA +1 -2
  36. {endoreg_db-0.8.3.3.dist-info → endoreg_db-0.8.6.5.dist-info}/RECORD +38 -37
  37. endoreg_db/views/pdf/pdf_media.py +0 -239
  38. endoreg_db/views/pdf/pdf_stream_views.py +0 -127
  39. endoreg_db/views/video/video_media.py +0 -158
  40. {endoreg_db-0.8.3.3.dist-info → endoreg_db-0.8.6.5.dist-info}/WHEEL +0 -0
  41. {endoreg_db-0.8.3.3.dist-info → endoreg_db-0.8.6.5.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