From 0a196d6b1575cf26816f7a130a68bcd4e928e8d2b8d4e5e018cdbcd24484334d Mon Sep 17 00:00:00 2001 From: Johannes Randerath Date: Sat, 1 Jun 2024 00:19:10 +0200 Subject: [PATCH] Added models to represent GTFS --- .../pt_map/migrations/0001_initial.py | 182 ++++++++++++++++++ ...r_calendardate_unique_together_and_more.py | 29 +++ transport_accessibility/pt_map/models.py | 134 +++++++++++++ .../transport_accessibility/settings.py | 1 + 4 files changed, 346 insertions(+) create mode 100644 transport_accessibility/pt_map/migrations/0001_initial.py create mode 100644 transport_accessibility/pt_map/migrations/0002_alter_calendardate_unique_together_and_more.py diff --git a/transport_accessibility/pt_map/migrations/0001_initial.py b/transport_accessibility/pt_map/migrations/0001_initial.py new file mode 100644 index 0000000..53cc766 --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0001_initial.py @@ -0,0 +1,182 @@ +# Generated by Django 5.0.6 on 2024-05-31 22:07 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Agency', + fields=[ + ('agency_id', models.IntegerField(primary_key=True, serialize=False)), + ('agency_name', models.CharField(max_length=250)), + ('agency_url', models.URLField()), + ('agency_phone', models.CharField(max_length=15)), + ('agency_email', models.EmailField(max_length=254)), + ('agency_fare_url', models.URLField()), + ], + ), + migrations.CreateModel( + name='Calendar', + fields=[ + ('service_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('monday', models.BooleanField()), + ('tuesday', models.BooleanField()), + ('wednesday', models.BooleanField()), + ('thursday', models.BooleanField()), + ('friday', models.BooleanField()), + ('saturday', models.BooleanField()), + ('sunday', models.BooleanField()), + ('start_date', models.DateField()), + ('end_date', models.DateField()), + ], + ), + migrations.CreateModel( + name='FeedInfo', + fields=[ + ('feed_publisher_name', models.CharField(max_length=255)), + ('feed_publisher_url', models.URLField()), + ('feed_lang', models.CharField(max_length=255)), + ('feed_start_date', models.DateField(blank=True, null=True)), + ('feed_end_date', models.DateField(blank=True, null=True)), + ('feed_version', models.CharField(blank=True, max_length=255, null=True)), + ('feed_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ], + ), + migrations.CreateModel( + name='Shape', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('shape_id', models.CharField(max_length=255)), + ('shape_pt_lat', models.FloatField()), + ('shape_pt_lon', models.FloatField()), + ('shape_pt_sequence', models.IntegerField()), + ('shape_dist_traveled', models.FloatField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='CalendarDate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField()), + ('exception_type', models.IntegerField()), + ('service_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.calendar')), + ], + ), + migrations.CreateModel( + name='FareAttribute', + fields=[ + ('fare_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('price', models.FloatField()), + ('currency_type', models.CharField(max_length=255)), + ('payment_method', models.IntegerField()), + ('transfers', models.IntegerField()), + ('transfer_duration', models.IntegerField(blank=True, null=True)), + ('agency', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pt_map.agency')), + ], + ), + migrations.CreateModel( + name='Route', + fields=[ + ('route_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('route_short_name', models.CharField(max_length=255)), + ('route_long_name', models.CharField(max_length=255)), + ('route_desc', models.TextField(blank=True, null=True)), + ('route_type', models.IntegerField()), + ('route_url', models.URLField(blank=True, null=True)), + ('route_color', models.CharField(blank=True, max_length=6, null=True)), + ('route_text_color', models.CharField(blank=True, max_length=6, null=True)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.agency')), + ], + ), + migrations.CreateModel( + name='FareRule', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('origin_id', models.CharField(blank=True, max_length=255, null=True)), + ('destination_id', models.CharField(blank=True, max_length=255, null=True)), + ('contains_id', models.CharField(blank=True, max_length=255, null=True)), + ('fare', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.fareattribute')), + ('route', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pt_map.route')), + ], + ), + migrations.CreateModel( + name='Stop', + fields=[ + ('stop_id', models.IntegerField(primary_key=True, serialize=False)), + ('stop_code', models.CharField(max_length=50)), + ('stop_name', models.CharField(max_length=250)), + ('tts_stop_name', models.CharField(max_length=250)), + ('stop_desc', models.CharField(max_length=500)), + ('stop_lat', models.IntegerField()), + ('stop_lon', models.IntegerField()), + ('zone_id', models.IntegerField(unique=True)), + ('stop_url', models.URLField(blank=True, null=True)), + ('location_type', models.IntegerField(blank=True, null=True)), + ('stop_timezone', models.CharField(blank=True, max_length=255, null=True)), + ('wheelchair_boarding', models.IntegerField(blank=True, null=True)), + ('level_id', models.CharField(blank=True, max_length=255, null=True)), + ('platform_code', models.CharField(blank=True, max_length=255, null=True)), + ('parent_station', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.stop')), + ], + ), + migrations.CreateModel( + name='Transfer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('transfer_type', models.IntegerField()), + ('min_transfer_time', models.IntegerField(blank=True, null=True)), + ('from_stop', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_from', to='pt_map.stop')), + ('to_stop', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_to', to='pt_map.stop')), + ], + ), + migrations.CreateModel( + name='Trip', + fields=[ + ('trip_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('service_id', models.CharField(max_length=255)), + ('trip_headsign', models.CharField(blank=True, max_length=255, null=True)), + ('trip_short_name', models.CharField(blank=True, max_length=255, null=True)), + ('direction_id', models.IntegerField(blank=True, null=True)), + ('block_id', models.CharField(blank=True, max_length=255, null=True)), + ('shape_id', models.CharField(blank=True, max_length=255, null=True)), + ('wheelchair_accessible', models.IntegerField(blank=True, null=True)), + ('bikes_allowed', models.IntegerField(blank=True, null=True)), + ('route', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.route')), + ], + ), + migrations.CreateModel( + name='StopTime', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('arrival_time', models.TimeField()), + ('departure_time', models.TimeField()), + ('stop_sequence', models.IntegerField()), + ('stop_headsign', models.CharField(blank=True, max_length=255, null=True)), + ('pickup_type', models.IntegerField(blank=True, null=True)), + ('drop_off_type', models.IntegerField(blank=True, null=True)), + ('shape_dist_traveled', models.FloatField(blank=True, null=True)), + ('timepoint', models.IntegerField(blank=True, null=True)), + ('stop', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.stop')), + ('trip', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.trip')), + ], + ), + migrations.CreateModel( + name='Frequency', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start_time', models.TimeField()), + ('end_time', models.TimeField()), + ('headway_secs', models.IntegerField()), + ('exact_times', models.IntegerField(blank=True, null=True)), + ('trip', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.trip')), + ], + ), + ] diff --git a/transport_accessibility/pt_map/migrations/0002_alter_calendardate_unique_together_and_more.py b/transport_accessibility/pt_map/migrations/0002_alter_calendardate_unique_together_and_more.py new file mode 100644 index 0000000..d9ea27f --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0002_alter_calendardate_unique_together_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.0.6 on 2024-05-31 22:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pt_map', '0001_initial'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='calendardate', + unique_together={('service_id', 'date')}, + ), + migrations.AlterUniqueTogether( + name='shape', + unique_together={('shape_id', 'shape_pt_sequence')}, + ), + migrations.AlterUniqueTogether( + name='stoptime', + unique_together={('trip', 'stop_sequence')}, + ), + migrations.AlterUniqueTogether( + name='transfer', + unique_together={('from_stop', 'to_stop')}, + ), + ] diff --git a/transport_accessibility/pt_map/models.py b/transport_accessibility/pt_map/models.py index 3072a78..4634b15 100644 --- a/transport_accessibility/pt_map/models.py +++ b/transport_accessibility/pt_map/models.py @@ -1,3 +1,137 @@ from django.db import models +class Agency(models.Model): + agency_id = models.IntegerField(primary_key=True) + agency_name = models.CharField(max_length=250) + agency_url = models.URLField() + agency_phone = models.CharField(max_length=15) + agency_email = models.EmailField() + agency_fare_url = models.URLField() +class Stop(models.Model): + stop_id = models.IntegerField(primary_key=True) + stop_code = models.CharField(max_length=50) + stop_name = models.CharField(max_length=250) + tts_stop_name = models.CharField(max_length=250) + stop_desc = models.CharField(max_length=500) + stop_lat = models.IntegerField() + stop_lon = models.IntegerField() + zone_id = models.IntegerField(unique=True) + stop_url = models.URLField(blank=True, null=True) + location_type = models.IntegerField(blank=True, null=True) + parent_station = models.ForeignKey('self', on_delete=models.SET_NULL, blank=True, null=True) + stop_timezone = models.CharField(max_length=255, blank=True, null=True) + wheelchair_boarding = models.IntegerField(blank=True, null=True) + level_id = models.CharField(max_length=255, blank=True, null=True) + platform_code = models.CharField(max_length=255, blank=True, null=True) + + +class Route(models.Model): + route_id = models.CharField(max_length=255, primary_key=True) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + route_short_name = models.CharField(max_length=255) + route_long_name = models.CharField(max_length=255) + route_desc = models.TextField(blank=True, null=True) + route_type = models.IntegerField() + route_url = models.URLField(blank=True, null=True) + route_color = models.CharField(max_length=6, blank=True, null=True) + route_text_color = models.CharField(max_length=6, blank=True, null=True) + +class Trip(models.Model): + trip_id = models.CharField(max_length=255, primary_key=True) + route = models.ForeignKey(Route, on_delete=models.CASCADE) + service_id = models.CharField(max_length=255) + trip_headsign = models.CharField(max_length=255, blank=True, null=True) + trip_short_name = models.CharField(max_length=255, blank=True, null=True) + direction_id = models.IntegerField(blank=True, null=True) + block_id = models.CharField(max_length=255, blank=True, null=True) + shape_id = models.CharField(max_length=255, blank=True, null=True) + wheelchair_accessible = models.IntegerField(blank=True, null=True) + bikes_allowed = models.IntegerField(blank=True, null=True) + +class StopTime(models.Model): + trip = models.ForeignKey(Trip, on_delete=models.CASCADE) + arrival_time = models.TimeField() + departure_time = models.TimeField() + stop = models.ForeignKey(Stop, on_delete=models.CASCADE) + stop_sequence = models.IntegerField() + stop_headsign = models.CharField(max_length=255, blank=True, null=True) + pickup_type = models.IntegerField(blank=True, null=True) + drop_off_type = models.IntegerField(blank=True, null=True) + shape_dist_traveled = models.FloatField(blank=True, null=True) + timepoint = models.IntegerField(blank=True, null=True) + + class Meta: + unique_together = (('trip', 'stop_sequence'),) + +class Calendar(models.Model): + service_id = models.CharField(max_length=255, primary_key=True) + monday = models.BooleanField() + tuesday = models.BooleanField() + wednesday = models.BooleanField() + thursday = models.BooleanField() + friday = models.BooleanField() + saturday = models.BooleanField() + sunday = models.BooleanField() + start_date = models.DateField() + end_date = models.DateField() + +class CalendarDate(models.Model): + service_id = models.ForeignKey(Calendar, on_delete=models.CASCADE) + date = models.DateField() + exception_type = models.IntegerField() + + class Meta: + unique_together = (('service_id', 'date'),) + + +class FareAttribute(models.Model): + fare_id = models.CharField(max_length=255, primary_key=True) + price = models.FloatField() + currency_type = models.CharField(max_length=255) + payment_method = models.IntegerField() + transfers = models.IntegerField() + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, blank=True, null=True) + transfer_duration = models.IntegerField(blank=True, null=True) + +class FareRule(models.Model): + fare = models.ForeignKey(FareAttribute, on_delete=models.CASCADE) + route = models.ForeignKey(Route, on_delete=models.CASCADE, blank=True, null=True) + origin_id = models.CharField(max_length=255, blank=True, null=True) + destination_id = models.CharField(max_length=255, blank=True, null=True) + contains_id = models.CharField(max_length=255, blank=True, null=True) + +class Shape(models.Model): + shape_id = models.CharField(max_length=255) + shape_pt_lat = models.FloatField() + shape_pt_lon = models.FloatField() + shape_pt_sequence = models.IntegerField() + shape_dist_traveled = models.FloatField(blank=True, null=True) + + class Meta: + unique_together = (('shape_id', 'shape_pt_sequence'),) + +class Frequency(models.Model): + trip = models.ForeignKey(Trip, on_delete=models.CASCADE) + start_time = models.TimeField() + end_time = models.TimeField() + headway_secs = models.IntegerField() + exact_times = models.IntegerField(blank=True, null=True) + +class Transfer(models.Model): + from_stop = models.ForeignKey(Stop, on_delete=models.CASCADE, related_name='transfers_from') + to_stop = models.ForeignKey(Stop, on_delete=models.CASCADE, related_name='transfers_to') + transfer_type = models.IntegerField() + min_transfer_time = models.IntegerField(blank=True, null=True) + + class Meta: + unique_together = (('from_stop', 'to_stop'),) + +class FeedInfo(models.Model): + feed_publisher_name = models.CharField(max_length=255) + feed_publisher_url = models.URLField() + feed_lang = models.CharField(max_length=255) + feed_start_date = models.DateField(blank=True, null=True) + feed_end_date = models.DateField(blank=True, null=True) + feed_version = models.CharField(max_length=255, blank=True, null=True) + feed_id = models.CharField(max_length=255, primary_key=True) diff --git a/transport_accessibility/transport_accessibility/settings.py b/transport_accessibility/transport_accessibility/settings.py index 1929a0b..c5322e8 100644 --- a/transport_accessibility/transport_accessibility/settings.py +++ b/transport_accessibility/transport_accessibility/settings.py @@ -31,6 +31,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'pt_map.apps.PtMapConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes',