diff --git a/transport_accessibility/pt_map/bridge.py b/transport_accessibility/pt_map/bridge.py index 6244c33..13cda7e 100644 --- a/transport_accessibility/pt_map/bridge.py +++ b/transport_accessibility/pt_map/bridge.py @@ -35,13 +35,16 @@ db_to_gtfs(q, folder_path): import pt_map.gtfs import pt_map.models import pandas as pd -from pattern.text.en import singularize +from pattern.text.en import singularize, pluralize import math import numbers import email.utils import time import datetime import django.db.models +import time + +time_delta = int(datetime.datetime(2024,1,1).timestamp()) gtfs_schema = { "agency": [ @@ -216,7 +219,7 @@ gtfs_schema = { ], "transfers": [ "from_stop_id", - "to_stop_id", + "to_stop_id", "transfer_type", "min_transfer_time" ], @@ -283,7 +286,76 @@ gtfs_schema = { ] } -def to_camel_case(s: str): + +primary_keys = { pt_map.models.Agency: "agency_id", + pt_map.models.Level: "level_id", + pt_map.models.Stop: "stop_id", + pt_map.models.Route: "route_id", + pt_map.models.Shape: "shape_id", + pt_map.models.Calendar: "service_id", + pt_map.models.CalendarDate: None, + pt_map.models.Trip: "trip_id", + pt_map.models.LocationGroup: "location_group_id", + pt_map.models.LocationsGeojson: None, + pt_map.models.StopTime: None, + pt_map.models.FareAttribute: "fare_id", + pt_map.models.FareRule: None, + pt_map.models.Frequency: None, + pt_map.models.Transfer: None, + pt_map.models.Pathway: "pathway_id", + pt_map.models.FeedInfo: None, + pt_map.models.BookingRule: "booking_rule_id", + pt_map.models.Translation: None, + pt_map.models.Attribution: "attribution_id", + pt_map.models.LocationGroupStop: None, + pt_map.models.Network: "network_id", + pt_map.models.RouteNetwork: None, + pt_map.models.Area: None, + pt_map.models.StopArea: None, + pt_map.models.FareMedium: "fare_media_id", + pt_map.models.FareProduct: None, + pt_map.models.Timeframe: None, + pt_map.models.FareLegRule: None, + pt_map.models.FareTransferRule: None, + } + +foreign_keys = [ + (pt_map.models.Agency, []), + (pt_map.models.Level, []), + (pt_map.models.Stop, [(pt_map.models.Stop, 'parent_station'), (pt_map.models.Level, 'level_id'), ]), + (pt_map.models.Route, [(pt_map.models.Agency, 'agency_id'), ]), + (pt_map.models.Shape, []), + (pt_map.models.Calendar, []), + (pt_map.models.CalendarDate, []), + (pt_map.models.Trip, [(pt_map.models.Route, 'route_id'), (pt_map.models.Shape, 'shape_id'), ]), + (pt_map.models.LocationGroup, []), + (pt_map.models.LocationsGeojson, []), + (pt_map.models.StopTime, [(pt_map.models.Trip, 'trip_id'), (pt_map.models.Stop, 'stop_id'), (pt_map.models.LocationGroup, 'location_group_id'), (pt_map.models.LocationsGeojson, 'location_id'), ]), + (pt_map.models.FareAttribute, [(pt_map.models.Agency, 'agency_id'), ]), + (pt_map.models.FareRule, [(pt_map.models.FareAttribute, 'fare_id'), (pt_map.models.Route, 'route_id'), ]), + (pt_map.models.Frequency, [(pt_map.models.Trip, 'trip_id'), ]), + (pt_map.models.Transfer, [(pt_map.models.Stop, 'from_stop_id'), (pt_map.models.Stop, 'to_stop_id'), (pt_map.models.Route, 'from_route_id'), (pt_map.models.Route, 'to_route_id'), (pt_map.models.Trip, 'from_trip_id'), (pt_map.models.Trip, 'to_trip_id'), ]), + (pt_map.models.Pathway, [(pt_map.models.Stop, 'from_stop_id'), (pt_map.models.Stop, 'to_stop_id'), ]), + (pt_map.models.FeedInfo, []), + (pt_map.models.BookingRule, [(pt_map.models.Trip, 'trip_id'), ]), + (pt_map.models.Translation, []), + (pt_map.models.Attribution, [(pt_map.models.Agency, 'agency_id'), (pt_map.models.Route, 'route_id'), (pt_map.models.Trip, 'trip_id'), ]), + (pt_map.models.LocationGroupStop, [(pt_map.models.LocationGroup, 'location_group_id'), (pt_map.models.Stop, 'stop_id'), ]), + (pt_map.models.Network, []), + (pt_map.models.RouteNetwork, [(pt_map.models.Network, 'network_id'), (pt_map.models.Route, 'route_id'), ]), + (pt_map.models.Area, []), + (pt_map.models.StopArea, [(pt_map.models.Area, 'area_id'), (pt_map.models.Stop, 'stop_id'), ]), + (pt_map.models.FareMedium, []), + (pt_map.models.FareProduct, []), + (pt_map.models.Timeframe, []), + (pt_map.models.FareLegRule, [(pt_map.models.Network, 'network_id'), (pt_map.models.Area, 'from_area_id'), (pt_map.models.Area, 'to_area_id'), (pt_map.models.Timeframe, 'from_timeframe_group_id'), (pt_map.models.Timeframe, 'to_timeframe_group_id'), (pt_map.models.FareProduct, 'fare_product_id'), ]), + (pt_map.models.FareTransferRule, [(pt_map.models.FareProduct, 'fare_product_id'), ]), +] + +class_names = {'Agency': 'agency', 'Stop': 'stops', 'Route': 'routes', 'Trip': 'trips', 'StopTime': 'stop_times', 'Calendar': 'calendar', 'CalendarDate': 'calendar_dates', 'FareAttribute': 'fare_attributes', 'FareRule': 'fare_rules', 'Timeframe': 'timeframes', 'FareMedium': 'fare_media', 'FareProduct': 'fare_products', 'FareLegRule': 'fare_leg_rules', 'FareTransferRule': 'fare_transfer_rules', 'Area': 'areas', 'StopArea': 'stop_areas', 'Network': 'networks', 'RouteNetwork': 'route_networks', 'Shape': 'shapes', 'Frequency': 'frequencies', 'Transfer': 'transfers', 'Pathway': 'pathways', 'Level': 'levels', 'LocationGroup': 'location_groups', 'LocationGroupStop': 'location_group_stops', 'LocationsGeojson': 'locations_geojson', 'BookingRule': 'booking_rules', 'Translation': 'translations', 'FeedInfo': 'feed_info', 'Attribution': 'attributions'} + + +def toCamelCase(s: str): """ Convert '_'-separated str to CamelCase with the first letter capitalized. @@ -332,7 +404,8 @@ def is_NaN(v): def stdz(v, m: django.db.models.Model, f: str): """ - Convert Time and Date str to a format our db can easily work with. + If f is a time or date field, convert to a format our db can easily work with. + If f is a foreign key Parameters ---------- @@ -354,8 +427,24 @@ def stdz(v, m: django.db.models.Model, f: str): return str(v) if m._meta.get_field(f).get_internal_type() == 'TimeField': return standardize_time(v) + if m._meta.get_field(f).get_internal_type() == 'ForeignKey': + pass return v +def to_snake_case(name): + name = name[0].lower() + name[1:] + for c in name[1:]: + if c.isupper(): + name.insert(i,'_') + else: + c.lower() + return name + +def unqfk(ts, fk): + if not isinstance(fk, str): + fk = str(int(fk)) + print(f"fk: {fk}") + return f"{ts}{fk}".strip() def gtfs_to_db(g: pt_map.gtfs.GTFS): """ @@ -366,18 +455,34 @@ def gtfs_to_db(g: pt_map.gtfs.GTFS): g : gtfs.GTFS GTFS object to be saved to db """ - for k,v in gtfs_schema.items(): - name = to_camel_case(singularize(k)) - m = getattr(pt_map.models, name) - df = getattr(g, k).data + ts = str(int(time.time())-time_delta) + for model in foreign_keys: + if model[0] in [pt_map.models.Calendar, pt_map.models.CalendarDate, ]: + continue + m = model[0] + df = getattr(g, class_names[m.__name__]).data if not df.empty: + v = gtfs_schema[class_names[m.__name__]] for _, row in df.iterrows(): + for fk in model[1]: + if row.get(fk[1]): + row[fk[1]] = fk[0].objects.get(**{primary_keys[fk[0]]: unqfk(ts, row[fk[1]])}) defaults = {field: stdz(row.get(field), m, field) for field in v if row.get(field) and not is_NaN(row[field])} - kw_args = {v[0]: row[v[0]]} - m.objects.update_or_create( - defaults = defaults, - **kw_args, - ) + if primary_keys[m]: + row[primary_keys[m]] = unqfk(ts, row[primary_keys[m]]) + defaults[primary_keys[m]] = row[primary_keys[m]] + try: + m.objects.get(**{primary_keys[m]: row[primary_keys[m]]}) + except m.DoesNotExist: + + m.objects.update_or_create( + defaults = defaults, + #**kw_args, + **{primary_keys[m]: row[primary_keys[m]]} + ) + else: + m.objects.update_or_create(defaults=defaults) + reversed_file_mapping = { "Agency": "agency", diff --git a/transport_accessibility/pt_map/class_names.py b/transport_accessibility/pt_map/class_names.py new file mode 100644 index 0000000..fb76571 --- /dev/null +++ b/transport_accessibility/pt_map/class_names.py @@ -0,0 +1,138 @@ +""" +Constant defining different variation of the file names in GTFS / our model names, mapped to corresponding models. +""" + +import pt_map.models + +class_names = [ +{ + "Agency": pt_map.models.Agency, + "Stop": pt_map.models.Stop, + "Route": pt_map.models.Route, + "Trip": pt_map.models.Trip, + "StopTime": pt_map.models.StopTime, + "Calendar": pt_map.models.Calendar, + "CalendarDate": pt_map.models.CalendarDate, + "FareAttribute": pt_map.models.FareAttribute, + "FareRule": pt_map.models.FareRule, + "Timeframe": pt_map.models.Timeframe, + "FareMedium": pt_map.models.FareMedium, + "FareProduct": pt_map.models.FareProduct, + "FareLegRule": pt_map.models.FareLegRule, + "FareTransferRule": pt_map.models.FareTransferRule, + "Area": pt_map.models.Area, + "StopArea": pt_map.models.StopArea, + "Network": pt_map.models.Network, + "RouteNetwork": pt_map.models.RouteNetwork, + "Shape": pt_map.models.Shape, + "Frequency": pt_map.models.Frequency, + "Transfer": pt_map.models.Transfer, + "Pathway": pt_map.models.Pathway, + "Level": pt_map.models.Level, + "LocationGroup": pt_map.models.LocationGroup, + "LocationGroupStop": pt_map.models.LocationGroupStop, + "LocationsGeojson": pt_map.models.LocationsGeojson, + "BookingRule": pt_map.models.BookingRule, + "Translation": pt_map.models.Translation, + "FeedInfo": pt_map.models.FeedInfo, + "Attribution": pt_map.models.Attribution, +}, +{ + "agencies": pt_map.models.Agency, + "stops": pt_map.models.Stop, + "routes": pt_map.models.Route, + "trips": pt_map.models.Trip, + "stop_times": pt_map.models.StopTime, + "calendars": pt_map.models.Calendar, + "calendar_dates": pt_map.models.CalendarDate, + "fare_attributes": pt_map.models.FareAttribute, + "fare_rules": pt_map.models.FareRule, + "timeframes": pt_map.models.Timeframe, + "fare_mediums": pt_map.models.FareMedium, + "fare_products": pt_map.models.FareProduct, + "fare_leg_rules": pt_map.models.FareLegRule, + "fare_transfer_rules": pt_map.models.FareTransferRule, + "areas": pt_map.models.Area, + "stop_areas": pt_map.models.StopArea, + "networks": pt_map.models.Network, + "route_networks": pt_map.models.RouteNetwork, + "shapes": pt_map.models.Shape, + "frequencies": pt_map.models.Frequency, + "transfers": pt_map.models.Transfer, + "pathways": pt_map.models.Pathway, + "levels": pt_map.models.Level, + "location_groups": pt_map.models.LocationGroup, + "location_group_stops": pt_map.models.LocationGroupStop, + "locations": pt_map.models.LocationsGeojson, + "booking_rules": pt_map.models.BookingRule, + "translations": pt_map.models.Translation, + "feed_info": pt_map.models.FeedInfo, + "attributions": pt_map.models.Attribution, +}, +{ + pt_map.models.Agency: "Agency", + pt_map.models.Stop: "Stop", + pt_map.models.Route: "Route", + pt_map.models.Trip: "Trip", + pt_map.models.StopTime: "StopTime", + pt_map.models.Calendar: "Calendar", + pt_map.models.CalendarDate: "CalendarDate", + pt_map.models.FareAttribute: "FareAttribute", + pt_map.models.FareRule: "FareRule", + pt_map.models.Timeframe: "Timeframe", + pt_map.models.FareMedium: "FareMedium", + pt_map.models.FareProduct: "FareProduct", + pt_map.models.FareLegRule: "FareLegRule", + pt_map.models.FareTransferRule: "FareTransferRule", + pt_map.models.Area: "Area", + pt_map.models.StopArea: "StopArea", + pt_map.models.Network: "Network", + pt_map.models.RouteNetwork: "RouteNetwork", + pt_map.models.Shape: "Shape", + pt_map.models.Frequency: "Frequency", + pt_map.models.Transfer: "Transfer", + pt_map.models.Pathway: "Pathway", + pt_map.models.Level: "Level", + pt_map.models.LocationGroup: "LocationGroup", + pt_map.models.LocationGroupStop: "LocationGroupStop", + pt_map.models.LocationsGeojson: "LocationsGeojson", + pt_map.models.BookingRule: "BookingRule", + pt_map.models.Translation: "Translation", + pt_map.models.FeedInfo: "FeedInfo", + pt_map.models.Attribution: "Attribution", +}, +{ + pt_map.models.Agency: "agencies", + pt_map.models.Stop: "stops", + pt_map.models.Route: "routes", + pt_map.models.Trip: "trips", + pt_map.models.StopTime: "stop_times", + pt_map.models.Calendar: "calendars", + pt_map.models.CalendarDate: "calendar_dates", + pt_map.models.FareAttribute: "fare_attributes", + pt_map.models.FareRule: "fare_rules", + pt_map.models.Timeframe: "timeframes", + pt_map.models.FareMedium: "fare_mediums", + pt_map.models.FareProduct: "fare_products", + pt_map.models.FareLegRule: "fare_leg_rules", + pt_map.models.FareTransferRule: "fare_transfer_rules", + pt_map.models.Area: "areas", + pt_map.models.StopArea: "stop_areas", + pt_map.models.Network: "networks", + pt_map.models.RouteNetwork: "route_networks", + pt_map.models.Shape: "shapes", + pt_map.models.Frequency: "frequencies", + pt_map.models.Transfer: "transfers", + pt_map.models.Pathway: "pathways", + pt_map.models.Level: "levels", + pt_map.models.LocationGroup: "location_groups", + pt_map.models.LocationGroupStop: "location_group_stops", + pt_map.models.LocationsGeojson: "locations", + pt_map.models.BookingRule: "booking_rules", + pt_map.models.Translation: "translations", + pt_map.models.FeedInfo: "feed_info", + pt_map.models.Attribution: "attributions", +}, +] + + diff --git a/transport_accessibility/pt_map/migrations/0001_initial.py b/transport_accessibility/pt_map/migrations/0001_initial.py index 53cc766..e248b8c 100644 --- a/transport_accessibility/pt_map/migrations/0001_initial.py +++ b/transport_accessibility/pt_map/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.6 on 2024-05-31 22:07 +# Generated by Django 5.0.6 on 2024-06-05 22:43 import django.db.models.deletion from django.db import migrations, models @@ -15,18 +15,29 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Agency', fields=[ - ('agency_id', models.IntegerField(primary_key=True, serialize=False)), - ('agency_name', models.CharField(max_length=250)), + ('agency_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('agency_name', models.CharField(max_length=255)), ('agency_url', models.URLField()), - ('agency_phone', models.CharField(max_length=15)), - ('agency_email', models.EmailField(max_length=254)), - ('agency_fare_url', models.URLField()), + ('agency_timezone', models.CharField(max_length=255)), + ('agency_lang', models.CharField(blank=True, max_length=2, null=True)), + ('agency_phone', models.CharField(blank=True, max_length=50, null=True)), + ('agency_fare_url', models.URLField(blank=True, null=True)), + ('agency_email', models.EmailField(blank=True, max_length=254, null=True)), + ], + ), + migrations.CreateModel( + name='Area', + fields=[ + ('area_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('area_name', models.CharField(max_length=255)), + ('area_description', models.TextField(blank=True, null=True)), ], ), migrations.CreateModel( name='Calendar', fields=[ - ('service_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('service_id', models.IntegerField()), ('monday', models.BooleanField()), ('tuesday', models.BooleanField()), ('wednesday', models.BooleanField()), @@ -38,16 +49,165 @@ class Migration(migrations.Migration): ('end_date', models.DateField()), ], ), + migrations.CreateModel( + name='FareMedium', + fields=[ + ('fare_media_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('fare_media_name', models.CharField(max_length=255)), + ('fare_media_description', models.TextField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='FareProduct', + fields=[ + ('fare_product_id', models.BigAutoField(primary_key=True, serialize=False)), + ('fare_product_name', models.CharField(max_length=255)), + ('fare_product_description', models.TextField(blank=True, null=True)), + ('amount', models.FloatField()), + ('curreny', models.CharField(max_length=64)), + ], + ), 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)), + ('default_lang', models.CharField(blank=True, max_length=255, null=True)), ('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)), + ('feed_contact_email', models.EmailField(blank=True, max_length=254, null=True)), + ('feed_contact_url', models.URLField(blank=True, null=True)), + ('feed_id', models.BigAutoField(primary_key=True, serialize=False)), + ], + ), + migrations.CreateModel( + name='Level', + fields=[ + ('level_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('level_index', models.FloatField()), + ('level_name', models.CharField(blank=True, max_length=255, null=True)), + ], + ), + migrations.CreateModel( + name='LocationGroup', + fields=[ + ('location_group_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('location_group_name', models.CharField(max_length=255)), + ('location_group_type', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='LocationsGeojson', + fields=[ + ('location_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('location_name', models.CharField(max_length=255)), + ('location_lat', models.FloatField()), + ('location_lon', models.FloatField()), + ('location_type', models.CharField(max_length=255)), + ('parent_location_id', models.CharField(blank=True, max_length=255, null=True)), + ('wheelchair_boarding', models.BooleanField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Network', + fields=[ + ('network_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('network_name', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Timeframe', + fields=[ + ('timeframe_group_id', models.IntegerField(primary_key=True, serialize=False)), + ('service_id', models.IntegerField()), + ('start_date', models.DateField()), + ('end_date', models.DateField()), + ('start_time', models.TimeField()), + ('end_time', models.TimeField()), + ], + ), + migrations.CreateModel( + name='Translation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('table_name', models.CharField(max_length=255)), + ('field_name', models.CharField(max_length=255)), + ('language', models.CharField(max_length=2)), + ('translation', models.TextField()), + ], + ), + migrations.CreateModel( + name='CalendarDate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('service_id', models.IntegerField()), + ('date', models.DateField()), + ('exception_type', models.IntegerField()), + ], + options={ + 'unique_together': {('service_id', 'date')}, + }, + ), + 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=3)), + ('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='FareTransferRule', + fields=[ + ('fare_transfer_rule_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('fare_transfer_rule_name', models.CharField(max_length=255)), + ('fare_transfer_rule_description', models.TextField(blank=True, null=True)), + ('from_leg_group_id', models.IntegerField(blank=True, null=True)), + ('to_leg_group_id', models.IntegerField(blank=True, null=True)), + ('fare_product_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.fareproduct')), + ], + ), + migrations.CreateModel( + name='Route', + fields=[ + ('route_id', models.IntegerField(primary_key=True, serialize=False)), + ('route_short_name', models.CharField(max_length=50)), + ('route_long_name', models.CharField(blank=True, max_length=255, null=True)), + ('route_desc', models.TextField(blank=True, null=True)), + ('route_type', models.IntegerField(default=0)), + ('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)), + ('route_sort_order', models.IntegerField(blank=True, null=True)), + ('continuous_pickup', models.IntegerField(blank=True, null=True)), + ('continuous_drop_off', models.IntegerField(blank=True, null=True)), + ('agency_id', models.ForeignKey(blank=True, null=True, 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.IntegerField(blank=True, 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='RouteNetwork', + fields=[ + ('route_network_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('route_network_name', models.CharField(max_length=255)), + ('network_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.network')), + ('route_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.route')), ], ), migrations.CreateModel( @@ -60,112 +220,91 @@ class Migration(migrations.Migration): ('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')), - ], + options={ + 'unique_together': {('shape_id', 'shape_pt_sequence')}, + }, ), 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_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('stop_code', models.CharField(blank=True, max_length=50, null=True)), + ('stop_name', models.CharField(max_length=255)), + ('stop_desc', models.TextField(blank=True, null=True)), + ('stop_lat', models.FloatField()), + ('stop_lon', models.FloatField()), + ('zone_id', models.CharField(blank=True, max_length=255, null=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')), + ('platform_code', models.CharField(blank=True, max_length=50, null=True)), + ('level_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.level')), + ('parent_station', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pt_map.stop')), ], ), migrations.CreateModel( - name='Transfer', + name='Pathway', + fields=[ + ('pathway_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('pathway_mode', models.IntegerField()), + ('is_bidirectional', models.IntegerField()), + ('length', models.FloatField(blank=True, null=True)), + ('traversal_time', models.IntegerField(blank=True, null=True)), + ('stair_count', models.IntegerField(blank=True, null=True)), + ('max_slope', models.FloatField(blank=True, null=True)), + ('min_width', models.FloatField(blank=True, null=True)), + ('signposted_as', models.CharField(blank=True, max_length=255, null=True)), + ('reversed_signposted_as', models.CharField(blank=True, max_length=255, null=True)), + ('from_stop_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pathways_from', to='pt_map.stop')), + ('to_stop_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pathways_to', to='pt_map.stop')), + ], + ), + migrations.CreateModel( + name='LocationGroupStop', 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')), + ('location_group_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.locationgroup')), + ('stop_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.stop')), + ], + ), + migrations.CreateModel( + name='StopArea', + fields=[ + ('stop_area_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('stop_area_name', models.CharField(max_length=255)), + ('stop_area_description', models.TextField(blank=True, null=True)), + ('area_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.area')), + ('stop_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.stop')), + ], + ), + migrations.CreateModel( + name='FareLegRule', + fields=[ + ('fare_leg_rule_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('fare_leg_rule_name', models.CharField(max_length=255)), + ('fare_leg_rule_description', models.TextField(blank=True, null=True)), + ('from_area_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='farelegrule_from_area', to='pt_map.area')), + ('to_area_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='farelegrule_to_area', to='pt_map.area')), + ('fare_product_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.fareproduct')), + ('network_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.network')), + ('from_timeframe_group_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='farelegrule_from_timeframe', to='pt_map.timeframe')), + ('to_timeframe_group_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='farelegrule_to_timeframe', to='pt_map.timeframe')), ], ), migrations.CreateModel( name='Trip', fields=[ ('trip_id', models.CharField(max_length=255, primary_key=True, serialize=False)), - ('service_id', models.CharField(max_length=255)), + ('service_id', models.IntegerField()), ('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')), + ('route_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.route')), + ('shape_id', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='pt_map.shape')), ], ), migrations.CreateModel( @@ -176,7 +315,70 @@ class Migration(migrations.Migration): ('end_time', models.TimeField()), ('headway_secs', models.IntegerField()), ('exact_times', models.IntegerField(blank=True, null=True)), + ('trip_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.trip')), + ], + ), + migrations.CreateModel( + name='BookingRule', + fields=[ + ('booking_rule_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('start_time', models.TimeField(blank=True, null=True)), + ('end_time', models.TimeField(blank=True, null=True)), + ('booking_type', models.CharField(max_length=255)), + ('rule_criteria', models.TextField(blank=True, null=True)), + ('booking_rule_instructions', models.TextField(blank=True, null=True)), ('trip', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.trip')), ], ), + migrations.CreateModel( + name='Attribution', + fields=[ + ('attribution_id', models.BigAutoField(primary_key=True, serialize=False)), + ('attribution_name', models.CharField(max_length=255)), + ('attribution_url', models.URLField()), + ('attribution_email', models.EmailField(blank=True, max_length=254, null=True)), + ('attribution_phone', models.CharField(blank=True, max_length=50, null=True)), + ('agency_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.agency')), + ('route_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.route')), + ('trip_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.trip')), + ], + ), + 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_route_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transfers_from_route', to='pt_map.route')), + ('from_stop', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_from_stop', to='pt_map.stop')), + ('to_route_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transfers_to_route', to='pt_map.route')), + ('to_stop', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_to_stop', to='pt_map.stop')), + ('from_trip_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transfers_from_trip', to='pt_map.trip')), + ('to_trip_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transfers_to_trip', to='pt_map.trip')), + ], + options={ + 'unique_together': {('from_stop', 'to_stop')}, + }, + ), + migrations.CreateModel( + name='StopTime', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('arrival_time', models.TimeField(blank=True, null=True)), + ('departure_time', models.TimeField(blank=True, null=True)), + ('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)), + ('location_group_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.locationgroup')), + ('location_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pt_map.locationsgeojson')), + ('stop_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.stop')), + ('trip_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.trip')), + ], + options={ + 'unique_together': {('trip_id', 'stop_sequence')}, + }, + ), ] diff --git a/transport_accessibility/pt_map/migrations/0002_rename_trip_bookingrule_trip_id_and_more.py b/transport_accessibility/pt_map/migrations/0002_rename_trip_bookingrule_trip_id_and_more.py new file mode 100644 index 0000000..a81be12 --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0002_rename_trip_bookingrule_trip_id_and_more.py @@ -0,0 +1,47 @@ +# Generated by Django 5.0.6 on 2024-06-06 17:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pt_map', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='bookingrule', + old_name='trip', + new_name='trip_id', + ), + migrations.RenameField( + model_name='fareattribute', + old_name='agency', + new_name='agency_id', + ), + migrations.RenameField( + model_name='farerule', + old_name='fare', + new_name='fare_id', + ), + migrations.RenameField( + model_name='farerule', + old_name='route', + new_name='route_id', + ), + migrations.RenameField( + model_name='transfer', + old_name='from_stop', + new_name='from_stop_id', + ), + migrations.RenameField( + model_name='transfer', + old_name='to_stop', + new_name='to_stop_id', + ), + migrations.AlterUniqueTogether( + name='transfer', + unique_together={('from_stop_id', 'to_stop_id')}, + ), + ] diff --git a/transport_accessibility/pt_map/migrations/0003_alter_agency_agency_id_alter_area_area_id_and_more.py b/transport_accessibility/pt_map/migrations/0003_alter_agency_agency_id_alter_area_area_id_and_more.py new file mode 100644 index 0000000..5c55b43 --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0003_alter_agency_agency_id_alter_area_area_id_and_more.py @@ -0,0 +1,93 @@ +# Generated by Django 5.0.6 on 2024-06-06 21:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pt_map', '0002_rename_trip_bookingrule_trip_id_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='agency_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='area', + name='area_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='bookingrule', + name='booking_rule_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='fareattribute', + name='fare_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='farelegrule', + name='fare_leg_rule_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='faremedium', + name='fare_media_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='faretransferrule', + name='fare_transfer_rule_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='level', + name='level_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='locationgroup', + name='location_group_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='locationsgeojson', + name='location_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='network', + name='network_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='pathway', + name='pathway_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='routenetwork', + name='route_network_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='stop', + name='stop_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='stoparea', + name='stop_area_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trip', + name='trip_id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + ] diff --git a/transport_accessibility/pt_map/migrations/0004_alter_agency_agency_id_alter_area_area_id_and_more.py b/transport_accessibility/pt_map/migrations/0004_alter_agency_agency_id_alter_area_area_id_and_more.py new file mode 100644 index 0000000..1db7aa6 --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0004_alter_agency_agency_id_alter_area_area_id_and_more.py @@ -0,0 +1,103 @@ +# Generated by Django 5.0.6 on 2024-06-06 21:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pt_map', '0003_alter_agency_agency_id_alter_area_area_id_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='agency_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='area', + name='area_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='bookingrule', + name='booking_rule_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='fareattribute', + name='fare_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='farelegrule', + name='fare_leg_rule_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='faremedium', + name='fare_media_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='faretransferrule', + name='fare_transfer_rule_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='level', + name='level_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='locationgroup', + name='location_group_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='locationsgeojson', + name='location_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='network', + name='network_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='pathway', + name='pathway_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='route', + name='route_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='routenetwork', + name='route_network_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='stop', + name='stop_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='stoparea', + name='stop_area_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='timeframe', + name='timeframe_group_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trip', + name='trip_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + ] diff --git a/transport_accessibility/pt_map/migrations/0005_remove_calendar_id_alter_calendar_service_id_and_more.py b/transport_accessibility/pt_map/migrations/0005_remove_calendar_id_alter_calendar_service_id_and_more.py new file mode 100644 index 0000000..36a2878 --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0005_remove_calendar_id_alter_calendar_service_id_and_more.py @@ -0,0 +1,27 @@ +# Generated by Django 5.0.6 on 2024-06-09 20:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pt_map', '0004_alter_agency_agency_id_alter_area_area_id_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='calendar', + name='id', + ), + migrations.AlterField( + model_name='calendar', + name='service_id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='calendardate', + name='service_id', + field=models.CharField(max_length=255), + ), + ]