From 1a5d4a6717041dac6efa82d6cb88afafd26284dc Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Sat, 7 Sep 2024 11:36:36 -0400 Subject: [PATCH] [scrobbles] Clean up dataclass inheritence --- vrobbler/apps/scrobbles/dataclasses.py | 91 +++++++++++++++----------- 1 file changed, 54 insertions(+), 37 deletions(-) diff --git a/vrobbler/apps/scrobbles/dataclasses.py b/vrobbler/apps/scrobbles/dataclasses.py index 9f7c3dc..56f5c5f 100644 --- a/vrobbler/apps/scrobbles/dataclasses.py +++ b/vrobbler/apps/scrobbles/dataclasses.py @@ -30,9 +30,34 @@ class JSONDataclass(JSONWizard): def json(self): return json.dumps(self.asdict) + class LongPlayLogData(JSONDataclass): serial_scrobble_id: Optional[int] - long_play_complete: Optional[bool] + long_play_complete: bool = False + + +class WithOthersLogData(JSONDataclass): + with_user_ids: Optional[list[int]] = None + with_names_str: Optional[list[str]] = None + + @property + def with_names(self) -> list[str]: + with_names = [] + if self.with_user_ids: + with_names += [u.full_name for u in self.with_users if u] + if self.with_names_str: + with_names += [u for u in self.with_names_str] + return with_names + + @property + def with_users(self) -> list[User]: + with_users = [] + if self.with_user_ids: + with_users = [ + User.objects.filter(id=i).first() for i in self.with_user_ids + ] + return with_users + @dataclass class BoardGameScoreLogData(JSONDataclass): @@ -73,6 +98,8 @@ class BoardGameScoreLogData(JSONDataclass): @dataclass class BoardGameLogData(LongPlayLogData): + serial_scrobble_id: Optional[int] + long_play_complete: bool = False players: Optional[list[BoardGameScoreLogData]] = None location: Optional[str] = None geo_location_id: Optional[int] = None @@ -96,45 +123,31 @@ class BookPageLogData(JSONDataclass): @dataclass class BookLogData(LongPlayLogData): - koreader_hash: Optional[str] - pages_read: Optional[int] - page_data: Optional[list[BookPageLogData]] - page_end: Optional[int] - page_start: Optional[int] serial_scrobble_id: Optional[int] + long_play_complete: bool = False + koreader_hash: Optional[str] = None + pages_read: Optional[int] = None + page_data: Optional[list[BookPageLogData]] = None + page_end: Optional[int] = None + page_start: Optional[int] = None + serial_scrobble_id: Optional[int] = None @dataclass -class LifeEventLogData(JSONDataclass): - participant_user_ids: Optional[list[int]] = None - participant_names: Optional[list[str]] = None +class LifeEventLogData(WithOthersLogData): + with_user_ids: Optional[list[int]] = None + with_names_str: Optional[list[str]] = None location: Optional[str] = None geo_location_id: Optional[int] = None details: Optional[str] = None - def participants(self) -> list[str]: - participants = [] - if self.participant_user_ids: - participants += [u.full_name for u in self.participant_users] - if self.participant_names: - participants += self.participant_names - return participants - - @property - def participant_users(self) -> list[User]: - participants = [] - if self.participant_user_ids: - for id in self.participant_user_ids: - participants.append(User.objects.filter(id=id).first()) - return participants - def geo_location(self): return GeoLocation.objects.filter(id=self.geo_location_id).first() @dataclass class MoodLogData(JSONDataclass): - reasons: Optional[str] + reasons: Optional[str] = None @dataclass @@ -144,23 +157,27 @@ class VideoLogData(JSONDataclass): run_time_seconds: int kind: str year: Optional[int] - episode_number: Optional[int] - source_url: Optional[str] - imdbID: Optional[str] - season_number: Optional[int] - cover_url = Optional[str] - next_imdb_id: Optional[int] - tv_series_id: Optional[str] + episode_number: Optional[int] = None + source_url: Optional[str] = None + imdbID: Optional[str] = None + season_number: Optional[int] = None + cover_url: Optional[str] = None + next_imdb_id: Optional[int] = None + tv_series_id: Optional[str] = None @dataclass class VideoGameLogData(LongPlayLogData): + serial_scrobble_id: Optional[int] + long_play_complete: bool = False + console: str = "" emulated: bool = False - console: Optional[str] = None emulator: Optional[str] = None @dataclass -class BrickSetLogData(LongPlayLogData): - built_with_names: Optional[list[str]] - built_with_user_ids: Optional[list[str]] +class BrickSetLogData(LongPlayLogData, WithOthersLogData): + serial_scrobble_id: Optional[int] + long_play_complete: bool = False + with_user_ids: Optional[list[int]] = None + with_names_str: Optional[list[str]] = None