[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