Add station screen display

This commit is contained in:
Emmy D'Anello 2024-01-27 10:45:34 +01:00
parent de6e231639
commit 1192e89a01
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
44 changed files with 110165 additions and 128 deletions

1
.gitignore vendored
View File

@ -44,6 +44,7 @@ env/
.venv/
venv/
db.sqlite3
db.sqlite3-journal
# Don't git index
whoosh_index/

View File

@ -15,8 +15,9 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("admin/", admin.site.urls, name="admin"),
path("gtfs/", include("sncfgtfs.urls"), name="gtfs"),
]

View File

@ -1,4 +1,5 @@
from django.contrib import admin
from django.utils.safestring import mark_safe
from sncfgtfs.models import Agency, Stop, Route, Trip, StopTime, Calendar, CalendarDate, \
Transfer, FeedInfo
@ -6,44 +7,76 @@ from sncfgtfs.models import Agency, Stop, Route, Trip, StopTime, Calendar, Calen
@admin.register(Agency)
class AgencyAdmin(admin.ModelAdmin):
pass
list_display = ('name', 'id', 'url', 'timezone',)
search_fields = ('name',)
@admin.register(Stop)
class StopAdmin(admin.ModelAdmin):
pass
list_display = ('name', 'id', 'lat', 'lon', 'location_type',)
list_filter = ('location_type',)
search_fields = ('name', 'id',)
ordering = ('name',)
autocomplete_fields = ('parent_station',)
@admin.register(Route)
class RouteAdmin(admin.ModelAdmin):
pass
list_display = ('long_name', 'short_name', 'id', 'type',)
list_filter = ('type',)
search_fields = ('long_name', 'short_name', 'id',)
ordering = ('long_name',)
autocomplete_fields = ('agency',)
@admin.register(Trip)
class TripAdmin(admin.ModelAdmin):
pass
list_display = ('id', 'route', 'service', 'headsign', 'direction_id',)
list_filter = ('direction_id', 'service__transport_type',)
search_fields = ('id', 'route__long_name', 'service', 'headsign',)
ordering = ('route', 'service',)
@admin.register(StopTime)
class StopTimeAdmin(admin.ModelAdmin):
pass
list_display = ('trip', 'stop', 'arrival_time', 'departure_time', 'arrival_next_day',
'stop_sequence', 'pickup_type', 'drop_off_type',)
list_filter = ('arrival_next_day', 'pickup_type', 'drop_off_type', 'trip__service__transport_type',)
search_fields = ('trip__id', 'stop__name', 'arrival_time', 'departure_time',)
ordering = ('trip', 'stop_sequence',)
autocomplete_fields = ('trip', 'stop',)
@admin.register(Calendar)
class CalendarAdmin(admin.ModelAdmin):
pass
list_display = ('id', 'transport_type', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday',
'saturday', 'sunday', 'start_date', 'end_date',)
list_filter = ('transport_type', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday',
'start_date', 'end_date',)
search_fields = ('id', 'start_date', 'end_date',)
ordering = ('transport_type', 'id',)
@admin.register(CalendarDate)
class CalendarDateAdmin(admin.ModelAdmin):
pass
list_display = ('id', 'service_id', 'date', 'exception_type',)
list_filter = ('exception_type', 'date', 'service__transport_type',)
search_fields = ('id', 'date',)
ordering = ('date', 'service_id',)
@admin.register(Transfer)
class TransferAdmin(admin.ModelAdmin):
pass
list_display = ('from_stop', 'to_stop', 'transfer_type', 'min_transfer_time',)
list_filter = ('transfer_type',)
search_fields = ('from_stop__stop_name', 'to_stop__stop_name',)
autocomplete_fields = ('from_stop', 'to_stop',)
@admin.register(FeedInfo)
class FeedInfoAdmin(admin.ModelAdmin):
pass
list_display = ('feed_publisher_name', 'feed_publisher_url', 'feed_lang', 'feed_start_date',
'feed_end_date', 'feed_version',)
search_fields = ('feed_publisher_name', 'feed_publisher_url', 'feed_lang', 'feed_start_date',
'feed_end_date', 'feed_version',)
ordering = ('feed_publisher_name',)

