[PATCH 06/15] series: Add a Series model
Damien Lespiau
damien.lespiau at intel.com
Fri Oct 9 21:39:53 AEDT 2015
v2: Add 'order' metadata to revisions as they do have a natural
ordering.
v3: Add a couple of utility functions to Series and SeriesRevision
v4: Provide a get_absolute_url() method on Series
v5: Add a dump() method to series, handy for debugging
Signed-off-by: Damien Lespiau <damien.lespiau at intel.com>
---
patchwork/models.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/patchwork/models.py b/patchwork/models.py
index a1c2974..68673bf 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -410,6 +410,89 @@ class BundlePatch(models.Model):
unique_together = [('bundle', 'patch')]
ordering = ['order']
+# This Model represents the "top level" Series, an object that doesn't change
+# with the various versions of patches sent to the mailing list.
+class Series(models.Model):
+ project = models.ForeignKey(Project)
+ name = models.CharField(max_length=200, null=True, blank=False)
+ submitter = models.ForeignKey(Person, related_name='submitters')
+ reviewer = models.ForeignKey(User, related_name='reviewers', null=True,
+ blank=True)
+ submitted = models.DateTimeField(default=datetime.datetime.now)
+ last_updated = models.DateTimeField(auto_now=True)
+ # Caches the latest version so we can display it without looking at the max
+ # of all SeriesRevision.version
+ version = models.IntegerField(default=1)
+ # This is the number of patches of the latest version.
+ n_patches = models.IntegerField(default=0)
+
+ def __unicode__(self):
+ return self.name
+
+ def revisions(self):
+ return SeriesRevision.objects.filter(series=self)
+
+ def latest_revision(self):
+ return self.revisions().reverse()[0]
+
+ def get_absolute_url(self):
+ return reverse('series', kwargs={ 'series': self.pk })
+
+ def dump(self):
+ print('')
+ print('===')
+ print('Series: %s' % self)
+ print(' version %d' % self.version)
+ for rev in self.revisions():
+ print(' rev %d:' % rev.version)
+ i = 1
+ for patch in rev.ordered_patches():
+ print(' patch %d:' % i)
+ print(' subject: %s' % patch.name)
+ print(' msgid : %s' % patch.msgid)
+ i += 1
+
+# A 'revision' of a series. Resending a new version of a patch or a full new
+# iteration of a series will create a new revision.
+class SeriesRevision(models.Model):
+ series = models.ForeignKey(Series)
+ version = models.IntegerField(default=1)
+ root_msgid = models.CharField(max_length=255)
+ cover_letter = models.TextField(null = True, blank = True)
+ patches = models.ManyToManyField(Patch, through = 'SeriesRevisionPatch')
+
+ class Meta:
+ unique_together = [('series', 'version')]
+ ordering = ['version']
+
+ def ordered_patches(self):
+ return self.patches.order_by('seriesrevisionpatch__order')
+
+ def add_patch(self, patch, order):
+ # see if the patch is already in this revision
+ if SeriesRevisionPatch.objects.filter(revision=self,
+ patch=patch).count():
+ raise Exception("patch is already in revision")
+
+ sp = SeriesRevisionPatch.objects.create(revision=self, patch=patch,
+ order=order)
+ sp.save()
+
+ def __unicode__(self):
+ if hasattr(self, 'series'):
+ return self.series.name + " (rev " + str(self.version) + ")"
+ else:
+ return "New revision" + " (rev " + str(self.version) + ")"
+
+class SeriesRevisionPatch(models.Model):
+ patch = models.ForeignKey(Patch)
+ revision = models.ForeignKey(SeriesRevision)
+ order = models.IntegerField()
+
+ class Meta:
+ unique_together = [('revision', 'patch'), ('revision', 'order')]
+ ordering = ['order']
+
class EmailConfirmation(models.Model):
validity = datetime.timedelta(days = settings.CONFIRMATION_VALIDITY_DAYS)
type = models.CharField(max_length = 20, choices = [
--
2.1.0
More information about the Patchwork
mailing list