Browse Source

Fix tag editing for links

Trevor Elliott 4 years ago
parent
commit
bd698f4e12
3 changed files with 20 additions and 4 deletions
  1. 1 1
      lc/app.py
  2. 19 2
      lc/model.py
  3. 0 1
      tests/model.py

+ 1 - 1
lc/app.py

@@ -137,7 +137,7 @@ class GetLink(Endpoint):
         u = self.require_authentication(user)
         l = u.get_link(int(link))
         req = self.request_data(r.Link)
-        l.update_from_request(req)
+        l.update_from_request(u, req)
         raise e.LCRedirect(l.link_url())
 
     def html(self, user: str, link: str):

+ 19 - 2
lc/model.py

@@ -167,12 +167,21 @@ class Link(Model):
             )
         return l
 
-    def update_from_request(self, link: r.Link):
+    def update_from_request(self, user: User, link: r.Link):
+        new_tags = set()
+        for tag_name in link.tags:
+            t = Tag.get_or_create_tag(user, tag_name)
+            new_tags.add(t)
+            HasTag.get_or_create(self, t)
+
+        for tag in self.tags:
+            if tag not in new_tags:
+                HasTag.delete().where((HasTag.link == self.id) & (HasTag.tag == tag))
+
         self.url = link.url
         self.name = link.name
         self.description = link.description
         self.private = link.private
-        self.tags = link.tags
         self.save()
 
 
@@ -226,6 +235,14 @@ class HasTag(Model):
     link = peewee.ForeignKeyField(Link, backref="tags")
     tag = peewee.ForeignKeyField(Tag, backref="models")
 
+    @staticmethod
+    def get_or_create(link: Link, tag: Tag):
+        res = HasTag.get_or_none(link=link, tag=tag)
+        if res is None:
+            res = HasTag.create(link=link, tag=tag)
+
+        return res
+
 
 class UserInvite(Model):
     token = peewee.TextField(unique=True)

+ 0 - 1
tests/model.py

@@ -140,7 +140,6 @@ class Testdb:
         req = r.Link("http://foo.com", "foo", "", False, ["foo", "bar"])
         l = m.Link.from_request(u, req)
         assert l.name == req.name
-
         assert l.tags == ["foo", "bar"]
 
         # check the in-place update