95 lines
2.5 KiB
Python
95 lines
2.5 KiB
Python
"""Sound played tracking model."""
|
|
|
|
from datetime import datetime
|
|
from zoneinfo import ZoneInfo
|
|
|
|
from sqlalchemy import DateTime, ForeignKey, Integer, func, text
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from app.database import db
|
|
|
|
|
|
class SoundPlayed(db.Model):
|
|
"""Model to track when users play sounds."""
|
|
|
|
__tablename__ = "sound_played"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
|
|
# Foreign keys
|
|
user_id: Mapped[int] = mapped_column(
|
|
Integer,
|
|
ForeignKey("user.id"),
|
|
nullable=True,
|
|
)
|
|
sound_id: Mapped[int] = mapped_column(
|
|
Integer,
|
|
ForeignKey("sound.id"),
|
|
nullable=False,
|
|
)
|
|
|
|
# Timestamp
|
|
played_at: Mapped[datetime] = mapped_column(
|
|
DateTime,
|
|
default=lambda: datetime.now(tz=ZoneInfo("UTC")),
|
|
nullable=False,
|
|
)
|
|
|
|
# Relationships
|
|
user: Mapped["User"] = relationship("User", backref="sounds_played")
|
|
sound: Mapped["Sound"] = relationship("Sound", backref="play_history")
|
|
|
|
def __repr__(self) -> str:
|
|
"""Return string representation of SoundPlayed."""
|
|
return (
|
|
f"<SoundPlayed user_id={self.user_id} sound_id={self.sound_id} "
|
|
f"at={self.played_at}>"
|
|
)
|
|
|
|
def to_dict(self) -> dict:
|
|
"""Convert sound played record to dictionary."""
|
|
return {
|
|
"id": self.id,
|
|
"user_id": self.user_id,
|
|
"sound_id": self.sound_id,
|
|
"played_at": self.played_at.isoformat(),
|
|
"user": (
|
|
{
|
|
"id": self.user.id,
|
|
"name": self.user.name,
|
|
"email": self.user.email,
|
|
}
|
|
if self.user
|
|
else None
|
|
),
|
|
"sound": (
|
|
{
|
|
"id": self.sound.id,
|
|
"name": self.sound.name,
|
|
"filename": self.sound.filename,
|
|
"type": self.sound.type,
|
|
}
|
|
if self.sound
|
|
else None
|
|
),
|
|
}
|
|
|
|
@classmethod
|
|
def create_play_record(
|
|
cls,
|
|
user_id: int | None,
|
|
sound_id: int,
|
|
*,
|
|
commit: bool = True,
|
|
) -> "SoundPlayed":
|
|
"""Create a new sound played record."""
|
|
play_record = cls(
|
|
user_id=user_id,
|
|
sound_id=sound_id,
|
|
)
|
|
|
|
db.session.add(play_record)
|
|
if commit:
|
|
db.session.commit()
|
|
return play_record
|