view.py 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from dataclasses import dataclass
  2. from typing import Any, Optional, List
  3. class View: pass
  4. @dataclass
  5. class Pagination(View):
  6. current: int
  7. last: int
  8. def previous(self) -> Optional[dict]:
  9. if self.current > 1:
  10. return {"page": self.current - 1}
  11. return None
  12. def next(self) -> Optional[dict]:
  13. if self.current < self.last:
  14. return {"page": self.current + 1}
  15. return None
  16. @classmethod
  17. def from_total(cls, current, total) -> "Pagination":
  18. return cls(current=current, last=((total - 1) // c.per_page) + 1,)
  19. @dataclass
  20. class UserInvite(View):
  21. claimed: bool
  22. claimant: str
  23. token: str
  24. @dataclass
  25. class AdminPane(View):
  26. invites: List[UserInvite]
  27. @dataclass
  28. class Config(View):
  29. username: str
  30. admin_pane: Optional[AdminPane]
  31. @dataclass
  32. class LinkList(View):
  33. links: List[Any]
  34. pages: Optional[Pagination] = None
  35. @dataclass
  36. class Message(View):
  37. title: str
  38. message: str
  39. @dataclass
  40. class Page(View):
  41. title: str
  42. content: str
  43. user: Optional[str]