model.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import datetime
  2. import peewee
  3. import lc.config
  4. import lc.request as r
  5. class Model(peewee.Model):
  6. class Meta:
  7. database = lc.config.DB
  8. # TODO: figure out authorization for users (oauth? passwd?)
  9. class User(Model):
  10. """
  11. A user! you know tf this is about
  12. """
  13. name = peewee.TextField()
  14. @staticmethod
  15. def from_request(user: r.User) -> "User":
  16. return User.create(name=user.name)
  17. @staticmethod
  18. def by_slug(slug: str) -> "User":
  19. return User.get(name=slug)
  20. def base_url(self) -> str:
  21. return f"/u/{self.name}"
  22. class Link(Model):
  23. """
  24. A link as stored in the database
  25. """
  26. url = peewee.TextField()
  27. name = peewee.TextField()
  28. description = peewee.TextField()
  29. # TODO: do we need to track modified time?
  30. created = peewee.DateTimeField()
  31. # is the field entirely private?
  32. private = peewee.BooleanField()
  33. # owned by
  34. user = peewee.ForeignKeyField(User, backref="links")
  35. def link_url(self) -> str:
  36. return f"/u/{self.user.name}/l/{self.id}"
  37. @staticmethod
  38. def from_request(user: User, link: r.Link) -> "Link":
  39. l = Link.create(
  40. url=link.url,
  41. name=link.name,
  42. description=link.description,
  43. private=link.private,
  44. created=datetime.datetime.now(),
  45. user=user,
  46. )
  47. for tag_name in link.tags:
  48. t = Tag.find_tag(user, tag_name)
  49. HasTag.create(
  50. link=l, tag=t,
  51. )
  52. return l
  53. class Tag(Model):
  54. """
  55. A tag. This just indicates that a user has used this tag at some point.
  56. """
  57. name = peewee.TextField()
  58. parent = peewee.ForeignKeyField("self", null=True, backref="children")
  59. user = peewee.ForeignKeyField(User, backref="tags")
  60. def url(self) -> str:
  61. return f"/u/{self.user.name}/t/{self.name}"
  62. @staticmethod
  63. def find_tag(user: User, tag_name: str):
  64. if (t := Tag.get_or_none(name=tag_name, user=user)) :
  65. return t
  66. parent = None
  67. if "/" in tag_name:
  68. parent_name = tag_name[: tag_name.rindex("/")]
  69. parent = Tag.find_tag(user, parent_name)
  70. return Tag.create(name=tag_name, parent=parent, user=user,)
  71. class HasTag(Model):
  72. """
  73. Establishes that a link is tagged with a given tag.
  74. """
  75. link = peewee.ForeignKeyField(Link, backref="tags")
  76. tag = peewee.ForeignKeyField(Tag, backref="models")
  77. MODELS = [
  78. User,
  79. Link,
  80. Tag,
  81. HasTag,
  82. ]
  83. def create_tables():
  84. lc.config.DB.create_tables(MODELS, safe=True)