View File

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-01-26 21:12+0100\n"
"POT-Creation-Date: 2024-01-27 10:44+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <ynerant@emy.lu>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -13,433 +13,480 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: sncfgtfs/models.py:6
msgid "TGV"
msgstr "TGV"
#: sncfgtfs/models.py:7
msgid "TER"
msgstr "TER"
#: sncfgtfs/models.py:8
msgid "Intercités"
msgstr "Intercités"
#: sncfgtfs/models.py:9
msgid "Transilien"
msgstr "Transilien"
#: sncfgtfs/models.py:13
msgid "Stop/platform"
msgstr "Arrêt / quai"
#: sncfgtfs/models.py:7
#: sncfgtfs/models.py:14
msgid "Station"
msgstr "Gare"
#: sncfgtfs/models.py:8
#: sncfgtfs/models.py:15
msgid "Entrance/exit"
msgstr "Entrée / sortie"
#: sncfgtfs/models.py:9
#: sncfgtfs/models.py:16
msgid "Generic node"
msgstr "Nœud générique"
#: sncfgtfs/models.py:10
#: sncfgtfs/models.py:17
msgid "Boarding area"
msgstr "Zone d'embarquement"
#: sncfgtfs/models.py:14
#: sncfgtfs/models.py:21
msgid "No information"
msgstr "Pas d'information"
#: sncfgtfs/models.py:15
#: sncfgtfs/models.py:22
msgid "Possible"
msgstr "Possible"
#: sncfgtfs/models.py:16 sncfgtfs/models.py:46
#: sncfgtfs/models.py:23 sncfgtfs/models.py:53
msgid "Not possible"
msgstr "Impossible"
#: sncfgtfs/models.py:20
#: sncfgtfs/models.py:27
msgid "Regular"
msgstr "Régulier"
#: sncfgtfs/models.py:21
#: sncfgtfs/models.py:28
msgid "None"
msgstr "Aucun"
#: sncfgtfs/models.py:22
#: sncfgtfs/models.py:29
msgid "Must phone agency"
msgstr "Doit téléphoner à l'agence"
#: sncfgtfs/models.py:23
#: sncfgtfs/models.py:30
msgid "Must coordinate with driver"
msgstr "Doit se coordonner avec læ conducteurice"
#: sncfgtfs/models.py:27
#: sncfgtfs/models.py:34
msgid "Tram"
msgstr "Tram"
#: sncfgtfs/models.py:28
#: sncfgtfs/models.py:35
msgid "Metro"
msgstr "Métro"
#: sncfgtfs/models.py:29
#: sncfgtfs/models.py:36
msgid "Rail"
msgstr "Rail"
#: sncfgtfs/models.py:30
#: sncfgtfs/models.py:37
msgid "Bus"
msgstr "Bus"
#: sncfgtfs/models.py:31
#: sncfgtfs/models.py:38
msgid "Ferry"
msgstr "Ferry"
#: sncfgtfs/models.py:32
#: sncfgtfs/models.py:39
msgid "Cable car"
msgstr "Câble"
#: sncfgtfs/models.py:33
#: sncfgtfs/models.py:40
msgid "Gondola"
msgstr "Gondole"
#: sncfgtfs/models.py:34
#: sncfgtfs/models.py:41
msgid "Funicular"
msgstr "Funiculaire"
#: sncfgtfs/models.py:38
#: sncfgtfs/models.py:45
msgid "Outbound"
msgstr "Vers l'extérieur"
#: sncfgtfs/models.py:39
#: sncfgtfs/models.py:46
msgid "Inbound"
msgstr "Vers l'intérieur"
#: sncfgtfs/models.py:43
#: sncfgtfs/models.py:50
msgid "Recommended"
msgstr "Recommandé"
#: sncfgtfs/models.py:44
#: sncfgtfs/models.py:51
msgid "Timed"
msgstr "Correspondance programmée"
#: sncfgtfs/models.py:45
#: sncfgtfs/models.py:52
msgid "Minimum time"
msgstr "Temps de correspondance minimum requis"
#: sncfgtfs/models.py:53 sncfgtfs/models.py:177
#: sncfgtfs/models.py:57
msgid "Added"
msgstr "Ajouté"
#: sncfgtfs/models.py:58
msgid "Removed"
msgstr "Supprimé"
#: sncfgtfs/models.py:65 sncfgtfs/models.py:209
msgid "Agency ID"
msgstr "ID de l'agence"
#: sncfgtfs/models.py:59
#: sncfgtfs/models.py:71
msgid "Agency name"
msgstr "Nom de l'agence"
#: sncfgtfs/models.py:63
#: sncfgtfs/models.py:75
msgid "Agency URL"
msgstr "URL de l'agence"
#: sncfgtfs/models.py:68
#: sncfgtfs/models.py:80
msgid "Agency timezone"
msgstr "Fuseau horaire de l'agence"
#: sncfgtfs/models.py:73
#: sncfgtfs/models.py:85
msgid "Agency language"
msgstr "Langue de l'agence"
#: sncfgtfs/models.py:78
#: sncfgtfs/models.py:91
msgid "Agency phone"
msgstr "Téléphone de l'agence"
#: sncfgtfs/models.py:96
msgid "Agency email"
msgstr "Adresse email de l'agence"
#: sncfgtfs/models.py:104
msgid "Agency"
msgstr "Agence"
#: sncfgtfs/models.py:79
#: sncfgtfs/models.py:105
msgid "Agencies"
msgstr "Agences"
#: sncfgtfs/models.py:86 sncfgtfs/models.py:307
#: sncfgtfs/models.py:112 sncfgtfs/models.py:366
msgid "Stop ID"
msgstr "ID de l'arrêt"
#: sncfgtfs/models.py:91
#: sncfgtfs/models.py:117
msgid "Stop code"
msgstr "Code de l'arrêt"
#: sncfgtfs/models.py:97
#: sncfgtfs/models.py:123
msgid "Stop name"
msgstr "Nom de l'arrêt"
#: sncfgtfs/models.py:102
#: sncfgtfs/models.py:128
msgid "Stop description"
msgstr "Description de l'arrêt"
#: sncfgtfs/models.py:107
#: sncfgtfs/models.py:133
msgid "Stop longitude"
msgstr "Longitude de l'arrêt"
#: sncfgtfs/models.py:111
#: sncfgtfs/models.py:137
msgid "Stop latitude"
msgstr "Latitude de l'arrêt"
#: sncfgtfs/models.py:116
#: sncfgtfs/models.py:142
msgid "Zone ID"
msgstr "ID de la zone"
#: sncfgtfs/models.py:120
#: sncfgtfs/models.py:146
msgid "Stop URL"
msgstr "URL de l'arrêt"
#: sncfgtfs/models.py:125
#: sncfgtfs/models.py:151
msgid "Location type"
msgstr "Type de localisation"
#: sncfgtfs/models.py:134
#: sncfgtfs/models.py:160
msgid "Parent station"
msgstr "Gare parente"
#: sncfgtfs/models.py:140
#: sncfgtfs/models.py:168
msgid "Stop timezone"
msgstr "Fuseau horaire de l'arrêt"
#: sncfgtfs/models.py:146
#: sncfgtfs/models.py:174
msgid "Level ID"
msgstr "ID du niveau"
#: sncfgtfs/models.py:151
#: sncfgtfs/models.py:179
msgid "Wheelchair boarding"
msgstr "Embarquement en fauteuil roulant"
#: sncfgtfs/models.py:159
#: sncfgtfs/models.py:187
msgid "Platform code"
msgstr "Code du quai"
#: sncfgtfs/models.py:163
#: sncfgtfs/models.py:195
msgid "Stop"
msgstr "Arrêt"
#: sncfgtfs/models.py:164
#: sncfgtfs/models.py:196
msgid "Stops"
msgstr "Arrêts"
#: sncfgtfs/models.py:171 sncfgtfs/models.py:233
msgid "Route ID"
msgstr "ID de la ligne"
#: sncfgtfs/models.py:203 sncfgtfs/models.py:340 sncfgtfs/models.py:469
#: sncfgtfs/models.py:506
msgid "ID"
msgstr "Identifiant"
#: sncfgtfs/models.py:182
#: sncfgtfs/models.py:215
msgid "Route short name"
msgstr "Nom court de la ligne"
#: sncfgtfs/models.py:187
#: sncfgtfs/models.py:220
msgid "Route long name"
msgstr "Nom long de la ligne"
#: sncfgtfs/models.py:192
#: sncfgtfs/models.py:225
msgid "Route description"
msgstr "Description de la ligne"
#: sncfgtfs/models.py:197
#: sncfgtfs/models.py:230
msgid "Route type"
msgstr "Type de ligne"
#: sncfgtfs/models.py:202
#: sncfgtfs/models.py:235
msgid "Route URL"
msgstr "URL de la ligne"
#: sncfgtfs/models.py:208
#: sncfgtfs/models.py:241
msgid "Route color"
msgstr "Couleur de la ligne"
#: sncfgtfs/models.py:214
#: sncfgtfs/models.py:247
msgid "Route text color"
msgstr "Couleur du texte de la ligne"
#: sncfgtfs/models.py:219
#: sncfgtfs/models.py:255 sncfgtfs/models.py:269
msgid "Route"
msgstr "Ligne"
#: sncfgtfs/models.py:220
#: sncfgtfs/models.py:256
msgid "Routes"
msgstr "Lignes"
#: sncfgtfs/models.py:227 sncfgtfs/models.py:293
#: sncfgtfs/models.py:263
msgid "Trip ID"
msgstr "ID du trajet"
#: sncfgtfs/models.py:238 sncfgtfs/models.py:349 sncfgtfs/models.py:397
msgid "Service ID"
msgstr "ID du service"
#: sncfgtfs/models.py:276 sncfgtfs/models.py:475
msgid "Service"
msgstr "Service"
#: sncfgtfs/models.py:243
#: sncfgtfs/models.py:282
msgid "Trip headsign"
msgstr "Destination du trajet"
#: sncfgtfs/models.py:249
#: sncfgtfs/models.py:288
msgid "Trip short name"
msgstr "Nom court du trajet"
#: sncfgtfs/models.py:254
#: sncfgtfs/models.py:293
msgid "Direction"
msgstr "Direction"
#: sncfgtfs/models.py:261
#: sncfgtfs/models.py:300
msgid "Block ID"
msgstr "ID du bloc"
#: sncfgtfs/models.py:267
#: sncfgtfs/models.py:306
msgid "Shape ID"
msgstr "ID de la forme"
#: sncfgtfs/models.py:272
#: sncfgtfs/models.py:311
msgid "Wheelchair accessible"
msgstr "Accessible en fauteuil roulant"
#: sncfgtfs/models.py:279
#: sncfgtfs/models.py:318
msgid "Bikes allowed"
msgstr "Vélos autorisés"
#: sncfgtfs/models.py:285
#: sncfgtfs/models.py:332 sncfgtfs/models.py:346
msgid "Trip"
msgstr "Trajet"
#: sncfgtfs/models.py:286
#: sncfgtfs/models.py:333
msgid "Trips"
msgstr "Trajets"
#: sncfgtfs/models.py:297
#: sncfgtfs/models.py:351
msgid "Arrival time"
msgstr "Heure d'arrivée"
#: sncfgtfs/models.py:301
#: sncfgtfs/models.py:355
msgid "Departure time"
msgstr "Heure de départ"
#: sncfgtfs/models.py:311
#: sncfgtfs/models.py:359
msgid "Arrival next day"
msgstr "Arrivée le jour suivant"
#: sncfgtfs/models.py:371
msgid "Stop sequence"
msgstr "Séquence de l'arrêt"
#: sncfgtfs/models.py:316
#: sncfgtfs/models.py:376
msgid "Stop headsign"
msgstr "Destination de l'arrêt"
#: sncfgtfs/models.py:321
#: sncfgtfs/models.py:381
msgid "Pickup type"
msgstr "Type de prise en charge"
#: sncfgtfs/models.py:328
#: sncfgtfs/models.py:388
msgid "Drop off type"
msgstr "Type de dépose"
#: sncfgtfs/models.py:335
#: sncfgtfs/models.py:395
msgid "Timepoint"
msgstr "Ponctualité"
#: sncfgtfs/models.py:341
#: sncfgtfs/models.py:404
msgid "Stop time"
msgstr "Heure d'arrêt"
#: sncfgtfs/models.py:342
#: sncfgtfs/models.py:405
msgid "Stop times"
msgstr "Heures d'arrêt"
#: sncfgtfs/models.py:353
#: sncfgtfs/models.py:412
msgid "Service ID"
msgstr "ID du service"
#: sncfgtfs/models.py:416
msgid "Monday"
msgstr "Lundi"
#: sncfgtfs/models.py:357
#: sncfgtfs/models.py:420
msgid "Tuesday"
msgstr "Mardi"
#: sncfgtfs/models.py:361
#: sncfgtfs/models.py:424
msgid "Wednesday"
msgstr "Mercredi"
#: sncfgtfs/models.py:365
#: sncfgtfs/models.py:428
msgid "Thursday"
msgstr "Jeudi"
#: sncfgtfs/models.py:369
#: sncfgtfs/models.py:432
msgid "Friday"
msgstr "Vendredi"
#: sncfgtfs/models.py:373
#: sncfgtfs/models.py:436
msgid "Saturday"
msgstr "Samedi"
#: sncfgtfs/models.py:377
#: sncfgtfs/models.py:440
msgid "Sunday"
msgstr "Dimanche"
#: sncfgtfs/models.py:381
#: sncfgtfs/models.py:444
msgid "Start date"
msgstr "Date de début"
#: sncfgtfs/models.py:385
#: sncfgtfs/models.py:448
msgid "End date"
msgstr "Date de fin"
#: sncfgtfs/models.py:389
#: sncfgtfs/models.py:453 sncfgtfs/models.py:490
msgid "Transport type"
msgstr "Type de transport"
#: sncfgtfs/models.py:461
msgid "Calendar"
msgstr "Calendrier"
#: sncfgtfs/models.py:390
#: sncfgtfs/models.py:462
msgid "Calendars"
msgstr "Calendriers"
#: sncfgtfs/models.py:401
#: sncfgtfs/models.py:480
msgid "Date"
msgstr "Date"
#: sncfgtfs/models.py:405
#: sncfgtfs/models.py:484
msgid "Exception type"
msgstr "Type d'exception"
#: sncfgtfs/models.py:409
#: sncfgtfs/models.py:498
msgid "Calendar date"
msgstr "Date du calendrier"
#: sncfgtfs/models.py:410
#: sncfgtfs/models.py:499
msgid "Calendar dates"
msgstr "Dates du calendrier"
#: sncfgtfs/models.py:417
#: sncfgtfs/models.py:512
msgid "From stop"
msgstr "Depuis l'arrêt"
#: sncfgtfs/models.py:424
#: sncfgtfs/models.py:519
msgid "To stop"
msgstr "Jusqu'à l'arrêt"
#: sncfgtfs/models.py:429
#: sncfgtfs/models.py:524
msgid "Transfer type"
msgstr "Type de correspondance"
#: sncfgtfs/models.py:435
#: sncfgtfs/models.py:530
msgid "Minimum transfer time"
msgstr "Temps de correspondance minimum"
#: sncfgtfs/models.py:440
#: sncfgtfs/models.py:535
msgid "Transfer"
msgstr "Correspondance"
#: sncfgtfs/models.py:441
#: sncfgtfs/models.py:536
msgid "Transfers"
msgstr "Correspondances"
#: sncfgtfs/models.py:447
msgid "Feed ID"
msgstr "ID du flux"
#: sncfgtfs/models.py:452
#: sncfgtfs/models.py:542
msgid "Feed publisher name"
msgstr "Nom de l'éditeur du flux"
#: sncfgtfs/models.py:456
#: sncfgtfs/models.py:546
msgid "Feed publisher URL"
msgstr "URL de l'éditeur du flux"
#: sncfgtfs/models.py:461
#: sncfgtfs/models.py:551
msgid "Feed language"
msgstr "Langue du flux"
#: sncfgtfs/models.py:465
#: sncfgtfs/models.py:555
msgid "Feed start date"
msgstr "Date de début du flux"
#: sncfgtfs/models.py:469
#: sncfgtfs/models.py:559
msgid "Feed end date"
msgstr "Date de fin du flux"
#: sncfgtfs/models.py:474
#: sncfgtfs/models.py:564
msgid "Feed version"
msgstr "Version du flux"
#: sncfgtfs/models.py:478
#: sncfgtfs/models.py:568
msgid "Feed info"
msgstr "Information du flux"
#: sncfgtfs/models.py:479
#: sncfgtfs/models.py:569
msgid "Feed infos"
msgstr "Informations du flux"
#~ msgid "Route ID"
#~ msgstr "ID de la ligne"
#~ msgid "Feed ID"
#~ msgstr "ID du flux"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/assets/img/docs/favicons/mstile-150x150.png"/>
<TileColor>#00aba9</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,19 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/assets/img/docs/favicons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/assets/img/docs/favicons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,90 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1596.000000pt" height="1596.000000pt" viewBox="0 0 1596.000000 1596.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,1596.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M688 12165 c-2 -2 -93 -6 -203 -9 -280 -9 -317 -16 -393 -73 -27 -20
-67 -77 -61 -85 2 -2 -3 -14 -11 -27 -10 -20 -12 -765 -12 -3990 l0 -3967 22
-52 c28 -64 96 -127 154 -143 44 -12 14060 -17 14124 -5 111 21 153 73 216
272 27 82 70 217 96 299 27 83 76 236 110 340 34 105 63 197 65 205 2 8 26 85
53 170 28 85 83 256 122 380 103 325 121 379 141 440 10 30 55 170 99 310 45
140 104 325 132 410 27 85 51 160 52 165 3 13 108 342 146 455 24 74 78 246
86 275 2 6 53 165 114 355 61 190 113 352 115 360 2 8 14 44 25 80 79 243 86
286 62 359 -8 24 -33 61 -55 82 -83 81 -646 418 -1102 659 -478 253 -1069 527
-1580 732 -82 33 -163 66 -180 73 -16 8 -96 38 -176 69 -579 220 -1264 448
-1854 615 -99 28 -202 58 -230 66 -27 8 -120 33 -205 55 -85 23 -177 48 -205
55 -50 14 -598 149 -645 159 -14 3 -115 26 -225 51 -110 25 -209 47 -220 50
-11 2 -96 20 -190 40 -191 40 -298 62 -336 69 -14 2 -73 13 -130 25 -57 11
-115 23 -129 25 -14 3 -50 9 -80 15 -30 6 -71 13 -90 16 -19 3 -42 8 -50 10
-8 2 -31 7 -50 10 -19 3 -57 10 -85 15 -27 5 -63 12 -80 15 -60 10 -621 104
-660 110 -22 3 -53 8 -70 11 -16 2 -43 6 -60 9 -41 6 -443 64 -480 70 -16 2
-84 11 -150 20 -66 8 -136 18 -155 21 -19 3 -54 7 -78 9 -23 3 -55 7 -70 9
-15 3 -52 8 -82 11 -30 3 -66 8 -80 10 -14 2 -50 7 -80 10 -30 3 -89 10 -130
15 -101 12 -156 19 -215 25 -99 11 -141 15 -230 25 -49 5 -117 12 -150 15 -33
3 -103 10 -155 15 -52 5 -122 12 -155 15 -57 5 -97 8 -217 20 -29 3 -84 8
-123 10 -38 3 -90 8 -115 10 -25 3 -83 7 -130 10 -47 3 -101 7 -120 10 -19 2
-82 7 -140 10 -58 3 -125 8 -150 10 -79 7 -233 17 -300 20 -36 2 -112 6 -170
9 -186 12 -262 16 -395 21 -71 3 -168 7 -215 10 -124 6 -382 16 -560 21 -176
6 -1717 13 -1722 9z m2979 -3469 c89 -4 170 -8 180 -10 10 -2 49 -7 86 -11 37
-3 76 -8 85 -10 9 -1 42 -6 72 -11 30 -4 57 -8 60 -9 3 -1 26 -5 53 -9 26 -5
47 -11 47 -15 0 -3 -16 -56 -35 -116 -19 -61 -56 -176 -82 -258 l-47 -147 -40
6 c-22 3 -43 7 -46 9 -3 2 -21 6 -40 9 -19 3 -46 8 -60 10 -149 28 -289 40
-470 40 -125 0 -283 -9 -330 -19 -13 -2 -42 -7 -65 -10 -204 -28 -404 -110
-533 -220 -35 -30 -84 -112 -98 -165 -43 -168 91 -283 616 -529 226 -106 587
-286 690 -345 368 -209 568 -396 651 -610 73 -187 36 -407 -106 -631 -21 -33
-41 -62 -45 -65 -3 -3 -14 -16 -23 -30 -60 -88 -237 -238 -372 -316 -63 -36
-100 -55 -200 -99 -90 -40 -332 -109 -455 -130 -19 -3 -60 -10 -90 -15 -30 -5
-80 -12 -110 -16 -30 -3 -66 -7 -80 -10 -106 -17 -603 -25 -760 -11 -78 7
-317 39 -385 52 -72 14 -303 66 -331 76 -17 5 -42 12 -55 14 -112 22 -619 201
-619 219 0 2 17 42 39 88 21 45 49 106 61 133 13 28 42 91 65 140 23 50 52
114 65 143 17 38 29 52 40 48 8 -2 73 -30 143 -60 185 -81 509 -185 659 -211
15 -3 59 -12 96 -20 38 -7 90 -17 118 -20 27 -3 61 -8 76 -11 160 -31 578 -36
743 -9 116 19 124 21 212 45 329 90 481 327 347 541 -51 81 -201 204 -364 298
-30 17 -156 81 -280 142 -541 265 -689 347 -864 478 -346 261 -458 537 -345
851 108 298 398 527 849 670 36 11 74 22 85 25 11 2 38 9 60 15 120 30 300 63
425 76 25 2 63 6 85 8 22 3 101 8 175 11 74 4 136 8 137 9 3 2 153 -1 310 -8z
m7368 0 c109 -9 276 -26 304 -31 9 -2 24 -4 34 -4 13 -1 16 -7 13 -23 -6 -28
-183 -545 -191 -558 -4 -6 -18 -8 -33 -5 -212 36 -760 41 -977 10 -22 -3 -56
-8 -75 -11 -270 -36 -614 -165 -835 -313 -212 -142 -374 -320 -479 -529 -58
-114 -107 -267 -120 -372 -3 -25 -8 -56 -11 -70 -8 -37 -8 -218 0 -275 55
-418 326 -723 767 -863 143 -46 258 -70 433 -89 144 -16 666 -8 785 12 14 2
41 6 60 9 19 3 60 10 90 16 30 6 66 14 80 16 14 3 28 8 31 12 3 4 26 72 52
152 25 80 82 260 127 400 45 140 111 347 147 460 36 113 78 243 93 290 15 47
37 117 49 155 37 116 162 507 176 550 8 22 48 148 90 280 64 200 216 679 230
723 3 6 10 12 17 13 61 2 2830 0 2833 -2 3 -4 -159 -532 -169 -548 -4 -5 -421
-9 -983 -9 -538 -1 -995 -1 -1015 -1 -36 -1 -38 -3 -52 -48 -8 -27 -35 -113
-61 -193 -96 -298 -215 -671 -215 -674 0 -2 381 -4 846 -4 465 0 848 -2 850
-4 2 -3 -7 -38 -20 -79 -13 -41 -51 -160 -85 -265 l-61 -191 -833 -1 c-457 -1
-842 -1 -853 -2 -20 0 -24 -6 -40 -65 -1 -5 -41 -131 -89 -280 -48 -148 -95
-297 -105 -330 -10 -33 -39 -125 -65 -205 -26 -80 -73 -228 -104 -329 -58
-183 -58 -184 -96 -202 -124 -61 -537 -170 -770 -204 -22 -4 -47 -8 -55 -10
-8 -2 -44 -7 -80 -11 -36 -3 -68 -8 -71 -10 -3 -2 -41 -6 -84 -10 -44 -3 -87
-7 -96 -9 -112 -22 -659 -22 -775 -1 -11 2 -50 7 -89 12 -38 4 -72 8 -75 9 -3
0 -27 5 -55 10 -243 42 -470 116 -690 227 -55 27 -107 56 -116 64 -8 8 -19 14
-23 14 -15 0 -163 109 -247 183 -214 187 -385 464 -444 717 -36 156 -34 152
-58 148 -23 -3 -37 -39 -135 -348 -17 -52 -53 -165 -80 -250 -28 -85 -78 -243
-112 -350 -34 -107 -69 -215 -77 -240 -8 -25 -16 -49 -17 -55 -2 -5 -9 -29
-16 -52 l-13 -43 -428 0 -428 0 -11 43 c-57 219 -251 780 -329 949 -11 26 -21
49 -21 52 0 3 -11 29 -24 58 -13 29 -40 91 -61 138 -126 280 -299 613 -475
915 -77 133 -181 298 -283 452 l-121 182 -17 -47 c-14 -38 -159 -483 -164
-502 -3 -11 -38 -120 -135 -420 -56 -173 -126 -391 -156 -485 -30 -93 -60
-172 -66 -176 -21 -13 -37 3 -54 54 -23 70 -78 179 -127 252 -48 70 -175 200
-264 269 -35 27 -63 52 -63 56 0 3 30 98 66 211 73 228 225 700 304 944 29 88
53 165 54 170 1 6 7 24 13 40 6 17 41 125 78 240 36 116 69 219 73 229 8 18
25 19 400 19 290 -1 396 -4 406 -13 8 -6 57 -66 108 -133 515 -672 973 -1477
1261 -2217 24 -63 50 -133 57 -155 l13 -40 28 85 c32 97 163 510 186 585 9 28
29 88 44 135 15 47 55 171 88 275 32 105 98 312 146 460 124 388 216 678 271
850 26 83 50 154 54 158 7 8 740 16 740 8 0 -2 -25 -80 -56 -175 -30 -94 -57
-175 -58 -181 -2 -5 -6 -17 -9 -25 -6 -15 -58 -185 -63 -205 -1 -5 -16 -51
-33 -102 -37 -111 -38 -123 -8 -123 14 0 58 35 127 101 86 83 268 229 356 287
153 99 365 206 549 275 104 39 331 107 405 122 14 3 63 12 110 21 47 9 92 18
101 19 9 2 40 6 69 10 29 4 62 8 72 10 11 2 63 7 116 11 53 3 99 8 101 10 6 6
612 -3 696 -10z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>Icons/Langages/english</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Icons/Langages/english" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M7.9224,24.9701 L7.9224,18.9461 L3.0644,21.3741 C4.3714,22.9231 6.0294,24.1661 7.9224,24.9701" id="Fill-1" fill="#00247D"></path>
<path d="M18.0781,24.9701 C19.9701,24.1661 21.6291,22.9231 22.9351,21.3741 L18.0781,18.9461 L18.0781,24.9701 Z" id="Fill-3" fill="#00247D"></path>
<path d="M3.064,4.6258 L7.922,7.0548 L7.922,1.0298 C6.03,1.8338 4.371,3.0768 3.064,4.6258" id="Fill-5" fill="#00247D"></path>
<path d="M18.0781,1.0301 L18.0781,7.0541 L22.9351,4.6261 C21.6291,3.0761 19.9701,1.8341 18.0781,1.0301" id="Fill-7" fill="#00247D"></path>
<path d="M7.9224,7.0545 L3.0644,4.6255 C2.8414,4.8885 2.6344,5.1645 2.4344,5.4455 L7.3864,7.9225 L1.0304,7.9225 C0.8704,8.2975 0.7304,8.6815 0.6064,9.0745 C0.5154,9.3615 0.4444,9.6575 0.3744,9.9535 L2.3644,9.9535 L9.9534,9.9535 L9.9534,9.2055 L9.9534,8.0705 L9.9534,0.3735 C9.2544,0.5415 8.5724,0.7535 7.9224,1.0305 L7.9224,7.0545 Z" id="Fill-9" fill="#FFFFFF"></path>
<path d="M25.626,9.9535 C25.555,9.6575 25.484,9.3615 25.394,9.0745 C25.27,8.6825 25.129,8.2975 24.97,7.9225 L18.613,7.9225 L23.566,5.4455 C23.365,5.1645 23.158,4.8895 22.936,4.6255 L18.078,7.0545 L18.078,1.0305 C17.428,0.7535 16.746,0.5415 16.047,0.3735 L16.047,8.0705 L16.047,9.2055 L16.047,9.9535 L23.636,9.9535 L25.626,9.9535 Z" id="Fill-11" fill="#FFFFFF"></path>
<path d="M0.374,16.0462 C0.445,16.3422 0.516,16.6382 0.606,16.9262 C0.73,17.3172 0.871,17.7022 1.03,18.0772 L7.387,18.0772 L2.434,20.5542 C2.635,20.8352 2.842,21.1102 3.064,21.3742 L7.922,18.9452 L7.922,24.9702 C8.572,25.2452 9.254,25.4572 9.953,25.6262 L9.953,17.9302 L9.953,16.7942 L9.953,16.0462 L2.365,16.0462 L0.374,16.0462 Z" id="Fill-13" fill="#FFFFFF"></path>
<path d="M16.0469,16.0462 L16.0469,16.7942 L16.0469,17.9302 L16.0469,25.6262 C16.7459,25.4572 17.4279,25.2452 18.0779,24.9702 L18.0779,18.9452 L22.9359,21.3742 C23.1579,21.1102 23.3649,20.8352 23.5669,20.5542 L18.6129,18.0772 L24.9699,18.0772 C25.1289,17.7022 25.2699,17.3172 25.3939,16.9252 C25.4849,16.6382 25.5549,16.3422 25.6259,16.0462 L23.6359,16.0462 L16.0469,16.0462 Z" id="Fill-15" fill="#FFFFFF"></path>
<path d="M23.5664,5.4456 L18.6134,7.9226 L24.9694,7.9226 C24.5954,7.0406 24.1174,6.2156 23.5664,5.4456" id="Fill-17" fill="#CF142B"></path>
<path d="M23.5664,20.554 C24.1174,19.784 24.5954,18.959 24.9694,18.077 L18.6134,18.077 L23.5664,20.554 Z" id="Fill-19" fill="#CF142B"></path>
<path d="M2.4341,20.554 L7.3871,18.077 L1.0301,18.077 C1.4051,18.959 1.8831,19.784 2.4341,20.554" id="Fill-21" fill="#CF142B"></path>
<path d="M2.4341,5.4456 C1.8831,6.2156 1.4051,7.0406 1.0301,7.9226 L7.3871,7.9226 L2.4341,5.4456 Z" id="Fill-23" fill="#CF142B"></path>
<path d="M25.6582,10.077 C25.6482,10.035 25.6362,9.995 25.6262,9.953 L23.6362,9.953 L16.0472,9.953 L16.0472,9.205 L16.0472,8.07 L16.0472,0.374 C15.0672,0.139 14.0512,0 13.0002,0 C11.9492,0 10.9322,0.139 9.9532,0.374 L9.9532,8.07 L9.9532,9.205 L9.9532,9.953 L2.3652,9.953 L0.3742,9.953 C0.3642,9.995 0.3512,10.035 0.3422,10.077 C0.1252,11.018 0.0002,11.994 0.0002,13 C0.0002,14.006 0.1252,14.982 0.3422,15.923 C0.3512,15.964 0.3642,16.005 0.3742,16.046 L2.3652,16.046 L9.9532,16.046 L9.9532,16.794 L9.9532,17.93 L9.9532,25.626 C10.9322,25.862 11.9492,26 13.0002,26 C14.0512,26 15.0672,25.862 16.0472,25.626 L16.0472,17.93 L16.0472,16.794 L16.0472,16.046 L23.6362,16.046 L25.6262,16.046 C25.6362,16.005 25.6482,15.964 25.6582,15.923 C25.8752,14.982 26.0002,14.006 26.0002,13 C26.0002,11.994 25.8752,11.018 25.6582,10.077" id="Fill-25" fill="#CF142B"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>Icons/Langages/french</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Icons/Langages/french" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M13,26 C14.637,26 16.195,25.688 17.636,25.14 L17.636,0.861 C16.195,0.313 14.637,0 13,0 C11.363,0 9.805,0.313 8.364,0.861 L8.364,25.14 C9.805,25.688 11.363,26 13,26" id="Fill-1" fill="#FFFFFF"></path>
<path d="M26,13 C26,7.437 22.531,2.723 17.636,0.861 L17.636,25.14 C22.531,23.277 26,18.562 26,13" id="Fill-3" fill="#FF0000"></path>
<path d="M0,13 C0,18.562 3.469,23.277 8.364,25.14 L8.364,0.861 C3.469,2.723 0,7.437 0,13" id="Fill-5" fill="#0088CE"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 968 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>Icons/Langages/deutsch</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Icons/Langages/deutsch" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M0,13 C0,14.637 0.313,16.195 0.861,17.636 L25.14,17.636 C25.687,16.195 26,14.637 26,13 C26,11.363 25.687,9.805 25.14,8.364 L0.861,8.364 C0.313,9.805 0,11.363 0,13" id="Fill-1" fill="#FF0000"></path>
<path d="M13,26 C18.562,26 23.277,22.531 25.14,17.636 L0.861,17.636 C2.723,22.531 7.437,26 13,26" id="Fill-3" fill="#FECE00"></path>
<path d="M13,0 C7.437,0 2.723,3.469 0.861,8.364 L25.14,8.364 C23.277,3.469 18.562,0 13,0" id="Fill-5" fill="#000000"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 969 B

