class OrderedProduct(db.Model): id = db.Column(db.Integer, primary_key=True) order_id = db.Column(db.Integer, db.ForeignKey("order.id"), nullable=False) product_id = db.Column(db.Integer, db.ForeignKey("product.id"), nullable=False) quantity = db.Column(db.Integer, nullable=False) def __repr__(self): return f"Ordered('{self.id}', '{self.order_id}','{self.product_id}','{self.quantity}')"
class CartItem(db.Model): id = db.Column(db.Integer, primary_key=True) cart_id = db.Column(db.Integer, db.ForeignKey("user_cart.id"), nullable=False) product_id = db.Column(db.Integer, db.ForeignKey("product.id"), nullable=False) quantity = db.Column(db.Integer, nullable=False) def __repr__(self): return f"CartItem('{self.id}', '{self.cart_id}','{self.product_id}','{self.quantity}')"
class ProductRating(db.Model): id = db.Column(db.Integer, primary_key=True) rating = db.Column(db.Integer, nullable=False) comments = db.Column(db.Text(500), nullable=False) product_id = db.Column(db.Integer, db.ForeignKey("product.id"), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) def __repr__(self): return f"ProductRating('{self.id}','{self.rating}, {self.product_id}')"
class Order(db.Model): id = db.Column(db.Integer, primary_key=True) order_date = db.Column(db.String(100), nullable=False) total_price = db.Column(db.DECIMAL, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) items = db.relationship("OrderedProduct", backref="order", lazy=True) tracking_no = db.Column(db.String(30), nullable=True, default=None) confirm_received = db.Column(db.Boolean, nullable=False, default=False) address_id = db.Column(db.Integer, db.ForeignKey("address.id", ondelete='SET NULL'), nullable=True) def __repr__(self): return f"Order('{self.id}', '{self.order_date}','{self.total_price}','{self.user_id}'')"
class UserCart(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) user = db.relationship("User", back_populates="cart") items = db.relationship("CartItem", backref="cart", lazy=True) def __repr__(self): return f"UserCart('{self.id}','{self.total_price}','{self.user_id}'')"
class Card(db.Model): id = db.Column(db.Integer, primary_key=True) type = db.Column(db.String(20), nullable=False) name = db.Column(db.String(30), nullable=False) number = db.Column(db.String(20), nullable=False) cvc = db.Column(db.String(4), nullable=False) expiry = db.Column(db.String(100), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) def __repr__(self): return f"Card('{self.name}', '{self.number}', '{self.cvc}', '{self.expiry}')"
class Address(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), unique=False, nullable=False) contact = db.Column(db.String(30), unique=False, nullable=False) description = db.Column(db.String(20), unique=False, nullable=False) address_1 = db.Column(db.String(100), nullable=False) address_2 = db.Column(db.String(100), nullable=True) postal_code = db.Column(db.String(10), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) default = db.Column(db.Boolean, nullable=False, default=False) def __repr__(self): return f"Address('{self.description}', '{self.address_1} {self.address_2} {self.postal_code}')"
class LoginAttempts(db.Model): id = db.Column(db.Integer, primary_key=True) ip_address = db.Column(db.String(20), nullable=False) successful = db.Column(db.Boolean, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) timestamp = db.Column(db.String(100), nullable=False) def __init__(self, ip_address, successful, user_id): self.ip_address = ip_address self.successful = successful self.user_id = user_id self.timestamp = datetime.datetime.now().timestamp() def __repr__(self): return f"LoginAttempt('{self.user_id}', '{self.successful}', '{self.ip_address}')"
class User2FA(db.Model): id = db.Column(db.Integer, primary_key=True) pin = db.Column(db.String(6), unique=False) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) expiry = db.Column(db.String(100), nullable=False) used = db.Column(db.Boolean, nullable=False, default=False) def __init__(self, user_id): expired_dt = datetime.datetime.now() + datetime.timedelta(seconds=300) system_random = random.SystemRandom() self.user_id = user_id self.pin = str(system_random.randrange(100000, 999999)) self.expiry = str(expired_dt.timestamp()) def is_expired(self): expiry_time = float(self.expiry) now = datetime.datetime.now().timestamp() if now > expiry_time: return True else: return False def __repr__(self): return f"User2FA('{self.user_id}', '{self.pin}')"
class ResetPasswordToken(db.Model): token = db.Column(db.String(300), primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) def __repr__(self): return f"ResetPasswordLInk('{self.token}','{self.user_id}')"