[PATCH v2 1/5] Add option to get all project patches in one mbox

Mete Polat metepolat2000 at gmail.com
Sat Jun 29 01:56:36 AEST 2019


FilenameMixin.filename(self) returns a sanitized filename based on the str
representation of the object. In our case str(project) returns the project name.
Thus the output file will be <project_name_sanitized>.mbox

Signed-off-by: Mete Polat <metepolat2000 at gmail.com>
---
patch_list_mbox() and project_patches_to_mbox() are not named project_mbox() and
project_to_mbox() in order to prevent confusion. While a project also consists
of cover letters, those are not intended to be included.

 patchwork/models.py      | 22 +++++++++++-----------
 patchwork/views/patch.py | 12 ++++++++++++
 patchwork/views/utils.py | 13 +++++++++++++
 3 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/patchwork/models.py b/patchwork/models.py
index a7eee4d..36d6fad 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -55,8 +55,18 @@ class Person(models.Model):
         verbose_name_plural = 'People'
 
 
+class FilenameMixin(object):
+
+    @property
+    def filename(self):
+        """Return a sanitized filename without extension."""
+        fname_re = re.compile(r'[^-_A-Za-z0-9\.]+')
+        fname = fname_re.sub('-', str(self)).strip('-')
+        return fname
+
+
 @python_2_unicode_compatible
-class Project(models.Model):
+class Project(FilenameMixin, models.Model):
     # properties
 
     linkname = models.CharField(max_length=255, unique=True)
@@ -337,16 +347,6 @@ class EmailMixin(models.Model):
         abstract = True
 
 
-class FilenameMixin(object):
-
-    @property
-    def filename(self):
-        """Return a sanitized filename without extension."""
-        fname_re = re.compile(r'[^-_A-Za-z0-9\.]+')
-        fname = fname_re.sub('-', str(self)).strip('-')
-        return fname
-
-
 @python_2_unicode_compatible
 class Submission(FilenameMixin, EmailMixin, models.Model):
     # parent
diff --git a/patchwork/views/patch.py b/patchwork/views/patch.py
index 277b281..cf494ad 100644
--- a/patchwork/views/patch.py
+++ b/patchwork/views/patch.py
@@ -20,6 +20,7 @@ from patchwork.models import Project
 from patchwork.models import Submission
 from patchwork.views import generic_list
 from patchwork.views.utils import patch_to_mbox
+from patchwork.views.utils import project_patches_to_mbox
 from patchwork.views.utils import series_patch_to_mbox
 
 
@@ -34,6 +35,17 @@ def patch_list(request, project_id):
     return render(request, 'patchwork/list.html', context)
 
 
+def patch_list_mbox(request, project_id):
+    project = get_object_or_404(Project, linkname=project_id)
+
+    response = HttpResponse(content_type='text/plain')
+    response.write(project_patches_to_mbox(project))
+    response['Content-Disposition'] = 'attachment; filename=%s.mbox' % (
+        project.filename)
+
+    return response
+
+
 def patch_detail(request, patch_id):
     # redirect to cover letters where necessary
     try:
diff --git a/patchwork/views/utils.py b/patchwork/views/utils.py
index eed4aee..c2aa619 100644
--- a/patchwork/views/utils.py
+++ b/patchwork/views/utils.py
@@ -110,6 +110,19 @@ patch_to_mbox = _submission_to_mbox
 cover_to_mbox = _submission_to_mbox
 
 
+def project_patches_to_mbox(project):
+    """Get an mbox representation of all patches in a project.
+
+    Arguments:
+        project: The project object to convert.
+
+    Returns:
+        A string for the mbox file.
+    """
+    patches = Patch.objects.filter(patch_project=project)
+    return '\n'.join([patch_to_mbox(p) for p in patches])
+
+
 def bundle_to_mbox(bundle):
     """Get an mbox representation of a bundle.
 
-- 
2.22.0



More information about the Patchwork mailing list