class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(255), nullable=False, unique=True, index=True) email = db.Column(db.String(255), nullable=False, unique=True) password = db.Column(db.String(255), nullable=False) create_date = db.Column(db.DateTime(255), default=datetime.utcnow) @staticmethod def generate_hashed_password(password: str) -> str: return generate_password_hash(password) def is_password_valid(self, password: str) -> bool: return check_password_hash(self.password, password) def generate_jwt(self) -> bytes: payload = { 'user_id': self.id, 'exp': datetime.utcnow() + timedelta( minutes=current_app.config.get('JWT_EXPIRED_MINUTES', 30)) } return jwt.encode(payload, current_app.config.get('SECRET_KEY'))
class Author(db.Model): __tablename__ = 'authors' id = db.Column(db.Integer, primary_key=True) first_name = db.Column(db.String(50), nullable=False) last_name = db.Column(db.String(50), nullable=False) birth_date = db.Column(db.Date, nullable=False) books = db.relationship('Book', back_populates='author', cascade='all, delete-orphan') def __repr__(self): return f'<{self.__class__.__name__}>: {self.first_name} {self.last_name}' @staticmethod def additional_validation(param: str, value: str) -> date: if param == 'birth_date': try: value = datetime.strptime(value, '%d-%m-%Y').date() except ValueError: value = None return value
class Book(db.Model): __tablename__ = 'books' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(50), nullable=False) isbn = db.Column(db.BigInteger, nullable=False, unique=True) number_of_pages = db.Column(db.Integer, nullable=False) description = db.Column(db.Text) author_id = db.Column(db.Integer, db.ForeignKey('authors.id'), nullable=False) author = db.relationship('Author', back_populates='books') def __repr__(self): return f'{self.title} - {self.author.first_name} {self.author.last_name}' @staticmethod def additional_validation(param: str, value: str) -> str: return value