From fa49ff2c49e697da4c2e4ce1cb51e8cc6af0e705 Mon Sep 17 00:00:00 2001 From: suhlrich <43877159+suhlrich@users.noreply.github.com> Date: Mon, 29 Jun 2026 15:57:30 -0600 Subject: [PATCH 1/2] keep waiting if saved_locally (+ test - revert the 1m wait) --- mcserver/views.py | 13 ++++++++++--- tests/test_views.py | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/mcserver/views.py b/mcserver/views.py index 29a577a..245ed13 100644 --- a/mcserver/views.py +++ b/mcserver/views.py @@ -1665,9 +1665,16 @@ def dequeue(self, request): - # find trials with some videos not uploaded - not_uploaded = Video.objects.filter(video='', - updated_at__gte=timezone.now() + timedelta(minutes=-15)).values_list("trial__id", flat=True) + # Trials are considered waiting-for-upload when at least one video is missing. + # Keep the 15-minute grace period for normal uploads, but always wait when + # a missing video is explicitly marked as saved locally on phones for upload later. + missing_video_q = Q(video='') | Q(video__isnull=True) + not_uploaded = Video.objects.filter( + missing_video_q, + ).filter( + Q(updated_at__gte=timezone.now() + timedelta(minutes=-1)) | + Q(saved_local=True) + ).values_list("trial__id", flat=True) if isMonoQuery == 'False': diff --git a/tests/test_views.py b/tests/test_views.py index 7326b40..1822ddd 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1,6 +1,9 @@ from unittest import mock import uuid +from datetime import timedelta from django.test import TestCase +from django.utils import timezone +from django.contrib.auth.models import Group from rest_framework.permissions import IsAuthenticated from rest_framework.reverse import reverse @@ -208,3 +211,24 @@ def test_session_status_waits_for_video_or_saved_local_when_save_local(self): self.assertEqual(response.data['status'], 'processing') self.assertEqual(response.data['n_videos_uploaded'], 3) + + def test_dequeue_does_not_pick_old_pending_saved_local_uploads(self): + admin_group, _ = Group.objects.get_or_create(name='admin') + self.user.groups.add(admin_group) + + session = Session.objects.create(user=self.user, save_local=True) + trial = Trial.objects.create(session=session, status='stopped', name='walk-offline') + video = Video.objects.create( + trial=trial, + device_id=uuid.uuid4(), + video='', + saved_local=True, + ) + Video.objects.filter(pk=video.pk).update( + updated_at=timezone.now() - timedelta(hours=2) + ) + + self.client.force_login(self.user) + response = self.client.get('/trials/dequeue/') + + self.assertEqual(response.status_code, 404) From 9ba355e69409da7369650e5466a8a4ba9a488c44 Mon Sep 17 00:00:00 2001 From: suhlrich <43877159+suhlrich@users.noreply.github.com> Date: Mon, 29 Jun 2026 16:07:27 -0600 Subject: [PATCH 2/2] revert testing delay --- mcserver/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcserver/views.py b/mcserver/views.py index 245ed13..8042e10 100644 --- a/mcserver/views.py +++ b/mcserver/views.py @@ -1672,7 +1672,7 @@ def dequeue(self, request): not_uploaded = Video.objects.filter( missing_video_q, ).filter( - Q(updated_at__gte=timezone.now() + timedelta(minutes=-1)) | + Q(updated_at__gte=timezone.now() + timedelta(minutes=-15)) | Q(saved_local=True) ).values_list("trial__id", flat=True)