from flaskapp.database import Base
from sqlalchemy import Column, String, ForeignKey, Integer, Sequence
from typing import Optional
from sqlalchemy.orm.session import Session
from sqlalchemy.orm.query import Query
[docs]class CategoryModel(Base):
"""ORM class for category objects."""
__tablename__ = "category"
id = Column(Integer, Sequence("my_sequence"), primary_key=True)
parent_id = Column(Integer, ForeignKey("category.id"))
name = Column(String(50))
level = Column(Integer)
def __repr__(self):
"""Returns a readable representation of a category object."""
return f"Category('{self.id}', '{self.parent_id}', '{self.name}', '{self.level}')"
[docs] @classmethod
def find_by_id_query(cls, db: Session, id: int) -> Query:
"""
Returns a category object associated with given id.
Parameters
----------
db: Session
The database session in which to execute the query.
id: int
The id of the required category object.
Returns
----------
Query
The query for finding category object by id.
"""
return db.query(cls).filter(cls.id == id)
[docs] @classmethod
def find_all_query(cls, db: Session) -> Query:
"""
Returns all category objects.
Parameters
----------
db: Session
The database session in which to execute the query.
Returns
----------
Query
The query for finding all category objects present in the database.
"""
return db.query(cls)
[docs] @classmethod
def find_by_level_query(cls, db: Session, level: int) -> Query:
"""
Returns all category objects belonging to given level.
Parameters
----------
db: Session
The database session in which to execute the query.
level: int
The category level of the required category objects.
Returns
----------
Query
The query for finding all category objects of the given level.
"""
return db.query(cls).filter(cls.level == level)
[docs] @classmethod
def find_all_children_query(cls, db: Session, category_id: int):
"""
Returns all immediate children of a given category.
Parameters
----------
db: Session
The database session in which to execute the query.
category_id: int
The id of the category object whose children are required.
Returns
----------
Query
The query for finding all immediate children of category object of given id.
"""
return db.query(cls).filter(cls.parent_id == category_id)
[docs] @classmethod
def find_if_exists_query(cls, db: Session, parent_id: Optional[int] = None,
name: Optional[str] = None, level: Optional[int] = None) -> Query:
"""
Check existence of a given category object.
Parameters
----------
db: Session
The database session in which to execute the query.
parent_id: int, optional
The parent id of the category object.
name: str, optional
The name of the category object.
level: int, optional
The level of the category object.
Returns
----------
Query
The query for returning all matching objects.
"""
q = db.query(cls)
if parent_id is not None:
q = q.filter(cls.parent_id == parent_id)
if name is not None:
q = q.filter(cls.name == name)
if level is not None:
q = q.filter(cls.level == level)
return q
[docs] def save(self, db: Session) -> None:
"""
Save a category object.
Parameters
----------
db: Session
The database session in which to execute the query.
"""
db.add(self)