diff options
-rw-r--r-- | patchwork/migrations/0024_patch_patch_project.py | 39 | ||||
-rw-r--r-- | patchwork/models.py | 4 | ||||
-rw-r--r-- | patchwork/parser.py | 1 | ||||
-rw-r--r-- | patchwork/tests/utils.py | 2 | ||||
-rw-r--r-- | patchwork/views/__init__.py | 2 |
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) |