From f955a1ff2ea0f6da5d860c6466ee861cbb7c92b3 Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sat, 30 Sep 2017 17:02:30 +1300 Subject: [PATCH 01/18] Initial gtfsproj using django-admin --- examples/gtfsproj/gtfsapp/__init__.py | 0 examples/gtfsproj/gtfsapp/admin.py | 6 + examples/gtfsproj/gtfsapp/apps.py | 8 ++ .../gtfsproj/gtfsapp/migrations/__init__.py | 0 examples/gtfsproj/gtfsapp/models.py | 6 + examples/gtfsproj/gtfsapp/tests.py | 6 + examples/gtfsproj/gtfsapp/views.py | 6 + examples/gtfsproj/gtfsproj/__init__.py | 0 examples/gtfsproj/gtfsproj/settings.py | 120 ++++++++++++++++++ examples/gtfsproj/gtfsproj/urls.py | 21 +++ examples/gtfsproj/gtfsproj/wsgi.py | 16 +++ examples/gtfsproj/manage.py | 22 ++++ examples/gtfsproj/requirements.txt | 4 + 13 files changed, 215 insertions(+) create mode 100644 examples/gtfsproj/gtfsapp/__init__.py create mode 100644 examples/gtfsproj/gtfsapp/admin.py create mode 100644 examples/gtfsproj/gtfsapp/apps.py create mode 100644 examples/gtfsproj/gtfsapp/migrations/__init__.py create mode 100644 examples/gtfsproj/gtfsapp/models.py create mode 100644 examples/gtfsproj/gtfsapp/tests.py create mode 100644 examples/gtfsproj/gtfsapp/views.py create mode 100644 examples/gtfsproj/gtfsproj/__init__.py create mode 100644 examples/gtfsproj/gtfsproj/settings.py create mode 100644 examples/gtfsproj/gtfsproj/urls.py create mode 100644 examples/gtfsproj/gtfsproj/wsgi.py create mode 100755 examples/gtfsproj/manage.py create mode 100644 examples/gtfsproj/requirements.txt diff --git a/examples/gtfsproj/gtfsapp/__init__.py b/examples/gtfsproj/gtfsapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/gtfsproj/gtfsapp/admin.py b/examples/gtfsproj/gtfsapp/admin.py new file mode 100644 index 0000000..13be29d --- /dev/null +++ b/examples/gtfsproj/gtfsapp/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/examples/gtfsproj/gtfsapp/apps.py b/examples/gtfsproj/gtfsapp/apps.py new file mode 100644 index 0000000..47dddba --- /dev/null +++ b/examples/gtfsproj/gtfsapp/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class GtfsappConfig(AppConfig): + name = 'gtfsapp' diff --git a/examples/gtfsproj/gtfsapp/migrations/__init__.py b/examples/gtfsproj/gtfsapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/gtfsproj/gtfsapp/models.py b/examples/gtfsproj/gtfsapp/models.py new file mode 100644 index 0000000..1dfab76 --- /dev/null +++ b/examples/gtfsproj/gtfsapp/models.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models + +# Create your models here. diff --git a/examples/gtfsproj/gtfsapp/tests.py b/examples/gtfsproj/gtfsapp/tests.py new file mode 100644 index 0000000..5982e6b --- /dev/null +++ b/examples/gtfsproj/gtfsapp/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/examples/gtfsproj/gtfsapp/views.py b/examples/gtfsproj/gtfsapp/views.py new file mode 100644 index 0000000..e784a0b --- /dev/null +++ b/examples/gtfsproj/gtfsapp/views.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render + +# Create your views here. diff --git a/examples/gtfsproj/gtfsproj/__init__.py b/examples/gtfsproj/gtfsproj/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/gtfsproj/gtfsproj/settings.py b/examples/gtfsproj/gtfsproj/settings.py new file mode 100644 index 0000000..f84fc8e --- /dev/null +++ b/examples/gtfsproj/gtfsproj/settings.py @@ -0,0 +1,120 @@ +""" +Django settings for gtfsproj project. + +Generated by 'django-admin startproject' using Django 1.11.5. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.11/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '+$8pgzf)luxklr(rhzg4!$6+b^2hbw*-frvh_2-7an9-_==n_u' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'gtfsproj.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'gtfsproj.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.11/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.11/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.11/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/examples/gtfsproj/gtfsproj/urls.py b/examples/gtfsproj/gtfsproj/urls.py new file mode 100644 index 0000000..5a32c22 --- /dev/null +++ b/examples/gtfsproj/gtfsproj/urls.py @@ -0,0 +1,21 @@ +"""gtfsproj URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.11/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), +] diff --git a/examples/gtfsproj/gtfsproj/wsgi.py b/examples/gtfsproj/gtfsproj/wsgi.py new file mode 100644 index 0000000..278abd7 --- /dev/null +++ b/examples/gtfsproj/gtfsproj/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for gtfsproj project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gtfsproj.settings") + +application = get_wsgi_application() diff --git a/examples/gtfsproj/manage.py b/examples/gtfsproj/manage.py new file mode 100755 index 0000000..9d97264 --- /dev/null +++ b/examples/gtfsproj/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gtfsproj.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) diff --git a/examples/gtfsproj/requirements.txt b/examples/gtfsproj/requirements.txt new file mode 100644 index 0000000..752dd09 --- /dev/null +++ b/examples/gtfsproj/requirements.txt @@ -0,0 +1,4 @@ +# Install multigtfs from PyPi +multigtfs +# Or from local source project +#-e ../.. From 4ab5dd712168b6e5491cf97e94d2613472a748f8 Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sat, 30 Sep 2017 17:52:10 +1300 Subject: [PATCH 02/18] Apply .env for debug and allowed hosts --- examples/gtfsproj/.env.example | 2 ++ examples/gtfsproj/gtfsproj/settings.py | 6 +++--- examples/gtfsproj/requirements.txt | 7 +++++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 examples/gtfsproj/.env.example diff --git a/examples/gtfsproj/.env.example b/examples/gtfsproj/.env.example new file mode 100644 index 0000000..a57fe72 --- /dev/null +++ b/examples/gtfsproj/.env.example @@ -0,0 +1,2 @@ +DEBUG=True +ALLOWED_HOSTS=* diff --git a/examples/gtfsproj/gtfsproj/settings.py b/examples/gtfsproj/gtfsproj/settings.py index f84fc8e..1eb4e6c 100644 --- a/examples/gtfsproj/gtfsproj/settings.py +++ b/examples/gtfsproj/gtfsproj/settings.py @@ -11,6 +11,7 @@ """ import os +from decouple import config, Csv # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -23,9 +24,8 @@ SECRET_KEY = '+$8pgzf)luxklr(rhzg4!$6+b^2hbw*-frvh_2-7an9-_==n_u' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] +DEBUG = config('DEBUG', default=False, cast=bool) +ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='', cast=Csv()) # Application definition diff --git a/examples/gtfsproj/requirements.txt b/examples/gtfsproj/requirements.txt index 752dd09..ec823a3 100644 --- a/examples/gtfsproj/requirements.txt +++ b/examples/gtfsproj/requirements.txt @@ -2,3 +2,10 @@ multigtfs # Or from local source project #-e ../.. + +# Configure the database from the environment +dj-database-url + +# Configure other settings from the environment +python-decouple + From d005bfeeb3f9dc089cba81f8e5de07b57defc4ca Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sat, 30 Sep 2017 18:23:31 +1300 Subject: [PATCH 03/18] Add db url settings --- examples/gtfsproj/.env.example | 5 +++++ examples/gtfsproj/gtfsproj/settings.py | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/examples/gtfsproj/.env.example b/examples/gtfsproj/.env.example index a57fe72..5a0166d 100644 --- a/examples/gtfsproj/.env.example +++ b/examples/gtfsproj/.env.example @@ -1,2 +1,7 @@ +SECRET_KEY=l$hc*-biy7*#7cic5q5r^mtf-2&l34pq4k7znn%)si+$h(i%e& + DEBUG=True ALLOWED_HOSTS=* + +#DATABASE_URL=spatialite:////db.sqlite3 + diff --git a/examples/gtfsproj/gtfsproj/settings.py b/examples/gtfsproj/gtfsproj/settings.py index 1eb4e6c..caa130a 100644 --- a/examples/gtfsproj/gtfsproj/settings.py +++ b/examples/gtfsproj/gtfsproj/settings.py @@ -11,6 +11,7 @@ """ import os +import dj_database_url from decouple import config, Csv # Build paths inside the project like this: os.path.join(BASE_DIR, ...) @@ -21,7 +22,7 @@ # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '+$8pgzf)luxklr(rhzg4!$6+b^2hbw*-frvh_2-7an9-_==n_u' +SECRET_KEY = config('SECRET_KEY', default='+$8pgzf)luxklr(rhzg4!$6+b^2hbw*-frvh_2-7an9-_==n_u', cast=str) # SECURITY WARNING: don't run with debug turned on in production! DEBUG = config('DEBUG', default=False, cast=bool) @@ -37,6 +38,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'gtfsapp', + 'multigtfs', ] MIDDLEWARE = [ @@ -74,13 +77,14 @@ # https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } + 'default': config('DATABASE_URL', + default='spatialite:///%s' % os.path.join(BASE_DIR, 'db.sqlite3'), + cast=dj_database_url.parse) } + + # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators From a5b1d7e0548fd3f25428698622331dd38d077564 Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sat, 30 Sep 2017 18:37:00 +1300 Subject: [PATCH 04/18] Add config for postgis --- examples/gtfsproj/.env.example | 2 +- examples/gtfsproj/requirements.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/gtfsproj/.env.example b/examples/gtfsproj/.env.example index 5a0166d..e789022 100644 --- a/examples/gtfsproj/.env.example +++ b/examples/gtfsproj/.env.example @@ -4,4 +4,4 @@ DEBUG=True ALLOWED_HOSTS=* #DATABASE_URL=spatialite:////db.sqlite3 - +#DATABASE_URL=postgis://USER:PASSWORD@HOST:PORT/DBNAME diff --git a/examples/gtfsproj/requirements.txt b/examples/gtfsproj/requirements.txt index ec823a3..4122dde 100644 --- a/examples/gtfsproj/requirements.txt +++ b/examples/gtfsproj/requirements.txt @@ -9,3 +9,5 @@ dj-database-url # Configure other settings from the environment python-decouple +# Connect to postgresql database +psycopg2 From 231f5a17698e77544a96f5433067f16edbba8802 Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sat, 30 Sep 2017 18:48:13 +1300 Subject: [PATCH 05/18] Now works with postgis too with eg --- examples/gtfsproj/.env.example | 2 +- examples/gtfsproj/gtfsproj/settings.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/gtfsproj/.env.example b/examples/gtfsproj/.env.example index e789022..b5b1a7f 100644 --- a/examples/gtfsproj/.env.example +++ b/examples/gtfsproj/.env.example @@ -3,5 +3,5 @@ SECRET_KEY=l$hc*-biy7*#7cic5q5r^mtf-2&l34pq4k7znn%)si+$h(i%e& DEBUG=True ALLOWED_HOSTS=* -#DATABASE_URL=spatialite:////db.sqlite3 +#DATABASE_URL=spatialite:///db.sqlite3 #DATABASE_URL=postgis://USER:PASSWORD@HOST:PORT/DBNAME diff --git a/examples/gtfsproj/gtfsproj/settings.py b/examples/gtfsproj/gtfsproj/settings.py index caa130a..d089de7 100644 --- a/examples/gtfsproj/gtfsproj/settings.py +++ b/examples/gtfsproj/gtfsproj/settings.py @@ -84,7 +84,6 @@ - # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators @@ -107,9 +106,9 @@ # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = config('LANGUAGE_CODE', default='en-us') -TIME_ZONE = 'UTC' +TIME_ZONE = config('TIME_ZONE', default='UTC') USE_I18N = True From 7d89aebe70bd7def0972e347601143e105d7b62f Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sat, 30 Sep 2017 22:43:37 +1300 Subject: [PATCH 06/18] Feed list views first cut --- .../gtfsproj/gtfsapp/static/css/explore.css | 8 +++ .../gtfsproj/gtfsapp/static/js/explore.js | 44 +++++++++++++++ .../gtfsapp/templates/multigtfs/base.html | 54 +++++++++++++++++++ .../templates/multigtfs/feed_detail.html | 14 +++++ .../templates/multigtfs/feed_list.html | 20 +++++++ examples/gtfsproj/gtfsapp/urls.py | 8 +++ examples/gtfsproj/gtfsapp/views.py | 10 +++- examples/gtfsproj/gtfsproj/urls.py | 3 +- 8 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 examples/gtfsproj/gtfsapp/static/css/explore.css create mode 100644 examples/gtfsproj/gtfsapp/static/js/explore.js create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/base.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/feed_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/feed_list.html create mode 100644 examples/gtfsproj/gtfsapp/urls.py diff --git a/examples/gtfsproj/gtfsapp/static/css/explore.css b/examples/gtfsproj/gtfsapp/static/css/explore.css new file mode 100644 index 0000000..4151d28 --- /dev/null +++ b/examples/gtfsproj/gtfsapp/static/css/explore.css @@ -0,0 +1,8 @@ +body { + padding-top: 20px; +} + +.body-top { + padding: 40px 15px; + text-align: center; +} diff --git a/examples/gtfsproj/gtfsapp/static/js/explore.js b/examples/gtfsproj/gtfsapp/static/js/explore.js new file mode 100644 index 0000000..1e6ae2c --- /dev/null +++ b/examples/gtfsproj/gtfsapp/static/js/explore.js @@ -0,0 +1,44 @@ +explore = { + mapPoint: function(map_id, x, y, zoom) { + var map = new OpenLayers.Map(map_id); + var osm = new OpenLayers.Layer.OSM("OpenStreetMap Map"); + var fromProjection = new OpenLayers.Projection("EPSG:4326"); + var toProjection = new OpenLayers.Projection("EPSG:900913"); + var position = new OpenLayers.LonLat(x, y).transform(fromProjection, toProjection); + map.addLayer(osm); + + var markers = new OpenLayers.Layer.Markers( "Markers" ); + map.addLayer(markers); + markers.addMarker(new OpenLayers.Marker(position)); + + map.setCenter(position, zoom); + }, + mapLine: function(map_id, line_wkt) { + var map = new OpenLayers.Map(map_id); + var osm = new OpenLayers.Layer.OSM("OpenStreetMap Map"); + var fromProjection = new OpenLayers.Projection("EPSG:4326"); + var toProjection = new OpenLayers.Projection("EPSG:900913"); + map.addLayer(osm); + + var style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); + style.strokeColor = "red"; + style.strokeColor = "red"; + style.fillColor = "red"; + style.pointRadius = 10; + style.strokeWidth = 3; + style.rotation = 45; + style.strokeLinecap = "butt"; + var vectorLayer = new OpenLayers.Layer.Vector("Line", {'style': style}); + var wkt = new OpenLayers.Format.WKT({ + 'internalProjection': toProjection, + 'externalProjection': fromProjection, + 'style': style }); + var lineVector = wkt.read(line_wkt); + var bounds = lineVector.geometry.getBounds(); + + map.addLayer(vectorLayer); + vectorLayer.addFeatures([lineVector]); + + map.zoomToExtent(bounds); + } +} diff --git a/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html b/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html new file mode 100644 index 0000000..9ebb71a --- /dev/null +++ b/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html @@ -0,0 +1,54 @@ +{% load staticfiles %} + + + + + + + {% block head_title %}Multi GTFS - django-multi-gtfs{% endblock %} + + + + + {% block head_extra %}{% endblock %} + + + +
+
+