16145
sncfgtfs/static/bootstrap-sncf.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

16152
sncfgtfs/static/bootstrap-sncf.darkmode.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

76703
sncfgtfs/static/bootstrap-sncf.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

91
sncfgtfs/static/bootstrap-sncf.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,53 @@
{% load static %}
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Horaires en gare de {{ stop.name }}</title>
<link title="Dark mode" rel="stylesheet" href="{% static "bootstrap-sncf.darkmode.min.css" %}">
<script src="{% static "bootstrap-sncf.min.js" %}"></script>
</head>
<body>
<h1>Horaires en gare de {{ stop.name }}</h1>
<form>
<div class="row">
<div class="col-auto">
<label for="date">Afficher le tableau à un autre moment</label>
</div>
<div class="col-auto">
<input name="date" type="date" class="form-control" value="{{ query_date|date:"Y-m-d" }}">
</div>
<div class="col-auto">
<input name="time" type="time" class="form-control form-inline" value="{{ query_time|time:"H:i" }}">
</div>
<div class="col-auto">
<input type="submit" class="form-control form-inline">
</div>
</div>
</form>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Heure</th>
<th>Destination</th>
</tr>
</thead>
<tbody>
{% for departure in next_departures %}
<tr>
<td>{{ departure.departure_time }}</td>
<td>
<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 %}
</td>
</tr>
{% endfor %}
</table>
</body>
</html>

