SeriesReference.objects.create(
msgid=msgid, project=project, series=series)
- try:
+ with transaction.atomic():
+ if CoverLetter.objects.filter(project=project, msgid=msgid):
+ raise DuplicateMailError(msgid=msgid)
+
cover_letter = CoverLetter.objects.create(
msgid=msgid,
project=project,
headers=headers,
submitter=author,
content=message)
- except IntegrityError:
- raise DuplicateMailError(msgid=msgid)
logger.debug('Cover letter saved')
from patchwork.models import Patch
from patchwork.models import Person
from patchwork.models import State
+from patchwork.models import CoverLetter
from patchwork.parser import clean_subject
from patchwork.parser import get_or_create_author
from patchwork.parser import find_patch_content as find_content
self.assertEqual(Patch.objects.count(), 1)
self.assertEqual(Comment.objects.count(), 1)
+
+ def test_duplicate_coverletter(self):
+ m = create_email('test', listid=self.listid, msgid='1@example.com')
+ del m['Subject']
+ m['Subject'] = '[PATCH 0/1] test cover letter'
+
+ self._test_duplicate_mail(m)
+
+ self.assertEqual(CoverLetter.objects.count(), 1)
--- /dev/null
+---
+fixes:
+ - |
+ The parser module now uses an atomic select-insert when creating new patch,
+ cover letter and comment entries. This prevents the integrity errors from
+ being logged in the DB logs.
+ (`#358 <https://github.com/getpatchwork/patchwork/issues/358>`__)