[Patchew-devel] [PATCH v2 1/4] views: make download link only retrieve patches

Paolo Bonzini pbonzini at redhat.com
Fri Sep 28 14:58:42 UTC 2018


This is almost always what you really want.  The download link now
appears only on complete series and also on message pages, where
it will download a single patch.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 api/models.py                    | 17 ++++++++++++-----
 www/templates/series-detail.html |  6 ++----
 www/urls.py                      |  2 +-
 www/views.py                     | 24 +++++++++++++++++++-----
 4 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/api/models.py b/api/models.py
index e4737cb..a6639b7 100644
--- a/api/models.py
+++ b/api/models.py
@@ -317,21 +317,28 @@ class MessageManager(models.Manager):
     class DuplicateMessageError(Exception):
         pass
 
-    def series_heads(self, project=None):
-        q = super(MessageManager, self).get_queryset()\
-                .filter(is_series_head=True).prefetch_related('properties', 'project')
+    def project_messages(self, project):
+        q = super(MessageManager, self).get_queryset()
         if isinstance(project, str):
             po = Project.objects.get(name=project)
         elif isinstance(project, int):
             po = Project.objects.get(id=project)
-        else:
-            return q
         q = q.filter(project=po) | q.filter(project__parent_project=po)
         return q
 
+    def series_heads(self, project=None):
+        if project:
+            q = self.project_messages(project)
+        else:
+            q = super(MessageManager, self).get_queryset()
+        return q.filter(is_series_head=True).prefetch_related('properties', 'project')
+
     def find_series(self, message_id, project_name=None):
         return self.series_heads(project_name).filter(message_id=message_id).first()
 
+    def find_message(self, message_id, project_name):
+        return self.project_messages(project_name).filter(message_id=message_id).first()
+
     def patches(self):
         return super(MessageManager, self).get_queryset().\
                 filter(is_patch=True)
diff --git a/www/templates/series-detail.html b/www/templates/series-detail.html
index cb5d611..02ce72c 100644
--- a/www/templates/series-detail.html
+++ b/www/templates/series-detail.html
@@ -24,17 +24,15 @@
 		    patch{% if series.total_patches != 1 %}es{% endif %}
 	    </span> <span class="message-age" title="{{ series.date }}">
 		    {{ series.age }} ago</span>
+  {% if series.extra_links %}
   <ul id="series-links">
-    <li>
-      <span class="fa fa-download"></span> <a
-        href="/{{ project }}/{{ series.message_id }}/mbox">Download series mbox</a></li>
-    </li>
     {% for op in series.extra_links %}
     <li>
       <span class="fa fa-{% if op.icon %}{{ op.icon }}{% else %}question{% endif %}"></span>
         {{ op.html }}</li>
     {% endfor %}
   </ul>
+  {% endif %}
 </div>
 
 {% if series.extra_ops %}
diff --git a/www/urls.py b/www/urls.py
index 1659ff2..5787cbd 100644
--- a/www/urls.py
+++ b/www/urls.py
@@ -34,6 +34,6 @@ urlpatterns += [
         url(r"^(?P<project>[^/]*)/info$", views.view_project_detail, name="project_detail"),
         url(r"^(?P<project>[^/]*)/(?P<message_id>[^/]*)/$", views.view_series_detail, name="series_detail"),
         url(r"^(?P<project>[^/]*)/(?P<thread_id>[^/]*)/(?P<message_id>[^/]*)/$", views.view_series_message, name="series_message"),
-        url(r"^(?P<project>[^/]*)/(?P<message_id>[^/]*)/mbox$", views.view_series_mbox),
+        url(r"^(?P<project>[^/]*)/(?P<message_id>[^/]*)/mbox$", views.view_series_mbox, name="mbox"),
         url(r"^$", views.view_project_list, name="project_list"),
         ]
diff --git a/www/views.py b/www/views.py
index dd910b1..11043a1 100644
--- a/www/views.py
+++ b/www/views.py
@@ -13,6 +13,7 @@ from django.shortcuts import render
 from django.http import HttpResponse, Http404
 from django.db.models import Exists, OuterRef
 from django.urls import reverse
+from django.utils.html import format_html
 from django.conf import settings
 import api
 from mod import dispatch_module_hook
@@ -39,6 +40,8 @@ def prepare_message(request, project, m, detailed):
     m.age = m.get_age()
     m.url = reverse("series_detail", kwargs={"project": project.name, "message_id": m.message_id})
     m.status_tags = []
+    m.extra_links = []
+    mbox_url = reverse("mbox", kwargs={"project": project.name, "message_id": m.message_id})
     if m.is_series_head:
         m.num_patches = m.get_num_patches()
         m.total_patches = m.get_total_patches()
@@ -50,11 +53,17 @@ def prepare_message(request, project, m, detailed):
                 "type": "warning",
                 "char": "?",
                 })
+        else:
+            m.extra_links.append({'html': format_html('<a href="{}">Download patches mbox</a>', mbox_url),
+                                  'icon': 'download'})
+    else:
+        m.extra_links.append({'html': format_html('<a href="{}">Download mbox</a>', mbox_url),
+                              'icon': 'download'})
+
     # hook points for plugins
     m.has_other_revisions = False
     m.extra_status = []
     m.extra_ops = []
-    m.extra_links = []
     dispatch_module_hook("prepare_message_hook", request=request, message=m,
                          detailed=detailed)
     if m.is_merged:
@@ -237,13 +246,18 @@ def view_series_list(request, project):
     query = api.models.Message.objects.series_heads(prj.id)
     return render_series_list_page(request, query, project=project)
 
-def view_series_mbox(request, project, message_id):
-    s = api.models.Message.objects.find_series(message_id, project)
+def view_mbox(request, project, message_id):
+    s = api.models.Message.objects.find_message(project, message_id)
     if not s:
         raise Http404("Series not found")
-    r = prepare_series(request, s)
+    if s.is_cover_letter:
+        if not s.is_complete:
+            raise Http404("Series not complete")
+        messages = s.get_patches()
+    else:
+        messages = [s]
     mbox = "\n".join(["From %s %s\n" % (x.get_sender_addr(), x.get_asctime()) + \
-                      x.get_mbox() for x in r])
+                      x.get_mbox(x) for x in messages])
     return HttpResponse(mbox, content_type="text/plain")
 
 def view_series_detail(request, project, message_id):
-- 
2.17.1





More information about the Patchew-devel mailing list