From 7cf6a28d4c852056ee924fbc8d7197087cbec493 Mon Sep 17 00:00:00 2001
From: DylannCordel <d.cordel@webu.coop>
Date: Mon, 8 Dec 2014 16:52:34 +0100
Subject: [PATCH] some code refactoring to be able to modify some default
 behaviour

---
 newsbox/models.py          | 30 ++++++++++++++++--------------
 newsbox/views.py           |  8 ++++----
 newsbox_cms/cms_plugins.py | 16 +++++++++++-----
 3 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/newsbox/models.py b/newsbox/models.py
index 59d62e2..7912b8c 100644
--- a/newsbox/models.py
+++ b/newsbox/models.py
@@ -45,22 +45,24 @@ class NewsboxManager(models.Manager):
     Filter published news
     """
 
-    def published(self):
+    @classmethod
+    def q_published(cls):
         now = datetime.utcnow().replace(tzinfo=utc)
-        query_set = super(NewsboxManager, self).get_query_set().filter(
-            # Only published News
-            models.Q(newsbox_published=True),
-        ).exclude(
-            # exclude news with publication start date in the future
-            models.Q(newsbox_publication_start_date__gt=now)
-        )
-        
-        if issubclass(self.model, NewsboxExpiredBase):
-            query_set = query_set.exclude(
-                # exclude news which are obsolete
-                models.Q(newsbox_publication_end_date__lte=now)
+        # Only published News
+        q = models.Q(newsbox_published=True)
+        # exclude news with publication start date in the future
+        q &= ~models.Q(newsbox_publication_start_date__gt=now)
+        if issubclass(cls, NewsboxExpiredBase):
+            # exclude news which are obsolete
+            q &= ~(
+                models.Q(newsbox_publication_end_date__lte=now) |
+                models.Q(newsbox_publication_end_date__isnull=True)
             )
-        return query_set
+        return q
+
+    def published(self):
+        q = self.q_published()
+        return super(NewsboxManager, self).get_queryset().filter(q)
 
 
 class NewsboxModelBase(models.base.ModelBase):
diff --git a/newsbox/views.py b/newsbox/views.py
index 8c5fa5b..18c0c3f 100644
--- a/newsbox/views.py
+++ b/newsbox/views.py
@@ -46,10 +46,10 @@ class NewsboxBaseArchiveView(object):
         return context
 
     def get_queryset(self):
-        if self.request.user.is_staff:
-            return self.model.objects.all()
-        else:
-            return self.model.objects.published()
+        queryset = super(NewsboxBaseArchiveView, self).get_queryset()
+        if not self.request.user.is_staff:
+            queryset = queryset.filter(pk__in=self.model.objects.published())
+        return queryset
 
 class NewsboxArchiveView(NewsboxBaseArchiveView, ArchiveIndexView):
     def get_context_data(self, **kwargs):
diff --git a/newsbox_cms/cms_plugins.py b/newsbox_cms/cms_plugins.py
index d42181a..e5b2a10 100644
--- a/newsbox_cms/cms_plugins.py
+++ b/newsbox_cms/cms_plugins.py
@@ -12,14 +12,22 @@ class NewsboxPluginBase(CMSPluginBase):
     render_template = "newsbox_cms/list-cms.html" # template to render the plugin
     raw_id_fields = ('page_link',)
 
+    def get_instance_queryset(self, instance, request):
+        NewsboxModel = instance.newsbox_model
+        return NewsboxModel.objects.published()
+
     def render(self, context, instance, placeholder):
         from django.db.models.loading import get_model
-        
+
         NewsboxModel = instance.newsbox_model
 
         if not NewsboxModel or not issubclass(NewsboxModel, NewsboxBase):
             raise Exception(_("The choosen news type to display is invalid"))
 
+        newsset = self.get_instance_queryset(
+            instance=instance, 
+            request=context['request'])
+
         if instance.numitems > 0 :
             with_pager = instance.with_pager
 
@@ -27,8 +35,7 @@ class NewsboxPluginBase(CMSPluginBase):
                 from django.core.paginator import Paginator, \
                     EmptyPage, PageNotAnInteger
 
-                paginator = Paginator(NewsboxModel.objects.published(), 
-                    instance.numitems)
+                paginator = Paginator(newsset, instance.numitems)
                 page = context['request'].GET.get('page')
                 try:
                     newsset = paginator.page(page)
@@ -39,9 +46,8 @@ class NewsboxPluginBase(CMSPluginBase):
                     # If page is out of range (e.g. 9999), deliver last page of results.
                     newsset = paginator.page(paginator.num_pages)
             else :
-                newsset = NewsboxModel.objects.published()[:instance.numitems]
+                newsset = newsset[:instance.numitems]
         else :
-            newsset = NewsboxModel.objects.published()
             with_pager = False
         context.update({
             'instance': instance,
-- 
GitLab