bensin_site/app/models.py

76 lines
2.1 KiB
Python

from app import db
from datetime import datetime, date
class AutoSerialize(object):
'Mixin for retrieving public fields of model in json-compatible format'
__public__ = None
def get_public(self, exclude=(), extra=()):
"Returns model's PUBLIC data for jsonify"
data = {}
keys = self._sa_instance_state.attrs.items()
public = self.__public__ + extra if self.__public__ else extra
for k, field in keys:
if public and k not in public: continue
if k in exclude: continue
value = self._serialize(field.value)
if value:
data[k] = value
return data
@classmethod
def _serialize(cls, value, follow_fk=False):
if type(value) in (datetime, date):
ret = value.isoformat()
elif hasattr(value, '__iter__'):
ret = []
for v in value:
ret.append(cls._serialize(v))
elif AutoSerialize in value.__class__.__bases__:
ret = value.get_public()
else:
ret = value
return ret
class Gas(db.Model, AutoSerialize):
"""
Create a gas table
"""
__table_args__ = {'extend_existing': True}
__tablename__ = 'gas'
__public__ = ('price', 'volume', 'milage', 'date',
'wintertyre', 'car', 'id')
id = db.Column(db.Integer, primary_key=True)
price = db.Column(db.Integer)
volume = db.Column(db.Integer)
milage = db.Column(db.Integer)
date = db.Column(db.DateTime, default=datetime.utcnow)
winterTyre = db.Column(db.Boolean)
car_id = db.Column(db.Integer, db.ForeignKey('car.id'))
def __ref__(self):
return '<Gas :{}>'.format(self.id)
class Car(db.Model, AutoSerialize):
"""
Create a table of cars
"""
__tablename__ = 'car'
__public__ = ('name', 'id')
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
cars = db.relationship('Gas', backref='car',
lazy='dynamic')
def __ref__(self):
return '<Gas :{}>'.format(self.id)