Session editor and live sessions!

This commit is contained in:
marc
2025-03-21 19:42:43 +01:00
parent 6c83d11e5b
commit ac54453b7f
54 changed files with 1247 additions and 173 deletions

View File

@@ -0,0 +1,77 @@
import dataclasses
from collections.abc import Iterator
from typing import Optional, Self
from folkugat_web.model.temes import Tema
from folkugat_web.utils import groupby
@dataclasses.dataclass
class PlaylistEntry:
id: Optional[int]
session_id: int
set_id: int
tema_id: Optional[int]
@dataclasses.dataclass
class TemaInSet:
id: Optional[int]
tema_id: Optional[int]
tema: Optional[Tema]
def to_playlist_entry(self, session_id: int, set_id: int) -> PlaylistEntry:
return PlaylistEntry(
id=self.id,
session_id=session_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)
@dataclasses.dataclass
class Set:
id: int
temes: list[TemaInSet]
def to_playlist_entries(self, session_id) -> Iterator[PlaylistEntry]:
for tema_in_set in self.temes:
yield tema_in_set.to_playlist_entry(
session_id=session_id,
set_id=self.id,
)
@classmethod
def from_playlist_entries(cls, set_id: int, entries: list[PlaylistEntry]) -> Self:
if any(entry.set_id != set_id for entry in entries):
raise ValueError("All PlaylistEntries must have the same session_id")
return cls(
id=set_id,
temes=[TemaInSet.from_playlist_entry(entry) for entry in entries],
)
@dataclasses.dataclass
class Playlist:
session_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)
@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")
return cls(
session_id=session_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)
],
)

View File

@@ -125,4 +125,4 @@ class Tema:
return self
def score(self) -> Optional[Link]:
return next(filter(lambda l: l.content_type is ContentType.PARTITURA, self.links), None)
return next(filter(lambda l: l.content_type is ContentType.PARTITURA and l.url.startswith('/'), self.links), None)