[PATCH] models: Remove 'latest_series'

Stephen Finucane stephen at that.guru
Tue Sep 11 06:45:42 AEST 2018


This is only used in a single view (where it probably shouldn't be used)
and some tests. It's an anti-pattern that makes it too easy to shoot
yourself in the foot. Remove it.

Signed-off-by: Stephen Finucane <stephen at that.guru>
---
 patchwork/models.py                           | 23 ++----------------
 .../templates/patchwork/download_buttons.html | 10 ++++----
 patchwork/tests/test_series.py                | 24 +++++++++----------
 patchwork/views/utils.py                      |  2 +-
 4 files changed, 21 insertions(+), 38 deletions(-)

diff --git a/patchwork/models.py b/patchwork/models.py
index d2d8f343..8731bb2f 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -393,26 +393,7 @@ class Submission(FilenameMixin, EmailMixin, models.Model):
         ]
 
 
-class SeriesMixin(object):
-
-    @property
-    def latest_series(self):
-        """Get the latest series this is a member of.
-
-        Return the last series that (ordered by date) that this
-        submission is a member of.
-
-        .. warning::
-          Be judicious in your use of this. For example, do not use it
-          in list templates as doing so will result in a new query for
-          each item in the list.
-        """
-        # NOTE(stephenfin): We don't use 'latest()' here, as this can raise an
-        # exception if no series exist
-        return self.series.order_by('-date').first()
-
-
-class CoverLetter(SeriesMixin, Submission):
+class CoverLetter(Submission):
 
     def get_absolute_url(self):
         return reverse('cover-detail', kwargs={'cover_id': self.id})
@@ -422,7 +403,7 @@ class CoverLetter(SeriesMixin, Submission):
 
 
 @python_2_unicode_compatible
-class Patch(SeriesMixin, Submission):
+class Patch(Submission):
     # patch metadata
 
     diff = models.TextField(null=True, blank=True)
diff --git a/patchwork/templates/patchwork/download_buttons.html b/patchwork/templates/patchwork/download_buttons.html
index 4809db54..32acf26b 100644
--- a/patchwork/templates/patchwork/download_buttons.html
+++ b/patchwork/templates/patchwork/download_buttons.html
@@ -15,17 +15,19 @@
    class="btn btn-default" role="button" title="Download cover mbox"
    >mbox</a>
   {% endif %}
-  {% if submission.series.all|length == 1 %}
-  <a href="{% url 'series-mbox' series_id=submission.latest_series.id %}"
+  {% if all_series|length == 1 %}
+  {% with all_series|first as series %}
+  <a href="{% url 'series-mbox' series_id=series.id %}"
    class="btn btn-default" role="button"
    title="Download patch mbox with dependencies">series</a>
-  {% elif submission.series.all|length > 1 %}
+  {% endwith %}
+  {% elif all_series|length > 1 %}
   <button type="button" class="btn btn-default dropdown-toggle"
    data-toggle="dropdown">
    series <span class="caret"></span>
   </button>
   <ul class="dropdown-menu" role="menu">
-  {% for series in submission.series.all %}
+  {% for series in all_series %}
    <li><a href="{% url 'series-mbox' series_id=series.id %}"
     >{{ series }}</a></li>
   {% endfor %}
diff --git a/patchwork/tests/test_series.py b/patchwork/tests/test_series.py
index 9b5c0129..6892a615 100644
--- a/patchwork/tests/test_series.py
+++ b/patchwork/tests/test_series.py
@@ -87,7 +87,7 @@ class _BaseTestCase(TestCase):
 
             patches_ = patches[start_idx:end_idx]
             for patch in patches_:
-                self.assertEqual(patch.latest_series, series[idx])
+                self.assertEqual(patch.series.first(), series[idx])
 
             start_idx = end_idx
 
@@ -531,7 +531,7 @@ class SeriesTotalTest(_BaseTestCase):
         self.assertSerialized(patches, [1])
         self.assertSerialized(covers, [1])
 
-        series = patches[0].latest_series
+        series = patches[0].series.first()
         self.assertFalse(series.received_all)
 
     def test_complete(self):
@@ -551,7 +551,7 @@ class SeriesTotalTest(_BaseTestCase):
         self.assertSerialized(covers, [1])
         self.assertSerialized(patches, [2])
 
-        series = patches[0].latest_series
+        series = patches[0].series.first()
         self.assertTrue(series.received_all)
 
     def test_extra_patches(self):
@@ -572,7 +572,7 @@ class SeriesTotalTest(_BaseTestCase):
         self.assertSerialized(covers, [1])
         self.assertSerialized(patches, [3])
 
-        series = patches[0].latest_series
+        series = patches[0].series.first()
         self.assertTrue(series.received_all)
 
 
@@ -657,13 +657,13 @@ class SeriesNameTestCase(TestCase):
 
         cover = self._parse_mail(mbox[0])
         cover_name = self._format_name(cover)
-        self.assertEqual(cover.latest_series.name, cover_name)
+        self.assertEqual(cover.series.first().name, cover_name)
 
         self._parse_mail(mbox[1])
-        self.assertEqual(cover.latest_series.name, cover_name)
+        self.assertEqual(cover.series.first().name, cover_name)
 
         self._parse_mail(mbox[2])
-        self.assertEqual(cover.latest_series.name, cover_name)
+        self.assertEqual(cover.series.first().name, cover_name)
 
         mbox.close()
 
@@ -681,7 +681,7 @@ class SeriesNameTestCase(TestCase):
         mbox = self._get_mbox('base-no-cover-letter.mbox')
 
         patch = self._parse_mail(mbox[0])
-        series = patch.latest_series
+        series = patch.series.first()
         self.assertEqual(series.name, patch.name)
 
         self._parse_mail(mbox[1])
@@ -705,13 +705,13 @@ class SeriesNameTestCase(TestCase):
         mbox = self._get_mbox('base-out-of-order.mbox')
 
         patch = self._parse_mail(mbox[0])
-        self.assertIsNone(patch.latest_series.name)
+        self.assertIsNone(patch.series.first().name)
 
         patch = self._parse_mail(mbox[1])
-        self.assertEqual(patch.latest_series.name, patch.name)
+        self.assertEqual(patch.series.first().name, patch.name)
 
         cover = self._parse_mail(mbox[2])
-        self.assertEqual(cover.latest_series.name, self._format_name(cover))
+        self.assertEqual(cover.series.first().name, self._format_name(cover))
 
         mbox.close()
 
@@ -730,7 +730,7 @@ class SeriesNameTestCase(TestCase):
         """
         mbox = self._get_mbox('base-out-of-order.mbox')
 
-        series = self._parse_mail(mbox[0]).latest_series
+        series = self._parse_mail(mbox[0]).series.first()
         self.assertIsNone(series.name)
 
         series_name = 'My custom series name'
diff --git a/patchwork/views/utils.py b/patchwork/views/utils.py
index 2357ab86..3bf7af3c 100644
--- a/patchwork/views/utils.py
+++ b/patchwork/views/utils.py
@@ -143,7 +143,7 @@ def series_patch_to_mbox(patch, series_id):
         A string for the mbox file.
     """
     if series_id == '*':
-        series = patch.latest_series
+        series = patch.series.order_by('-date').first()
     else:
         try:
             series_id = int(series_id)
-- 
2.17.1



More information about the Patchwork mailing list