diff --git a/transport_accessibility/api/convenience.py b/transport_accessibility/api/convenience.py new file mode 100644 index 0000000..c860747 --- /dev/null +++ b/transport_accessibility/api/convenience.py @@ -0,0 +1,4 @@ +from pt_map.models import * +import osmnx + + diff --git a/transport_accessibility/pt_map/model_test_fields.py b/transport_accessibility/pt_map/model_test_fields.py index b41de97..2f36559 100644 --- a/transport_accessibility/pt_map/model_test_fields.py +++ b/transport_accessibility/pt_map/model_test_fields.py @@ -7,12 +7,13 @@ from pt_map.models import * field_requirements = \ [ { - "model": Agency, + "model": "Agency", "fields": [ { "name": "agency_id", "type": "pk", - "required": "true", + "required": "false", + "default": "yes", }, { "name": "agency_name", @@ -24,6 +25,11 @@ field_requirements = \ "type": "url", "required": "true", }, + { + "name": "agency_fare_url", + "type": "url", + "required": "false", + }, { "name": "agency_timezone", "type": "timezone", @@ -44,7 +50,8 @@ field_requirements = \ "type": "email", "required": "false", }, - ], + ], + "pk": "agency_id", }, { "model": "Stop", @@ -64,6 +71,11 @@ field_requirements = \ "type": "str", "required": "true", }, + { + "name": "tts_stop_name", + "type": "str", + "required": "false", + }, { "name": "stop_desc", "type": "str", @@ -99,6 +111,7 @@ field_requirements = \ { "name": "parent_station", "type": "fk", + "references": Stop, "required": "if", "required_if": ["location_type", [2,3,4]], "forbidden_if": ["location_type", [1]], @@ -113,72 +126,19 @@ field_requirements = \ "type": "int", "required": "false", }, - ], - }, - { - "model": "Stop", - "fields": [ { - "name": "stop_id", - "type": "pk", - "required": "true", - }, + "name": "level_id", + "type": "fk", + "references": Level, + "required": "false", + }, { - "name": "stop_code", + "name": "platform_code", "type": "str", "required": "false", }, - { - "name": "stop_name", - "type": "str", - "required": "true", - }, - { - "name": "stop_desc", - "type": "str", - "required": "false", - }, - { - "name": "stop_lat", - "type": "float", - "required": "true", - }, - { - "name": "stop_lon", - "type": "float", - "required": "true", - }, - { - "name": "zone_id", - "type": "str", - "required": "false", - }, - { - "name": "stop_url", - "type": "url", - "required": "false", - }, - { - "name": "location_type", - "type": "int", - "required": "true", - }, - { - "name": "parent_station", - "type": "str", - "required": "false", - }, - { - "name": "stop_timezone", - "type": "timezone", - "required": "false", - }, - { - "name": "wheelchair_boarding", - "type": "int", - "required": "false", - }, ], + "pk": "stop_id", }, { "model": "Route", @@ -188,15 +148,23 @@ field_requirements = \ "type": "pk", "required": "true", }, + { + "name": "agency_id", + "type": "fk", + "required": "false", + "default": "yes", + }, { "name": "route_short_name", "type": "str", - "required": "false", + "required": "if", + "required_if": ["route_long_name", None], }, { "name": "route_long_name", "type": "str", - "required": "true", + "required": "if", + "required_if": ["route_short_name", None], }, { "name": "route_desc", @@ -222,8 +190,28 @@ field_requirements = \ "name": "route_text_color", "type": "str", "required": "false", - } + }, + { + "name": "continuous_pickup", + "type": "enum", + "allowed_values": [0,1,2,3,], + "required": "false", + }, + { + "name": "continuous_dropoff", + "type": "enum", + "allowed_values": [0,1,2,3,], + "required": "false", + }, + { + "name": "network_id", + "type": "mtm", + "references": Route, + "required": "false", + "forbidden_if": ["RouteNetwork", True] + }, ], + "pk": "route_id", }, { "model": "Trip", @@ -236,17 +224,19 @@ field_requirements = \ { "name": "route_id", "type": "fk", + "references": Route, "required": "true", }, { "name": "service_id", "type": "fk", + "references": [Calendar, CalendarDate], "required": "true", }, { "name": "trip_headsign", "type": "str", - "required": "true", + "required": "false", }, { "name": "trip_short_name", @@ -255,20 +245,36 @@ field_requirements = \ }, { "name": "direction_id", - "type": "int", - "required": "true", + "type": "enum", + "allowed_values": [0,1,], + "required": "false", }, { "name": "block_id", - "type": "str", + "type": "mtm", + "references": Trip, "required": "false", }, { "name": "shape_id", "type": "fk", - "required": "true", + "references": Shape, + "required": "false", + }, + { + "name": "wheelchair_accessible", + "type": "enum", + "allowed_values": [0,1,2,], + "required": "false", + }, + { + "name": "bikes_allowed", + "type": "enum", + "allowed_values": [0,1,2,], + "required": "false", }, ], + "pk": "trip_id", }, { "model": "StopTime", @@ -276,37 +282,93 @@ field_requirements = \ { "name": "trip_id", "type": "fk", + "references": Trip, "required": "true", }, { "name": "arrival_time", "type": "time", - "required": "true", + "required": "if", + "required_if": [["stop_sequence", 1, -1], ["timepoint", 1]], }, { "name": "departure_time", "type": "time", - "required": "true", + "required": "if", + "required_if": [["timepoint", 1]], }, { "name": "stop_id", "type": "fk", - "required": "true", + "references": Stop, + "required": "if", + "required_if": [(["location_group", None], ["location_id", None])], + "forbidden_if_not": [["location_group", None], ["location_id", None]], + }, + { + "name": "location_group_id", + "type": "mtm", + "references": LocationGroup, + "required": "false", + "forbidden_if_not": [(["stop_id", None], ["location_id", None])], + }, + { + "name": "location_id", + "type": "fk", + "references": LocationsGeojson, + "forbidden_if_not": [(["stop_id", None], ["location_group_id", None])], }, { "name": "stop_sequence", - "type": "int", + "type": "unsigned", "required": "true", }, + { + "name": "stop_headsign", + "type": "str", + "required": "false", + }, + { + "name": "start_pickup_drop_off_window", + "type": "time", + "required": "if", + "required_if_not": [["location_group_id", None], ["location_id", None], ["end_pickup_drop_off_window", None]], + "forbidden_if_not": [["arrival_time", None], ["departure_time", None]], + }, + { + "name": "end_pickup_drop_off_window", + "type": "time", + "required": "if", + "required_if_not": [["location_group_id", None], ["location_id", None], ["start_pickup_drop_off_window", None]], + "forbidden_if_not": [["arrival_time", None], ["departure_time", None]], + }, { "name": "pickup_type", - "type": "int", - "required": "true", + "type": "enum", + "allowed_values": [0,1,2,3], + "required": "false", + "forbidden_if_not": [(["pickup_type", 0, 3], ["start_pickup_drop_off_window", None], ["end_pickup_drop_off_window", None]),] }, { "name": "drop_off_type", - "type": "int", - "required": "true", + "type": "enum", + "allowed_values": [0,1,2,3,], + "required": "false", + "forbidden_if": [(["drop_off_type", 0], ["start_pickup_drop_off_window", None], ["end_pickup_drop_off_window", None])], + }, + { + "name": "continuous_pickup", + "type": "enum", + "allowed_values": [0,1,2,3,], + "required": "false", + "forbidden_if_not": [(["start_pickup_drop_off_window", None], ["end_pickup_drop_off_window", None])], + }, + { + "name": "continuous_drop_off", + "type": "enum", + "allowed_values": [0,1,2,3,], + "required": "false", + "forbidden_if_not": [(["start_pickup_drop_off_window", None], ["end_pickup_drop_off_window", None])], }, { "name": "shape_dist_traveled", @@ -315,52 +377,73 @@ field_requirements = \ }, { "name": "timepoint", - "type": "int", + "type": "enum", + "allowed_values": [0,1,], + "required": "false", + }, + { + "name": "pickup_booking_rule_id", + "type": "fk", + "references": BookingRule, + "required": "false", + }, + { + "name": "drop_off_booking_rule_id", + "type": "fk", + "references": BookingRule, "required": "false", }, ], + "pk": ["trip_id", "stop_sequence"], }, { "model": "Calendar", "fields": [ { "name": "service_id", - "type": "pk", + "type": "unique", "required": "true", }, { "name": "monday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { "name": "tuesday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { "name": "wednesday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { "name": "thursday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { "name": "friday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { "name": "saturday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { "name": "sunday", - "type": "int", + "type": "enum", + "allowed_values": [0,1], "required": "true", }, { @@ -374,13 +457,14 @@ field_requirements = \ "required": "true", }, ], + "pk": "service_id", }, { - "model": "CalendarDates", + "model": "CalendarDate", "fields": [ { "name": "service_id", - "type": "fk", + "type": "str", "required": "true", }, { @@ -390,13 +474,15 @@ field_requirements = \ }, { "name": "exception_type", - "type": "int", + "type": "enum", + "allowed_values": [1,2,], "required": "true", }, ], + "pk": ["service_id", "date"], }, { - "model": "FareAttributes", + "model": "FareAttribute", "fields": [ { "name": "fare_id", @@ -410,25 +496,35 @@ field_requirements = \ }, { "name": "currency_type", - "type": "str", + "type": "curcode", "required": "true", }, { "name": "payment_method", - "type": "int", + "type": "enum", + "allowed_values": [0,1,], "required": "true", }, { "name": "transfers", - "type": "int", + "type": "enum", + "allowed_values": [0,1,2,None], "required": "true", }, + { + "name": "agency_id", + "type": "fk", + "references": Agency, + "required": "false", + "default": "yes", + }, { "name": "transfer_duration", - "type": "int", + "type": "unsigned", "required": "true", }, ], + "pk": "fare_id", }, { "model": "FareRules", @@ -436,44 +532,287 @@ field_requirements = \ { "name": "fare_id", "type": "fk", + "references": FareAttribute, "required": "true", }, { "name": "route_id", "type": "fk", + "references": Route, "required": "true", }, { "name": "origin_id", - "type": "fk", + "type": "mtm", + "references": Stop, "required": "true", }, { "name": "destination_id", - "type": "fk", + "type": "mtm", + "references": Stop, "required": "true", }, { "name": "contains_id", - "type": "fk", + "type": "mtm", + "references": Stop, "required": "false", }, ], + "pk": None, }, { - "model": "FareZones", + "model": "Timeframe", "fields": [ { - "name": "fare_zone_id", - "type": "pk", - "required": "true", - }, - { - "name": "zone_id", + "name": "timeframe_group_id", "type": "str", "required": "true", }, + { + "name": "start_time", + "type": "time", + "required": "if", + "required_if_not": [["end_time", None]], + "forbidden_if": [["end_time", None]], + }, + { + "name": "end_time", + "type": "time", + "required": "if", + "required_if_not": [["start_time", None]], + "forbidden_if": [["start_time", None]], + }, + { + "name": "service_id", + "type": "str", + "required": "true", + } ], + "pk": None, + }, + { + "model": "FareMedium", + "fields": [ + { + "name": "fare_media_id", + "type": "pk", + "required": "true", + }, + { + "name": "fare_media_name", + "type": "str", + "required": "false", + }, + { + "name": "fare_media_type", + "type": "enum", + "allowed_values": [0,1,2,3,4,], + "required": "false", + }, + ], + "pk": "fare_media_id", + }, + { + "model": "FareProduct", + "fields": [ + { + "name": "fare_product_id", + "type": "str", + "required": "true", + }, + { + "name": "fare_product_name", + "type": "str", + "required": "false", + }, + { + "name": "fare_media_id", + "type": "fk", + "references": FareMedium, + "required": "false", + }, + { + "name": "amount", + "type": "float", + "required": "true", + }, + { + "name": "currency", + "type": "curcode", + "required": "true", + }, + ], + "pk": ["fare_product_id", "fare_media_id"] + }, + { + "model": "FareLegRule", + "fields": [ + { + "name": "leg_group_id", + "type": "str", + "required": "false", + }, + { + "name": "network_id", + "type": "str", + "required": "false", + }, + { + "name": "from_area_id", + "type": "fk", + "references": Area, + "required": "false", + }, + { + "name": "to_area_id", + "type": "fk", + "references": Area, + "required": "false", + }, + { + "name": "from_timeframe_group_id", + "type": "mtm", + "references": Timeframe, + "required": "false", + }, + { + "name": "to_timeframe_group_id", + "type": "mtm", + "references": Timeframe, + "required": "false", + }, + { + "name": "fare_product_id", + "type": "fk", + "references": FareProduct, + "required": "true", + }, + { + "name": "rule_priority", + "type": "unsigned", + "required": "false", + }, + ], + "pk": ["network_id", "from_area_id", "to_area_id", "from_timeframe_group_id", "to_timeframe_group_id", "fare_product_id"], + }, + { + "model": "FareTransferRule", + "fields": [ + { + "name": "from_leg_group_id", + "type": "mtm", + "references": FareLegRule, + "required": "false", + }, + { + "name": "to_leg_group_id", + "type": "mtm", + "references": FareLegRule, + "required": "false", + }, + { + "name": "transfer_count", + "type": "int", + "required": "if", + "required_if_eq": ["from_leg_group_id", "to_leg_group_id"], + "forbidden_if_not_eq": ["from_leg_group_id", "to_leg_group_id"], + }, + { + "name": "duration_limit", + "type": "unsigned", + "required": "false", + }, + { + "name": "duration_limit_type", + "type": "enum", + "allowed_values": [0,1,2,3,], + "required_if_not": [["duration_limit", None]], + "forbidden_if": [["duration_limit", None]], + }, + { + "name": "fare_transfer_type", + "type": "enum", + "allowed_values": [0,1,2], + "required": "true", + }, + { + "name": "fare_product_id", + "type": "fk", + "references": FareProduct, + "required": "false", + }, + ], + "pk": ["from_leg_group_id", "to_leg_group_id", "fare_product_id", "transfer_count", "duration_limit"], + }, + { + "model": "Area", + "fields": [ + { + "name": "area_id", + "type": "pk", + "required": "true", + }, + { + "name": "area_name", + "type": "str", + "required": "false", + }, + ], + "pk": "area_id", + }, + { + "model": "StopArea", + "fields": [ + { + "name": "area_id", + "type": "fk", + "references": Area, + "required": "true", + }, + { + "name": "stop_id", + "type": "fk", + "references": Stop, + "required": "true", + }, + ], + "pk": None, + }, + { + "model": "Network", + "fields": [ + { + "name": "network_id", + "type": "pk", + "required": "true", + }, + { + "name": "network_name", + "type": "str", + "required": "false", + }, + ], + "pk": "network_id", + }, + { + "model": "RouteNetwork", + "fields": [ + { + "name": "network_id", + "type": "fk", + "references": Network, + "required": "true", + }, + { + "name": "route_id", + "type": "fk", + "references": Route, + "required": "true", + }, + ], + "pk": "route_id", }, { "model": "Shape", @@ -504,13 +843,15 @@ field_requirements = \ "required": "true", }, ], + "pk": ["shape_id", "shape_pt_sequence"], }, { - "model": "Frequencies", + "model": "Frequency", "fields": [ { "name": "trip_id", "type": "fk", + "references": Trip, "required": "true", }, { @@ -525,15 +866,17 @@ field_requirements = \ }, { "name": "headway_secs", - "type": "int", + "type": "unsigned", "required": "true", }, { "name": "exact_times", - "type": "int", - "required": "true", + "type": "enum", + "allowed_values": [0,1,], + "required": "false", }, ], + "pk": ["trip_id", "start_time"], }, { "model": "Transfers", @@ -541,24 +884,324 @@ field_requirements = \ { "name": "from_stop_id", "type": "fk", - "required": "true", + "references": Stop, + "required": "false", }, { "name": "to_stop_id", "type": "fk", - "required": "true", + "references": Stop, + "required": "false", }, { "name": "transfer_type", - "type": "int", + "type": "enum", + "allowed_values": [0,1,2,3,4,5,], + "required": "true", + }, + { + "name": "from_route_id", + "type": "fk", + "references": Route, + "required": "false", + }, + { + "name": "to_route_id", + "type": "fk", + "references": Route, + "required": "false", + }, + { + "name": "from_trip_id", + "type": "fk", + "references": Trip, + "required": "false", + }, + { + "name": "to_trip_id", + "type": "fk", + "references": Trip, + "required": "false", + }, + { + "name": "min_transfer_time", + "type": "unsigned", + "required": "false", + }, + ], + "pk": ["from_trip_id", "to_trip_id", "from_stop_id", "to_stop_id", "from_route_id", "to_route_id"], + }, + { + "model": "Pathway", + "fields": [ + { + "name": "pathway_id", + "type": "pk", + "required": "true", + }, + { + "name": "from_stop_id", + "type": "fk", + "references": Stop, + "required": "true", + }, + { + "name": "to_stop_id", + "type": "fk", + "references": Stop, + "required": "true", + }, + { + "name": "pathway_mode", + "type": "enum", + "allowed_values": [1,2,3,4,5,6,7,], + "required": "true", + }, + { + "name": "is_bidirectional", + "type": "enum", + "allowed_values": [0,1,], + "required": "true", + }, + { + "name": "length", + "type": "float", + "required": "false", + }, + { + "name": "traversal_time", + "type": "unsigned", + "required": "false", + }, + { + "name": "stair_count", + "type": "int", + "required": "false", + }, + { + "name": "max_slope", + "type": "float", + "required": "false", + }, + { + "name": "min_width", + "type": "float", + "required": "false", + }, + { + "name": "signposted_as", + "type": "str", + "required": "false", + }, + { + "name": "reversed_signposted_as", + "type": "str", + "required": "false", + }, + ], + "pk": "pathway_id", + }, + { + "model": "Level", + "fields": [ + { + "name": "level_id", + "type": "pk", "required": "true", }, { - "name": "min_transfer_time", - "type": "int", + "name": "level_index", + "type": "float", + "required": "true", + }, + { + "name": "level_name", + "type": "str", + "required": "false", + }, + ], + "pk": "level_id", + }, + { + "model": "LocationGroup", + "fields": [ + { + "name": "location_group_id", + "type": "pk", + "required": "true", + }, + { + "name": "location_group_name", + "type": "str", + "required": "false", + }, + ], + "pk": "location_group_id", + }, + { + "model": "LocationGroupStop", + "fields": [ + { + "name": "location_group_id", + "type": "fk", + "references": LocationGroup, + "required": "true", + }, + { + "name": "stop_id", + "type": "fk", + "references": Stop, "required": "true", }, ], + "pk": None, + }, + { + "model": "BookingRule", + "fields": [ + { + "name": "booking_rule_id", + "type": "pk", + "required": "true", + }, + { + "name": "booking_type", + "type": "enum", + "allowed_values": [0,1,2,], + "required": "false", + }, + { + "name": "prior_notice_duration_min", + "type": "unsigned", + "required": "if", + "required_if": [["booking_type", 1]], + "forbidden_if_not": [["booking_type", 1]] + }, + { + "name": "prior_notice_duration_max", + "type": "unsigned", + "required": "if", + "required_if_not": [["booking_type", 1]], + "forbidden_if": [["booking_type", 1]] + }, + { + "name": "prior_notice_last_day", + "type": "unsigned", + "required": "if", + "required_if": [["booking_type", 2]], + "forbidden_if_not": [["booking_type", 2]] + }, + { + "name": "prior_notice_last_time", + "type": "time", + "required": "if", + "required_if_not": [["prior_notice_last_day", None]], + "forbidden_if": [["prior_notice_last_day", None]], + }, + { + "name": "prior_notice_start_day", + "type": "unsigned", + "required": "false", + "forbidden_if": [["booking_type", 0],], + "forbidden_if_not": [["booking_type", 1], ["prior_notice_duration_max", None]], + }, + { + "name": "prior_notice_start_time", + "type": "time", + "required": "if", + "required_if_not": [["prior_notice_start_day", None]], + "forbidden_if": [["prior_notice_last_day", None]], + }, + { + "name": "prior_notice_service_id", + "type": "str", + "required": "false", + "forbidden_if_not": [["booking_type", 2]], + }, + { + "name": "message", + "type": "str", + "required": "false", + }, + { + "name": "pickup_message", + "type": "str", + "required": "false", + }, + { + "name": "drop_off_message", + "type": "str", + "required": "false", + }, + { + "name": "phone_number", + "type": "telephone", + "required": "false", + }, + { + "name": "info_url", + "type": "url", + "required": "false", + }, + { + "name": "booking_url", + "type": "url", + "required": "false", + }, + ], + "pk": "booking_rule_id", + }, + { + "model": "Translation", + "fields": [ + { + "name": "table_name", + "type": "enum", + "allowed_values": ["agency", "stops", "routes", "trips", "stop_times", "pathways", "levels", "feed_info", "attributions"], + "required": "true", + }, + { + "name": "field_name", + "type": "str", + "required": "true", + }, + { + "name": "language", + "type": "lancode", + "required": "true", + }, + { + "name": "translation", + "type": "str", + "required": "true", + }, + { + "name": "record_id", + "type": "fk", + "references": "table_name", + "required": "if", + "required_if": [["field_value", None]], + "forbidden_if": [["table_name", "feed_info"]], + "forbidden_if_not": [["field_value", None]], + }, + { + "name": "record_sub_id", + "type": "str", + "required": "if", + "required_if": [["table_name", "stop_times"], ["record_id", not None]], + "forbidden_if": [["table_name", "feed_info"]], + "forbidden_if_not": [["field_value", None]], + }, + { + "name": "field_value", + "type": "str", + "required": "if", + "required_if": [["record_id", None]], + "forbidden_if": [["table_name", "feed_info"]], + "forbidden_if_not": [["record_id", None]], + }, + ], + "pk": ["table_name", "field_name", "language", "record_id", "record_sub_id", "field_value"], }, { "model": "FeedInfo", @@ -578,10 +1221,15 @@ field_requirements = \ "type": "langcode", "required": "true", }, + { + "name": "default_lang", + "type": "langcode", + "required": "false", + }, { "name": "feed_start_date", "type": "date", - "required": "true", + "required": "false", }, { "name": "feed_end_date", @@ -591,9 +1239,87 @@ field_requirements = \ { "name": "feed_version", "type": "str", - "required": "true", + "required": "false", + }, + { + "name": "feed_contact_url", + "type": "url", + "required": "false", + }, + { + "name": "feed_contact_email", + "type": "email", + "required": "false", }, ], + "pk": None, + }, + { + "model": "Attribution", + "fields": [ + { + "name": "attribution_id", + "type": "pk", + "required": "false", + }, + { + "name": "agency_id", + "type": "fk", + "references": Agency, + "required": "false", + }, + { + "name": "route_id", + "type": "fk", + "references": Route, + "required": "false", + }, + { + "name": "trip_id", + "type": "fk", + "references": Trip, + "required": "false", + }, + { + "name": "organization_name", + "type": "str", + "required": "true", + }, + { + "name": "is_producer", + "type": "enum", + "allowed_values": [0,1,], + "required": "false", + }, + { + "name": "is_operator", + "type": "enum", + "allowed_values": [0,1,], + "required": "false", + }, + { + "name": "is_authority", + "type": "str", + "required": "false", + }, + { + "name": "attribution_url", + "type": "enum", + "allowed_values": [0,1,], + "required": "false", + }, + { + "name": "attribution_email", + "type": "url", + "required": "false", + }, + { + "name": "attribution_phone", + "type": "telephone", + "required": "false", + }, + ], + "pk": "attribution_id", }, ] diff --git a/transport_accessibility/pt_map/test_data.py b/transport_accessibility/pt_map/test_data.py new file mode 100644 index 0000000..fa2c53b --- /dev/null +++ b/transport_accessibility/pt_map/test_data.py @@ -0,0 +1,169 @@ +from pt_map.models import * +from pt_map.model_test_fields import field_requirements + +def get_all_fields(model_name): + for m in field_requirements: + if m["model"] == model_name: + return m["fields"] + +def get_required_fields(model_name): + required_fields = [] + for field in get_all_fields(model_name): + if field["required"] == "true": + required_fields.append(field) + return required_fields + +def get_optional_fields(model_name): + optional_fields = [] + for field in get_all_fields(model_name): + if field["required"] == "false": + optional_fields.append(field) + return optional_fields + +def get_conditionally_required_fields(model_name): + conditionally_required_fields = [] + for field in get_all_fields(model_name): + if field["required"] == "if": + conditionally_required_fields.append(field) + return conditionally_required_fields + +def get_conditionally_forbidden_fields(model_name): + conditionally_forbidden_fields = [] + for field in get_all_fields(model_name): + if field.get("forbidden_if") or field.get("forbidden_if_not") or field.get("forbidden_if_eq") or field.get("forbidden_if_not_eq"): + conditionally_forbidden_fields.append(field) + return conditionally_forbidden_fields + +data = [ + { + "name": "Fulton Conley", + "telephone": "1-538-373-2858", + "email": "duis@google.net", + "url": "http://bbc.co.uk", + "pk": "WKQ42OFT7XX", + "str": "tincidunt orci quis lectus. Nullam suscipit, est ac", + "time": "00:34:56", + "date": "20231223", + "curcode": "TRY", + "timezone": "Europe/Paris", + "langcode": "ZO" + }, + { + "name": "Donna Collins", + "telephone": "1-858-166-4735", + "email": "arcu.vestibulum.ante@yahoo.org", + "url": "http://youtube.com", + "pk": "TEP72JJR8XE", + "str": "gravida molestie arcu. Sed eu nibh vulputate mauris", + "time": "04:14:54", + "date": "20240903", + "curcode": "HKD", + "timezone": "Africa/Abidjan", + "langcode": "RQ" + }, + { + "name": "Tad Jensen", + "telephone": "(767) 770-8531", + "email": "dolor.egestas.rhoncus@icloud.com", + "url": "http://baidu.com", + "pk": "UVO18XXG8IB", + "str": "montes, nascetur ridiculus mus. Aenean eget magna. Suspendisse tristique", + "time": "20:27:48", + "date": "20240322", + "curcode": "KZT", + "timezone": "Europe/Paris", + "langcode": "GI" + }, + { + "name": "Calvin Harrison", + "telephone": "1-547-884-7735", + "email": "etiam.laoreet@google.net", + "url": "https://instagram.com", + "pk": "NCV69RJX3HR", + "str": "aptent taciti sociosqu ad litora", + "time": "18:55:30", + "date": "20240720", + "curcode": "PLN", + "timezone": "Asia/Atyrau", + "langcode": "DP" + }, + { + "name": "Phillip Britt", + "telephone": "(445) 832-4949", + "email": "nulla.tincidunt@protonmail.net", + "url": "http://naver.com", + "pk": "HGW71LUD1QL", + "str": "ultricies dignissim", + "time": "00:42:36", + "date": "20230627", + "curcode": "CHF", + "timezone": "Africa/Addis_Ababa", + "langcode": "CB" + }, + { + "name": "Branden Leblanc", + "telephone": "(621) 519-7201", + "email": "erat.etiam@google.edu", + "url": "https://google.com", + "pk": "BIT71WZZ5MT", + "str": "Nunc pulvinar arcu et pede.", + "time": "13:57:23", + "date": "20250116", + "curcode": "MUR", + "timezone": "Asia/Atyrau", + "langcode": "YD" + }, + { + "name": "Bradley Larson", + "telephone": "1-699-788-9354", + "email": "et.commodo@icloud.edu", + "url": "https://whatsapp.com", + "pk": "UON48QSJ0RD", + "str": "dui,", + "time": "01:26:35", + "date": "20231004", + "curcode": "EUR", + "timezone": "Europe/Berlin", + "langcode": "BU" + }, + { + "name": "Scarlet Patterson", + "telephone": "(451) 444-7817", + "email": "scelerisque.scelerisque@outlook.edu", + "url": "http://wikipedia.org", + "pk": "LHE29UCR4BJ", + "str": "lacus. Cras", + "time": "13:51:51", + "date": "20240602", + "curcode": "SEK", + "timezone": "Asia/Damascus", + "langcode": "DY" + }, + { + "name": "Latifah Alvarez", + "telephone": "(266) 713-8186", + "email": "mauris.magna@icloud.edu", + "url": "https://youtube.com", + "pk": "VOQ57DYR9CU", + "str": "orci tincidunt adipiscing. Mauris molestie pharetra nibh. Aliquam ornare,", + "time": "03:54:44", + "date": "20240923", + "curcode": "XCD", + "timezone": "Africa/Addis_Ababa", + "langcode": "OT" + }, + { + "name": "Thane Moran", + "telephone": "1-674-463-6771", + "email": "odio.etiam.ligula@icloud.edu", + "url": "https://pinterest.com", + "pk": "CGR74BDF1DH", + "str": "eu metus. In lorem. Donec elementum,", + "time": "15:58:50", + "date": "20231225", + "curcode": "RUB", + "timezone": "Africa/Abidjan", + "langcode": "KS" + } +] + diff --git a/transport_accessibility/pt_map/tests.py b/transport_accessibility/pt_map/tests.py index 9c306e2..3a07b9e 100644 --- a/transport_accessibility/pt_map/tests.py +++ b/transport_accessibility/pt_map/tests.py @@ -1,26 +1,35 @@ from django.test import TestCase -from pt_map.models import Agency, FeedInfo, Level, Stop, Route, Shape, Calendar, CalendarDate, LocationGroup, LocationGroupStop, LocationsGeojson, Trip, StopArea, StopTime, FareAttribute, FareLegRule, FareMedium, FareProduct, FareTransferRule, FareRule, Frequency, Transfer, Pathway, BookingRule, Translation, Attribution, Network, RouteNetwork, Area, Timeframe -from datetime import date, datetime - -# Create your tests here. -class FeedInfoTestCase(TestCase): - def setUp(self): - FeedInfo.objects.create(feed_publisher_name="All fields", feed_publisher_url='example.com', feed_lang='pl', default_lang='pl', feed_start_date=datetime(2024, 1, 1), feed_end_date=datetime.now(), feed_version='1.0', feed_contact_email='me@example.com', feed_contact_url='example.com') - def test_ok(self): - FeedInfo.objects.get(feed_publisher_name="All fields") - FeedInfo.objects.get(feed_publisher_url='example.com') - FeedInfo.objects.get(feed_lang='pl') - FeedInfo.objects.get(default_lang='pl') - FeedInfo.objects.get(feed_start_date=datetime(2024, 1, 1)) - FeedInfo.objects.get(feed_end_date=datetime.now()) - FeedInfo.objects.get(feed_version='1.0') - FeedInfo.objects.get(feed_contact_email='me@example.com') - FeedInfo.objects.get(feed_contact_email='me@example.com') - +from pt_map.test_data import * +from pt_map.models import * +import unittest +from django.db import models +import random class AgencyTestCase(TestCase): def setUp(self): - FeedInfo.objects.create(feed_publisher_name="All fields", feed_publisher_url='example.com', feed_lang='pl', default_lang='pl', feed_start_date=datetime(2024, 1, 1), feed_end_date=datetime.now(), feed_version='1.0', feed_contact_email='me@example.com', feed_contact_url='example.com') - Agency.objects.create(agency_name='test', agency_url='example.com', agency_timezone='Europe/Berlin', agency_lang='pl', agency_phone='0123456574', agency_fare_url='example.com', agency_email='me@example.com', feed_info_id=FeedInfo.objects.get(feed_publisher_name="All fields")) - def test_ok(self): - print(Agency.objects.get(agency_name='test').feed_info_id.feed_id) + self.model_fields = [f.name for f in Agency._meta.fields] + self.gtfs_fields = get_all_fields("Agency") + + def test_all_fields_present(self): + """Make sure the model has properties for all fields - regardless if required - provided by the GTFS standard.""" + for f in self.gtfs_fields: + with self.subTest(f=f): + self.assertIn(f["name"], self.model_fields) + + def test_constructor_all_fields(self): + """Make sure all of the models fields of the model are initializable""" + with self.subTest(name="fixed"): + """Fixed subTest""" + d = data[0] + values = {f["name"]: d[f["type"]] for f in self.gtfs_fields} + obj = Agency(**values) + self.assertIsNotNone(obj) + self.assertIsInstance(obj, models.Model) + + with self.subTest(name="other"): + d = data[random.randint(0,len(data))] + values = {f["name"]: d[f["type"]] for f in self.gtfs_fields} + obj = Agency(**values) + self.assertIsNotNone(obj) + self.assertIsInstance(obj, models.Model) +