[PATCH 6/7] series: Add a 'new-series-revision' event

Damien Lespiau damien.lespiau at intel.com
Wed Oct 21 09:40:46 AEDT 2015


We create a new log entry when a new series revision appears.

The series_revision_complete event only fires when the series/revision
is fully complete, eg., the git send-email series has been fully
processed. That behaviour is tested, making sure an incomplete series
doesn't appear in the SeriesLog table.

v2: Rebase on top of SERIES_DEFAULT_NAME changes

Signed-off-by: Damien Lespiau <damien.lespiau at intel.com>
---
 patchwork/fixtures/default_events.xml |  6 +++++
 patchwork/models.py                   |  8 ++++++
 patchwork/tests/test_bundles.py       |  2 +-
 patchwork/tests/test_encodings.py     |  4 +--
 patchwork/tests/test_expiry.py        |  2 +-
 patchwork/tests/test_list.py          |  2 +-
 patchwork/tests/test_mboxviews.py     | 12 ++++-----
 patchwork/tests/test_notifications.py |  4 +--
 patchwork/tests/test_patchparser.py   | 10 +++----
 patchwork/tests/test_series.py        | 51 ++++++++++++++++++++++++++++++++---
 patchwork/tests/test_tags.py          |  4 +--
 patchwork/tests/test_updates.py       |  2 +-
 patchwork/tests/test_xmlrpc.py        |  2 +-
 13 files changed, 83 insertions(+), 26 deletions(-)
 create mode 100644 patchwork/fixtures/default_events.xml

diff --git a/patchwork/fixtures/default_events.xml b/patchwork/fixtures/default_events.xml
new file mode 100644
index 0000000..c23ce3b
--- /dev/null
+++ b/patchwork/fixtures/default_events.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<django-objects version="1.0">
+  <object pk="1" model="patchwork.event">
+    <field type="CharField" name="name">series-new-revision</field>
+  </object>
+</django-objects>
diff --git a/patchwork/models.py b/patchwork/models.py
index 28e28bb..31026ff 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -632,3 +632,11 @@ def _patch_change_callback(sender, instance, **kwargs):
     notification.save()
 
 models.signals.pre_save.connect(_patch_change_callback, sender = Patch)
