changeset 345:a812fdfce278

View related news
author Sylvain Beucler <beuc@beuc.net>
date Sun, 29 Aug 2010 11:41:26 +0200
parents 32d0e87d3fd5
children 6b68af3c7eaf
files TODO savane/svnews/models.py savane/svnews/urls.py savane/svnews/views.py templates/svnews/news_detail.html
diffstat 5 files changed, 71 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/TODO
+++ b/TODO
@@ -74,7 +74,19 @@
 
 [/] Admin interface (implemented via Django admin)
 
-[ ] News management (+ comments)
+[/] News management
+
+    [X] Display frontpage news
+
+    [X] Display group news
+
+    [ ] Manage news
+
+    [ ] Post news item
+
+    [ ] Edit news item
+
+    [ ] Comments
 
 [/] Rewrite backend (or have them work on a replicate that uses the
     old DB schema)
@@ -109,7 +121,9 @@
 
     [X] Jobs
 
-    [.] Trackers
+    [X] Import news
+
+    [/] Trackers
 
 [ ] Implement mod_rewrite URL migration list
 
--- a/savane/svnews/models.py
+++ b/savane/svnews/models.py
@@ -20,10 +20,16 @@
 import django.contrib.auth.models as auth_models
 
 # - news_byte
+class ApprovedNewsManager(models.Manager):
+    def get_query_set(self):
+        return super(self.__class__, self).get_query_set().filter(is_approved__in=(0,1,2))
 class News(models.Model):
     """
     One piece of news
     """
+    class Meta:
+        ordering = ('-date',)
+
     IS_APPROVED_CHOICES = (
         ('0', 'approved for project page'),
         ('1', 'approved for site frontpage news'),
@@ -41,6 +47,9 @@
     # Savane3's 'forum_id', the most visible id, is now 'id'.
     # Savane3's 'id', only used in administration screens, is dropped.
 
+    objects = models.Manager() # default manager
+    approved_objects = ApprovedNewsManager()
+
 class Comment(models.Model):
     """
     A comment on the news item
--- a/savane/svnews/urls.py
+++ b/savane/svnews/urls.py
@@ -34,11 +34,11 @@
   url(r'^$', views.redirect_to_admin_group,
       {},
       name='news_list_admin_group'),
-  url(r'^(?P<object_id>\d+)/$', object_detail,
-      { 'queryset' : svnews_models.News.objects.filter(is_approved__in=(0,1,2,)) },
+  url(r'^(?P<object_id>\d+)/$', views.news_detail,
+      { 'queryset' : svnews_models.News.approved_objects.all() },
       name='news_detail'),
   url(r'^(?P<slug>[-\w]+)/$', views.news_list_by_group,
-      { 'queryset' : svnews_models.News.objects.filter(is_approved__in=(0,1,2,)).order_by('-date') },
+      { 'queryset' : svnews_models.News.approved_objects.all() },
       name='news_list_by_group'),
 )
 urlpatterns += decorated_patterns ('', only_project_admin,
--- a/savane/svnews/views.py
+++ b/savane/svnews/views.py
@@ -19,10 +19,11 @@
 from django.conf import settings
 from django.shortcuts import get_object_or_404
 from django.views.generic.simple import redirect_to
-from django.views.generic.list_detail import object_list
+from django.views.generic.list_detail import object_list, object_detail
 from django.core.urlresolvers import reverse
 from django.utils.translation import ugettext as _, ungettext
 import django.contrib.auth.models as auth_models
+import models as svnews_models
 
 def redirect_to_admin_group(*args, **kwargs):
     group = get_object_or_404(auth_models.Group, name=settings.SV_ADMIN_GROUP)
@@ -35,3 +36,13 @@
     kwargs['extra_context'] = kwargs.get('extra_context', {})
     kwargs['extra_context']['group'] = group
     return object_list(request, *args, **kwargs)
+
+def news_detail(request, *args, **kwargs):
+    news = get_object_or_404(svnews_models.News, pk=kwargs['object_id'])
+    group = news.group
+    kwargs['extra_context'] = kwargs.get('extra_context', {})
+    kwargs['extra_context']['group'] = group
+    kwargs['extra_context']['group_news'] = svnews_models.News \
+        .approved_objects.filter(group=group) \
+        .select_related()
+    return object_detail(request, *args, **kwargs)
--- a/templates/svnews/news_detail.html
+++ b/templates/svnews/news_detail.html
@@ -10,15 +10,39 @@
 
 {% block content %}
 
-<h2><a href="">{{object.summary}}</a></h2>
+<div class="indexright">
+  <div class="box">
+    <div class="boxtitle">{% trans "Latest news" %}</div>
+    {% with group_news|slice:":5" as object_list %}
+    {% include 'svnews/news_list_short.inc' %}
+    {% endwith %}
+    <div class="smaller">
+      <a href="{% url savane:svnews:news_list_admin_group %}"
+        >[{% blocktrans count group_news.count as count %}{{count}} news in archive{% plural %}{{count}} news in archive{% endblocktrans %}]
+      </a>
+    </div>
+  </div>
+</div>
+
+<div class="indexcenter">
+  <h2><a href="">{{object.summary}}</a></h2>
 
-<p><em>
-  {% trans "Posted by" %}
-  {% include 'svnews/user_submitted_by_link.inc' %}
-  {{object.date}}
-</em></p>
+  <p><em>
+    {% trans "Posted by" %}
+    {% include 'svnews/user_submitted_by_link.inc' %}
+    {{object.date}}
+  </em></p>
+
+  {{object.details|svmarkup_full}}
 
-{{object.details|svmarkup_full}}
+  <h2><a name="comments" href="#comments">{% trans "Comments" %}</a></h2>
+
+  <h2><a name="newthread" href="#newthread">{% trans "Start a new thread" %}</a></h2>
+  {% if not user.is_anonymous %}
+  {% else %}
+  <p class="error" style="text-align: center">{% trans "You could post if you were logged in" %}</p>
+  {% endif %}
+</div>
 
 {% endblock %}