Skip to content
Snippets Groups Projects
Commit 67292cf3 authored by Anton Sarukhanov's avatar Anton Sarukhanov
Browse files

More frontend work. Not finished.

parent d94bf7e8
No related branches found
No related tags found
No related merge requests found
......@@ -37,3 +37,6 @@ celerybeat-schedule.db
# Kernprof
*.lprof
# Bower Components
bower_components
......@@ -2,7 +2,6 @@ import os
from flask import Flask, render_template
from flask.ext.bower import Bower
from models import db
import models
app = Flask(__name__, instance_relative_config=True)
......@@ -21,7 +20,11 @@ Bower(app)
# Flask Web Routes
@app.route('/')
def map():
return render_template('map.html')
from models import Agency
# TODO: serve different agency depending on cookie (or special domain)
agency_tag = app.config['AGENCIES'][0]
agency = db.session.query(Agency).filter(Agency.tag==agency_tag).one()
return render_template('map.html', agency=agency)
if __name__ == '__main__':
# Run Flask
......
{
"name": "pybusmap",
"version": "0.0.0",
"authors": [
"Anton Sarukhanov <code@ant.sr>"
],
"license": "MIT",
"homepage": "https://ant.sr",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"bootstrap": "~3.3.6",
"leaflet": "~0.7.7"
}
}
from sqlalchemy.sql.expression import ClauseElement
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm import object_session, column_property
from sqlalchemy.dialects import postgresql
from datetime import datetime
......@@ -13,21 +15,21 @@ class BMModel():
Our own Model add-on class for adding utility functions to db.Model.
"""
@classmethod
def get_one(cls, session, **kwargs):
return session.query(cls).filter_by(**kwargs).first()
def get_one(self, session, **kwargs):
return session.query(self).filter_by(**kwargs).first()
@classmethod
def get(cls, session, **kwargs):
return session.query(cls).filter_by(**kwargs).all()
def get(self, session, **kwargs):
return session.query(self).filter_by(**kwargs).all()
@classmethod
def get_or_create(cls, session, create_method='', create_method_kwargs=None, **kwargs):
def get_or_create(self, session, create_method='', create_method_kwargs=None, **kwargs):
""" Imitate Django's get_or_create() """
try:
return session.query(cls).filter_by(**kwargs).one()
return session.query(self).filter_by(**kwargs).one()
except NoResultFound:
kwargs.update(create_method_kwargs or {})
new = getattr(cls, create_method, cls)(**kwargs)
new = getattr(self, create_method, cls)(**kwargs)
session.add(new)
return new
......@@ -56,6 +58,14 @@ class Agency(db.Model, BMModel):
api_call_id = db.Column(db.Integer, db.ForeignKey('api_call.id', ondelete="set null"))
api_call = db.relationship("ApiCall", backref="agencies")
@property
def center(self):
"""
Centerpoint coordinates for this agency.
"""
lat = (self.lat_max + self.lat_min) / 2
lon = (self.lon_max + self.lon_min) / 2
return [lat, lon]
class Prediction(db.Model, BMModel):
"""
......@@ -304,3 +314,16 @@ class ApiCall(db.Model, BMModel):
# Parameters (request variables) of this API call
params = db.Column(postgresql.JSON)
# Hybrid properties (can't be defined until relevant classes are defined)
# Agency boundaries (derived from Route boundaries)
Agency.lat_min = column_property(db.select([db.func.min(Route.lat_min)])\
.where(Route.agency_id==Agency.id))
Agency.lat_max = column_property(db.select([db.func.max(Route.lat_max)])\
.where(Route.agency_id==Agency.id))
Agency.lon_min = column_property(db.select([db.func.min(Route.lon_min)])\
.where(Route.agency_id==Agency.id))
Agency.lon_max = column_property(db.select([db.func.max(Route.lon_max)])\
.where(Route.agency_id==Agency.id))
This diff is collapsed.
body {
padding-top: 50px;
padding-bottom: 30px;
}
......@@ -29,19 +29,23 @@
maxZoom: 18,
zoomControl: false,
};
var bounds = [
[40.400, -74.65], // sw
[40.600, -74.25], // ne
[{{ agency.lat_min }}, {{ agency.lon_min }}],
[{{ agency.lat_max }}, {{ agency.lon_max }}]
];
var center = {{ agency.center }};
var boundsOptions = {
animate: false,
reset: true,
};
var osm = "<a href=\"http://openstreetmap.org\">OpenStreetMap</a>";
var tileUrl = 'http://{s}.tiles.antsar-static.com/{tileset}/{z}/{x}/{y}.png';
var tileOptions = {
subdomains: ['a', 'b', 'c', 'd', 'e'],
attribution: '&copy; ' + osm + ' Contributors',
attribution: '<a href="https://ant.sr/">ant.sr</a> '
+ '<br>Map Data &copy; '
+ '<a href="http://openstreetmap.org">OSM Contributors</a>'
+ '<br>Bus Data &copy; {{ agency.title }}',
tileset: 'rutgers-black',
errorTileUrl: 'http://tiles.antsar-static.com/generic/tile-blank-black.png',
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment