view.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from dataclasses import dataclass
  2. from datetime import datetime
  3. from typing import Any, Optional, List
  4. import lc.config as c
  5. class View: pass
  6. @dataclass
  7. class Pagination(View):
  8. current: int
  9. last: int
  10. def previous(self) -> Optional[dict]:
  11. if self.current > 1:
  12. return {"page": self.current - 1}
  13. return None
  14. def next(self) -> Optional[dict]:
  15. if self.current < self.last:
  16. return {"page": self.current + 1}
  17. return None
  18. @classmethod
  19. def from_total(cls, current, total) -> "Pagination":
  20. return cls(current=current, last=((total - 1) // c.per_page) + 1,)
  21. @dataclass
  22. class UserInvite(View):
  23. claimed: bool
  24. claimant: str
  25. token: str
  26. @dataclass
  27. class AdminPane(View):
  28. invites: List[UserInvite]
  29. @dataclass
  30. class Config(View):
  31. username: str
  32. admin_pane: Optional[AdminPane]
  33. @dataclass
  34. class Tag(View):
  35. url: str
  36. name: str
  37. @dataclass
  38. class Link(View):
  39. id: int
  40. url: str
  41. name: str
  42. description: str
  43. private: bool
  44. tags: List[Tag]
  45. created: datetime
  46. is_mine: bool
  47. link_url: str
  48. @dataclass
  49. class LinkList(View):
  50. links: List[Any]
  51. pages: Optional[Pagination] = None
  52. @dataclass
  53. class Message(View):
  54. title: str
  55. message: str
  56. @dataclass
  57. class Page(View):
  58. title: str
  59. content: str
  60. user: Optional[str]