class CarPoolParticipant(db.Model): """ Model of all car pool participants (e.g. driver + passengers) """ id = db.Column(db.Integer, primary_key=True) participant_id = db.Column(db.Integer, primary_key=True) role = db.Column(db.Enum(RoleType), nullable=False) fare = db.Column(db.Float(precision=2), nullable=False) fare_currency = db.Column(db.Enum(CurrencyType), nullable=False) __tablename__ = "carpool_participants" __table_args__ = ( db.ForeignKeyConstraint(["participant_id"], ["user.id"]), )
class CarPool(db.Model): """ Model of shared trip via car pooling """ __tablename__ = "carpools" id = db.Column(db.Integer, primary_key=True) created_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) created_by = db.Column(db.Integer, db.ForeignKey("user.id")) start_date = db.Column(db.DateTime, nullable=False) end_date = db.Column(db.DateTime, nullable=False) car_model = db.Column(db.String, nullable=False) max_seats = db.Column(db.Integer, nullable=False) rental_id = db.Column(db.BigInteger, nullable=False) buy_in = db.Column(db.Float(precision=2), nullable=False) buy_in_currency = db.Column(db.Enum(CurrencyType), nullable=False) def __init__(self, **kwargs): super(CarPool, self).__init__(**kwargs) def validate(self): result = requests.get("{0}/rentals/{1}".format("http://localhost:5000/api/v1", self.rental_id)) if result.status_code != 200: raise ValueError("Supplied rental ID not found") rental = json.loads(result.content) if self.start_date < parser.parse(rental["rental"]["pickup_time"]): raise ValueError("Trip start time can not be before pick up time") if self.end_date > parser.parse(rental["rental"]["return_time"]): raise ValueError("Trip end time can not be after return time") if self.car_model != rental["rental"]["car_name"]: raise ValueError("Car models do not match") passenger_constraint = int(rental["rental"]["max_passengers"]) - 1 if self.max_seats > passenger_constraint: raise ValueError("Maximum seat count of {0} exceeded".format(passenger_constraint))
class Cars(db.Model): __tablename__ = "cars" car_id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) type = db.Column(db.String(80), nullable=False) full_price = db.Column(db.Integer, nullable=False) purchase_date = db.Column(db.DateTime, nullable=False) rental_price_day = db.Column(db.Integer, nullable=False) avg_cost_day = db.Column(db.Integer, nullable=False)
class CarRental(db.Model): __tablename__ = "car_rentals" id = db.Column(db.String, primary_key=True) driver_id = db.Column(db.Integer, db.ForeignKey("user.id")) car_id = db.Column(db.Integer, db.ForeignKey("cars.car_id")) max_passengers = db.Column(db.Integer, nullable=False) imageurl = db.Column(db.String) route_id = db.Column(db.Integer, db.ForeignKey("routes.route_id")) pickup_time = db.Column(db.DateTime, nullable=False) return_time = db.Column(db.DateTime, nullable=False) def __init__(self, **kwargs): super(CarRental, self).__init__(**kwargs) self.max_passengers = 4
class CarPoolRequest(db.Model): """ Model of open requests to join a car pool """ id = db.Column(db.Integer, primary_key=True) requested_pool = db.Column(db.Integer, db.ForeignKey("carpools.id")) requester_id = db.Column(db.Integer, db.ForeignKey("user.id")) pick_up_lng = db.Column(db.String()) pick_up_lat = db.Column(db.String()) drop_off_lng = db.Column(db.String()) drop_off_lat = db.Column(db.String()) __tablename__ = "carpool_requests" #TODO: logic for accepting/declining
class User(db.Model): """Basic user model """ id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) first_name = db.Column(db.String(80), nullable=False) second_name = db.Column(db.String(80), nullable=False) email = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(255), nullable=False) active = db.Column(db.Boolean, default=True) def __init__(self, **kwargs): super(User, self).__init__(**kwargs) self.password = pwd_context.hash(self.password) def __repr__(self): return "<User %s>" % self.username
class TokenBlacklist(db.Model): """Blacklist representation """ id = db.Column(db.Integer, primary_key=True) jti = db.Column(db.String(36), nullable=False, unique=True) token_type = db.Column(db.String(10), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) revoked = db.Column(db.Boolean, nullable=False) expires = db.Column(db.DateTime, nullable=False) user = db.relationship('User', lazy='joined') def to_dict(self): return { 'token_id': self.id, 'jti': self.jti, 'token_type': self.token_type, 'user_identity': self.user_identity, 'revoked': self.revoked, 'expires': self.expires }
class Rating(db.Model): user_id = db.Column(db.Integer, primary_key=True) rating_type = db.Column(db.Enum(RatingType), primary_key=True) rating_id = db.Column(db.Integer, primary_key=True) rating = db.Column(db.Integer, nullable=False) rating_text = db.Column(db.String) date_submitted = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow) __tablename__ = "ratings" __table_args__ = (db.ForeignKeyConstraint(["user_id"], ["user.id"]), ) def __init__(self, user_id, rating_type, **kwargs): super(Rating, self).__init__(**kwargs) latest_rating = Rating.query.filter_by(user_id=user_id, rating_type=rating_type).last() if latest_rating is None: self.rating_id = 1 else: self.rating_id = latest_rating.rating_id + 1
class Routes(db.Model): __tablename__ = "routes" route_id = db.Column(db.Integer, primary_key=True) path_name = db.Column(db.String(80), primary_key=True) origin_destination = db.Column(db.Enum(DestinationType), primary_key=True) city = db.Column(db.String(80), nullable=False)