]
-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})
@python_2_unicode_compatible
-class Patch(SeriesMixin, Submission):
+class Patch(Submission):
# patch metadata
diff = models.TextField(null=True, blank=True)
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 %}
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
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):
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):
self.assertSerialized(covers, [1])
self.assertSerialized(patches, [3])
- series = patches[0].latest_series
+ series = patches[0].series.first()
self.assertTrue(series.received_all)
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()
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])
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()
"""
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'