{% block page_title %}TODO: set page_title{% endblock %}

+ {% block page_top_content_elem %} +

+ {% block page_top_content %}TODO: set page_top_content{% endblock %} +

+ {% endblock %} +

+
{% block page_middle_content %}{% endblock %}
+
+ + + {% block body_script %}{% endblock %} + + + diff --git a/examples/gtfsproj/gtfsapp/templates/multigtfs/feed_detail.html b/examples/gtfsproj/gtfsapp/templates/multigtfs/feed_detail.html new file mode 100644 index 0000000..3a0f044 --- /dev/null +++ b/examples/gtfsproj/gtfsapp/templates/multigtfs/feed_detail.html @@ -0,0 +1,14 @@ +{% extends "multigtfs/base.html" %} +{% block head_title %}{{ block.super }} - Feed {{object}}{% endblock %} +{% block page_title %}Feed {{object}}{% endblock %} +{% block page_top_content_elem %} +A Feed represents a single GTFS feed. +{% endblock %} +{% block page_middle_content %} +

Attributes

+
+
id
{{object.id}}
+
name
{{object.name}}
+
created
{{object.created}}
+
+{% endblock %} diff --git a/examples/gtfsproj/gtfsapp/templates/multigtfs/feed_list.html b/examples/gtfsproj/gtfsapp/templates/multigtfs/feed_list.html new file mode 100644 index 0000000..382f8dc --- /dev/null +++ b/examples/gtfsproj/gtfsapp/templates/multigtfs/feed_list.html @@ -0,0 +1,20 @@ +{% extends "multigtfs/base.html" %} +{% block head_title %}{{ block.super }} - Feeds{% endblock %} +{% block nav_feed_active_class %} class="active"{% endblock %} +{% block page_title %}Feeds{% endblock %} +{% block page_top_content_elem %} +A Feed represents a single GTFS feed. +{% endblock %} +{% block page_middle_content %} +{% for feed in object_list %} + {% if forloop.first %}{% endif %} +{% empty %} +

