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 <ores...@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
signature.asc
Description: OpenPGP digital signature