Add RSS feed for last comments. Numerous bugfixes.

portnov [2008-06-16 07:27:48]
Add RSS feed for last comments. Numerous bugfixes.
Filename
mgmt/bugs_views.py
mgmt/context.py
mgmt/decorators.py
mgmt/documents_views.py
mgmt/hms/modules/last_comments.py
mgmt/reports_views.py
mgmt/requests_views.py
mgmt/rss_views.py
mgmt/tasks_views.py
mgmt/utils.py
mgmt/views.py
templates/base.html
templates/rss.xml
urls.py
diff --git a/mgmt/bugs_views.py b/mgmt/bugs_views.py
index 46a4f05..66b3454 100644
--- a/mgmt/bugs_views.py
+++ b/mgmt/bugs_views.py
@@ -1,3 +1,5 @@
+from django.http import HttpResponseForbidden,HttpResponseRedirect
+from django.core.urlresolvers import reverse
 from django.conf import settings
 import django.newforms as djangoforms
 from decorators import check_auth,login_required,render_to
diff --git a/mgmt/context.py b/mgmt/context.py
index 505dc2f..cd8860c 100644
--- a/mgmt/context.py
+++ b/mgmt/context.py
@@ -2,6 +2,7 @@

 import sys
 from os.path import dirname
+from datetime import datetime
 import re

 from django.conf import settings
@@ -63,6 +64,9 @@ def add_menu(request):
   menu = hms.modules.menu(request)
   return dict(menu=menu)

+def for_rss(request):
+  return dict(pub_date = datetime.now().strftime('%a, %d %b %Y %H:%M:%S') )
+
 def debug_messages(request):
   if settings.DEBUG:
     return dict(debug = debug.dump())
diff --git a/mgmt/decorators.py b/mgmt/decorators.py
index 4b2d618..90dc9ff 100644
--- a/mgmt/decorators.py
+++ b/mgmt/decorators.py
@@ -1,6 +1,6 @@
 from django.http import HttpResponseForbidden,HttpResponseRedirect
 from rights import can
-from utils import render_it
+from utils import render_it,render_rss

 def login_required(func):
   def wrapper(request,*args,**kwargs):
@@ -31,7 +31,19 @@ def render_to(template):
   def decorator(func):
     def wrapper(request,*args,**kwargs):
       r = func(request,*args,**kwargs)
-      return render_it(template, r, request)
+      if isinstance(r,dict):
+        return render_it(template, r, request)
+      else:
+        return r
+    wrapper.__name__ = func.__name__
+    return wrapper
+  return decorator
+
+def rss(template):
+  def decorator(func):
+    def wrapper(request,*args,**kwargs):
+      r = func(request,*args,**kwargs)
+      return render_rss(template, r, request)
     wrapper.__name__ = func.__name__
     return wrapper
   return decorator
diff --git a/mgmt/documents_views.py b/mgmt/documents_views.py
index 81f8f82..bfa6b92 100644
--- a/mgmt/documents_views.py
+++ b/mgmt/documents_views.py
@@ -1,3 +1,5 @@
+from django.http import HttpResponseRedirect
+from django.core.urlresolvers import reverse
 from decorators import check_auth,login_required,render_to
 from utils import get_comments
 from models import *
diff --git a/mgmt/hms/modules/last_comments.py b/mgmt/hms/modules/last_comments.py
index 2b9a5c3..a5e1bdc 100644
--- a/mgmt/hms/modules/last_comments.py
+++ b/mgmt/hms/modules/last_comments.py
@@ -3,22 +3,12 @@
 def init():

   from mgmt.models import Comment
+  import mgmt.utils

   @block
   def last_comments():
     def short_comment(comment):
-      def get_url(comment):
-        type = comment.object_type
-        id = comment.object_id
-        if type=='Project':
-          return "/projects/%s/#comment-%s" % (id,comment.id)
-        if type=='Bug':
-          return "/bugs/%s/#comment-%s" % (id,comment.id)
-        if type=='Document':
-          return "/docs/%d/#comment-%s" % (id,comment.id)
-        if type=='Request':
-          return "/requests/%d/#comment-%s" % (id,comment.id)
-      return "<li><a href='%s'>%s</a></li>" % (get_url(comment),comment.title)
+      return u"<li><a href='%s'>%s</a></li>" % (mgmt.utils.get_comment_url(comment),comment.title)
     b = Block()
     b.name='last_comments'
     b.title = u"Последние комментарии"
diff --git a/mgmt/reports_views.py b/mgmt/reports_views.py
index 97e6113..4cc86c5 100644
--- a/mgmt/reports_views.py
+++ b/mgmt/reports_views.py
@@ -1,3 +1,5 @@
+from django.http import HttpResponseForbidden,HttpResponseRedirect
+from django.core.urlresolvers import reverse
 from decorators import check_auth,login_required,render_to
 from models import *
 from rights import can
diff --git a/mgmt/requests_views.py b/mgmt/requests_views.py
index 3ade79f..afbd844 100644
--- a/mgmt/requests_views.py
+++ b/mgmt/requests_views.py
@@ -1,3 +1,5 @@
+from django.http import HttpResponseForbidden,HttpResponseRedirect
+from django.core.urlresolvers import reverse
 from decorators import check_auth,login_required,render_to
 from utils import get_comments
 from models import *
