aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--patchwork/migrations/0024_patch_patch_project.py39
-rw-r--r--patchwork/models.py4
-rw-r--r--patchwork/parser.py1
-rw-r--r--patchwork/tests/utils.py2
-rw-r--r--patchwork/views/__init__.py2
5 files changed, 47 insertions, 1 deletions
diff --git a/patchwork/migrations/0024_patch_patch_project.py b/patchwork/migrations/0024_patch_patch_project.py
new file mode 100644
index 0000000..76d8f14
--- /dev/null
+++ b/patchwork/migrations/0024_patch_patch_project.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-03-08 01:51
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+ # per migration 16, but note this seems to be going away
+ # in new PostgreSQLs (https://stackoverflow.com/questions/12838111/south-cannot-alter-table-because-it-has-pending-trigger-events#comment44629663_12838113)
+ atomic = False
+
+ dependencies = [
+ ('patchwork', '0023_timezone_unify'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='patch',
+ name='patch_project',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='patchwork.Project'),
+ preserve_default=False,
+ ),
+
+ # as with 10, this will break if you use non-default table names
+ migrations.RunSQL('''UPDATE patchwork_patch SET patch_project_id =
+ (SELECT project_id FROM patchwork_submission
+ WHERE patchwork_submission.id =
+ patchwork_patch.submission_ptr_id);'''
+ ),
+
+ migrations.AlterField(
+ model_name='patch',
+ name='patch_project',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='patchwork.Project'),
+ ),
+
+ ]
diff --git a/patchwork/models.py b/patchwork/models.py
index ff1d7dc..f91b994 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -433,6 +433,10 @@ class Patch(SeriesMixin, Submission):
archived = models.BooleanField(default=False)
hash = HashField(null=True, blank=True)
+ # duplicate project from submission in subclass so we can count the
+ # patches in a project without needing to do a JOIN.
+ patch_project = models.ForeignKey(Project, on_delete=models.CASCADE)
+
objects = PatchManager()
@staticmethod
diff --git a/patchwork/parser.py b/patchwork/parser.py
index 803e985..805037c 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -1004,6 +1004,7 @@ def parse_mail(mail, list_id=None):
patch = Patch.objects.create(
msgid=msgid,
project=project,
+ patch_project=project,
name=name[:255],
date=date,
headers=headers,
diff --git a/patchwork/tests/utils.py b/patchwork/tests/utils.py
index f0a71fb..eb14a7d 100644
--- a/patchwork/tests/utils.py
+++ b/patchwork/tests/utils.py
@@ -176,6 +176,8 @@ def create_patch(**kwargs):
'diff': SAMPLE_DIFF,
}
values.update(kwargs)
+ if 'patch_project' not in values:
+ values['patch_project'] = values['project']
return Patch.objects.create(**values)
diff --git a/patchwork/views/__init__.py b/patchwork/views/__init__.py
index 3baf299..f8d23a3 100644
--- a/patchwork/views/__init__.py
+++ b/patchwork/views/__init__.py
@@ -270,7 +270,7 @@ def generic_list(request, project, view, view_args=None, filter_settings=None,
context['filters'].set_status(filterclass, setting)
if patches is None:
- patches = Patch.objects.filter(project=project)
+ patches = Patch.objects.filter(patch_project=project)
# annotate with tag counts
patches = patches.with_tag_counts(project)