7
sncfgtfs/urls.py Normal file
View File

@ -0,0 +1,7 @@
from django.urls import path
from sncfgtfs import views
urlpatterns = [
path('gare/<str:gare>/', views.GareView.as_view(), name='gare'),
]

View File

@ -1,3 +1,46 @@
from django.shortcuts import render
from datetime import date, datetime, time
# Create your views here.
from django.db.models import Q
from django.views.generic import TemplateView
from sncfgtfs.models import Stop, StopTime, CalendarDate, Calendar
class GareView(TemplateView):
template_name = "sncfgtfs/gare.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
stop = Stop.objects.get(name__iexact=kwargs["gare"], location_type=1)
context['stop'] = stop
next_departures = []
now = datetime.now()
if self.request.GET.get('date', None):
query_date = date.fromisoformat(self.request.GET['date'])
else:
query_date = now.date()
if self.request.GET.get('time', None):
query_time = time.fromisoformat(self.request.GET['time'])
else:
query_time = now.time()
context['query_date'] = query_date
context['query_time'] = query_time
qs = StopTime.objects.none()
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 = qs_child.filter(Q(trip__service_id__in=CalendarDate.objects.filter(
date=query_date, exception_type=1).values_list('service_id'))
| Q(trip__service_id__in=Calendar.objects.filter(
start_date__lte=query_date,
end_date__gte=query_date,
**{f"{query_date:%A}".lower(): True})
.filter(~Q(id__in=CalendarDate.objects.filter(
date=query_date, exception_type=2).values_list('service_id')))
.values_list('id')))
qs = qs.union(qs_child)
next_departures += qs.order_by("departure_time")[:20].all()
print(len(next_departures))
context['next_departures'] = next_departures
return context