+
+def _on_revision_complete(sender, revision, **kwargs):
+    new_revision = Event.objects.get(name='series-new-revision')
+    log = EventLog(event=new_revision, series=revision.series,
+                   user=revision.series.submitter.user)
+    log.save()
+
+series_revision_complete.connect(_on_revision_complete)
diff --git a/patchwork/tests/test_bundles.py b/patchwork/tests/test_bundles.py
index a9ee8dd..9d08be5 100644
--- a/patchwork/tests/test_bundles.py
+++ b/patchwork/tests/test_bundles.py
@@ -54,7 +54,7 @@ class BundleListTest(TestCase):
         self.user.delete()
 
 class BundleTestBase(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     def setUp(self, patch_count=3):
         patch_names = ['testpatch%d' % (i) for i in range(1, patch_count+1)]
         self.user = create_user()
diff --git a/patchwork/tests/test_encodings.py b/patchwork/tests/test_encodings.py
index b639078..d12c6e3 100644
--- a/patchwork/tests/test_encodings.py
+++ b/patchwork/tests/test_encodings.py
@@ -26,7 +26,7 @@ from django.test import TestCase
 from django.test.client import Client
 
 class UTF8PatchViewTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     patch_filename = '0002-utf-8.patch'
     patch_encoding = 'utf-8'
 
@@ -64,7 +64,7 @@ class UTF8PatchViewTest(TestCase):
         defaults.project.delete()
 
 class UTF8HeaderPatchViewTest(UTF8PatchViewTest):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     patch_filename = '0002-utf-8.patch'
     patch_encoding = 'utf-8'
     patch_author_name = u'P\xe4tch Author'
diff --git a/patchwork/tests/test_expiry.py b/patchwork/tests/test_expiry.py
index ca22970..0fdc77b 100644
--- a/patchwork/tests/test_expiry.py
+++ b/patchwork/tests/test_expiry.py
@@ -26,7 +26,7 @@ from patchwork.tests.utils import create_user, defaults
 from patchwork.utils import do_expiry
 
 class TestRegistrationExpiry(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def register(self, date):
         user = create_user()
diff --git a/patchwork/tests/test_list.py b/patchwork/tests/test_list.py
index f440e3e..7a9f88b 100644
--- a/patchwork/tests/test_list.py
+++ b/patchwork/tests/test_list.py
@@ -42,7 +42,7 @@ class EmptyPatchListTest(TestCase):
         self.assertNotContains(response, 'tbody')
 
 class PatchOrderTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     d = datetime.datetime
     patchmeta = [
diff --git a/patchwork/tests/test_mboxviews.py b/patchwork/tests/test_mboxviews.py
index fbea322..e390cb6 100644
--- a/patchwork/tests/test_mboxviews.py
+++ b/patchwork/tests/test_mboxviews.py
@@ -29,7 +29,7 @@ from patchwork.models import Patch, Comment, Person
 from patchwork.tests.utils import defaults, create_user, find_in_context
 
 class MboxPatchResponseTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """ Test that the mbox view appends the Acked-by from a patch comment """
     def setUp(self):
@@ -58,7 +58,7 @@ class MboxPatchResponseTest(TestCase):
                 'Acked-by: 1\nAcked-by: 2\n')
 
 class MboxPatchSplitResponseTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """ Test that the mbox view appends the Acked-by from a patch comment,
         and places it before an '---' update line. """
@@ -88,7 +88,7 @@ class MboxPatchSplitResponseTest(TestCase):
                 'Acked-by: 1\nAcked-by: 2\n')
 
 class MboxPassThroughHeaderTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """ Test that we see 'Cc' and 'To' headers passed through from original
         message to mbox view """
@@ -128,7 +128,7 @@ class MboxPassThroughHeaderTest(TestCase):
         self.assertContains(response, self.date_header)
 
 class MboxBrokenFromHeaderTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """ Test that a person with characters outside ASCII in his name do
         produce correct From header. As RFC 2822 state we must retain the
@@ -153,7 +153,7 @@ class MboxBrokenFromHeaderTest(TestCase):
         self.assertContains(response, from_email)
 
 class MboxDateHeaderTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """ Test that the date provided in the patch mail view is correct """
 
@@ -191,7 +191,7 @@ class MboxDateHeaderTest(TestCase):
         self.assertEqual(mail_date, date)
 
 class MboxCommentPostcriptUnchangedTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """ Test that the mbox view doesn't change the postscript part of a mail.
         There where always a missing blank right after the postscript
diff --git a/patchwork/tests/test_notifications.py b/patchwork/tests/test_notifications.py
index 37adb8d..cbc43f9 100644
--- a/patchwork/tests/test_notifications.py
+++ b/patchwork/tests/test_notifications.py
@@ -26,7 +26,7 @@ from patchwork.tests.utils import defaults
 from patchwork.utils import send_notifications
 
 class PatchNotificationModelTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     """Tests for the creation & update of the PatchChangeNotification model"""
 
@@ -120,7 +120,7 @@ class PatchNotificationModelTest(TestCase):
         self.assertEqual(PatchChangeNotification.objects.count(), 0)
 
 class PatchNotificationEmailTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def setUp(self):
         self.project = defaults.project
diff --git a/patchwork/tests/test_patchparser.py b/patchwork/tests/test_patchparser.py
index 61fdd5a..f266627 100644
--- a/patchwork/tests/test_patchparser.py
+++ b/patchwork/tests/test_patchparser.py
@@ -29,7 +29,7 @@ from patchwork.tests.utils import read_patch, read_mail, create_email, \
 from email.mime.text import MIMEText
 
 class PatchTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     default_sender = defaults.sender
     default_subject = defaults.subject
     project = defaults.project
@@ -262,7 +262,7 @@ class MultipleProjectPatchTest(TestCase):
     """ Test that patches sent to multiple patchwork projects are
         handled correctly """
 
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     test_comment = 'Test Comment'
     patch_filename = '0001-add-line.patch'
     msgid = '<1 at example.com>'
@@ -484,7 +484,7 @@ class NoNewlineAtEndOfFilePatchTest(MBoxPatchTest):
         self.assertEqual(2, patch.content.count('\ No newline at end of file'))
 
 class DelegateRequestTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     patch_filename = '0001-add-line.patch'
     msgid = '<1 at example.com>'
     invalid_delegate_email = "nobody"
@@ -530,7 +530,7 @@ class DelegateRequestTest(TestCase):
         self.user.delete()
 
 class MailFromPatchTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
     patch_filename = '0001-add-line.patch'
     msgid = '<1 at example.com>'
 
@@ -638,7 +638,7 @@ class ParseInitialTagsTest(PatchTest):
     test_comment = ('test comment\n\n' +
         'Tested-by: Test User <test at example.com>\n' +
         'Reviewed-by: Test User <test at example.com>\n')
-    fixtures = ['default_tags', 'default_states']
+    fixtures = ['default_tags', 'default_states', 'default_events']
 
     def setUp(self):
         project = defaults.project
diff --git a/patchwork/tests/test_series.py b/patchwork/tests/test_series.py
index 373ef1b..2cb4c02 100644
--- a/patchwork/tests/test_series.py
+++ b/patchwork/tests/test_series.py
@@ -21,7 +21,7 @@ import os
 
 from django.test import TestCase
 from patchwork.models import Patch, Series, SeriesRevision, Project, \
-                             SERIES_DEFAULT_NAME
+                             SERIES_DEFAULT_NAME, EventLog, User, Person
 from patchwork.tests.utils import read_mail
 from patchwork.tests.utils import defaults, read_mail, TestSeries
 
@@ -29,7 +29,7 @@ from patchwork.bin.parsemail import parse_mail, build_references_list, \
                                     clean_series_name
 
 class SeriesTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def setUp(self):
         self.assertTrue(self.project is not None)
@@ -75,6 +75,11 @@ class SeriesTest(TestCase):
         patches = Patch.objects.all()
         self.assertEquals(patches.count(), self.n_patches)
 
+        # We are inserting a single series, so the logs should only have one
+        # entry
+        logs = EventLog.objects.all()
+        self.assertEquals(logs.count(), 1)
+
 class GeneratedSeriesTest(SeriesTest):
     project = defaults.project
 
@@ -119,6 +124,7 @@ class SingleMailSeries(IntelGfxTest):
     root_msgid = '<1400748280-26449-1-git-send-email-chris at chris-wilson.co.uk>'
     cover_letter = None
 
+class Series0010(SingleMailSeries):
     def testInsertion(self):
         """A single patch is a series of 1 patch"""
 
@@ -203,7 +209,7 @@ class MultipleMailNoCoverLetterSeries(Series0020):
         self.commonInsertionChecks()
 
 class ReferencesListTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def testSingleMail(self):
         series = TestSeries(1, has_cover_letter=False)
@@ -384,7 +390,7 @@ class SinglePatchUpdateTest(GeneratedSeriesTest):
         self._test_internal(3, 3, has_cover_letter=False)
 
 class SinglePatchUpdatesVariousCornerCasesTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def testSinglePatchUpdatesNotSerialized(self):
         """ + patch v1
@@ -528,3 +534,40 @@ class FullSeriesUpdateTest(GeneratedSeriesTest):
 
     def testNewSeriesIgnoreCase(self):
         self._test_internal(3, ('Awesome series', 'awesome series (V4)'))
+
+#
+# series-new-revision event tests
+#
+
+class EventLogTest(SingleMailSeries):
+    def setUp(self):
+        # Create a 'chris' User and Person
+        mail = 'chris at chris-wilson.co.uk'
+        self.user = User.objects.create_user('chris', mail, 'securepass')
+        person = Person(email=mail)
+        person.link_to_user(self.user)
+        person.save()
+
+        super(EventLogTest, self).setUp()
+
+    def testNewSeriesSeries(self):
+        entry = EventLog.objects.all()[0]
+        series = Series.objects.all()[0]
+        self.assertEquals(entry.series, series)
+
+    def testNewSeriesUser(self):
+        entry = EventLog.objects.all()[0]
+        self.assertEquals(self.user, entry.user)
+
+class MultipleMailCoverLetterSeriesIncomplete(Series0010):
+    mails = (
+        '0010-multiple-mails-cover-letter.mbox',
+        '0011-multiple-mails-cover-letter.mbox',
+        '0012-multiple-mails-cover-letter.mbox',
+        '0014-multiple-mails-cover-letter.mbox',
+    )
+
+class EventLogIncompleteTest(MultipleMailCoverLetterSeriesIncomplete):
+    def testNoNewSeriesIfIncomplete(self):
+        logs = EventLog.objects.all()
+        self.assertEquals(logs.count(), 0)
diff --git a/patchwork/tests/test_tags.py b/patchwork/tests/test_tags.py
index a1e03f5..0973be6 100644
--- a/patchwork/tests/test_tags.py
+++ b/patchwork/tests/test_tags.py
@@ -31,7 +31,7 @@ class ExtractTagsTest(TestCase):
 
     email = 'test at exmaple.com'
     name_email = 'test name <' + email + '>'
-    fixtures = ['default_tags', 'default_states']
+    fixtures = ['default_tags', 'default_states', 'default_events']
 
     def assertTagsEqual(self, str, acks, reviews, tests):
         counts = extract_tags(str, Tag.objects.all())
@@ -83,7 +83,7 @@ class PatchTagsTest(TransactionTestCase):
     ACK = 1
     REVIEW = 2
     TEST = 3
-    fixtures = ['default_tags', 'default_states']
+    fixtures = ['default_tags', 'default_states', 'default_events']
 
     def assertTagsEqual(self, patch, acks, reviews, tests):
         patch = Patch.objects.get(pk=patch.pk)
diff --git a/patchwork/tests/test_updates.py b/patchwork/tests/test_updates.py
index d2f4126..f664547 100644
--- a/patchwork/tests/test_updates.py
+++ b/patchwork/tests/test_updates.py
@@ -23,7 +23,7 @@ from patchwork.models import Patch, Person, State
 from patchwork.tests.utils import defaults, create_maintainer
 
 class MultipleUpdateTest(TestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def setUp(self):
         defaults.project.save()
diff --git a/patchwork/tests/test_xmlrpc.py b/patchwork/tests/test_xmlrpc.py
index 1aef03c..9519f1b 100644
--- a/patchwork/tests/test_xmlrpc.py
+++ b/patchwork/tests/test_xmlrpc.py
@@ -28,7 +28,7 @@ from patchwork.tests.utils import defaults
 @unittest.skipUnless(settings.ENABLE_XMLRPC,
         "requires xmlrpc interface (use the ENABLE_XMLRPC setting)")
 class XMLRPCTest(LiveServerTestCase):
-    fixtures = ['default_states']
+    fixtures = ['default_states', 'default_events']
 
     def setUp(self):
         self.url = (self.live_server_url +
-- 
2.4.3



More information about the Patchwork mailing list