No feeds yet.

+{% endfor %} +
+

To add a feed, use:

+
./manage.py importgtfs --name "Feed Name" /path/to/feed.zip
+{% endblock %} + diff --git a/examples/gtfsproj/gtfsapp/urls.py b/examples/gtfsproj/gtfsapp/urls.py new file mode 100644 index 0000000..347d767 --- /dev/null +++ b/examples/gtfsproj/gtfsapp/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url + +from gtfsapp.views import FeedList, FeedDetail + +urlpatterns = [ + url(r'^$', FeedList.as_view(), name='feed_list'), + url(r'^feed/(?P\d+)/$', FeedDetail.as_view(), name='feed_detail'), +] diff --git a/examples/gtfsproj/gtfsapp/views.py b/examples/gtfsproj/gtfsapp/views.py index e784a0b..e17748f 100644 --- a/examples/gtfsproj/gtfsapp/views.py +++ b/examples/gtfsproj/gtfsapp/views.py @@ -3,4 +3,12 @@ from django.shortcuts import render -# Create your views here. +from django.views.generic import ListView, DetailView +from multigtfs.models import Feed + +class FeedList(ListView): + #model = Feed + queryset = Feed.objects.order_by('name', '-created') + +class FeedDetail(DetailView): + model = Feed diff --git a/examples/gtfsproj/gtfsproj/urls.py b/examples/gtfsproj/gtfsproj/urls.py index 5a32c22..e057e9e 100644 --- a/examples/gtfsproj/gtfsproj/urls.py +++ b/examples/gtfsproj/gtfsproj/urls.py @@ -13,9 +13,10 @@ 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url +from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), + url(r'', include('gtfsapp.urls')), ] From d1ea34152b1a1ed21c59f644260d0b907a4a61a8 Mon Sep 17 00:00:00 2001 From: Adam Lawrence Date: Sun, 1 Oct 2017 00:11:41 +1300 Subject: [PATCH 07/18] List views created from other eg --- .../templates/multigtfs/agency_detail.html | 21 +++++ .../templates/multigtfs/agency_list.html | 15 ++++ .../gtfsapp/templates/multigtfs/base.html | 3 +- .../templates/multigtfs/block_detail.html | 19 +++++ .../templates/multigtfs/block_list.html | 15 ++++ .../templates/multigtfs/extra_data.html | 8 ++ .../templates/multigtfs/fare_detail.html | 24 ++++++ .../templates/multigtfs/fare_list.html | 15 ++++ .../templates/multigtfs/farerule_detail.html | 17 ++++ .../templates/multigtfs/farerule_list.html | 20 +++++ .../templates/multigtfs/feed_detail.html | 11 +++ .../templates/multigtfs/feedinfo_detail.html | 20 +++++ .../templates/multigtfs/feedinfo_list.html | 15 ++++ .../templates/multigtfs/frequency_detail.html | 18 +++++ .../templates/multigtfs/frequency_list.html | 19 +++++ .../templates/multigtfs/route_detail.html | 57 +++++++++++++ .../templates/multigtfs/route_list.html | 15 ++++ .../templates/multigtfs/service_detail.html | 29 +++++++ .../templates/multigtfs/service_list.html | 16 ++++ .../multigtfs/servicedate_detail.html | 16 ++++ .../templates/multigtfs/servicedate_list.html | 16 ++++ .../templates/multigtfs/shape_detail.html | 48 +++++++++++ .../templates/multigtfs/shape_list.html | 15 ++++ .../multigtfs/shapepoint_detail.html | 28 +++++++ .../templates/multigtfs/shapepoint_list.html | 18 +++++ .../templates/multigtfs/stop_detail.html | 40 ++++++++++ .../templates/multigtfs/stop_list.html | 15 ++++ .../templates/multigtfs/stoptime_detail.html | 22 ++++++ .../templates/multigtfs/stoptime_list.html | 20 +++++ .../templates/multigtfs/trip_detail.html | 57 +++++++++++++ .../templates/multigtfs/trip_list.html | 24 ++++++ .../templates/multigtfs/zone_detail.html | 15 ++++ .../templates/multigtfs/zone_list.html | 15 ++++ examples/gtfsproj/gtfsapp/urls.py | 21 ++++- examples/gtfsproj/gtfsapp/views.py | 79 ++++++++++++++++++- 35 files changed, 800 insertions(+), 6 deletions(-) create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/agency_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/agency_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/block_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/block_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/extra_data.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/fare_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/fare_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/farerule_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/farerule_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/feedinfo_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/feedinfo_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/frequency_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/frequency_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/route_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/route_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/service_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/service_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/servicedate_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/servicedate_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/shape_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/shape_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/shapepoint_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/shapepoint_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/stop_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/stop_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/stoptime_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/stoptime_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/trip_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/trip_list.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/zone_detail.html create mode 100644 examples/gtfsproj/gtfsapp/templates/multigtfs/zone_list.html diff --git a/examples/gtfsproj/gtfsapp/templates/multigtfs/agency_detail.html b/examples/gtfsproj/gtfsapp/templates/multigtfs/agency_detail.html new file mode 100644 index 0000000..4b3e8d7 --- /dev/null +++ b/examples/gtfsproj/gtfsapp/templates/multigtfs/agency_detail.html @@ -0,0 +1,21 @@ +{% extends "multigtfs/base.html" %} +{% block head_title %}{{ block.super }} - Agency {{object}}{% endblock %} +{% block page_title %}Agency {{object}}{% endblock %} +{% block page_top_content_elem %} +An Agency represents a transit agency. +{% endblock %} +{% block page_middle_content %} +

