"""Artist model.""" from typing import Type from db import db from models.polymorphable import Polymorphable from models.mixins.searchable import SearchableMixin class Artist(SearchableMixin, Polymorphable): """Artist model.""" __tablename__ = "Artist" __searchable__ = {"name": {"type": "text", "analyzer": "autocomplete", "search_analyzer": "standard"}} id = db.Column(db.Integer, db.ForeignKey(Polymorphable.id), primary_key=True) external_id = db.Column(db.String, nullable=True, unique=True) name = db.Column(db.String, nullable=False) is_sony = db.Column(db.Boolean, nullable=False) is_unknown = db.Column(db.Boolean, nullable=False, server_default="FALSE") artist_level_id = db.Column(db.Integer, db.ForeignKey("ArtistLevel.id"), nullable=True) artist_level = db.relationship("ArtistLevel") genres = db.relationship("ArtistGenre", back_populates="artist") tracks = db.relationship("Track", secondary="ArtistTrack") albums = db.relationship("Album", secondary="ArtistAlbum") images = db.relationship("Image", lazy="subquery") team = db.relationship("ArtistTeam") __mapper_args__ = {"polymorphic_identity": "Artist", "polymorphic_load": "inline"} __table_args__ = (db.CheckConstraint(r"external_id ~ '^GRAS_\d*$'", name="ck_Artist_external_id_value_format"),) def __init__(self, external_id: str, name: str): self.external_id = external_id self.name = name self.is_sony = True @classmethod def es_query(cls: Type[db.Model]): return cls.query.filter_by(is_deleted=False) artist_track = db.Table( "ArtistTrack", db.Model.metadata, db.Column("artist_id", db.BigInteger, db.ForeignKey("Artist.id"), primary_key=True), db.Column("track_id", db.BigInteger, db.ForeignKey("Track.id"), primary_key=True), ) artist_album = db.Table( "ArtistAlbum", db.Model.metadata, db.Column("artist_id", db.BigInteger, db.ForeignKey("Artist.id"), primary_key=True), db.Column("album_id", db.BigInteger, db.ForeignKey("Album.id"), primary_key=True), )