From f5b329bc1776f5a8038b8308af4f3822e4b65fce992e40dfa02143c0c92657d9 Mon Sep 17 00:00:00 2001 From: Johannes Randerath Date: Wed, 19 Jun 2024 22:12:20 +0200 Subject: [PATCH] API: Retrieve data Now able to retrieve model data for any number of models, identified by their primary keys, represented as JSON, using GET /data?=. --- transport_accessibility/api/__init__.py | 0 transport_accessibility/api/admin.py | 3 + transport_accessibility/api/apps.py | 6 + .../api/migrations/__init__.py | 0 transport_accessibility/api/models.py | 3 + transport_accessibility/api/tests.py | 3 + transport_accessibility/api/views.py | 3 + transport_accessibility/pt_map/bridge.py | 40 +- transport_accessibility/pt_map/class_names.py | 202 +++++---- .../pt_map/migrations/0001_initial.py | 376 +--------------- .../pt_map/migrations/0002_initial.py | 420 ++++++++++++++++++ ...ename_trip_bookingrule_trip_id_and_more.py | 47 -- ...y_agency_id_alter_area_area_id_and_more.py | 93 ---- .../0003_faretransferrule_feed_info_id.py | 21 + ...y_agency_id_alter_area_area_id_and_more.py | 103 ----- ...r_id_alter_calendar_service_id_and_more.py | 27 -- transport_accessibility/pt_map/models.py | 97 ++-- transport_accessibility/pt_map/views.py | 83 ++-- 18 files changed, 695 insertions(+), 832 deletions(-) create mode 100644 transport_accessibility/api/__init__.py create mode 100644 transport_accessibility/api/admin.py create mode 100644 transport_accessibility/api/apps.py create mode 100644 transport_accessibility/api/migrations/__init__.py create mode 100644 transport_accessibility/api/models.py create mode 100644 transport_accessibility/api/tests.py create mode 100644 transport_accessibility/api/views.py create mode 100644 transport_accessibility/pt_map/migrations/0002_initial.py delete mode 100644 transport_accessibility/pt_map/migrations/0002_rename_trip_bookingrule_trip_id_and_more.py delete mode 100644 transport_accessibility/pt_map/migrations/0003_alter_agency_agency_id_alter_area_area_id_and_more.py create mode 100644 transport_accessibility/pt_map/migrations/0003_faretransferrule_feed_info_id.py delete mode 100644 transport_accessibility/pt_map/migrations/0004_alter_agency_agency_id_alter_area_area_id_and_more.py delete mode 100644 transport_accessibility/pt_map/migrations/0005_remove_calendar_id_alter_calendar_service_id_and_more.py diff --git a/transport_accessibility/api/__init__.py b/transport_accessibility/api/__init__.py new file mode 100644 index 0000000..473a0f4 diff --git a/transport_accessibility/api/admin.py b/transport_accessibility/api/admin.py new file mode 100644 index 0000000..97e651b --- /dev/null +++ b/transport_accessibility/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/transport_accessibility/api/apps.py b/transport_accessibility/api/apps.py new file mode 100644 index 0000000..e8477b2 --- /dev/null +++ b/transport_accessibility/api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'api' diff --git a/transport_accessibility/api/migrations/__init__.py b/transport_accessibility/api/migrations/__init__.py new file mode 100644 index 0000000..473a0f4 diff --git a/transport_accessibility/api/models.py b/transport_accessibility/api/models.py new file mode 100644 index 0000000..5d0d3b0 --- /dev/null +++ b/transport_accessibility/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/transport_accessibility/api/tests.py b/transport_accessibility/api/tests.py new file mode 100644 index 0000000..bccdb2f --- /dev/null +++ b/transport_accessibility/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/transport_accessibility/api/views.py b/transport_accessibility/api/views.py new file mode 100644 index 0000000..244b489 --- /dev/null +++ b/transport_accessibility/api/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/transport_accessibility/pt_map/bridge.py b/transport_accessibility/pt_map/bridge.py index 9350ecc..30286c6 100644 --- a/transport_accessibility/pt_map/bridge.py +++ b/transport_accessibility/pt_map/bridge.py @@ -50,7 +50,7 @@ import datetime import django.db.models import time from pt_map.gtfs_schema import gtfs_schema -from.class_names import * +from .class_names import * def toCamelCase(s: str): @@ -178,32 +178,42 @@ def gtfs_to_db(g: pt_map.gtfs.GTFS): g : gtfs.GTFS GTFS object to be saved to db """ + feed_id = 0 + #model = (pt_map.models.Trip, [(pt_map.models.Route, 'route_id'), (pt_map.models.Shape, 'shape_id'), ]) ts = str(int(time.time())-time_delta) # Prepend the current time in seconds since Jan 1, 2024 to ids to make them more or less unique - for model in foreign_keys: + #if model == pt_map.models.Shape: + for model in foreign_keys: m = model[0] - df = getattr(g, class_names[m.__name__]).data # Extract dataframe for each model from gtfs.GTFS object + df = getattr(g, reversed_file_mapping[m.__name__]).data # Extract dataframe for each model from gtfs.GTFS object if not df.empty: # Only process GTFS files actually present - v = gtfs_schema[class_names[m.__name__]] # field names + if primary_keys[m] in df.keys() and not m == pt_map.models.FeedInfo: + #df[primary_keys[m]] = df[primary_keys[m]].astype(str) + df[primary_keys[m]] = [f"{feed_id.feed_id}_{pk}" for pk in df[primary_keys[m]]] + elif not m == pt_map.models.FeedInfo: + df[primary_keys[m]] = [f"{feed_id.feed_id}_{pk}" for pk in range(1, df.index.size + 1)] + v = gtfs_schema[reversed_file_mapping[m.__name__]] # field names for _, row in df.iterrows(): # the rows of the dataframe are the individual entries in the GTFS file and should be the individual instances of the db model for fk in model[1]: # Map foreign_keys to objects of the foreign model if row.get(fk[1]): - row[fk[1]] = fk[0].objects.get(**{primary_keys[fk[0]]: unqfk(ts, row[fk[1]])}) + row[fk[1]] = fk[0].objects.get(**{primary_keys[fk[0]]: f"{feed_id.feed_id}_{row[fk[1]]}"})#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])} # dict of fields and values of current model object to create - if primary_keys[m]: - row[primary_keys[m]] = unqfk(ts, row[primary_keys[m]]) # primary_keys should be unique, use current time in seconds as a prefix - defaults[primary_keys[m]] = row[primary_keys[m]] + o = None + if not m == pt_map.models.FeedInfo: + defaults["feed_info_id"] = feed_id + if primary_keys[m] in df.keys(): + #row[primary_keys[m]] = unqfk(ts, row[primary_keys[m]]) # primary_keys should be unique, use current time in seconds as a prefix + #defaults[primary_keys[m]] = row[primary_keys[m]] try: - m.objects.get(**{primary_keys[m]: row[primary_keys[m]]}) # Make sure there is no object with identical primary_key, exception is expected to be risen + o = m.objects.get(**{primary_keys[m]: row[primary_keys[m]]}) # Make sure there is no object with identical primary_key, exception is expected to be risen except m.DoesNotExist: - - m.objects.update_or_create( + o = m.objects.update_or_create( defaults = defaults, - #**kw_args, - **{primary_keys[m]: row[primary_keys[m]]} + **{primary_keys[m]: row[primary_keys[m]]} ) else: - m.objects.create(**defaults) - + o = m.objects.create(**defaults) + if m == pt_map.models.FeedInfo: + feed_id = o diff --git a/transport_accessibility/pt_map/class_names.py b/transport_accessibility/pt_map/class_names.py index 818200d..cb9f490 100644 --- a/transport_accessibility/pt_map/class_names.py +++ b/transport_accessibility/pt_map/class_names.py @@ -165,7 +165,7 @@ reversed_file_mapping = { "Level": "levels", "LocationGroup": "location_groups", "LocationGroupStop": "location_group_stops", - "LocationsGeojson": "locations.geojson", + "LocationsGeojson": "locations_geojson", "BookingRule": "booking_rules", "Translation": "translations", "FeedInfo": "feed_info", @@ -176,86 +176,136 @@ reversed_file_mapping = { case_swap = {'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'} -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, - } +#primary_keys = { pt_map.models.FeedInfo: None, +# 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.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, + #} + +primary_keys = { + pt_map.models.FeedInfo: "feed_id", + 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_pk", + pt_map.models.Calendar: "service_id", + pt_map.models.CalendarDate: "calendar_date_id", + pt_map.models.Trip: "trip_id", + pt_map.models.LocationGroup: "location_group_id", + pt_map.models.LocationsGeojson: "location_id", + pt_map.models.StopTime: "stop_time_id", + pt_map.models.FareAttribute: "fare_id", + pt_map.models.FareRule: "fare_rule_id", + pt_map.models.Frequency: "frequency_id", + pt_map.models.Transfer: "transfer_id", + pt_map.models.Pathway: "pathway_id", + pt_map.models.BookingRule: "booking_rule_id", + pt_map.models.Translation: "translation_id", + pt_map.models.Attribution: "attribution_id", + pt_map.models.LocationGroupStop: "location_group_stop_id", + pt_map.models.Network: "network_id", + pt_map.models.RouteNetwork: "route_network_id", + pt_map.models.Area: "area_id", + pt_map.models.StopArea: "stop_area_id", + pt_map.models.FareMedium: "fare_media_id", + pt_map.models.FareProduct: "fare_product_id", + pt_map.models.Timeframe: "timeframe_group_id", + pt_map.models.FareLegRule: "fare_leg_rule_id", + pt_map.models.FareTransferRule: "fare_transfer_rule_id", +} -classes_by_primary_keys = { "agency_id": pt_map.models.Agency, - "level_id": pt_map.models.Level, - "stop_id": pt_map.models.Stop, - "route_id": pt_map.models.Route, - "shape_id": pt_map.models.Shape, - "service_id": pt_map.models.Calendar, - "trip_id": pt_map.models.Trip, - "location_group_id": pt_map.models.LocationGroup, - "fare_id": pt_map.models.FareAttribute, - "pathway_id": pt_map.models.Pathway, - "booking_rule_id": pt_map.models.BookingRule, - "attribution_id": pt_map.models.Attribution, - "network_id": pt_map.models.Network, - "fare_media_id": pt_map.models.FareMedium, - } +classes_by_primary_keys = { + 'feed_id': pt_map.models.FeedInfo, + 'agency_id': pt_map.models.Agency, + 'level_id': pt_map.models.Level, + 'stop_id': pt_map.models.Stop, + 'route_id': pt_map.models.Route, + 'shape_pk': pt_map.models.Shape, + 'service_id': pt_map.models.Calendar, + 'calendar_date_id': pt_map.models.CalendarDate, + 'trip_id': pt_map.models.Trip, + 'location_group_id': pt_map.models.LocationGroup, + 'location_id': pt_map.models.LocationsGeojson, + 'stop_time_id': pt_map.models.StopTime, + 'fare_id': pt_map.models.FareAttribute, + 'fare_rule_id': pt_map.models.FareRule, + 'frequency_id': pt_map.models.Frequency, + 'transfer_id': pt_map.models.Transfer, + 'pathway_id': pt_map.models.Pathway, + 'booking_rule_id': pt_map.models.BookingRule, + 'translation_id': pt_map.models.Translation, + 'attribution_id': pt_map.models.Attribution, + 'location_group_stop_id': pt_map.models.LocationGroupStop, + 'network_id': pt_map.models.Network, + 'route_network_id': pt_map.models.RouteNetwork, + 'area_id': pt_map.models.Area, + 'stop_area_id': pt_map.models.StopArea, + 'fare_media_id': pt_map.models.FareMedium, + 'fare_product_id': pt_map.models.FareProduct, + 'timeframe_group_id': pt_map.models.Timeframe, + 'fare_leg_rule_id': pt_map.models.FareLegRule, + 'fare_transfer_rule_id': pt_map.models.FareTransferRule, +} 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'), ]), + (pt_map.models.Agency, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.Level, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.Stop, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Stop, 'parent_station'), (pt_map.models.Level, 'level_id'), ]), + (pt_map.models.Route, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Agency, 'agency_id'), ]), + (pt_map.models.Shape, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.Calendar, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.CalendarDate, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.Trip, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Route, 'route_id'), (pt_map.models.Shape, 'shape_id'), ]), + (pt_map.models.LocationGroup, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.LocationsGeojson, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.StopTime, [(pt_map.models.FeedInfo, 'feed_info_id'),(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.FeedInfo, 'feed_info_id'),(pt_map.models.Agency, 'agency_id'), ]), + (pt_map.models.FareRule, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.FareAttribute, 'fare_id'), (pt_map.models.Route, 'route_id'), ]), + (pt_map.models.Frequency, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Trip, 'trip_id'), ]), + (pt_map.models.Transfer, [(pt_map.models.FeedInfo, 'feed_info_id'),(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.FeedInfo, 'feed_info_id'),(pt_map.models.Stop, 'from_stop_id'), (pt_map.models.Stop, 'to_stop_id'), ]), + (pt_map.models.BookingRule, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Trip, 'trip_id'), ]), + (pt_map.models.Translation, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.Attribution, [(pt_map.models.FeedInfo, 'feed_info_id'),(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.FeedInfo, 'feed_info_id'),(pt_map.models.LocationGroup, 'location_group_id'), (pt_map.models.Stop, 'stop_id'), ]), + (pt_map.models.Network, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.RouteNetwork, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Network, 'network_id'), (pt_map.models.Route, 'route_id'), ]), + (pt_map.models.Area, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.StopArea, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Area, 'area_id'), (pt_map.models.Stop, 'stop_id'), ]), + (pt_map.models.FareMedium, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.FareProduct, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.Timeframe, [(pt_map.models.FeedInfo, 'feed_info_id'),]), + (pt_map.models.FareLegRule, [(pt_map.models.FeedInfo, 'feed_info_id'),(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.FeedInfo, 'feed_info_id'),(pt_map.models.FareProduct, 'fare_product_id'), ]), ] fk_dict = {fk[0]: fk[1] for fk in foreign_keys} diff --git a/transport_accessibility/pt_map/migrations/0001_initial.py b/transport_accessibility/pt_map/migrations/0001_initial.py index e248b8c..c676349 100644 --- a/transport_accessibility/pt_map/migrations/0001_initial.py +++ b/transport_accessibility/pt_map/migrations/0001_initial.py @@ -1,384 +1,12 @@ -# Generated by Django 5.0.6 on 2024-06-05 22:43 +# Generated by Django 5.0.6 on 2024-06-17 19:43 -import django.db.models.deletion -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): - initial = True - dependencies = [ ] operations = [ - migrations.CreateModel( - name='Agency', - fields=[ - ('agency_id', models.CharField(max_length=255, primary_key=True, serialize=False)), - ('agency_name', models.CharField(max_length=255)), - ('agency_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=[ - ('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()), - ('thursday', models.BooleanField()), - ('friday', models.BooleanField()), - ('saturday', models.BooleanField()), - ('sunday', models.BooleanField()), - ('start_date', models.DateField()), - ('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_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( - 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)), - ], - options={ - 'unique_together': {('shape_id', 'shape_pt_sequence')}, - }, - ), - migrations.CreateModel( - name='Stop', - fields=[ - ('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)), - ('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='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')), - ('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.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)), - ('wheelchair_accessible', models.IntegerField(blank=True, null=True)), - ('bikes_allowed', models.IntegerField(blank=True, null=True)), - ('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( - 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_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_initial.py b/transport_accessibility/pt_map/migrations/0002_initial.py new file mode 100644 index 0000000..213e262 --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0002_initial.py @@ -0,0 +1,420 @@ +# Generated by Django 5.0.6 on 2024-06-17 19:43 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('pt_map', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Agency', + fields=[ + ('agency_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('agency_name', models.CharField(max_length=255)), + ('agency_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='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_id', models.BigAutoField(primary_key=True, serialize=False)), + ('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_contact_email', models.EmailField(blank=True, max_length=254, null=True)), + ('feed_contact_url', models.URLField(blank=True, null=True)), + ], + ), + 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_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pt_map.agency')), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + 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.AddField( + model_name='fareproduct', + name='feed_info_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo'), + ), + 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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + 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()), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + 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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + migrations.AddField( + model_name='agency', + name='feed_info_id', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo'), + ), + 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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + 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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + 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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + migrations.CreateModel( + name='Network', + fields=[ + ('network_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('network_name', models.CharField(max_length=255)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + migrations.CreateModel( + name='Route', + fields=[ + ('route_id', models.CharField(max_length=255, 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')), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + migrations.CreateModel( + name='FareRule', + fields=[ + ('fare_rule_id', models.BigAutoField(primary_key=True, serialize=False)), + ('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_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.fareattribute')), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('route_id', 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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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( + name='Shape', + fields=[ + ('shape_pk', models.BigAutoField(primary_key=True, serialize=False)), + ('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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + options={ + 'unique_together': {('shape_id', 'shape_pt_sequence')}, + }, + ), + migrations.CreateModel( + name='Stop', + fields=[ + ('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)), + ('platform_code', models.CharField(blank=True, max_length=50, null=True)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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='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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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=[ + ('location_group_stop_id', models.BigAutoField(primary_key=True, serialize=False)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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')), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('stop_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.stop')), + ], + ), + migrations.CreateModel( + name='Timeframe', + fields=[ + ('timeframe_group_id', models.CharField(max_length=255, 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()), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + 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')), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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='Translation', + fields=[ + ('translation_id', models.BigAutoField(primary_key=True, serialize=False)), + ('table_name', models.CharField(max_length=255)), + ('field_name', models.CharField(max_length=255)), + ('language', models.CharField(max_length=2)), + ('translation', models.TextField()), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + ), + migrations.CreateModel( + name='Trip', + fields=[ + ('trip_id', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('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)), + ('wheelchair_accessible', models.IntegerField(blank=True, null=True)), + ('bikes_allowed', models.IntegerField(blank=True, null=True)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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( + name='Frequency', + fields=[ + ('frequency_id', models.BigAutoField(primary_key=True, serialize=False)), + ('start_time', models.TimeField()), + ('end_time', models.TimeField()), + ('headway_secs', models.IntegerField()), + ('exact_times', models.IntegerField(blank=True, null=True)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('trip_id', 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')), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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='CalendarDate', + fields=[ + ('calendar_date_id', models.BigAutoField(primary_key=True, serialize=False)), + ('service_id', models.CharField(max_length=255)), + ('date', models.DateField()), + ('exception_type', models.IntegerField()), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ], + options={ + 'unique_together': {('service_id', 'date')}, + }, + ), + migrations.CreateModel( + name='Transfer', + fields=[ + ('transfer_id', models.BigAutoField(primary_key=True, serialize=False)), + ('transfer_type', models.IntegerField()), + ('min_transfer_time', models.IntegerField(blank=True, null=True)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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_id', 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_id', 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_id', 'to_stop_id')}, + }, + ), + migrations.CreateModel( + name='StopTime', + fields=[ + ('stop_time_id', models.BigAutoField(primary_key=True, serialize=False)), + ('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)), + ('feed_info_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo')), + ('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 deleted file mode 100644 index a81be12..0000000 --- a/transport_accessibility/pt_map/migrations/0002_rename_trip_bookingrule_trip_id_and_more.py +++ /dev/null @@ -1,47 +0,0 @@ -# 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 deleted file mode 100644 index 5c55b43..0000000 --- a/transport_accessibility/pt_map/migrations/0003_alter_agency_agency_id_alter_area_area_id_and_more.py +++ /dev/null @@ -1,93 +0,0 @@ -# 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/0003_faretransferrule_feed_info_id.py b/transport_accessibility/pt_map/migrations/0003_faretransferrule_feed_info_id.py new file mode 100644 index 0000000..335d33d --- /dev/null +++ b/transport_accessibility/pt_map/migrations/0003_faretransferrule_feed_info_id.py @@ -0,0 +1,21 @@ +# Generated by Django 5.0.6 on 2024-06-19 20:12 + +import django.db.models.deletion +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pt_map', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='faretransferrule', + name='feed_info_id', + field=models.ForeignKey(default=django.utils.timezone.now, on_delete=django.db.models.deletion.CASCADE, to='pt_map.feedinfo'), + preserve_default=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 deleted file mode 100644 index 1db7aa6..0000000 --- a/transport_accessibility/pt_map/migrations/0004_alter_agency_agency_id_alter_area_area_id_and_more.py +++ /dev/null @@ -1,103 +0,0 @@ -# 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 deleted file mode 100644 index 36a2878..0000000 --- a/transport_accessibility/pt_map/migrations/0005_remove_calendar_id_alter_calendar_service_id_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# 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), - ), - ] diff --git a/transport_accessibility/pt_map/models.py b/transport_accessibility/pt_map/models.py index 0575d5f..d97a262 100644 --- a/transport_accessibility/pt_map/models.py +++ b/transport_accessibility/pt_map/models.py @@ -13,6 +13,21 @@ Agency, Stop, Route, Trip, StopTime, Calendar, CalendarDate, FareAttribute, Fare from django.db import models from pt_map.gtfs_schema import gtfs_schema +class FeedInfo(models.Model): + """ + Represents feed_info.txt from the GTFS Reference. + """ + feed_id = models.BigAutoField(primary_key=True) + feed_publisher_name = models.CharField(max_length=255) + feed_publisher_url = models.URLField() + feed_lang = models.CharField(max_length=255) + default_lang = models.CharField(max_length=255, blank=True, null=True) + 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_contact_email = models.EmailField(blank=True, null=True) + feed_contact_url = models.URLField(blank=True, null=True) + class Agency(models.Model): """ Represents agency.txt from the GTFS Reference. @@ -25,7 +40,7 @@ class Agency(models.Model): agency_phone = models.CharField(max_length=50, blank=True, null=True) agency_fare_url = models.URLField(blank=True, null=True) agency_email = models.EmailField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Level(models.Model): """ @@ -34,7 +49,7 @@ class Level(models.Model): level_id = models.CharField(max_length=255, primary_key=True) level_index = models.FloatField() level_name = models.CharField(max_length=255, blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Stop(models.Model): """ @@ -54,7 +69,7 @@ class Stop(models.Model): wheelchair_boarding = models.IntegerField(blank=True, null=True) level_id = models.ForeignKey(Level, on_delete=models.SET_NULL, blank=True, null=True) platform_code = models.CharField(max_length=50, blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Route(models.Model): """ @@ -72,18 +87,19 @@ class Route(models.Model): 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) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Shape(models.Model): """ Represents shape.txt from the GTFS Reference. """ + shape_pk = models.BigAutoField(primary_key=True) 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) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Meta: unique_together = (('shape_id', 'shape_pt_sequence'),) @@ -92,7 +108,6 @@ class Calendar(models.Model): """ Represents calendar.txt from the GTFS Reference. """ - calendar_id = models.BigAutoField(primary_key=True) service_id = models.CharField(max_length=255,primary_key=True) monday = models.BooleanField() tuesday = models.BooleanField() @@ -103,7 +118,7 @@ class Calendar(models.Model): sunday = models.BooleanField() start_date = models.DateField() end_date = models.DateField() - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class CalendarDate(models.Model): """ @@ -113,7 +128,7 @@ class CalendarDate(models.Model): service_id = models.CharField(max_length=255) date = models.DateField() exception_type = models.IntegerField() - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Meta: unique_together = (('service_id', 'date'),) @@ -146,7 +161,7 @@ class Trip(models.Model): "wheelchair_accessible": self.wheelchair_accessible, "bikes_allowed": self.bikes_allowed, } - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class LocationGroup(models.Model): """ @@ -155,7 +170,7 @@ class LocationGroup(models.Model): location_group_id = models.CharField(max_length=255, primary_key=True) location_group_name = models.CharField(max_length=255) location_group_type = models.CharField(max_length=255) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class LocationsGeojson(models.Model): """ @@ -168,7 +183,7 @@ class LocationsGeojson(models.Model): location_type = models.CharField(max_length=255) parent_location_id = models.CharField(max_length=255, blank=True, null=True) wheelchair_boarding = models.BooleanField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class StopTime(models.Model): """ @@ -187,7 +202,7 @@ class StopTime(models.Model): 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) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Meta: unique_together = (('trip_id', 'stop_sequence'),) @@ -203,34 +218,37 @@ class FareAttribute(models.Model): transfers = models.IntegerField() agency_id = models.ForeignKey(Agency, on_delete=models.CASCADE, blank=True, null=True) transfer_duration = models.IntegerField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class FareRule(models.Model): """ Represents fare_rule.txt from the GTFS Reference. """ + fare_rule_id = models.BigAutoField(primary_key=True) fare_id = models.ForeignKey(FareAttribute, on_delete=models.CASCADE) route_id = models.ForeignKey(Route, on_delete=models.CASCADE, blank=True, null=True) origin_id = models.IntegerField(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) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Frequency(models.Model): """ Represents frequency.txt from the GTFS Reference. """ + frequency_id = models.BigAutoField(primary_key=True) trip_id = 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) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Transfer(models.Model): """ Represents transfer.txt from the GTFS Reference. """ + transfer_id = models.BigAutoField(primary_key=True) from_stop_id = models.ForeignKey(Stop, on_delete=models.CASCADE, related_name='transfers_from_stop') to_stop_id = models.ForeignKey(Stop, on_delete=models.CASCADE, related_name='transfers_to_stop') from_route_id = models.ForeignKey(Route, on_delete=models.SET_NULL, blank=True, null=True, related_name='transfers_from_route') @@ -239,7 +257,7 @@ class Transfer(models.Model): to_trip_id = models.ForeignKey(Trip, on_delete=models.SET_NULL, blank=True, null=True, related_name='transfers_to_trip') transfer_type = models.IntegerField() min_transfer_time = models.IntegerField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Meta: unique_together = (('from_stop_id', 'to_stop_id'),) @@ -260,24 +278,7 @@ class Pathway(models.Model): min_width = models.FloatField(blank=True, null=True) signposted_as = models.CharField(max_length=255, blank=True, null=True) reversed_signposted_as = models.CharField(max_length=255, blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) - -class FeedInfo(models.Model): - """ - Represents feed_info.txt from the GTFS Reference. - """ - feed_info_id = models.BigAutoField(primary_key=True) - feed_publisher_name = models.CharField(max_length=255) - feed_publisher_url = models.URLField() - feed_lang = models.CharField(max_length=255) - default_lang = models.CharField(max_length=255, blank=True, null=True) - 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_contact_email = models.EmailField(blank=True, null=True) - feed_contact_url = models.URLField(blank=True, null=True) - feed_id = models.BigAutoField(primary_key=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class BookingRule(models.Model): """ @@ -290,17 +291,18 @@ class BookingRule(models.Model): booking_type = models.CharField(max_length=255) rule_criteria = models.TextField(blank=True, null=True) booking_rule_instructions = models.TextField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Translation(models.Model): """ Represents translation.txt from the GTFS Reference. """ + translation_id = models.BigAutoField(primary_key=True) table_name = models.CharField(max_length=255) field_name = models.CharField(max_length=255) language = models.CharField(max_length=2) translation = models.TextField() - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Attribution(models.Model): """ @@ -314,15 +316,16 @@ class Attribution(models.Model): attribution_url = models.URLField() attribution_email = models.EmailField(blank=True, null=True) attribution_phone = models.CharField(max_length=50, blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class LocationGroupStop(models.Model): """ Represents location_groupStop.txt from the GTFS Reference. """ + location_group_stop_id = models.BigAutoField(primary_key=True) location_group_id = models.ForeignKey(LocationGroup, on_delete=models.CASCADE) stop_id = models.ForeignKey(Stop, on_delete=models.CASCADE) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Network(models.Model): """ @@ -330,7 +333,7 @@ class Network(models.Model): """ network_id = models.CharField(max_length=255, primary_key=True) network_name = models.CharField(max_length=255) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class RouteNetwork(models.Model): """ @@ -340,7 +343,7 @@ class RouteNetwork(models.Model): route_network_name = models.CharField(max_length=255) network_id = models.ForeignKey(Network, on_delete=models.CASCADE) route_id = models.ForeignKey(Route, on_delete=models.CASCADE) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Area(models.Model): """ @@ -349,7 +352,7 @@ class Area(models.Model): area_id = models.CharField(max_length=255, primary_key=True) area_name = models.CharField(max_length=255) area_description = models.TextField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class StopArea(models.Model): """ @@ -360,7 +363,7 @@ class StopArea(models.Model): stop_area_description = models.TextField(blank=True, null=True) area_id = models.ForeignKey(Area, on_delete=models.CASCADE) stop_id = models.ForeignKey(Stop, on_delete=models.CASCADE) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class FareMedium(models.Model): """ @@ -369,7 +372,7 @@ class FareMedium(models.Model): fare_media_id = models.CharField(max_length=255, primary_key=True) fare_media_name = models.CharField(max_length=255) fare_media_description = models.TextField(blank=True, null=True) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class FareProduct(models.Model): """ @@ -380,7 +383,7 @@ class FareProduct(models.Model): fare_product_description = models.TextField(blank=True, null=True) amount = models.FloatField() curreny = models.CharField(max_length=64) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class Timeframe(models.Model): """ @@ -392,7 +395,7 @@ class Timeframe(models.Model): end_date = models.DateField() start_time = models.TimeField() end_time = models.TimeField() - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class FareLegRule(models.Model): """ @@ -407,7 +410,7 @@ class FareLegRule(models.Model): from_timeframe_group_id = models.ForeignKey(Timeframe, blank=True, null=True, on_delete=models.SET_NULL, related_name='farelegrule_from_timeframe') to_timeframe_group_id = models.ForeignKey(Timeframe, blank=True, null=True, on_delete=models.SET_NULL, related_name='farelegrule_to_timeframe') fare_product_id = models.ForeignKey(FareProduct, on_delete=models.CASCADE) - feed_info_id = models.ForeignKey(Feed_Info, on_delete=models.CASCADE, blank=True, null=True) + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) class FareTransferRule(models.Model): """ @@ -419,5 +422,5 @@ class FareTransferRule(models.Model): 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(FareProduct, on_delete=models.SET_NULL, blank=True, null=True) - + feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE) diff --git a/transport_accessibility/pt_map/views.py b/transport_accessibility/pt_map/views.py index 252f12e..a243f29 100644 --- a/transport_accessibility/pt_map/views.py +++ b/transport_accessibility/pt_map/views.py @@ -11,13 +11,20 @@ index(request) from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed, HttpRequest from django.core.exceptions import BadRequest, ObjectDoesNotExist +from django.core import serializers +import django.db.models from .models import * from .forms import * import json -from datetime import datetime +from datetime import datetime, date from django.views.decorators.csrf import csrf_exempt from .class_names import * + +class GTFSSerializer(serializers.json.Serializer): + def serialize(self, queryset, **options): + return json.dumps([{field: obj['fields'][field] for field in obj['fields'] if obj['fields'][field] == 0 or obj['fields'][field]} for obj in json.loads(super().serialize(queryset, **options))]) + def get_timetable(r, trips_r, stop_sequence): """ Given a pt_map.models.Route, calculate the timetable for all its stops. @@ -95,52 +102,19 @@ def get_pks_from_get(req_get): for k in req_get.keys(): if k in classes_by_primary_keys.keys(): result[classes_by_primary_keys[k]] = req_get.getlist(k) + if not result: + raise ValueError("No pks found.") return result def get_obj_by_pk(mdl: models.Model, pks: list[str]): return [obj for obj in [mdl.objects.get(**{primary_keys[mdl]: pk}) for pk in pks] if obj] def obj_from_get(req_get) -> str: - return {mdl: get_obj_by_pk(mdl, keys) for mdl, keys in get_pks_from_get(req_get)} - -def mdl_to_jsnzbl_dict(cls, obj: models.Model) -> dict: - result = {} - fields = get_field_names(cls) - for fk in fk_dict[cls]: - fields.remove(fk[1]) - if getattr(obj, fk[1]): - result[fk[1]] = getattr(getattr(obj, fk[1]), primary_keys[fk[0]]) - for field in fields: - if getattr(obj, field): - result[field] = getattr(obj, field) - return result - -def json_from_pk(req_get) -> str: - for cpk in classes_by_primary_keys: - if req_get.get(cpk): - for key in (req_get[cpk] if isinstance(req_get[cpk], list) else [req_get[cpk]]): - obj = classes_by_primary_keys[cpk].objects.get(**{cpk: key}) - for field in get_field_names(obj): - v = getattr(obj, field) - if v: - if field in [f[1] for f in foreign_keys[classes_by_primary_keys[cpk]]]: - fk = get_attr(v, field) - return json.dumps(obj) - - -def jsnzbl_from_get(req_get) -> str: - return {mdl._meta.object_name: [mdl_to_jsnzbl_dict(mdl, o) for o in get_obj_by_pk(mdl, keys)] for mdl, keys in get_pks_from_get(req_get).items()} - -def jsnz(jsnzbl: dict): - return json.dumps(jsnzbl) - -def rsp_for_json_from_get(req_get): - try: - return HttpResponse(jsnz(jsnzbl_from_get(req_get))) - except ObjectDoesNotExist: - return HttpResponseBadRequest("Object(s) not found.") + print({mdl: get_obj_by_pk(mdl, keys) for mdl, keys in get_pks_from_get(req_get).items()}) + return {mdl: get_obj_by_pk(mdl, keys) for mdl, keys in get_pks_from_get(req_get).items()} +@csrf_exempt def data(request): """ Handle database requests from the frontend. Using Http semantics to specify what to do with the data. @@ -149,32 +123,41 @@ def data(request): ------- PUT Create a new object if no object with the given primary key exists in the database or delete and replace an existing object. - Body must be a json dict of lists of fully specified, valid models. - If primary keys are given as GET keys, they are applied to the first elements in their corresponding object lists. Primary keys in body will be ignored. - RETURN 400 if primary keys not existing. + Body must be a json dict of lists of fully specified, valid models. Primary keys can be omitted and will be ignored if the element does not exist in the database. + If primary keys are given, the elements are deleted and replaced. Note that if there is an error in creating the new object, the object to replace will still probably already have been deleted. + Successful response is 200 with a list of primary keys of the created and replaced objects. PATCH Modify an existing objects given the instructions in the body. - Body must be a json dict of lists of fields to change and their valid values existing objects in the database, identified by their valid primary keys as GET keys. - Primary keys in body will be ignored. + Body must be a json dict of lists of fields to change and their valid values existing objects in the database, identified by their valid primary keys. + Responds 400 if any of the primary keys given does not exist. + Successful response is 200 with a list of the primary keys of the modified objects. GET Return json of models identified by primary keys. DELETE - Delete models with given primary keys if they exist. Returns number of deleted models. + Delete models with given primary keys if they exist. + Responds 400 if any of the primary keys given does not exist in the database. + Successful response is 200 and the number of deleted models. """ if request.method == "PUT": if not request.META["CONTENT_TYPE"] == 'application/json': HttpResponseBadRequest('Request must be JSON.') - bdy = json.loads(request.body) try: - obj = obj_from_get(request.GET) - except ObjectDoesNotExist: - return HttpResponseBadRequest("Did not find models corresponding to given pks.") + bdy = json.loads(request.body) + except json.JSONDecodeError: + return HttpResponseBadRequest("Malformed json.") return HttpResponse(f"received {obj}") elif request.method == "PATCH": if not request.META["CONTENT_TYPE"] == 'application/json': HttpResponseBadRequest('Request must be JSON.') return HttpResponse(f"received {obj}") elif request.method == "GET": - return rsp_for_json_from_get(request.GET) + try: + pks = get_pks_from_get(request.GET) + except ValueError: + return HttpResponseBadRequest("No valid pks given.") + try: + return HttpResponse(json.dumps({mdl._meta.object_name: GTFSSerializer().serialize(v) for mdl,v in obj_from_get(request.GET).items()}), content_type='application/json') + except ObjectDoesNotExist: + return HttpResponseBadRequest("Object(s) not found.") return HttpResponseNotAllowed(['PUT', 'PATCH', 'GET'])