Desacoblar playlists de sessions i afegir slow jams
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import dataclasses
|
||||
import enum
|
||||
from collections.abc import Iterator
|
||||
from typing import Self
|
||||
|
||||
@@ -6,10 +7,15 @@ from folkugat_web.model.temes import Tema
|
||||
from folkugat_web.utils import groupby
|
||||
|
||||
|
||||
class PlaylistType(enum.Enum):
|
||||
SESSION_SETLIST = "session_setlist"
|
||||
SESSION_SLOWJAM = "session_slowjam"
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class PlaylistEntry:
|
||||
id: int | None
|
||||
session_id: int
|
||||
playlist_id: int
|
||||
set_id: int
|
||||
tema_id: int | None
|
||||
|
||||
@@ -20,17 +26,21 @@ class TemaInSet:
|
||||
tema_id: int | None
|
||||
tema: Tema | None
|
||||
|
||||
def to_playlist_entry(self, session_id: int, set_id: int) -> PlaylistEntry:
|
||||
def to_playlist_entry(self, playlist_id: int, set_id: int) -> PlaylistEntry:
|
||||
return PlaylistEntry(
|
||||
id=self.id,
|
||||
session_id=session_id,
|
||||
playlist_id=playlist_id,
|
||||
set_id=set_id,
|
||||
tema_id=self.tema_id,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_playlist_entry(cls, entry: PlaylistEntry) -> Self:
|
||||
return cls(id=entry.id, tema_id=entry.tema_id, tema=None)
|
||||
return cls(
|
||||
id=entry.id,
|
||||
tema_id=entry.tema_id,
|
||||
tema=None,
|
||||
)
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
@@ -45,10 +55,10 @@ class Set:
|
||||
temes: list[TemaInSet]
|
||||
score: SetScore | None
|
||||
|
||||
def to_playlist_entries(self, session_id: int) -> Iterator[PlaylistEntry]:
|
||||
def to_playlist_entries(self, playlist_id: int) -> Iterator[PlaylistEntry]:
|
||||
for tema_in_set in self.temes:
|
||||
yield tema_in_set.to_playlist_entry(
|
||||
session_id=session_id,
|
||||
playlist_id=playlist_id,
|
||||
set_id=self.id,
|
||||
)
|
||||
|
||||
@@ -58,26 +68,29 @@ class Set:
|
||||
raise ValueError("All PlaylistEntries must have the same session_id")
|
||||
return cls(
|
||||
id=set_id,
|
||||
temes=[TemaInSet.from_playlist_entry(entry) for entry in sorted(entries, key=lambda e: e.id or 0)],
|
||||
temes=[
|
||||
TemaInSet.from_playlist_entry(entry)
|
||||
for entry in sorted(entries, key=lambda e: e.id or 0)
|
||||
],
|
||||
score=None,
|
||||
)
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class Playlist:
|
||||
session_id: int
|
||||
id: int
|
||||
sets: list[Set]
|
||||
|
||||
def to_playlist_entries(self) -> Iterator[PlaylistEntry]:
|
||||
for set_entry in self.sets:
|
||||
yield from set_entry.to_playlist_entries(session_id=self.session_id)
|
||||
yield from set_entry.to_playlist_entries(playlist_id=self.id)
|
||||
|
||||
@classmethod
|
||||
def from_playlist_entries(cls, session_id: int, entries: list[PlaylistEntry]) -> Self:
|
||||
if any(entry.session_id != session_id for entry in entries):
|
||||
raise ValueError("All PlaylistEntries must have the same session_id")
|
||||
def from_playlist_entries(cls, playlist_id: int, entries: list[PlaylistEntry]) -> Self:
|
||||
if any(entry.playlist_id != playlist_id for entry in entries):
|
||||
raise ValueError("All PlaylistEntries must have the same playlist_id")
|
||||
return cls(
|
||||
session_id=session_id,
|
||||
id=playlist_id,
|
||||
sets=[
|
||||
Set.from_playlist_entries(set_id, set_entries)
|
||||
for set_id, set_entries in groupby(entries, key_fn=lambda e: e.set_id, group_fn=list)
|
||||
|
||||
@@ -2,6 +2,8 @@ import dataclasses
|
||||
import datetime
|
||||
import enum
|
||||
|
||||
from folkugat_web.model import playlists
|
||||
|
||||
DEFAULT_START_TIME = datetime.time(20, 30)
|
||||
DEFAULT_END_TIME = datetime.time(22, 30)
|
||||
|
||||
@@ -21,6 +23,8 @@ class Session:
|
||||
venue: SessionVenue = dataclasses.field(default_factory=SessionVenue)
|
||||
notes: str | None = None
|
||||
cartell_url: str | None = None
|
||||
slowjam: playlists.Playlist | None = None
|
||||
setlist: playlists.Playlist | None = None
|
||||
is_live: bool = False
|
||||
|
||||
|
||||
|
||||
@@ -4,13 +4,15 @@ import dataclasses
|
||||
import datetime
|
||||
import enum
|
||||
import itertools
|
||||
from typing import Self
|
||||
from typing import TYPE_CHECKING, Self
|
||||
|
||||
from folkugat_web.model.lilypond.processing import RenderError
|
||||
from folkugat_web.model.search import NGrams
|
||||
from folkugat_web.model.sessions import Session
|
||||
from folkugat_web.services import ngrams
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from folkugat_web.model.sessions import Session
|
||||
|
||||
|
||||
class ContentType(enum.Enum):
|
||||
PARTITURA = "partitura"
|
||||
|
||||
Reference in New Issue
Block a user