[locations] Handle log data cleaner
All checks were successful
build / test (push) Successful in 1m54s
All checks were successful
build / test (push) Successful in 1m54s
This commit is contained in:
@ -28,6 +28,14 @@ class GeoLocationLogData(BaseLogData, WithPeopleLogData):
|
||||
activity: str = ""
|
||||
detected_at: str = ""
|
||||
|
||||
@classmethod
|
||||
def from_log_dict(cls, log_dict: dict) -> dict:
|
||||
instance_data = log_dict.get("movement_detection", {}).copy()
|
||||
for field_name in ["description", "notes", "with_people_ids"]:
|
||||
if field_name in log_dict:
|
||||
instance_data[field_name] = log_dict[field_name]
|
||||
return instance_data
|
||||
|
||||
|
||||
class GeoLocation(ScrobblableMixin):
|
||||
COMPLETION_PERCENT = getattr(settings, "LOCATION_COMPLETION_PERCENT", 100)
|
||||
|
||||
@ -50,6 +50,18 @@ class BaseLogData(JSONDataclass):
|
||||
def override_fields(cls) -> dict:
|
||||
return {}
|
||||
|
||||
@classmethod
|
||||
def from_log_dict(cls, log_dict: dict) -> dict:
|
||||
"""Extract LogData keyword arguments from a stored log dict.
|
||||
|
||||
Override in subclasses to handle custom nesting/structure.
|
||||
"""
|
||||
return {
|
||||
k: v
|
||||
for k, v in log_dict.items()
|
||||
if k in cls.__dataclass_fields__
|
||||
}
|
||||
|
||||
def notes_as_str(self, separator: str = " | ") -> str:
|
||||
import html
|
||||
import re
|
||||
|
||||
@ -973,24 +973,8 @@ class Scrobble(TimeStampedModel):
|
||||
if not log_dict:
|
||||
log_dict = {}
|
||||
|
||||
# Special handling for GeoLocationLogData - data is nested under 'movement_detection'
|
||||
# TODO there's a better way to fix this this at the LogData level
|
||||
if logdata_cls.__name__ == "GeoLocationLogData":
|
||||
instance_data = log_dict.get("movement_detection", {}).copy()
|
||||
# Add top-level fields that GeoLocationLogData expects from BaseLogData/WithPeopleLogData
|
||||
for field_name in ["description", "notes", "with_people_ids"]:
|
||||
if field_name in log_dict:
|
||||
instance_data[field_name] = log_dict[field_name]
|
||||
try:
|
||||
return logdata_cls(**instance_data)
|
||||
except Exception as e:
|
||||
logger.warning("Log data could not be loaded", e)
|
||||
return logdata_cls()
|
||||
|
||||
# Strip log-only keys (stored in JSONField but not part of LogData dataclass)
|
||||
logdata_kwargs = {
|
||||
k: v for k, v in log_dict.items() if k in logdata_cls().__dataclass_fields__
|
||||
}
|
||||
# Use LogData's from_log_dict to handle any custom nesting/structure
|
||||
logdata_kwargs = logdata_cls.from_log_dict(log_dict)
|
||||
|
||||
try:
|
||||
return logdata_cls(**logdata_kwargs)
|
||||
|
||||
Reference in New Issue
Block a user