(self, request, format=None)
| 1209 | responses={200: ProgramDataSerializer(many=True)}, |
| 1210 | ) |
| 1211 | def post(self, request, format=None): |
| 1212 | # Get IDs from request body |
| 1213 | channel_uuids = request.data.get('channel_uuids', None) |
| 1214 | epg_data_ids = request.data.get('epg_data_ids', None) |
| 1215 | |
| 1216 | # Validate that at most one type of ID is provided |
| 1217 | if channel_uuids is not None and epg_data_ids is not None: |
| 1218 | return Response( |
| 1219 | {"error": "Provide either channel_uuids or epg_data_ids, not both"}, |
| 1220 | status=status.HTTP_400_BAD_REQUEST |
| 1221 | ) |
| 1222 | |
| 1223 | # Get current time |
| 1224 | now = timezone.now() |
| 1225 | |
| 1226 | # If epg_data_ids are provided, query directly by EPG data |
| 1227 | if epg_data_ids is not None: |
| 1228 | if not isinstance(epg_data_ids, list): |
| 1229 | return Response( |
| 1230 | {"error": "epg_data_ids must be an array of integers or null"}, |
| 1231 | status=status.HTTP_400_BAD_REQUEST |
| 1232 | ) |
| 1233 | |
| 1234 | try: |
| 1235 | epg_data_ids = [int(eid) for eid in epg_data_ids] |
| 1236 | except (ValueError, TypeError): |
| 1237 | return Response( |
| 1238 | {"error": "epg_data_ids must contain valid integers"}, |
| 1239 | status=status.HTTP_400_BAD_REQUEST |
| 1240 | ) |
| 1241 | |
| 1242 | # Limit to 50 IDs per request |
| 1243 | epg_data_ids = epg_data_ids[:50] |
| 1244 | |
| 1245 | epg_data_entries = EPGData.objects.select_related('epg_source').filter( |
| 1246 | id__in=epg_data_ids |
| 1247 | ) |
| 1248 | |
| 1249 | # Batch-fetch current programs for all requested EPG entries in one query |
| 1250 | db_programs = ProgramData.objects.filter( |
| 1251 | epg__in=epg_data_entries, start_time__lte=now, end_time__gt=now |
| 1252 | ).select_related('epg') |
| 1253 | # Map epg_data id -> first matching program |
| 1254 | programs_by_epg = {} |
| 1255 | for prog in db_programs: |
| 1256 | if prog.epg_id not in programs_by_epg: |
| 1257 | programs_by_epg[prog.epg_id] = prog |
| 1258 | |
| 1259 | current_programs = [] |
| 1260 | for epg_data in epg_data_entries: |
| 1261 | # Check batch-fetched DB results first |
| 1262 | program = programs_by_epg.get(epg_data.id) |
| 1263 | |
| 1264 | if program: |
| 1265 | program_data = ProgramDataSerializer(program).data |
| 1266 | program_data['epg_data_id'] = epg_data.id |
| 1267 | current_programs.append(program_data) |
| 1268 | continue |
nothing calls this directly
no test coverage detected