backend/models/postgis/interests.py (53 lines of code) (raw):
from backend import db
from backend.models.dtos.interests_dto import InterestDTO, InterestsListDTO
from backend.models.postgis.utils import NotFound
# Secondary table defining many-to-many join for interests of a user.
user_interests = db.Table(
"user_interests",
db.metadata,
db.Column("interest_id", db.Integer, db.ForeignKey("interests.id")),
db.Column("user_id", db.BigInteger, db.ForeignKey("users.id")),
)
# Secondary table defining many-to-many join for interests of a project.
project_interests = db.Table(
"project_interests",
db.metadata,
db.Column("interest_id", db.Integer, db.ForeignKey("interests.id")),
db.Column("project_id", db.BigInteger, db.ForeignKey("projects.id")),
)
class Interest(db.Model):
""" Describes an interest for projects and users"""
__tablename__ = "interests"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
@staticmethod
def get_by_id(interest_id: int):
""" Get interest by id """
interest = Interest.query.get(interest_id)
if interest is None:
raise NotFound(f"Interest id {interest_id} not found")
return interest
@staticmethod
def get_by_name(name: str):
""" Get interest by name """
interest = Interest.query.filter(Interest.name == name).first()
if interest is None:
raise NotFound(f"Interest name {name} not found")
return interest
def update(self, dto):
""" Update existing interest """
self.name = dto.name
db.session.commit()
def create(self):
""" Creates and saves the current model to the DB """
db.session.add(self)
db.session.commit()
def save(self):
""" Save changes to db"""
db.session.commit()
def delete(self):
""" Deletes the current model from the DB """
db.session.delete(self)
db.session.commit()
def as_dto(self) -> InterestDTO:
""" Get the interest from the DB """
dto = InterestDTO()
dto.id = self.id
dto.name = self.name
return dto
@staticmethod
def get_all_interests():
"""Get all interests"""
query = Interest.query.all()
interest_list_dto = InterestsListDTO()
interest_list_dto.interests = [interest.as_dto() for interest in query]
return interest_list_dto