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?<primary_key>=<value>.
This commit is contained in:
Johannes Randerath 2024-06-19 22:12:20 +02:00
parent 26b08b72dd
commit f5b329bc17
18 changed files with 695 additions and 832 deletions

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api'

View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View File

@ -178,32 +178,42 @@ def gtfs_to_db(g: pt_map.gtfs.GTFS):
g : gtfs.GTFS g : gtfs.GTFS
GTFS object to be saved to db 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 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
#if model == pt_map.models.Shape:
for model in foreign_keys: for model in foreign_keys:
m = model[0] 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 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 _, 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 for fk in model[1]: # Map foreign_keys to objects of the foreign model
if row.get(fk[1]): 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 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]: o = None
row[primary_keys[m]] = unqfk(ts, row[primary_keys[m]]) # primary_keys should be unique, use current time in seconds as a prefix if not m == pt_map.models.FeedInfo:
defaults[primary_keys[m]] = row[primary_keys[m]] 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: 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: except m.DoesNotExist:
o = m.objects.update_or_create(
m.objects.update_or_create(
defaults = defaults, defaults = defaults,
#**kw_args,
**{primary_keys[m]: row[primary_keys[m]]} **{primary_keys[m]: row[primary_keys[m]]}
) )
else: else:
m.objects.create(**defaults) o = m.objects.create(**defaults)
if m == pt_map.models.FeedInfo:
feed_id = o

View File

