[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#756766: Initial work-patch on this bug



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


Reply to: