Better pass-midnight management

This commit is contained in:
Emmy D'Anello 2024-01-27 11:43:01 +01:00
parent 1192e89a01
commit 8619553a30
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
6 changed files with 37 additions and 38 deletions

View File

@ -39,9 +39,9 @@ class TripAdmin(admin.ModelAdmin):
@admin.register(StopTime) @admin.register(StopTime)
class StopTimeAdmin(admin.ModelAdmin): class StopTimeAdmin(admin.ModelAdmin):
list_display = ('trip', 'stop', 'arrival_time', 'departure_time', 'arrival_next_day', list_display = ('trip', 'stop', 'arrival_time', 'departure_time',
'stop_sequence', 'pickup_type', 'drop_off_type',) 'stop_sequence', 'pickup_type', 'drop_off_type',)
list_filter = ('arrival_next_day', 'pickup_type', 'drop_off_type', 'trip__service__transport_type',) list_filter = ('pickup_type', 'drop_off_type', 'trip__service__transport_type',)
search_fields = ('trip__id', 'stop__name', 'arrival_time', 'departure_time',) search_fields = ('trip__id', 'stop__name', 'arrival_time', 'departure_time',)
ordering = ('trip', 'stop_sequence',) ordering = ('trip', 'stop_sequence',)
autocomplete_fields = ('trip', 'stop',) autocomplete_fields = ('trip', 'stop',)

View File

