]> git.ozlabs.org Git - patchwork/commitdiff
patchwork/parser: Adapt for new unsaved-foreign-key behaviour in django 1.8
authorJeremy Kerr <jk@ozlabs.org>
Fri, 5 Jun 2015 06:33:13 +0000 (14:33 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Fri, 5 Jun 2015 06:37:48 +0000 (14:37 +0800)
Django 1.8 no longer supports assignment of unsaved models to
ForeignKey fields:

  File "/home/jk/devel/patchwork/patchwork/tests/test_patchparser.py", line 75, in setUp
    (self.patch, self.comment) = find_content(self.project, email)
  File "/home/jk/devel/patchwork/patchwork/bin/parsemail.py", line 231, in find_content
    headers = mail_headers(mail))
  File "/home/jk/devel/patchwork/lib/python/django/db/models/base.py", line 468, in __init__
    setattr(self, field.name, rel_obj)
  File "/home/jk/devel/patchwork/lib/python/django/db/models/fields/related.py", line 668, in __set__
    (value, self.field.rel.to._meta.object_name)
ValueError: Cannot assign "<Patch: Test Subject>": "Patch" instance isn't saved in the database.

Even though we'd be guaranteed to save the patch before the comment, we
need to avoid this error.

This change defers the assigment of Comment.patch until we know we have
a saved Patch instance.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
patchwork/bin/parsemail.py

index 97189a3089d5b7de573f2725ee81a0f2af801755..f2b10bd38ee9f0536745d0e624db5c2a8f7c726f 100755 (executable)
@@ -220,15 +220,20 @@ def find_content(project, mail):
                     date = mail_date(mail), headers = mail_headers(mail))
 
     if commentbuf:
+        # If this is a new patch, we defer setting comment.patch until
+        # patch has been saved by the caller
         if patch:
-            cpatch = patch
+            comment = Comment(date = mail_date(mail),
+                    content = clean_content(commentbuf),
+                    headers = mail_headers(mail))
+
         else:
             cpatch = find_patch_for_comment(project, mail)
             if not cpatch:
                 return (None, None)
-        comment = Comment(patch = cpatch, date = mail_date(mail),
-                content = clean_content(commentbuf),
-                headers = mail_headers(mail))
+            comment = Comment(patch = cpatch, date = mail_date(mail),
+                    content = clean_content(commentbuf),
+                    headers = mail_headers(mail))
 
     return (patch, comment)
 
@@ -389,8 +394,7 @@ def parse_mail(mail):
     if comment:
         if save_required:
             author.save()
-        # looks like the original constructor for Comment takes the pk
-        # when the Comment is created. reset it here.
+        # we defer this assignment until we know that we have a saved patch
         if patch:
             comment.patch = patch
         comment.submitter = author