76 lines
2.1 KiB
Python
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)
|