Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions audiostats/application/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .models import Status, Success
13 changes: 0 additions & 13 deletions audiostats/application/dto_mappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,6 @@

from audiostats.handlers import AlbumDTO, TrackDTO


# def create_album_f_dto(album : AlbumDTO) -> Album:
# return Album(title=album.title,
# performer=album.performer,
# year=album.year,
# path=album.path,
# cover=album.cover,
# tracks=[Track(title=track.title,
# number=track.number,
# path=track.path,
# offset=track.offset,
# duration=track.duration) for track in album.tracks])

def update_track_orm_f_dto(old : Track, new : TrackDTO) -> None:
old.title = new.title
old.number = new.number
Expand Down
11 changes: 11 additions & 0 deletions audiostats/application/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from enum import StrEnum

class Status(StrEnum):
ADDED = 'added'
MODIFIED = 'modified'

class Success(StrEnum):
SUCCESS = 'success'
WARNING = 'warning'
ERROR = 'error'

32 changes: 19 additions & 13 deletions audiostats/db/models.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from datetime import datetime

from sqlalchemy import String, Integer, UniqueConstraint, ForeignKey, Float, DATETIME
from sqlalchemy import String, Integer, UniqueConstraint, ForeignKey, Float, Enum, DateTime
from sqlalchemy.orm import declarative_base, Mapped, mapped_column, relationship

from audiostats.application import Status, Success

Base = declarative_base()

MAX_PATH_FIELD_LEN = 200
Expand Down Expand Up @@ -34,7 +36,8 @@ class Album(Base):
year : Mapped[int | None] = mapped_column(Integer, nullable=True)
path : Mapped[str | None] = mapped_column(String(MAX_PATH_FIELD_LEN), nullable=True)
cover : Mapped[str | None] = mapped_column(String(MAX_PATH_FIELD_LEN), nullable=True)
tracks : Mapped[list['Track']] = relationship('Track', back_populates='album')
tracks : Mapped[list['Track']] = relationship('Track', back_populates='album', lazy='noload')
album_statuses : Mapped[list['AlbumStatus']] = relationship('AlbumStatus', back_populates='album', lazy='noload')

def __repr__(self):
return f'<Album(year={self.year}, performer={self.performer}, title={self.title})>'
Expand Down Expand Up @@ -63,7 +66,7 @@ class Track(Base):
path : Mapped[str] = mapped_column(String(MAX_PATH_FIELD_LEN), nullable=True)
offset : Mapped[float | None] = mapped_column(Float, nullable=True)
duration : Mapped[float | None] = mapped_column(Float, nullable=True)
album : Mapped["Album"]= relationship('Album', back_populates='tracks')
album : Mapped["Album"]= relationship('Album', back_populates='tracks', lazy='noload')

def __repr__(self):
return f'<Track(title={self.title}, album_id={self.album_id}, number={self.number})>'
Expand All @@ -72,15 +75,18 @@ def __str__(self):
return f'{self.number} - {self.title}'


# class AlbumStatus(Base):
# """Represents **album_statuses** line as orm object"""
#
# __tablename__ = 'album_statuses'
#
# id : Mapped[int] = mapped_column(Integer, primary_key=True)
# album_id : Mapped[int] = mapped_column(Integer, ForeignKey('albums.id', ondelete='CASCADE'), index=True)
# time_stamp : Mapped[datetime] = mapped_column(DATETIME, nullable=False)
# status : Mapped[]
# success : Mapped[]
class AlbumStatus(Base):
"""Represents **album_statuses** line as orm object"""

__tablename__ = 'album_statuses'

id : Mapped[int] = mapped_column(Integer, primary_key=True)
album_id : Mapped[int] = mapped_column(Integer, ForeignKey('albums.id', ondelete='CASCADE'), index=True)
time_stamp : Mapped[datetime] = mapped_column(DateTime, nullable=False)
status : Mapped[Status] = mapped_column(Enum(Status), nullable=False)
success : Mapped[Success] = mapped_column(Enum(Success), nullable=False)
album : Mapped["Album"] = relationship('Album', back_populates='album_statuses', lazy='noload')




4 changes: 3 additions & 1 deletion audiostats/db/repositories.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload

from .models import Album
from .models import Album, AlbumStatus
from audiostats.handlers import AlbumDTO

from audiostats.application.dto_mappers import create_album_dto_f_orm, update_album_orm_meta_f_dto, update_track_orm_f_dto, create_track_orm_f_dto
Expand All @@ -17,10 +17,12 @@ def __init__(self, session : AsyncSession):

async def upsert(self, album_data : AlbumDTO):
album = await self.find_by_title_performer(album_data.title, album_data.performer)
# album_status = AlbumStatus()

if not album:
album = Album()
self._session.add(album)

update_album_orm_meta_f_dto(album, album_data)

old_tracks_by_title = {track.title: track for track in album.tracks}
Expand Down
47 changes: 47 additions & 0 deletions migrations/versions/a337b3f88bf1_added_album_status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""added album status

Revision ID: a337b3f88bf1
Revises: bd8d699fa622
Create Date: 2025-09-16 20:08:54.362324

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'a337b3f88bf1'
down_revision: Union[str, Sequence[str], None] = 'bd8d699fa622'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('album_statuses',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('album_id', sa.Integer(), nullable=False),
sa.Column('time_stamp', sa.DateTime(), nullable=False),
sa.Column('status', sa.Enum('ADDED', 'MODIFIED', name='status'), nullable=False),
sa.Column('success', sa.Enum('SUCCESS', 'WARNING', 'ERROR', name='success'), nullable=False),
sa.ForeignKeyConstraint(['album_id'], ['albums.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_album_statuses_album_id'), 'album_statuses', ['album_id'], unique=False)
# ### end Alembic commands ###


def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_album_statuses_album_id'), table_name='album_statuses')
op.drop_table('album_statuses')

status_enum = sa.Enum('ADDED', 'MODIFIED', name='status')
success_enum = sa.Enum('SUCCESS', 'WARNING', 'ERROR', name='success')
status_enum.drop(op.get_bind())
success_enum.drop(op.get_bind())
# ### end Alembic commands ###