X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fmodels.py;h=793cb4ede5554e03d297668dee22adba576c1c3f;hb=cd874f3ef896a54c47fc4a483739b00871e5a4b4;hp=02fb8b4a4e55fc77489145c3280c0b13169abec3;hpb=65404776f7f0e975737a5c8c69dc0b2ae5fe93da;p=patchwork diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py index 02fb8b4..793cb4e 100644 --- a/apps/patchwork/models.py +++ b/apps/patchwork/models.py @@ -23,7 +23,6 @@ from django.core.urlresolvers import reverse from django.contrib.sites.models import Site from django.conf import settings from patchwork.parser import hash_patch -import django.oldforms as oldforms import re import datetime, time @@ -179,7 +178,7 @@ class PatchMbox(MIMENonMultipart): class Patch(models.Model): project = models.ForeignKey(Project) - msgid = models.CharField(max_length=255, unique = True) + msgid = models.CharField(max_length=255) name = models.CharField(max_length=255) date = models.DateTimeField(default=datetime.datetime.now) submitter = models.ForeignKey(Person) @@ -228,6 +227,8 @@ class Patch(models.Model): return str.strip('-') + '.patch' def mbox(self): + postscript_re = re.compile('\n-{2,3} ?\n') + comment = None try: comment = Comment.objects.get(patch = self, msgid = self.msgid) @@ -238,6 +239,14 @@ class Patch(models.Model): if comment: body = comment.content.strip() + "\n" + parts = postscript_re.split(body, 1) + if len(parts) == 2: + (body, postscript) = parts + body = body.strip() + "\n" + postscript = postscript.strip() + "\n" + else: + postscript = '' + responses = False for comment in Comment.objects.filter(patch = self) \ .exclude(msgid = self.msgid): @@ -246,13 +255,16 @@ class Patch(models.Model): if body: body += '\n' - body += self.content + if postscript: + body += '---\n' + postscript.strip() + '\n' + + body += '\n' + self.content mail = PatchMbox(body) mail['Subject'] = self.name mail['Date'] = email.utils.formatdate( time.mktime(self.date.utctimetuple())) - mail['From'] = str(self.submitter) + mail['From'] = unicode(self.submitter) mail['X-Patchwork-Id'] = str(self.id) mail.set_unixfrom('From patchwork ' + self.date.ctime()) @@ -266,10 +278,11 @@ class Patch(models.Model): class Meta: verbose_name_plural = 'Patches' ordering = ['date'] + unique_together = [('msgid', 'project')] class Comment(models.Model): patch = models.ForeignKey(Patch) - msgid = models.CharField(max_length=255, unique = True) + msgid = models.CharField(max_length=255) submitter = models.ForeignKey(Person) date = models.DateTimeField(default = datetime.datetime.now) headers = models.TextField(blank = True) @@ -283,17 +296,39 @@ class Comment(models.Model): class Meta: ordering = ['date'] + unique_together = [('msgid', 'patch')] class Bundle(models.Model): owner = models.ForeignKey(User) project = models.ForeignKey(Project) name = models.CharField(max_length = 50, null = False, blank = False) - patches = models.ManyToManyField(Patch) + patches = models.ManyToManyField(Patch, through = 'BundlePatch') public = models.BooleanField(default = False) def n_patches(self): return self.patches.all().count() + def ordered_patches(self): + return self.patches.order_by('bundlepatch__order'); + + def append_patch(self, patch): + # todo: use the aggregate queries in django 1.1 + orders = BundlePatch.objects.filter(bundle = self).order_by('-order') \ + .values('order') + + if len(orders) > 0: + max_order = orders[0]['order'] + else: + max_order = 0 + + # see if the patch is already in this bundle + if BundlePatch.objects.filter(bundle = self, patch = patch).count(): + raise Exception("patch is already in bundle") + + bp = BundlePatch.objects.create(bundle = self, patch = patch, + order = max_order + 1) + bp.save() + class Meta: unique_together = [('owner', 'name')] @@ -312,6 +347,15 @@ class Bundle(models.Model): return '\n'.join([p.mbox().as_string(True) \ for p in self.patches.all()]) +class BundlePatch(models.Model): + patch = models.ForeignKey(Patch) + bundle = models.ForeignKey(Bundle) + order = models.IntegerField() + + class Meta: + unique_together = [('bundle', 'patch')] + ordering = ['order'] + class UserPersonConfirmation(models.Model): user = models.ForeignKey(User) email = models.CharField(max_length = 200) @@ -324,7 +368,7 @@ class UserPersonConfirmation(models.Model): return person = None try: - person = Person.objects.get(email = self.email) + person = Person.objects.get(email__iexact = self.email) except Exception: pass if not person: