Compare commits

..

No commits in common. "da82ef7950d707a426a5e98c228f9680820fe3df" and "dd34b025ca5288c6a2c0e193c020fba359bc5683" have entirely different histories.

2 changed files with 13 additions and 43 deletions

View File

@ -33,7 +33,6 @@ class StopTimeSerializer(serializers.ModelSerializer):
departure_date = serializers.DateField(required=False) departure_date = serializers.DateField(required=False)
arrival_time_24h = serializers.DurationField(required=False) arrival_time_24h = serializers.DurationField(required=False)
departure_time_24h = serializers.DurationField(required=False) departure_time_24h = serializers.DurationField(required=False)
departure_time_real = serializers.CharField(required=False)
class Meta: class Meta:
model = StopTime model = StopTime

View File

@ -1,6 +1,6 @@
from datetime import datetime, timedelta, date from datetime import datetime, timedelta, date
from django.db.models import F, Q, Value, When, Case, Exists, OuterRef from django.db.models import F, Q, Value
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_control from django.views.decorators.cache import cache_control
from django.views.decorators.http import last_modified from django.views.decorators.http import last_modified
@ -171,41 +171,27 @@ class NextDeparturesViewSet(viewsets.ReadOnlyModelViewSet):
.values_list('service_id', flat=True))) .values_list('service_id', flat=True)))
.values_list('id')) .values_list('id'))
def stop_time_update_qs(d: date):
return StopTimeUpdate.objects.filter(trip_update__start_date=d) \
.exclude(departure_time=datetime.fromtimestamp(0)).filter(stop_time_id=OuterRef('pk'))
def departure_time_real(d: date):
return Case(
When(
condition=Exists(stop_time_update_qs(d)),
then=F('departure_time') + stop_time_update_qs(d).values('departure_delay'),
),
default=F('departure_time'),
)
def canceled_filter(d: date): def canceled_filter(d: date):
return Exists(stop_time_update_qs(d).filter(Q(schedule_relationship=1) | Q(schedule_relationship=3))) return Q(Q(update__schedule_relationship=1) | Q(update__trip_update__schedule_relationship=3),
Q(update__trip_update__start_date=d),
~Q(update__departure_time=datetime.fromtimestamp(0)))
qs_today = StopTime.objects.filter(stop_filter) \ qs_today = StopTime.objects.filter(stop_filter) \
.annotate(departure_time_real=departure_time_real(query_date)) \ .filter(Q(departure_time__gte=query_time - F('update__departure_delay'))) \
.filter(departure_time_real__gte=query_time) \
.filter(Q(pickup_type=0) | canceled_filter(query_date)) \ .filter(Q(pickup_type=0) | canceled_filter(query_date)) \
.filter(calendar_filter(query_date)) \ .filter(calendar_filter(query_date)) \
.annotate(departure_date=Value(query_date)) \ .annotate(departure_date=Value(query_date)) \
.annotate(departure_time_24h=F('departure_time')) .annotate(departure_time_24h=F('departure_time'))
qs_yesterday = StopTime.objects.filter(stop_filter) \ qs_yesterday = StopTime.objects.filter(stop_filter) \
.annotate(departure_time_real=departure_time_real(query_date)) \ .filter(Q(departure_time__gte=time_yesterday - F('update__departure_delay'))) \
.filter(departure_time_real__gte=time_yesterday) \
.filter(Q(pickup_type=0) | canceled_filter(yesterday)) \ .filter(Q(pickup_type=0) | canceled_filter(yesterday)) \
.filter(calendar_filter(yesterday)) \ .filter(calendar_filter(yesterday)) \
.annotate(departure_date=Value(yesterday)) \ .annotate(departure_date=Value(yesterday)) \
.annotate(departure_time_24h=F('departure_time') - timedelta(days=1)) .annotate(departure_time_24h=F('departure_time') - timedelta(days=1))
qs_tomorrow = StopTime.objects.filter(stop_filter) \ qs_tomorrow = StopTime.objects.filter(stop_filter) \
.annotate(departure_time_real=departure_time_real(query_date)) \ .filter(Q(departure_time__gte=timedelta(0))) \
.filter(departure_time_real__gte=timedelta(0)) \
.filter(Q(pickup_type=0) | canceled_filter(tomorrow)) \ .filter(Q(pickup_type=0) | canceled_filter(tomorrow)) \
.filter(calendar_filter(tomorrow)) \ .filter(calendar_filter(tomorrow)) \
.annotate(departure_date=Value(tomorrow)) \ .annotate(departure_date=Value(tomorrow)) \
@ -229,7 +215,6 @@ class NextArrivalsViewSet(viewsets.ReadOnlyModelViewSet):
query_time = timedelta(seconds=int(query_time[:2]) * 3600 query_time = timedelta(seconds=int(query_time[:2]) * 3600
+ int(query_time[3:5]) * 60 + int(query_time[3:5]) * 60
+ (int(query_time[6:]) if len(query_time) > 6 else 0)) + (int(query_time[6:]) if len(query_time) > 6 else 0))
query_time -= timedelta(minutes=5) # Keep the last trains of the 5 previous minutes
yesterday = query_date - timedelta(days=1) yesterday = query_date - timedelta(days=1)
time_yesterday = query_time + timedelta(days=1) time_yesterday = query_time + timedelta(days=1)
@ -258,41 +243,27 @@ class NextArrivalsViewSet(viewsets.ReadOnlyModelViewSet):
.values_list('service_id', flat=True))) .values_list('service_id', flat=True)))
.values_list('id')) .values_list('id'))
def stop_time_update_qs(d: date):
return StopTimeUpdate.objects.filter(trip_update__start_date=d) \
.exclude(arrival_time=datetime.fromtimestamp(0)).filter(stop_time_id=OuterRef('pk'))
def arrival_time_real(d: date):
return Case(
When(
condition=Exists(stop_time_update_qs(d)),
then=F('arrival_time') + stop_time_update_qs(d).values('arrival_delay'),
),
default=F('arrival_time'),
)
def canceled_filter(d: date): def canceled_filter(d: date):
return Exists(stop_time_update_qs(d).filter(Q(schedule_relationship=1) | Q(schedule_relationship=3))) return Q(Q(update__schedule_relationship=1) | Q(update__trip_update__schedule_relationship=3),
Q(update__trip_update__start_date=d),
~Q(update__arrival_time=datetime.fromtimestamp(0)))
qs_today = StopTime.objects.filter(stop_filter) \ qs_today = StopTime.objects.filter(stop_filter) \
.annotate(arrival_time_real=arrival_time_real(query_date)) \ .filter(Q(departure_time__gte=query_time - F('update__arrival_delay'))) \
.filter(arrival_time_real__gte=query_time) \
.filter(Q(drop_off_type=0) | canceled_filter(query_date)) \ .filter(Q(drop_off_type=0) | canceled_filter(query_date)) \
.filter(calendar_filter(query_date)) \ .filter(calendar_filter(query_date)) \
.annotate(arrival_date=Value(query_date)) \ .annotate(arrival_date=Value(query_date)) \
.annotate(arrival_time_24h=F('arrival_time')) .annotate(arrival_time_24h=F('arrival_time'))
qs_yesterday = StopTime.objects.filter(stop_filter) \ qs_yesterday = StopTime.objects.filter(stop_filter) \
.annotate(arrival_time_real=arrival_time_real(yesterday)) \ .filter(Q(departure_time__gte=time_yesterday - F('update__arrival_delay'))) \
.filter(arrival_time_real__gte=time_yesterday) \
.filter(Q(drop_off_type=0) | canceled_filter(yesterday)) \ .filter(Q(drop_off_type=0) | canceled_filter(yesterday)) \
.filter(calendar_filter(yesterday)) \ .filter(calendar_filter(yesterday)) \
.annotate(arrival_date=Value(yesterday)) \ .annotate(arrival_date=Value(yesterday)) \
.annotate(arrival_time_24h=F('arrival_time') - timedelta(days=1)) .annotate(arrival_time_24h=F('arrival_time') - timedelta(days=1))
qs_tomorrow = StopTime.objects.filter(stop_filter) \ qs_tomorrow = StopTime.objects.filter(stop_filter) \
.annotate(arrival_time_real=arrival_time_real(tomorrow)) \ .filter(Q(departure_time__gte=timedelta(0))) \
.filter(arrival_time_real__gte=timedelta(0)) \
.filter(Q(drop_off_type=0) | canceled_filter(tomorrow)) \ .filter(Q(drop_off_type=0) | canceled_filter(tomorrow)) \
.filter(calendar_filter(tomorrow)) \ .filter(calendar_filter(tomorrow)) \
.annotate(arrival_date=Value(tomorrow)) \ .annotate(arrival_date=Value(tomorrow)) \