Explorar el Código

[scrobbles] Clean up dataclass inheritence

Colin Powell hace 10 meses
padre
commit
1a5d4a6717
Se han modificado 1 ficheros con 54 adiciones y 37 borrados
  1. 54 37
      vrobbler/apps/scrobbles/dataclasses.py

+ 54 - 37
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