@ -1,5 +1,5 @@
import csv import csv
from datetime import datetime from datetime import datetime, timedelta
from io import BytesIO from io import BytesIO
from zipfile import ZipFile from zipfile import ZipFile
@ -260,24 +260,15 @@ class Command(BaseCommand):
for stop_time_dict in csv.DictReader(zipfile.read("stop_times.txt").decode().splitlines()): for stop_time_dict in csv.DictReader(zipfile.read("stop_times.txt").decode().splitlines()):
stop_time_dict: dict stop_time_dict: dict
arrival_next_day = False arr_time = stop_time_dict['arrival_time']
arrival_time = stop_time_dict['arrival_time'] arr_time = int(arr_time[:2]) * 3600 + int(arr_time[3:5]) * 60 + int(arr_time[6:])
if int(arrival_time.split(":")[0]) >= 24: dep_time = stop_time_dict['departure_time']
split = arrival_time.split(':') dep_time = int(dep_time[:2]) * 3600 + int(dep_time[3:5]) * 60 + int(dep_time[6:])
arrival_time = f"{int(split[0]) - 24:02}:{split[1]}:{split[2]}"
arrival_next_day = True
departure_time = stop_time_dict['departure_time']
if int(departure_time.split(":")[0]) >= 24:
split = departure_time.split(':')
departure_time = f"{int(split[0]) - 24:02}:{split[1]}:{split[2]}"
arrival_next_day = True
st = StopTime( st = StopTime(
id=f"{stop_time_dict['trip_id']}-{stop_time_dict['stop_sequence']}", id=f"{stop_time_dict['trip_id']}-{stop_time_dict['stop_sequence']}",
trip_id=stop_time_dict['trip_id'], trip_id=stop_time_dict['trip_id'],
arrival_time=arrival_time, arrival_time=timedelta(seconds=arr_time),
departure_time=departure_time, departure_time=timedelta(seconds=dep_time),
arrival_next_day=arrival_next_day,
stop_id=stop_time_dict['stop_id'], stop_id=stop_time_dict['stop_id'],
stop_sequence=stop_time_dict['stop_sequence'], stop_sequence=stop_time_dict['stop_sequence'],
stop_headsign=stop_time_dict['stop_headsign'], stop_headsign=stop_time_dict['stop_headsign'],
@ -291,7 +282,7 @@ class Command(BaseCommand):
StopTime.objects.bulk_create(stop_times, StopTime.objects.bulk_create(stop_times,
update_conflicts=True, update_conflicts=True,
update_fields=['stop_id', 'arrival_time', 'departure_time', update_fields=['stop_id', 'arrival_time', 'departure_time',
'arrival_next_day', 'stop_headsign', 'pickup_type', 'stop_headsign', 'pickup_type',
'drop_off_type', 'timepoint'], 'drop_off_type', 'timepoint'],
unique_fields=['id']) unique_fields=['id'])
stop_times.clear() stop_times.clear()
@ -299,7 +290,7 @@ class Command(BaseCommand):
StopTime.objects.bulk_create(stop_times, StopTime.objects.bulk_create(stop_times,
update_conflicts=True, update_conflicts=True,
update_fields=['stop_id', 'arrival_time', 'departure_time', update_fields=['stop_id', 'arrival_time', 'departure_time',
'arrival_next_day', 'stop_headsign', 'pickup_type', 'stop_headsign', 'pickup_type',
'drop_off_type', 'timepoint'], 'drop_off_type', 'timepoint'],
unique_fields=['id']) unique_fields=['id'])
stop_times.clear() stop_times.clear()

View File

@ -1,4 +1,4 @@
# Generated by Django 5.0.1 on 2024-01-27 09:09 # Generated by Django 5.0.1 on 2024-01-27 10:29
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models from django.db import migrations, models
@ -506,12 +506,8 @@ class Migration(migrations.Migration):
verbose_name="ID", verbose_name="ID",
), ),
), ),
("arrival_time", models.TimeField(verbose_name="Arrival time")), ("arrival_time", models.DurationField(verbose_name="Arrival time")),
("departure_time", models.TimeField(verbose_name="Departure time")), ("departure_time", models.DurationField(verbose_name="Departure time")),
(
"arrival_next_day",
models.BooleanField(default=False, verbose_name="Arrival next day"),
),
("stop_sequence", models.IntegerField(verbose_name="Stop sequence")), ("stop_sequence", models.IntegerField(verbose_name="Stop sequence")),
( (
"stop_headsign", "stop_headsign",

View File

@ -347,19 +347,14 @@ class StopTime(models.Model):
related_name="stop_times", related_name="stop_times",
) )
arrival_time = models.TimeField( arrival_time = models.DurationField(
verbose_name=_("Arrival time"), verbose_name=_("Arrival time"),
) )
departure_time = models.TimeField( departure_time = models.DurationField(
verbose_name=_("Departure time"), verbose_name=_("Departure time"),
) )
arrival_next_day = models.BooleanField(
verbose_name=_("Arrival next day"),
default=False,
)
stop = models.ForeignKey( stop = models.ForeignKey(
to="Stop", to="Stop",
on_delete=models.CASCADE, on_delete=models.CASCADE,
@ -397,6 +392,20 @@ class StopTime(models.Model):
null=True, null=True,
) )
@property
def pretty_arrival_time(self):
seconds = self.arrival_time.total_seconds()
hours = int(seconds // 3600) % 24
minutes = int((seconds % 3600) // 60)
return f"{hours:02}:{minutes:02}"
@property
def pretty_departure_time(self):
seconds = self.departure_time.total_seconds()
hours = int(seconds // 3600) % 24
minutes = int((seconds % 3600) // 60)
return f"{hours:02}:{minutes:02}"
def __str__(self): def __str__(self):
return f"{self.trip.route.long_name} - {self.trip_id} - {self.stop.name}" return f"{self.trip.route.long_name} - {self.trip_id} - {self.stop.name}"

View File

@ -41,10 +41,10 @@
<tbody> <tbody>
{% for departure in next_departures %} {% for departure in next_departures %}
<tr> <tr>
<td>{{ departure.departure_time }}</td> <td>{{ departure.pretty_departure_time }}</td>
<td> <td>
<h3>{{ departure.trip.destination }}</h3> <h3>{{ departure.trip.destination }}</h3>
{% for trip_stop in departure.trip.stop_times.all %}{% if trip_stop.stop_sequence > departure.stop_sequence %}{% if trip_stop.drop_off_type == 0 %}{{ trip_stop.stop.name }}{% if trip_stop.pickup_type == 0 %}, {% endif %}{% endif %}{% endif %}{% endfor %} {% for trip_stop in departure.trip.stop_times.all %}{% if trip_stop.stop_sequence > departure.stop_sequence %}{% if trip_stop.drop_off_type == 0 %}{{ trip_stop.stop.name }}{% if trip_stop.stop.name != departure.trip.destination %}, {% endif %}{% endif %}{% endif %}{% endfor %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -1,4 +1,4 @@
from datetime import date, datetime, time from datetime import date, datetime, time, timedelta
from django.db.models import Q from django.db.models import Q
from django.views.generic import TemplateView from django.views.generic import TemplateView
@ -11,7 +11,7 @@ class GareView(TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
stop = Stop.objects.get(name__iexact=kwargs["gare"], location_type=1) stop = Stop.objects.filter(name__iexact=kwargs["gare"], location_type=1).first()
context['stop'] = stop context['stop'] = stop
next_departures = [] next_departures = []
@ -27,6 +27,9 @@ class GareView(TemplateView):
context['query_date'] = query_date context['query_date'] = query_date
context['query_time'] = query_time context['query_time'] = query_time
query_time = query_time.isoformat(timespec='seconds')
query_time = timedelta(seconds=int(query_time[:2]) * 3600 + int(query_time[3:5]) * 60 + int(query_time[6:]))
qs = StopTime.objects.none() qs = StopTime.objects.none()
for child in Stop.objects.filter(name__iexact=kwargs["gare"], location_type=0).all(): for child in Stop.objects.filter(name__iexact=kwargs["gare"], location_type=0).all():
qs_child = StopTime.objects.filter(stop=child, pickup_type=0, departure_time__gte=query_time) qs_child = StopTime.objects.filter(stop=child, pickup_type=0, departure_time__gte=query_time)