diff options
Diffstat (limited to 'ebus/web')
-rw-r--r-- | ebus/web/__init__.py | 67 | ||||
-rw-r--r-- | ebus/web/controller.py | 17 | ||||
-rw-r--r-- | ebus/web/model.py | 79 |
3 files changed, 80 insertions, 83 deletions
diff --git a/ebus/web/__init__.py b/ebus/web/__init__.py index e69de29..cfec3f0 100644 --- a/ebus/web/__init__.py +++ b/ebus/web/__init__.py @@ -0,0 +1,67 @@ +# coding: utf-8 +import os +import time +import datetime +import calendar + +import bottle +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from ebus.sql import model + +app = bottle.Bottle("ebus") +bottle.debug() + +engine = create_engine("postgresql://jack:jack@10.2.2.22:5432/ebus",echo=True) +Session = sessionmaker() +Session.configure(bind=engine) + +@app.route("/") +def do_index(): + return serve_static("index.html") + +@app.route('/static/:filename') +def serve_static(filename): + return bottle.static_file(filename, + root=os.path.join(os.path.dirname(__file__),"static")) + +@app.route("/list") +def list(): + sensors = Session().query(model.Sensor).all() + return {"type":"list","data":map(lambda sensor: sensor.name, sensors)} + +@app.route("/:when#today|yesterday|week|month#/:sensor") +def get_value(when,sensor): + s = Session() + sensor = s.query(model.Sensor).filter(model.Sensor.name == sensor).first() + values = Session().query(model.Value).add_columns("value_float","value_string","value_int") + values = values.filter(model.Value.sensor == sensor) + + now = datetime.datetime.now() + f,t = None, None + if when == "today": + f = now.date() + t = now.date() + datetime.timedelta(1) + elif when == "yesterday": + f = now.date() - datetime.timedelta(1) + t = now + elif when == "week": + f = now.date() - datetime.timedelta(now.isoweekday()) + t = now.date() + datetime.timedelta(7-now.isoweekday()) + elif when == "month": + f = now.date() - datetime.timedelta(now.day) + t = f + datetime.timedelta( calendar.monthrange(f.year, f.month)[1] ) + else: + raise Exception("illegal timerange") + + values = values.filter(model.Value.timestamp.between(f,t)) + x = values.all() + + v=[] + for value in values.all(): + v.append(value.value()) + return {"type":when,"data":v} + + + diff --git a/ebus/web/controller.py b/ebus/web/controller.py index 683bb6c..99d7053 100644 --- a/ebus/web/controller.py +++ b/ebus/web/controller.py @@ -6,7 +6,7 @@ from werkzeug.contrib.cache import SimpleCache from simplejson import dumps as dump_json from sqlalchemy.orm import sessionmaker -from ebus import model +from ebus.web import model Session = sessionmaker() @@ -35,13 +35,14 @@ def index(req): filename=os.path.join(os.path.dirname(__file__), "static", "index.html") return open(filename,"r").read() -@itty.get('/json/(?P<sensor>[^/]+)') -@itty.get('/json/(?P<sensor>[^/]+)/from_date/(?P<from_date>[^/]+)') -@itty.get('/json/(?P<sensor>[^/]+)/from_date/(?P<from_date>[^/]+)/till_date/(?P<till_date>[^/]+)') +#@itty.get('/json/(?P<sensor>[^/]+)') +#@itty.get('/json/(?P<sensor>[^/]+)/from_date/(?P<from_date>[^/]+)') +#@itty.get('/json/(?P<sensor>[^/]+)/from_date/(?P<from_date>[^/]+)/till_date/(?P<till_date>[^/]+)') @CacheDecorator(key=lambda args,kwargs: tuple(kwargs.keys()) + tuple(kwargs.values()), timeout=20) def json(req,sensor=None,from_date=None,till_date=None): print "sensor=%s from_date=%s till_date=%s" % (sensor,from_date,till_date) + """ values = Session().query(model.Value).join(model.Sensor) if sensor: @@ -56,9 +57,17 @@ def json(req,sensor=None,from_date=None,till_date=None): response = {"sensor":sensor, "from_date":from_date, "till_date":till_date, "values":values.all()} return itty.Response(dump_json(response), content_type="application/json") + """ + return itty.Response("") + +@itty.get('/json/list') +def list(req): + sensors = Session().query(model.Sensor) + return str(sensors.all()) @itty.get("/static/(?P<filename>.+)") def static(request,filename): + return "" file = itty.static_file(filename, root=os.path.join(os.path.dirname(__file__), 'static')) return itty.Response(file, content_type=itty.content_type(file)) diff --git a/ebus/web/model.py b/ebus/web/model.py deleted file mode 100644 index 7e21e82..0000000 --- a/ebus/web/model.py +++ /dev/null @@ -1,79 +0,0 @@ -from datetime import datetime -from sqlalchemy import Column, Integer, Float, DateTime, String, ForeignKey -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base - -ModelBase = declarative_base() - -class Sensor(ModelBase): - __tablename__ = 'sensor' - - id = Column(Integer, primary_key=True) - name = Column(String) - description = Column(String, default="") - - def __init__(self, name, description=""): - self.name = name - self.description = description - - def __repr__(self): - return "<Sensor('%s','%s','%s')>" % (self.id, self.name, self.description) - -# http://www.sqlalchemy.org/docs/05/reference/ext/declarative.html#inheritance-configuration -class Value(ModelBase): - __tablename__ = 'value' - - id = Column(Integer, primary_key=True) - timestamp = Column(DateTime) - sensor_id = Column(Integer, ForeignKey("sensor.id")) - sensor = relationship(Sensor, backref=backref('values', order_by=timestamp)) - - discriminator = Column('type', String(50)) - __mapper_args__ = {'polymorphic_on': discriminator} - - def __init__(self, sensor, timestamp=datetime.now()): - self.timestamp = timestamp - self.sensor = sensor - - def __repr__(self): - return "<Value('%s','%s','%s','%s'>" % (self.id, self.sensor, self.value, self.timestamp) - - def value(self): - raise NotImplementedException() - -class ValueFloat(Value): - __mapper_args__ = {'polymorphic_identity': 'float'} - value_float = Column(Float(precision=4)) - - def __init__(self, sensor, value, timestamp=datetime.now()): - Value.__init__(self, sensor, timestamp) - self.value_float = value - - def value(self): - return self.value_float - -class ValueInt(Value): - __mapper_args__ = {'polymorphic_identity': 'int'} - value_int = Column(Integer) - - def __init__(self, sensor, value, timestamp=datetime.now()): - Value.__init__(self, sensor, timestamp) - self.value_int = value - - def value(self): - return self.value_int - -class ValueString(Value): - __mapper_args__ = {'polymorphic_identity': 'string'} - value_string = Column(String) - - def __init__(self, sensor, value, timestamp=datetime.now()): - Value.__init__(self, sensor, timestamp) - self.value_string = value - - def value(self): - return self.value_string - - - - |