Added actual foreign key support and made primary keys (kind of) unique

This commit is contained in:
Johannes Randerath 2024-06-10 16:33:57 +02:00
parent ac279b35d4
commit 4028f63624
7 changed files with 817 additions and 102 deletions

View File

@ -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": [
@ -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]]}
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,
#**kw_args,
**{primary_keys[m]: row[primary_keys[m]]}
)
else:
m.objects.update_or_create(defaults=defaults)
reversed_file_mapping = {
"Agency": "agency",

View File

@ -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",
},
]

View File

@ -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')},
},
),
]

View File

@ -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')},
),
]

View File

@ -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),
),
]

View File

@ -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),
),
]

View File

@ -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),
),
]