class TimeAudit(object): @declared_attr def __tablename__(cls): return cls.__name__.lower() created_at = db.Column(db.TIMESTAMP(timezone=True), nullable=False, default=db.func.now()) updated_at = db.Column(db.TIMESTAMP(timezone=True), nullable=False, default=db.func.now(), onupdate=db.func.now())
class LastLocationPostGis(db.Model): """Simple database model to track the last location of an active user.""" __tablename__ = 'last_location_post_gis' user_id = db.Column(db.Integer, primary_key=True) latest_point = db.Column(Geography(geometry_type='POINT', srid=4326), nullable=True) last_modified = db.Column(db.TIMESTAMP(120), nullable=True, default=dt.datetime.utcnow()) active = db.Column(db.BOOLEAN(120), nullable=False) # define relationships with other tables person_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) def __init__(self, point=None, person_id=None): self.latest_point = point self.last_modified = dt.datetime.utcnow() self.active = True self.person_id = person_id self.user_id = person_id def serialize(self): return { 'user_id': self.user_id, 'latest_point_lat': str(to_shape(self.latest_point).y), 'latest_point_lng': str(to_shape(self.latest_point).x), 'last_modified': self.last_modified, 'active': self.active, 'person_id': self.person_id, }
class User(db.Model): email = db.Column(db.String(50), primary_key=True) name = db.Column(db.String(50), nullable=False) password = db.Column(db.String, nullable=False) last_offer_time = db.Column(db.TIMESTAMP(timezone=True), nullable=True) businesses = db.relationship('Business', backref='manager', lazy=True, cascade='all, delete-orphan') interests = db.relationship('Interest', secondary=user_interest, lazy='subquery', backref=db.backref('users', lazy=True)) def __init__(self, email, name, password, businesses=[], interests=[], last_offer_time=datetime.datetime.now(datetime.timezone.utc)): self.email = email self.name = name self.password = password self.last_offer_time = last_offer_time self.businesses = businesses self.interests = interests def __repr__(self): return "<email='%s', name='%s', password='******', last_offer_time=%r, businesses=%r, interests=%r>" % \ (self.email, self.name, self.password, self.last_offer_time, [b.id for b in self.businesses], [i.name for i in self.interests]) @property def serialize(self): """Return object data in easily serializeable format""" return { 'email': self.email, 'name': self.name, 'last_offer_time': self.last_offer_time.isoformat(), 'interests': [i.serialize for i in self.interests], }
class Feedback(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(150), nullable=False) email = db.Column(db.String(150), nullable=False) subject = db.Column(db.String(150), nullable=False) message = db.Column(db.String(1000), nullable=False) received_at = db.Column(db.TIMESTAMP(120), nullable=False, default=dt.datetime.utcnow()) # person_id = db.Column(db.String(20), nullable=False) def to_dict(self): return { 'id': self.id, 'name': self.name, 'email': self.email, 'subject': self.subject, 'message': self.message, 'received_at': self.received_at, } def __init__(self, name=None, email=None, subject=None, message=None): self.name = name self.email = email self.subject = subject self.message = message self.received_at = dt.datetime.utcnow() def serialize(self): return { 'id': self.id, 'name': self.name, 'email': self.email, 'subject': self.subject, 'message': self.message, 'received_at': self.received_at, }
class InteractedUsers(db.Model): __tablename__ = 'interacted_users' id = db.Column(db.Integer, primary_key=True) interacted_id = db.Column(db.Integer) at_location = db.Column(Geography(geometry_type='POINT', srid=4326), nullable=True) at_time = db.Column(db.TIMESTAMP(120), nullable=True, default=dt.datetime.utcnow()) # define relationships with other tables person_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) db.UniqueConstraint('interacted_id', 'person_id', 'person_interaction'), def __init__(self, point=None, person_id=None, interacted_id=None): self.at_location = point # default self.at_time = dt.datetime.utcnow() # person id is the current user id self.person_id = person_id # we will get this from post api call self.interacted_id = interacted_id def serialize(self): return { 'id': self.id, 'interacted_id': self.interacted_id, 'at_location_lat': str(to_shape(self.at_location).y), 'at_location_lon': str(to_shape(self.at_location).x), 'at_time': self.at_time, 'person_id': self.person_id, }
class Offer(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) start_time = db.Column(db.TIMESTAMP(timezone=True), nullable=False) end_time = db.Column(db.TIMESTAMP(timezone=True), nullable=False) description = db.Column(db.String(100), nullable=False) # Direct access to corresponding offer(offer) using Business business_id = db.Column(db.Integer, db.ForeignKey('business.id'), nullable=False) interests = db.relationship('Interest', secondary=offer_interest, lazy='subquery', backref=db.backref('offers', lazy=True)) users_accepted = db.relationship('User', secondary=user_accepted_offer, lazy='subquery', backref=db.backref('offers_accepted', lazy=True)) users_viewed = db.relationship('User', secondary=user_viewed_offer, lazy='subquery', backref=db.backref('offers_viewed', lazy=True)) __table_args__ = (db.UniqueConstraint( 'description', 'business_id', name='_offer_description_business_uc'), ) def __init__(self, business_id, start_time, end_time, description, interests=[], users_accepted=[], users_viewed=[]): self.business_id = business_id self.start_time = start_time self.end_time = end_time self.description = description self.interests = interests self.users_accepted = users_accepted self.users_viewed = users_viewed def __repr__(self): return "<business_id=%d, start_time=%r, end_time=%r, description='%s', interests=%r, users_accepted=%d, users_viewed=%d>" % \ (self.business_id, self.start_time, self.end_time, self.description, [i.name for i in self.interests], len(self.users_accepted), len(self.users_viewed)) @property def serialize(self): """Return object data in easily serializeable format""" return { 'id': self.id, 'business': { 'id': self.business.id, 'name': self.business.name }, 'start_time': self.start_time.isoformat(), 'end_time': self.end_time.isoformat(), 'description': self.description, 'interests': [i.serialize for i in self.interests], 'accepts': len(self.users_accepted), 'views': len(self.users_viewed), }