Attributes

+
+
feed
Feed {{object.feed}}
+
id
{{object.id}}
+
agency_id
{{object.agency_id|default:'Not set'}}
+
name
{{object.name}}
+
url
{% if object.url %}{{object.url}}{% else %}Not set{% endif %}
+
timezone
{{object.timezone}}
+
lang
{{object.lang|default:'Not set'}}
+
phone
{{object.phone|default:'Not set'}}
+
fare_url
{% if object.fare_url %}{{object.fare_url}}{% else %}Not set{% endif %}
+
+{% include "multigtfs/extra_data.html" %} +{% endblock %} diff --git a/examples/gtfsproj/gtfsapp/templates/multigtfs/agency_list.html b/examples/gtfsproj/gtfsapp/templates/multigtfs/agency_list.html new file mode 100644 index 0000000..2f9b4ec --- /dev/null +++ b/examples/gtfsproj/gtfsapp/templates/multigtfs/agency_list.html @@ -0,0 +1,15 @@ +{% extends "multigtfs/base.html" %} +{% block head_title %}{{ block.super }} - Agencies{% endblock %} +{% block page_title %}Agencies{% endblock %} +{% block page_top_content_elem %} +An Agency represents a transit agency. +{% endblock %} +{% block page_middle_content %} +{% for agency in object_list %} + {% if forloop.first %}{% endif %} +{% empty %} +

No agencies yet.

+{% endfor %} +{% endblock %} diff --git a/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html b/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html index 9ebb71a..775cacf 100644 --- a/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html +++ b/examples/gtfsproj/gtfsapp/templates/multigtfs/base.html @@ -25,7 +25,7 @@ - Multi GTFS + Multi GTFS