models.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # -*- coding: utf-8 -*-
  2. """
  3. SyncItem — Datenmodell fuer synchronisierbare Elemente.
  4. Jedes SyncItem hat eine eindeutige ID, einen Datentyp und
  5. Nutzdaten. Last-Write-Wins wird ueber updated_at gesteuert.
  6. """
  7. import uuid
  8. from dataclasses import dataclass, field
  9. from datetime import datetime, timezone
  10. from typing import Any
  11. def _now_iso() -> str:
  12. """Gibt den aktuellen Zeitpunkt als ISO 8601 UTC String zurueck."""
  13. return datetime.now(timezone.utc).isoformat()
  14. @dataclass
  15. class SyncItem:
  16. """Ein synchronisierbares Datenelement."""
  17. item_id: str = field(default_factory=lambda: str(uuid.uuid4()))
  18. data_type: str = "" # z.B. "notes.note"
  19. data: dict[str, Any] = field(default_factory=dict)
  20. created_at: str = field(default_factory=_now_iso)
  21. updated_at: str = field(default_factory=_now_iso)
  22. deleted: bool = False # Soft-Delete
  23. source_id: str = "" # MAC-Adresse oder "server"
  24. version: int = 1 # Monoton steigend
  25. def to_dict(self) -> dict[str, Any]:
  26. """Konvertiert das Item in ein Dictionary."""
  27. return {
  28. "item_id": self.item_id,
  29. "data_type": self.data_type,
  30. "data": self.data,
  31. "created_at": self.created_at,
  32. "updated_at": self.updated_at,
  33. "deleted": self.deleted,
  34. "source_id": self.source_id,
  35. "version": self.version,
  36. }
  37. @classmethod
  38. def from_dict(cls, data: dict[str, Any]) -> "SyncItem":
  39. """Erstellt ein SyncItem aus einem Dictionary."""
  40. return cls(
  41. item_id=data.get("item_id", str(uuid.uuid4())),
  42. data_type=data.get("data_type", ""),
  43. data=data.get("data", {}),
  44. created_at=data.get("created_at", _now_iso()),
  45. updated_at=data.get("updated_at", _now_iso()),
  46. deleted=data.get("deleted", False),
  47. source_id=data.get("source_id", ""),
  48. version=data.get("version", 1),
  49. )