model.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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="all_links")
  35. @staticmethod
  36. def from_request(user: User, link: r.Link) -> "Link":
  37. l = Link.create(
  38. url=link.url,
  39. name=link.name,
  40. description=link.description,
  41. private=link.private,
  42. created=datetime.datetime.now(),
  43. user=user,
  44. )
  45. for tag_name in link.tags:
  46. t = Tag.find_tag(tag_name)
  47. HasTag.create(
  48. link=l, tag=t,
  49. )
  50. return l
  51. class Tag(Model):
  52. """
  53. A tag. This just indicates that a user has used this tag at some point.
  54. """
  55. name = peewee.TextField()
  56. parent = peewee.ForeignKeyField("self", null=True, backref="children")
  57. user = peewee.ForeignKeyField(User, backref="tags")
  58. @staticmethod
  59. def find_tag(user: User, tag_name: str):
  60. if (t := Tag.get_or_none(name=tag_name, user=user)) :
  61. return t
  62. parent = None
  63. if "/" in tag_name:
  64. parent_name = tag_name[: tag_name.rindex("/")]
  65. parent = Tag.find_tag(user, parent_name)
  66. return Tag.create(name=tag_name, parent=parent, user=user,)
  67. class HasTag(Model):
  68. """
  69. Establishes that a link is tagged with a given tag.
  70. """
  71. link = peewee.ForeignKeyField(Link, backref="tags")
  72. tag = peewee.ForeignKeyField(Tag, backref="models")
  73. MODELS = [
  74. User,
  75. Link,
  76. Tag,
  77. HasTag,
  78. ]
  79. def create_tables():
  80. lc.config.DB.create_tables(MODELS, safe=True)