class Address(db.Model): __tablename__ = 'address' addressID = db.Column(db.Integer, primary_key=True, autoincrement=True) addressStreet = db.Column(db.String(45)) addressCity = db.Column(db.String(45)) addressState = db.Column(db.String(45)) addressZip = db.Column(db.String(45))
class User(db.Model): # global vars for login management is_authenticated = False logged_in = False __tablename__ = 'users' userID = db.Column(db.Integer, primary_key=True, autoincrement=True) userEmail = db.Column(db.String(45)) # varchar(115) userFName = db.Column(db.String(45)) userLName = db.Column(db.String(45)) userStatus = db.Column(db.String(45)) userType = db.Column(db.String(45)) userPassword = db.Column(db.String(250)) userPhone = db.Column(db.String(45)) userSubStatus = db.Column(db.String(45)) addressID = db.Column(db.Integer, db.ForeignKey('address.addressID')) address = db.relationship('Address', lazy=True) cards = db.relationship('PaymentCard', secondary='users_has_card') # override print def __str__(self): return (str(self.userID) + ', ' + self.userEmail + ', ' + self.userFName + ', ' + self.userLName + ', ' + self.userStatus + ', ' + self.userType) # specific for flask_login def is_authenticated(self): return self.is_authenticated def get_id(self): return str(self.userID) def set_status(self, status): self.userStatus = status.value def set_type(self, type): self.userType = type.value # set to value of boolean def set_subscription(self, active): self.userSubStatus = 'Active' if active else 'Deactive' # encryption/decryption methods @hybrid_property def password(self): return fernet.decrypt(self.userPassword.encode()).decode() # must commit to database before using value @password.setter def password(self, plaintext): self.userPassword = fernet.encrypt(plaintext.encode()) # return true if encrypted password matches attempted_password def check_password(self, attempted_password): return (self.password == attempted_password)
class BookCategory(db.Model): __tablename__ = 'book_categories' categoryID = db.Column(db.Integer, primary_key=True) categoryName = db.Column(db.String(45)) books = db.relationship('Book', secondary='book_has_book_categories', back_populates='categories')
class PaymentCard(db.Model): __tablename__ = 'card' cardID = db.Column(db.Integer, primary_key=True, autoincrement=True) cardNumber = db.Column(db.String(250)) # do not access directly cardExpDate = db.Column(db.DateTime) cardType = db.Column(db.String(45)) cardSVC = db.Column(db.String(250)) # do not access directly users = db.relationship('User', secondary='users_has_card', back_populates='cards') def __init__(self, cardNumber, cardExpDate, cardType, cardSVC, **kwargs): super(PaymentCard, self).__init__(**kwargs) self.cardType = cardType self.cardExpDate = cardExpDate self.card_number = cardNumber self.card_svc = cardSVC # encryption/decryption methods # @hybrid_property def card_number(self): return fernet.decrypt(self.cardNumber.encode()).decode() @card_number.setter def card_number(self, number): self.cardNumber = fernet.encrypt(number.encode()) @hybrid_property def card_svc(self): return fernet.decrypt(self.cardSVC.encode()).decode() @card_svc.setter def card_svc(self, svc): self.cardSVC = fernet.encrypt(svc.encode())
class Book(db.Model): __tablename__ = 'book' ISBN = db.Column(db.String(13), primary_key=True) # char(13) PK bookTitle = db.Column(db.String(115)) # varchar(115) authorFName = db.Column(db.String(45)) authorLName = db.Column(db.String(45)) bookImage = db.Column(db.String(50)) bookPrice = db.Column(db.Float) bookQuantity = db.Column(db.Integer) bookRating = db.Column(db.Integer) bookPublisher = db.Column(db.String(45)) bookPublicationDate = db.Column(db.DateTime) bookDescription = db.Column(db.String(1000)) categories = db.relationship('BookCategory', secondary='book_has_book_categories', back_populates='books', lazy=True)
import enum from bookmarqueapp import app, db # associative table book_has_book_categories = db.Table( 'book_has_book_categories', db.Column('ISBN', db.String(13), db.ForeignKey('book.ISBN'), primary_key=True), db.Column('categoryID', db.Integer, db.ForeignKey('book_categories.categoryID'), primary_key=True)) class Book(db.Model): __tablename__ = 'book' ISBN = db.Column(db.String(13), primary_key=True) # char(13) PK bookTitle = db.Column(db.String(115)) # varchar(115) authorFName = db.Column(db.String(45)) authorLName = db.Column(db.String(45)) bookImage = db.Column(db.String(50)) bookPrice = db.Column(db.Float) bookQuantity = db.Column(db.Integer) bookRating = db.Column(db.Integer) bookPublisher = db.Column(db.String(45)) bookPublicationDate = db.Column(db.DateTime) bookDescription = db.Column(db.String(1000))
class UserType(enum.Enum): ADMIN = 'Admin' CUSTOMER = 'Customer' WEB_USER = '******' # user info class Address(db.Model): __tablename__ = 'address' addressID = db.Column(db.Integer, primary_key=True, autoincrement=True) addressStreet = db.Column(db.String(45)) addressCity = db.Column(db.String(45)) addressState = db.Column(db.String(45)) addressZip = db.Column(db.String(45)) # associative table users_has_card = db.Table( 'users_has_card', db.Column('userEmail', db.String(45), db.ForeignKey('users.userEmail'), primary_key=True), db.Column('cardID', db.Integer, db.ForeignKey('card.cardID'), primary_key=True))