Hello, I reworked most of the patch, using the ListView and factorising most of the code. Let me know if this needs more work :) Cheers, Orestis
From 604f9981bc8630b3a21fb55ca5c35780d3094f40 Mon Sep 17 00:00:00 2001
From: Orestis Ioannou <orestis@oioannou.com>
Date: Wed, 2 Sep 2015 10:38:10 +0200
Subject: [PATCH] Add support for browsing package news
Packages now have their own specific news page accessible by
the respective panel in the package page.
---
distro_tracker/core/panels.py | 4 ++-
.../core/templates/core/_news_pagination.html | 34 ++++++++++++++++++++++
.../core/templates/core/package_news.html | 8 +++++
.../core/templates/core/panels/news.html | 31 +++++---------------
distro_tracker/core/views.py | 29 ++++++++++++++++++
distro_tracker/project/urls.py | 4 +++
6 files changed, 85 insertions(+), 25 deletions(-)
create mode 100644 distro_tracker/core/templates/core/_news_pagination.html
create mode 100644 distro_tracker/core/templates/core/package_news.html
diff --git a/distro_tracker/core/panels.py b/distro_tracker/core/panels.py
index 8c2cd82..668cb64 100644
--- a/distro_tracker/core/panels.py
+++ b/distro_tracker/core/panels.py
@@ -805,9 +805,11 @@ class NewsPanel(BasePanel):
def context(self):
news = News.objects.prefetch_related('signed_by')
news = news.filter(package=self.package).order_by('-datetime_created')
+ more_pages = True if len(news) > self.NEWS_LIMIT else False
news = news[:self.NEWS_LIMIT]
return {
- 'news': news
+ 'news': news,
+ 'has_more': more_pages
}
@property
diff --git a/distro_tracker/core/templates/core/_news_pagination.html b/distro_tracker/core/templates/core/_news_pagination.html
new file mode 100644
index 0000000..82d4f9a
--- /dev/null
+++ b/distro_tracker/core/templates/core/_news_pagination.html
@@ -0,0 +1,34 @@
+<ul class="list-group list-group-flush">
+ {% for news_item in news %}
+ <li class="list-group-item">
+ [<span class="news-date">{{ news_item.datetime_created|date:"Y-m-d" }}</span>]
+ <a href="{% url 'dtracker-news-page' news_item.pk %}">
+ <span class="news-title">{{ news_item.title }}</span>
+ </a>
+ {% if news_item.created_by %}(<span class="news-creator">{{ news_item.created_by }}</span>){% endif %}
+ {% with signers=news_item.signed_by.all %}
+ {% if signers and signers.0.name != news_item.created_by %}
+ {% spaceless %}
+ <span>(signed by: </span>
+ {% for signer in signers %}
+ <span class="news-signer">{{ signer.name }}</span>
+ {% if not forloop.last %}<span>, </span>{% endif %}
+ {% endfor %}
+ <span>)</span>
+ {% endspaceless %}
+ {% endif %}
+ {% endwith %}
+ </li>
+ {% endfor %}
+</ul>
+{% if is_paginated %}
+<div class="text-center">
+<div class="pagination">
+<ul>
+ {% for page in page_obj.paginator.page_range %}
+ <li {% if page_obj.number == page %}class="active"{% endif %}><a href="?page={{ page }}">{{ page }}</a></li>
+ {% endfor %}
+</ul>
+</div>
+</div>
+{% endif %}
diff --git a/distro_tracker/core/templates/core/package_news.html b/distro_tracker/core/templates/core/package_news.html
new file mode 100644
index 0000000..ed40eaf
--- /dev/null
+++ b/distro_tracker/core/templates/core/package_news.html
@@ -0,0 +1,8 @@
+{% extends 'core/base.html' %}
+
+{% block content %}
+<h1 class="text-center">News for package <a href="{% url 'dtracker-package-page' package %}">{{ package }}</a></h1>
+<div class="row-fluid">
+{% include "core/_news_pagination.html" %}
+</div>
+{% endblock %}
diff --git a/distro_tracker/core/templates/core/panels/news.html b/distro_tracker/core/templates/core/panels/news.html
index 1cc38fd..b0532ed 100644
--- a/distro_tracker/core/templates/core/panels/news.html
+++ b/distro_tracker/core/templates/core/panels/news.html
@@ -3,7 +3,7 @@
{% block panel-header %}
<div class="row-fluid">
<div class="pull-left">
- <span>{{ panel.title }}</span>
+ <span>{{ panel.title }} <a href="{% url 'dtracker-package-news' package.name %}"><i class='icon-share'></i></a></span>
</div>
<div class="pull-right">
<a title="rss feed" href="{% url 'dtracker-package-rss-news-feed' package.name %}">
@@ -14,27 +14,10 @@
{% endblock %}
{% block panel-body %}
-<ul class="list-group list-group-flush">
- {% for news_item in panel.context.news %}
- <li class="list-group-item">
- [<span class="news-date">{{ news_item.datetime_created|date:"Y-m-d" }}</span>]
- <a href="{% url 'dtracker-news-page' news_item.pk %}">
- <span class="news-title">{{ news_item.title }}</span>
- </a>
- {% if news_item.created_by %}(<span class="news-creator">{{ news_item.created_by }}</span>){% endif %}
- {% with signers=news_item.signed_by.all %}
- {% if signers and signers.0.name != news_item.created_by %}
- {% spaceless %}
- <span>(signed by: </span>
- {% for signer in signers %}
- <span class="news-signer">{{ signer.name }}</span>
- {% if not forloop.last %}<span>, </span>{% endif %}
- {% endfor %}
- <span>)</span>
- {% endspaceless %}
- {% endif %}
- {% endwith %}
- </li>
- {% endfor %}
-</ul>
+{% with news=panel.context.news %}
+ {% include "core/_news_pagination.html" %}
+{% endwith %}
+{% if panel.context.has_more %}
+<div class="pagination">Page <a href="{% url 'dtracker-package-news' package.name %}?page=2">2</a></div>
+{% endif %}
{% endblock %}
diff --git a/distro_tracker/core/views.py b/distro_tracker/core/views.py
index 16b958b..e0b802e 100644
--- a/distro_tracker/core/views.py
+++ b/distro_tracker/core/views.py
@@ -176,6 +176,35 @@ def news_page(request, news_id):
})
+class PackageNews(ListView):
+ """
+ A view which lists all the news of a package.
+ """
+ _DEFAULT_NEWS_LIMIT = 30
+ NEWS_LIMIT = getattr(
+ settings,
+ 'DISTRO_TRACKER_NEWS_PANEL_LIMIT',
+ _DEFAULT_NEWS_LIMIT)
+
+ paginate_by = NEWS_LIMIT
+ template_name = 'core/package_news.html'
+ context_object_name = 'news'
+
+ def get(self, request, package_name):
+ self.package = get_object_or_404(PackageName, name=package_name)
+ return super(PackageNews, self).get(request, package_name)
+
+ def get_queryset(self):
+ news = News.objects.prefetch_related('signed_by')
+ return(news.filter(package=self.package)
+ .order_by('-datetime_created'))
+
+ def get_context_data(self, *args, **kwargs):
+ context = super(PackageNews, self).get_context_data(*args, **kwargs)
+ context['package'] = self.package
+ return context
+
+
class ActionItemJsonView(View):
"""
View renders a :class:`distro_tracker.core.models.ActionItem` in a JSON
diff --git a/distro_tracker/project/urls.py b/distro_tracker/project/urls.py
index cbe1fe8..0b21808 100644
--- a/distro_tracker/project/urls.py
+++ b/distro_tracker/project/urls.py
@@ -39,6 +39,7 @@ from distro_tracker.core.views import SetMuteTeamView
from distro_tracker.core.views import SetMembershipKeywords
from distro_tracker.core.views import EditMembershipView
from distro_tracker.core.views import IndexView
+from distro_tracker.core.views import PackageNews
from distro_tracker.core.news_feed import PackageNewsFeed
from distro_tracker.accounts.views import ConfirmAddAccountEmail
from distro_tracker.accounts.views import LoginView
@@ -213,6 +214,9 @@ urlpatterns = patterns(
url(r'^teams/(?P<slug>.+?)/$', TeamDetailsView.as_view(),
name='dtracker-team-page'),
+ # Package news page
+ url(r'^pkg/(?P<package_name>.+)/news/', PackageNews.as_view(),
+ name='dtracker-package-news'),
# Dedicated package page
url(r'^pkg/(?P<package_name>[^/]+)/?$',
--
2.6.1
Attachment:
signature.asc
Description: OpenPGP digital signature