@ -165,7 +165,7 @@ reversed_file_mapping = {
"Level": "levels", "Level": "levels",
"LocationGroup": "location_groups", "LocationGroup": "location_groups",
"LocationGroupStop": "location_group_stops", "LocationGroupStop": "location_group_stops",
"LocationsGeojson": "locations.geojson", "LocationsGeojson": "locations_geojson",
"BookingRule": "booking_rules", "BookingRule": "booking_rules",
"Translation": "translations", "Translation": "translations",
"FeedInfo": "feed_info", "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'} 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", #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.Level: "level_id",
pt_map.models.Stop: "stop_id", pt_map.models.Stop: "stop_id",
pt_map.models.Route: "route_id", pt_map.models.Route: "route_id",
pt_map.models.Shape: "shape_id", pt_map.models.Shape: "shape_pk",
pt_map.models.Calendar: "service_id", pt_map.models.Calendar: "service_id",
pt_map.models.CalendarDate: None, pt_map.models.CalendarDate: "calendar_date_id",
pt_map.models.Trip: "trip_id", pt_map.models.Trip: "trip_id",
pt_map.models.LocationGroup: "location_group_id", pt_map.models.LocationGroup: "location_group_id",
pt_map.models.LocationsGeojson: None, pt_map.models.LocationsGeojson: "location_id",
pt_map.models.StopTime: None, pt_map.models.StopTime: "stop_time_id",
pt_map.models.FareAttribute: "fare_id", pt_map.models.FareAttribute: "fare_id",
pt_map.models.FareRule: None, pt_map.models.FareRule: "fare_rule_id",
pt_map.models.Frequency: None, pt_map.models.Frequency: "frequency_id",
pt_map.models.Transfer: None, pt_map.models.Transfer: "transfer_id",
pt_map.models.Pathway: "pathway_id", pt_map.models.Pathway: "pathway_id",
pt_map.models.FeedInfo: None,
pt_map.models.BookingRule: "booking_rule_id", pt_map.models.BookingRule: "booking_rule_id",
pt_map.models.Translation: None, pt_map.models.Translation: "translation_id",
pt_map.models.Attribution: "attribution_id", pt_map.models.Attribution: "attribution_id",
pt_map.models.LocationGroupStop: None, pt_map.models.LocationGroupStop: "location_group_stop_id",
pt_map.models.Network: "network_id", pt_map.models.Network: "network_id",
pt_map.models.RouteNetwork: None, pt_map.models.RouteNetwork: "route_network_id",
pt_map.models.Area: None, pt_map.models.Area: "area_id",
pt_map.models.StopArea: None, pt_map.models.StopArea: "stop_area_id",
pt_map.models.FareMedium: "fare_media_id", pt_map.models.FareMedium: "fare_media_id",
pt_map.models.FareProduct: None, pt_map.models.FareProduct: "fare_product_id",
pt_map.models.Timeframe: None, pt_map.models.Timeframe: "timeframe_group_id",
pt_map.models.FareLegRule: None, pt_map.models.FareLegRule: "fare_leg_rule_id",
pt_map.models.FareTransferRule: None, pt_map.models.FareTransferRule: "fare_transfer_rule_id",
} }
classes_by_primary_keys = { "agency_id": pt_map.models.Agency, classes_by_primary_keys = {
"level_id": pt_map.models.Level, 'feed_id': pt_map.models.FeedInfo,
"stop_id": pt_map.models.Stop, 'agency_id': pt_map.models.Agency,
"route_id": pt_map.models.Route, 'level_id': pt_map.models.Level,
"shape_id": pt_map.models.Shape, 'stop_id': pt_map.models.Stop,
"service_id": pt_map.models.Calendar, 'route_id': pt_map.models.Route,
"trip_id": pt_map.models.Trip, 'shape_pk': pt_map.models.Shape,
"location_group_id": pt_map.models.LocationGroup, 'service_id': pt_map.models.Calendar,
"fare_id": pt_map.models.FareAttribute, 'calendar_date_id': pt_map.models.CalendarDate,
"pathway_id": pt_map.models.Pathway, 'trip_id': pt_map.models.Trip,
"booking_rule_id": pt_map.models.BookingRule, 'location_group_id': pt_map.models.LocationGroup,
"attribution_id": pt_map.models.Attribution, 'location_id': pt_map.models.LocationsGeojson,
"network_id": pt_map.models.Network, 'stop_time_id': pt_map.models.StopTime,
"fare_media_id": pt_map.models.FareMedium, '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 = [ 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.FeedInfo, []),
(pt_map.models.BookingRule, [(pt_map.models.Trip, 'trip_id'), ]), (pt_map.models.Agency, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(pt_map.models.Translation, []), (pt_map.models.Level, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(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.Stop, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Stop, 'parent_station'), (pt_map.models.Level, 'level_id'), ]),
(pt_map.models.LocationGroupStop, [(pt_map.models.LocationGroup, 'location_group_id'), (pt_map.models.Stop, 'stop_id'), ]), (pt_map.models.Route, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Agency, 'agency_id'), ]),
(pt_map.models.Network, []), (pt_map.models.Shape, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(pt_map.models.RouteNetwork, [(pt_map.models.Network, 'network_id'), (pt_map.models.Route, 'route_id'), ]), (pt_map.models.Calendar, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(pt_map.models.Area, []), (pt_map.models.CalendarDate, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(pt_map.models.StopArea, [(pt_map.models.Area, 'area_id'), (pt_map.models.Stop, 'stop_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.FareMedium, []), (pt_map.models.LocationGroup, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(pt_map.models.FareProduct, []), (pt_map.models.LocationsGeojson, [(pt_map.models.FeedInfo, 'feed_info_id'),]),
(pt_map.models.Timeframe, []), (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.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.FareAttribute, [(pt_map.models.FeedInfo, 'feed_info_id'),(pt_map.models.Agency, 'agency_id'), ]),
(pt_map.models.FareTransferRule, [(pt_map.models.FareProduct, 'fare_product_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} fk_dict = {fk[0]: fk[1] for fk in foreign_keys}

View File

@ -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
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True
dependencies = [ dependencies = [
] ]
operations = [ 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')},
},
),
] ]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,6 +13,21 @@ Agency, Stop, Route, Trip, StopTime, Calendar, CalendarDate, FareAttribute, Fare
from django.db import models from django.db import models
from pt_map.gtfs_schema import gtfs_schema 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): class Agency(models.Model):
""" """
Represents agency.txt from the GTFS Reference. 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_phone = models.CharField(max_length=50, blank=True, null=True)
agency_fare_url = models.URLField(blank=True, null=True) agency_fare_url = models.URLField(blank=True, null=True)
agency_email = models.EmailField(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): class Level(models.Model):
""" """
@ -34,7 +49,7 @@ class Level(models.Model):
level_id = models.CharField(max_length=255, primary_key=True) level_id = models.CharField(max_length=255, primary_key=True)
level_index = models.FloatField() level_index = models.FloatField()
level_name = models.CharField(max_length=255, blank=True, null=True) 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): class Stop(models.Model):
""" """
@ -54,7 +69,7 @@ class Stop(models.Model):
wheelchair_boarding = models.IntegerField(blank=True, null=True) wheelchair_boarding = models.IntegerField(blank=True, null=True)
level_id = models.ForeignKey(Level, on_delete=models.SET_NULL, 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) 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): class Route(models.Model):
""" """
@ -72,18 +87,19 @@ class Route(models.Model):
route_sort_order = models.IntegerField(blank=True, null=True) route_sort_order = models.IntegerField(blank=True, null=True)
continuous_pickup = models.IntegerField(blank=True, null=True) continuous_pickup = models.IntegerField(blank=True, null=True)
continuous_drop_off = 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): class Shape(models.Model):
""" """
Represents shape.txt from the GTFS Reference. Represents shape.txt from the GTFS Reference.
""" """
shape_pk = models.BigAutoField(primary_key=True)
shape_id = models.CharField(max_length=255) shape_id = models.CharField(max_length=255)
shape_pt_lat = models.FloatField() shape_pt_lat = models.FloatField()
shape_pt_lon = models.FloatField() shape_pt_lon = models.FloatField()
shape_pt_sequence = models.IntegerField() shape_pt_sequence = models.IntegerField()
shape_dist_traveled = models.FloatField(blank=True, null=True) 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: class Meta:
unique_together = (('shape_id', 'shape_pt_sequence'),) unique_together = (('shape_id', 'shape_pt_sequence'),)
@ -92,7 +108,6 @@ class Calendar(models.Model):
""" """
Represents calendar.txt from the GTFS Reference. Represents calendar.txt from the GTFS Reference.
""" """
calendar_id = models.BigAutoField(primary_key=True)
service_id = models.CharField(max_length=255,primary_key=True) service_id = models.CharField(max_length=255,primary_key=True)
monday = models.BooleanField() monday = models.BooleanField()
tuesday = models.BooleanField() tuesday = models.BooleanField()
@ -103,7 +118,7 @@ class Calendar(models.Model):
sunday = models.BooleanField() sunday = models.BooleanField()
start_date = models.DateField() start_date = models.DateField()
end_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): class CalendarDate(models.Model):
""" """
@ -113,7 +128,7 @@ class CalendarDate(models.Model):
service_id = models.CharField(max_length=255) service_id = models.CharField(max_length=255)
date = models.DateField() date = models.DateField()
exception_type = models.IntegerField() 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: class Meta:
unique_together = (('service_id', 'date'),) unique_together = (('service_id', 'date'),)
@ -146,7 +161,7 @@ class Trip(models.Model):
"wheelchair_accessible": self.wheelchair_accessible, "wheelchair_accessible": self.wheelchair_accessible,
"bikes_allowed": self.bikes_allowed, "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): 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_id = models.CharField(max_length=255, primary_key=True)
location_group_name = models.CharField(max_length=255) location_group_name = models.CharField(max_length=255)
location_group_type = 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): class LocationsGeojson(models.Model):
""" """
@ -168,7 +183,7 @@ class LocationsGeojson(models.Model):
location_type = models.CharField(max_length=255) location_type = models.CharField(max_length=255)
parent_location_id = models.CharField(max_length=255, blank=True, null=True) parent_location_id = models.CharField(max_length=255, blank=True, null=True)
wheelchair_boarding = models.BooleanField(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): class StopTime(models.Model):
""" """
@ -187,7 +202,7 @@ class StopTime(models.Model):
drop_off_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) shape_dist_traveled = models.FloatField(blank=True, null=True)
timepoint = models.IntegerField(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: class Meta:
unique_together = (('trip_id', 'stop_sequence'),) unique_together = (('trip_id', 'stop_sequence'),)
@ -203,34 +218,37 @@ class FareAttribute(models.Model):
transfers = models.IntegerField() transfers = models.IntegerField()
agency_id = models.ForeignKey(Agency, on_delete=models.CASCADE, blank=True, null=True) agency_id = models.ForeignKey(Agency, on_delete=models.CASCADE, blank=True, null=True)
transfer_duration = models.IntegerField(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): class FareRule(models.Model):
""" """
Represents fare_rule.txt from the GTFS Reference. 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) fare_id = models.ForeignKey(FareAttribute, on_delete=models.CASCADE)
route_id = models.ForeignKey(Route, on_delete=models.CASCADE, blank=True, null=True) route_id = models.ForeignKey(Route, on_delete=models.CASCADE, blank=True, null=True)
origin_id = models.IntegerField(blank=True, null=True) origin_id = models.IntegerField(blank=True, null=True)
destination_id = models.CharField(max_length=255, blank=True, null=True) destination_id = models.CharField(max_length=255, blank=True, null=True)
contains_id = models.CharField(max_length=255, blank=True, null=True) 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): class Frequency(models.Model):
""" """
Represents frequency.txt from the GTFS Reference. Represents frequency.txt from the GTFS Reference.
""" """
frequency_id = models.BigAutoField(primary_key=True)
trip_id = models.ForeignKey(Trip, on_delete=models.CASCADE) trip_id = models.ForeignKey(Trip, on_delete=models.CASCADE)
start_time = models.TimeField() start_time = models.TimeField()
end_time = models.TimeField() end_time = models.TimeField()
headway_secs = models.IntegerField() headway_secs = models.IntegerField()
exact_times = models.IntegerField(blank=True, null=True) 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): class Transfer(models.Model):
""" """
Represents transfer.txt from the GTFS Reference. 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') 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') 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') 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') to_trip_id = models.ForeignKey(Trip, on_delete=models.SET_NULL, blank=True, null=True, related_name='transfers_to_trip')
transfer_type = models.IntegerField() transfer_type = models.IntegerField()
min_transfer_time = models.IntegerField(blank=True, null=True) 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: class Meta:
unique_together = (('from_stop_id', 'to_stop_id'),) unique_together = (('from_stop_id', 'to_stop_id'),)
@ -260,24 +278,7 @@ class Pathway(models.Model):
min_width = models.FloatField(blank=True, null=True) min_width = models.FloatField(blank=True, null=True)
signposted_as = models.CharField(max_length=255, 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) 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) feed_info_id = models.ForeignKey(FeedInfo, on_delete=models.CASCADE)
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)
class BookingRule(models.Model): class BookingRule(models.Model):
""" """
@ -290,17 +291,18 @@ class BookingRule(models.Model):
booking_type = models.CharField(max_length=255) booking_type = models.CharField(max_length=255)
rule_criteria = models.TextField(blank=True, null=True) rule_criteria = models.TextField(blank=True, null=True)
booking_rule_instructions = 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): class Translation(models.Model):
""" """
Represents translation.txt from the GTFS Reference. Represents translation.txt from the GTFS Reference.
""" """
translation_id = models.BigAutoField(primary_key=True)
table_name = models.CharField(max_length=255) table_name = models.CharField(max_length=255)
field_name = models.CharField(max_length=255) field_name = models.CharField(max_length=255)
language = models.CharField(max_length=2) language = models.CharField(max_length=2)
translation = models.TextField() 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): class Attribution(models.Model):
""" """
@ -314,15 +316,16 @@ class Attribution(models.Model):
attribution_url = models.URLField() attribution_url = models.URLField()
attribution_email = models.EmailField(blank=True, null=True) attribution_email = models.EmailField(blank=True, null=True)
attribution_phone = models.CharField(max_length=50, 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): class LocationGroupStop(models.Model):
""" """
Represents location_groupStop.txt from the GTFS Reference. 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) location_group_id = models.ForeignKey(LocationGroup, on_delete=models.CASCADE)
stop_id = models.ForeignKey(Stop, 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): class Network(models.Model):
""" """
@ -330,7 +333,7 @@ class Network(models.Model):
""" """
network_id = models.CharField(max_length=255, primary_key=True) network_id = models.CharField(max_length=255, primary_key=True)
network_name = models.CharField(max_length=255) 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): class RouteNetwork(models.Model):
""" """
@ -340,7 +343,7 @@ class RouteNetwork(models.Model):
route_network_name = models.CharField(max_length=255) route_network_name = models.CharField(max_length=255)
network_id = models.ForeignKey(Network, on_delete=models.CASCADE) network_id = models.ForeignKey(Network, on_delete=models.CASCADE)
route_id = models.ForeignKey(Route, 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): class Area(models.Model):
""" """
@ -349,7 +352,7 @@ class Area(models.Model):
area_id = models.CharField(max_length=255, primary_key=True) area_id = models.CharField(max_length=255, primary_key=True)
area_name = models.CharField(max_length=255) area_name = models.CharField(max_length=255)
area_description = models.TextField(blank=True, null=True) 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): class StopArea(models.Model):
""" """
@ -360,7 +363,7 @@ class StopArea(models.Model):
stop_area_description = models.TextField(blank=True, null=True) stop_area_description = models.TextField(blank=True, null=True)
area_id = models.ForeignKey(Area, on_delete=models.CASCADE) area_id = models.ForeignKey(Area, on_delete=models.CASCADE)
stop_id = models.ForeignKey(Stop, 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): 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_id = models.CharField(max_length=255, primary_key=True)
fare_media_name = models.CharField(max_length=255) fare_media_name = models.CharField(max_length=255)
fare_media_description = models.TextField(blank=True, null=True) 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): class FareProduct(models.Model):
""" """
@ -380,7 +383,7 @@ class FareProduct(models.Model):
fare_product_description = models.TextField(blank=True, null=True) fare_product_description = models.TextField(blank=True, null=True)
amount = models.FloatField() amount = models.FloatField()
curreny = models.CharField(max_length=64) 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): class Timeframe(models.Model):
""" """
@ -392,7 +395,7 @@ class Timeframe(models.Model):
end_date = models.DateField() end_date = models.DateField()
start_time = models.TimeField() start_time = models.TimeField()
end_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): 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') 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') 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) 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): class FareTransferRule(models.Model):
""" """
@ -419,5 +422,5 @@ class FareTransferRule(models.Model):
from_leg_group_id = models.IntegerField(blank=True, null=True) from_leg_group_id = models.IntegerField(blank=True, null=True)
to_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) 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)

View File

@ -11,13 +11,20 @@ index(request)
from django.shortcuts import render from django.shortcuts import render
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed, HttpRequest from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed, HttpRequest
from django.core.exceptions import BadRequest, ObjectDoesNotExist from django.core.exceptions import BadRequest, ObjectDoesNotExist
from django.core import serializers
import django.db.models
from .models import * from .models import *
from .forms import * from .forms import *
import json import json
from datetime import datetime from datetime import datetime, date
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from .class_names import * 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): def get_timetable(r, trips_r, stop_sequence):
""" """
Given a pt_map.models.Route, calculate the timetable for all its stops. 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(): for k in req_get.keys():
if k in classes_by_primary_keys.keys(): if k in classes_by_primary_keys.keys():
result[classes_by_primary_keys[k]] = req_get.getlist(k) result[classes_by_primary_keys[k]] = req_get.getlist(k)
if not result:
raise ValueError("No pks found.")
return result return result
def get_obj_by_pk(mdl: models.Model, pks: list[str]): 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] 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: 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)} 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()}
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.")
@csrf_exempt
def data(request): def data(request):
""" """
Handle database requests from the frontend. Using Http semantics to specify what to do with the data. 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 PUT
Create a new object if no object with the given primary key exists in the database or delete and replace an existing object. 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. 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 as GET keys, they are applied to the first elements in their corresponding object lists. Primary keys in body will be ignored. 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.
RETURN 400 if primary keys not existing. Successful response is 200 with a list of primary keys of the created and replaced objects.
PATCH PATCH
Modify an existing objects given the instructions in the body. 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. 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.
Primary keys in body will be ignored. 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 GET
Return json of models identified by primary keys. Return json of models identified by primary keys.
DELETE 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 request.method == "PUT":
if not request.META["CONTENT_TYPE"] == 'application/json': if not request.META["CONTENT_TYPE"] == 'application/json':
HttpResponseBadRequest('Request must be JSON.') HttpResponseBadRequest('Request must be JSON.')
bdy = json.loads(request.body)
try: try:
obj = obj_from_get(request.GET) bdy = json.loads(request.body)
except ObjectDoesNotExist: except json.JSONDecodeError:
return HttpResponseBadRequest("Did not find models corresponding to given pks.") return HttpResponseBadRequest("Malformed json.")
return HttpResponse(f"received {obj}") return HttpResponse(f"received {obj}")
elif request.method == "PATCH": elif request.method == "PATCH":
if not request.META["CONTENT_TYPE"] == 'application/json': if not request.META["CONTENT_TYPE"] == 'application/json':
HttpResponseBadRequest('Request must be JSON.') HttpResponseBadRequest('Request must be JSON.')
return HttpResponse(f"received {obj}") return HttpResponse(f"received {obj}")
elif request.method == "GET": 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']) return HttpResponseNotAllowed(['PUT', 'PATCH', 'GET'])