65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
"""Contains the data models used throughout the application."""
|
|
import dataclasses
|
|
import datetime
|
|
import typing
|
|
|
|
import sqlalchemy.orm # type: ignore [import]
|
|
|
|
from playlist.data import base
|
|
|
|
mapper_registry = sqlalchemy.orm.registry()
|
|
|
|
|
|
@mapper_registry.mapped
|
|
@dataclasses.dataclass
|
|
class Track(base.BaseData):
|
|
"""Model defining a Track object."""
|
|
|
|
__tablename__ = "tracks"
|
|
|
|
id: int = dataclasses.field(
|
|
init=False,
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)},
|
|
)
|
|
plex_id: int = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
|
|
)
|
|
track_num: int = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
|
|
)
|
|
title: str = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
|
|
)
|
|
artist: str = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
|
|
)
|
|
album_num: int = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
|
|
)
|
|
album: str = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
|
|
)
|
|
album_artist: str = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(100), nullable=False)},
|
|
)
|
|
duration: int = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
|
|
)
|
|
comments: str = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.String(2000), nullable=False)},
|
|
)
|
|
added: datetime.datetime = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.DateTime, nullable=False)},
|
|
)
|
|
play_count: int = dataclasses.field(
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer, nullable=False)},
|
|
)
|
|
rating: typing.Optional[int] = dataclasses.field(
|
|
default=None,
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.Integer)},
|
|
)
|
|
played: typing.Optional[datetime.datetime] = dataclasses.field(
|
|
default=None,
|
|
metadata={"sa": sqlalchemy.Column(sqlalchemy.DateTime)},
|
|
)
|