models.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from datetime import datetime
  2. from flask_login import UserMixin
  3. from werkzeug.security import generate_password_hash, check_password_hash
  4. from app import db, login_manager
  5. class User(UserMixin, db.Model):
  6. __tablename__ = 'users'
  7. id = db.Column(db.Integer, primary_key=True)
  8. username = db.Column(db.String(64), unique=True, index=True)
  9. email = db.Column(db.String(120), unique=True, index=True)
  10. password_hash = db.Column(db.String(256))
  11. google_id = db.Column(db.String(128), unique=True, nullable=True)
  12. is_admin = db.Column(db.Boolean, default=False)
  13. is_probation = db.Column(db.Boolean, default=True)
  14. profile_pic_url = db.Column(db.String(256))
  15. restaurants = db.relationship('Restaurant', backref='author', lazy='dynamic')
  16. def set_password(self, password):
  17. self.password_hash = generate_password_hash(password)
  18. def check_password(self, password):
  19. return check_password_hash(self.password_hash, password)
  20. def __repr__(self):
  21. return f'<User {self.username}>'
  22. @login_manager.user_loader
  23. def load_user(id):
  24. return User.query.get(int(id))
  25. class Restaurant(db.Model):
  26. __tablename__ = 'restaurants'
  27. id = db.Column(db.Integer, primary_key=True)
  28. name = db.Column(db.String(128), index=True)
  29. address = db.Column(db.String(256))
  30. latitude = db.Column(db.Float)
  31. longitude = db.Column(db.Float)
  32. google_place_id = db.Column(db.String(128)) # To link with Google Maps
  33. # Lunch Special Info
  34. min_price = db.Column(db.Float)
  35. max_price = db.Column(db.Float)
  36. single_price = db.Column(db.Boolean, default=False)
  37. drink_included = db.Column(db.Boolean, default=False)
  38. options_count = db.Column(db.Integer)
  39. # User Review/Rating
  40. user_rating = db.Column(db.Integer) # 1-10
  41. user_description = db.Column(db.Text)
  42. # Meta
  43. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  44. status = db.Column(db.String(20), default='pending') # pending, approved, rejected
  45. user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
  46. images = db.relationship('RestaurantImage', backref='restaurant', lazy='dynamic', cascade="all, delete-orphan")
  47. def __repr__(self):
  48. return f'<Restaurant {self.name}>'
  49. class RestaurantImage(db.Model):
  50. __tablename__ = 'restaurant_images'
  51. id = db.Column(db.Integer, primary_key=True)
  52. image_url = db.Column(db.String(512))
  53. restaurant_id = db.Column(db.Integer, db.ForeignKey('restaurants.id'))