Browse Source

Wrap Link#update_from_request in a transaction

Trevor Elliott 4 years ago
parent
commit
a48d5661d3
1 changed files with 19 additions and 19 deletions
  1. 19 19
      lc/model.py

+ 19 - 19
lc/model.py

@@ -151,25 +151,25 @@ class Link(Model):
         return l
 
     def update_from_request(self, user: User, link: r.Link):
-
-        req_tags = set(link.tags)
-
-        for hastag in self.tags:  # type: ignore
-            name = hastag.tag.name
-            if name not in req_tags:
-                hastag.delete_instance()
-            else:
-                req_tags.remove(name)
-
-        for tag_name in req_tags:
-            t = Tag.get_or_create_tag(user, tag_name)
-            HasTag.get_or_create(link=self, tag=t)
-
-        self.url = link.url
-        self.name = link.name
-        self.description = link.description
-        self.private = link.private
-        self.save()
+        with c.db.atomic():
+            req_tags = set(link.tags)
+
+            for hastag in self.tags:  # type: ignore
+                name = hastag.tag.name
+                if name not in req_tags:
+                    hastag.delete_instance()
+                else:
+                    req_tags.remove(name)
+
+            for tag_name in req_tags:
+                t = Tag.get_or_create_tag(user, tag_name)
+                HasTag.get_or_create(link=self, tag=t)
+
+            self.url = link.url
+            self.name = link.name
+            self.description = link.description
+            self.private = link.private
+            self.save()
 
     def to_view(self, as_user: User) -> v.Link:
         return v.Link(