diff --git a/mgmt/rss_views.py b/mgmt/rss_views.py
new file mode 100644
index 0000000..e99102f
--- /dev/null
+++ b/mgmt/rss_views.py
@@ -0,0 +1,12 @@
+from datetime import datetime
+from django.conf import settings
+from models import Comment
+from decorators import rss
+from utils import get_comment_url
+
+@rss('rss.xml')
+def last_comments(request):
+  comments = Comment.objects.all()[:settings.COMMENTS_PER_PAGE]
+  for c in comments:
+    c.url = get_comment_url(c)
+  return {'objects': comments}
diff --git a/mgmt/tasks_views.py b/mgmt/tasks_views.py
index 8c6f5e1..0e05d99 100644
--- a/mgmt/tasks_views.py
+++ b/mgmt/tasks_views.py
@@ -1,3 +1,5 @@
+from django.http import HttpResponseForbidden,HttpResponseRedirect
+from django.core.urlresolvers import reverse
 from decorators import check_auth,login_required,render_to
 from models import *
 from rights import can
diff --git a/mgmt/utils.py b/mgmt/utils.py
index 696dea6..70c71b1 100644
--- a/mgmt/utils.py
+++ b/mgmt/utils.py
@@ -4,7 +4,7 @@ from django.http import HttpResponse
 from django.core.paginator import Paginator
 from django.conf import settings

-from context import add_blocks,debug_messages,add_menu
+from context import add_blocks,debug_messages,add_menu,for_rss
 from models import *

 #############
@@ -16,6 +16,11 @@ def render_it(template,dict,request):
   t = get_template(template)
   return HttpResponse(t.render(c))

+def render_rss(template,dict,request):
+  c = RequestContext(request,dict,[for_rss])
+  t = get_template(template)
+  return HttpResponse(t.render(c),mimetype='application/xml')
+
 def get_comments(request,id,type):
   all = Comment.objects.filter(object_id=id, object_type=type)
   pg = Paginator(all,settings.COMMENTS_PER_PAGE)
@@ -38,3 +43,15 @@ def get_bugs(request,pid=None):
   if range == [1]:
     range = None
   return page_num,range, page.object_list
+
+def get_comment_url(comment):
+  type = comment.object_type
+  id = comment.object_id
+  if type=='Project':
+    return "/projects/%s/#comment-%s" % (id,comment.id)
+  if type=='Bug':
+    return "/bugs/%s/#comment-%s" % (id,comment.id)
+  if type=='Document':
+    return "/docs/%d/#comment-%s" % (id,comment.id)
+  if type=='Request':
+    return "/requests/%d/#comment-%s" % (id,comment.id)
diff --git a/mgmt/views.py b/mgmt/views.py
index 99e2191..93fa0ff 100644
--- a/mgmt/views.py
+++ b/mgmt/views.py
@@ -21,6 +21,7 @@ from requests_views import *
 from documents_views import *
 from tasks_views import *
 from reports_views import *
+from rss_views import *

 #############
 # Views
diff --git a/templates/base.html b/templates/base.html
index af6bc90..a436c1a 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -10,6 +10,7 @@
     <link rel='stylesheet' type='text/css' href='/media/css/main.css'/>
     <link rel="stylesheet" type="text/css" href="/media/js/markitup/skins/markitup/style.css" />
     <link rel="stylesheet" type="text/css" href="/media/js/markitup/sets/markdown/style.css" />
+    <link rel="alternate" title="Последние комментарии" type="application/rss+xml" href="/comments/feed/" />
     <script type="text/javascript" src="jquery.js"></script>
     <script type="text/javascript" src="markitup/jquery.markitup.js"></script>
     <script type="text/javascript" src="markitup/sets/markdown/set.js"></script>
diff --git a/templates/rss.xml b/templates/rss.xml
new file mode 100644
index 0000000..6aac873
--- /dev/null
+++ b/templates/rss.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<rss version="2.0">
+{% load prj_filters %}
+
+<channel>
+   <title>Projects: Последние комментарии</title>
+   <link>http://projects.rtfm-com.ru/</link>
+   <description>Последние комментарии по проектам</description>
+   <language>ru-ru</language>
+   <pubDate>{{pub_date}}</pubDate>
+
+{% for object in objects %}
+<item>
+   <title>{{object.title}}</title>
+   <link>http://rtfm-server{{object.url}}</link>
+   <description>{{object.text|markdown|safe}}</description>
+</item>
+{% endfor %}
+
+</channel>
+</rss>
diff --git a/urls.py b/urls.py
index d03edc0..90a58d2 100644
--- a/urls.py
+++ b/urls.py
@@ -30,6 +30,7 @@ urlpatterns = patterns('',
     (r'^message/(\d+)/delete/$', 'mgmt.views.delete_private_message'),
     (r'^preview/$', 'mgmt.views.message_preview'),
     (r'^comments/(\d+)/delete/$', 'mgmt.views.delete_comment'),
+    (r'^comments/feed/$', 'mgmt.views.last_comments'),
     (r'^my/$', 'mgmt.views.my_page'),

     (r'git/', include('pygit.urls')),
ViewGit