[Hejes-devel] [926] - refactored blog feed generator core to a common module so it can be used by other controllers and views

hejes-devel at nytud.hu hejes-devel at nytud.hu
Fri Sep 6 17:06:53 CEST 2013


Revision: 926
Author:   mihaltz
Date:     2013-09-06 17:06:53 +0200 (Fri, 06 Sep 2013)
Log Message:
-----------
- refactored blog feed generator core to a common module so it can be used by other controllers and views
- blog/feed.rss: implemented recommendations by http://validator.w3.org/feed/; added 'language'
- added blog/rss page (with any extension) that redirects to blog/feed.rss for compatibility
- added <link rel="alternate"...> to <head> section for blog pages for RSS feed autodiscovery
- added blog top 5 post links to right sidebar
- blog/index,show: added RSS link + icon (todo: make nicer)

Modified Paths:
--------------
    trunk/web2py/applications/helyesiras_webdev/controllers/blog.py
    trunk/web2py/applications/helyesiras_webdev/views/blog/feed.rss
    trunk/web2py/applications/helyesiras_webdev/views/blog/index.html
    trunk/web2py/applications/helyesiras_webdev/views/blog/show.html
    trunk/web2py/applications/helyesiras_webdev/views/layout.html
    trunk/web2py/applications/helyesiras_webdev/views/right_sidebar.html

Added Paths:
-----------
    trunk/web2py/applications/helyesiras_webdev/modules/blogutil.py
    trunk/web2py/applications/helyesiras_webdev/static/images/rss-icon.png

Modified: trunk/web2py/applications/helyesiras_webdev/controllers/blog.py
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/controllers/blog.py	2013-09-06 10:07:14 UTC (rev 925)
+++ trunk/web2py/applications/helyesiras_webdev/controllers/blog.py	2013-09-06 15:06:53 UTC (rev 926)
@@ -5,10 +5,8 @@
 @author MM
 """
 
-from email.Utils import formatdate
-from time import mktime
-import re
 from util import safeint
+from blogutil import get_feed
 
 def index():
   """Starting page for the blog.
@@ -83,19 +81,16 @@
 def feed():
   """Return a dict that can be rendered by views/blog/feed.rss as the RSS feed of the blog. URL is http://<host_name>/<application_name>/blog/feed.rss.
   Note: the builtin views/generic.rss could be used instead the custom views/blog/feed.rss, but at this time there's a (python) bug preventing it, see https://groups.google.com/forum/#!msg/web2py/8ZwVMKS69Sg/2ijXe2eKGBgJ
+  See modules/blogutil.get_feed().
   """
-  entries = []
-  posts = dbblog(dbblog.posts.category == dbblog.categories.id).select(orderby=~dbblog.posts.created_on, limitby=(0, 15))
-  for row in posts:
-    post = row.posts
-    entries.append(dict(title=post.title,
-                        link=URL(c='blog', f='show', args=[post.slug], host=True, extension=''),
-                        description=re.sub('<[^<>]+>', '', MARKMIN(post.body.split('\n')[0]).xml()),
-                        created_on=formatdate(mktime(post.created_on.timetuple()), localtime=True)
-                        ))
-  return dict(title=u"Helyesiras.mta.hu blog",
-              link=u"http://helyesiras.mta.hu/helyesiras/blog",
-              description=u"A helyesiras.mta.hu oldal hivatalos blogja",
-              created_on=formatdate(mktime(request.now.timetuple()), localtime=True),
-              entries=entries)
+  data = get_feed(dbblog, URL(c='blog', f='index', host=True, extension=''), 
+                          URL(c='blog', f='show', host=True, extension=''),
+                          URL(c='blog', f='feed', host=True, extension='rss'))
+  return data
 
+
+def rss():
+  """Redirect to feed.rss. For compatibility with feed autodetection."""
+  redirect(URL(c='blog', f='feed', extension='rss'))
+
+

Added: trunk/web2py/applications/helyesiras_webdev/modules/blogutil.py
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/modules/blogutil.py	                        (rev 0)
+++ trunk/web2py/applications/helyesiras_webdev/modules/blogutil.py	2013-09-06 15:06:53 UTC (rev 926)
@@ -0,0 +1,42 @@
+# coding: utf8
+
+"""
+Common functions for the blog used across controllers.
+ at author MM
+"""
+
+import datetime
+from email.Utils import formatdate
+import re
+import sys
+from time import mktime
+
+sys.path.append('/opt/web2py')
+from gluon.html import MARKMIN
+
+def get_feed(db, blogurl, baseurl, feedurl, limit=15):
+  """Return a dict that contains meta-info and articles (top n=limit most recent) for the blog feed.
+     db: a DAL connection to the dbhelyesblog database.
+     blogurl: url for the blog starting page
+     baseurl: base url for links to posts, final link to post will be baseurl/post.slug
+     feedurl: url of the blog feed
+     limit: max number of most recent posts returned
+     Note: all strings returned are type str, utf8 enc.
+  """
+  entries = []
+  posts = db(db.posts.category == db.categories.id).select(orderby=~db.posts.created_on, limitby=(0, limit))
+  for row in posts:
+    post = row.posts
+    entries.append(dict(title = post.title,
+                        link = baseurl + '/' + post.slug,
+                        description = re.sub('<[^<>]+>', '', MARKMIN(post.body.split('\n')[0]).xml()),
+                        created_on = formatdate(mktime(post.created_on.timetuple()), localtime=True)
+                        ))
+  return dict(title = "Helyesiras.mta.hu blog",
+              link = blogurl,
+              atom_link = feedurl,
+              description = "A helyesiras.mta.hu oldal hivatalos blogja",
+              created_on = formatdate(mktime(datetime.datetime.now().timetuple()), localtime=True),
+              entries = entries)
+
+

Added: trunk/web2py/applications/helyesiras_webdev/static/images/rss-icon.png
===================================================================
(Binary files differ)


Property changes on: trunk/web2py/applications/helyesiras_webdev/static/images/rss-icon.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: trunk/web2py/applications/helyesiras_webdev/views/blog/feed.rss
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/blog/feed.rss	2013-09-06 10:07:14 UTC (rev 925)
+++ trunk/web2py/applications/helyesiras_webdev/views/blog/feed.rss	2013-09-06 15:06:53 UTC (rev 926)
@@ -4,22 +4,20 @@
     return s.encode('utf8', 'replace')
   return s
 pass
-}}
-{{
-
+}}{{
 # Note: generic.rss should take care of everything, but it's buggy :(
 # See https://groups.google.com/forum/#!msg/web2py/8ZwVMKS69Sg/2ijXe2eKGBgJ
 
 response.headers['Content-Type'] = 'application/rss+xml; charset=UTF-8'
 
 response.write('<?xml version="1.0" encoding="utf-8"?>\n', escape=False)
-response.write('<rss version="2.0"><channel><title>{0}</title><link>{1}</link><description>{2}</description><lastBuildDate>{3}</lastBuildDate>\n'.format( response._vars.get('title', '(notitle)'), response._vars.get('link', ''), response._vars.get('description', '(nodescription)'), response._vars.get('created_on', '')), escape=False)
+response.write('<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="{0}" rel="self" type="application/rss+xml"/><title>{1}</title><link>{2}</link><description>{3}</description><lastBuildDate>{4}</lastBuildDate><language>hu</language>\n'.format( response._vars.get('atom_link', ''), response._vars.get('title', '(notitle)'), response._vars.get('link', ''), response._vars.get('description', '(nodescription)'), response._vars.get('created_on', '')), escape=False)
 response.write('<docs>http://blogs.law.harvard.edu/tech/rss</docs>\n', escape=False)
 
 for item in response._vars.get('entries', []):
   data = (item.get('title', '(notitle)'), item.get('link', ''), item.get('description', '(nodescription)'), item.get('created_on', ''))
   data2 = [toutf8(x) for x in data]
-  response.write('<item><title>{0}</title><link>{1}</link><description>{2}</description><pubDate>{3}</pubDate></item>\n'.format(*data2), escape=False)
+  response.write('<item><title>{0}</title><link>{1}</link><guid isPermaLink="true">{1}</guid><description>{2}</description><pubDate>{3}</pubDate></item>\n'.format(*data2), escape=False)
 pass
 
 response.write('</channel></rss>', escape=False)

Modified: trunk/web2py/applications/helyesiras_webdev/views/blog/index.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/blog/index.html	2013-09-06 10:07:14 UTC (rev 925)
+++ trunk/web2py/applications/helyesiras_webdev/views/blog/index.html	2013-09-06 15:06:53 UTC (rev 926)
@@ -39,6 +39,9 @@
       {{pass}}
   {{pass}}
     </div>
+  <div>
+  <a href="{{=URL(c='blog', f='feed', extension='rss', host=True)}}"><img width="30" src="{{=URL('static', 'images/rss-icon.png')}}" title="RSS feed" alt="RSS feed"/> RSS</a>
+  </div>
 {{end}}
 
 

Modified: trunk/web2py/applications/helyesiras_webdev/views/blog/show.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/blog/show.html	2013-09-06 10:07:14 UTC (rev 925)
+++ trunk/web2py/applications/helyesiras_webdev/views/blog/show.html	2013-09-06 15:06:53 UTC (rev 926)
@@ -15,6 +15,9 @@
       {{=A(row.name, _href=URL(c='blog', f='index', vars={'tag': row.name}))}} ({{=len(row.posts)}})
     {{pass}}
   </div>
+  <div>
+  <a href="{{=URL(c='blog', f='feed', extension='rss', host=True)}}"><img width="30" src="{{=URL('static', 'images/rss-icon.png')}}" title="RSS feed" alt="RSS feed"/> RSS</a>
+  </div>  
 {{end}}
 
 

Modified: trunk/web2py/applications/helyesiras_webdev/views/layout.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/layout.html	2013-09-06 10:07:14 UTC (rev 925)
+++ trunk/web2py/applications/helyesiras_webdev/views/layout.html	2013-09-06 15:06:53 UTC (rev 926)
@@ -34,6 +34,11 @@
     <link rel="shortcut icon" href="{{=URL('static','favicon.ico')}}" type="image/x-icon">
     <link rel="apple-touch-icon" href="{{=URL('static','favicon.png')}}">
 
+    <!-- Link to RSS feed on blog pages for RSS feed autodiscovery -->
+    {{if request.controller == 'blog':}}
+    <link rel="alternate" type="application/rss+xml" title="helyesiras.mta.hu blog" href="{{=URL(c='blog', f='feed', extension='rss', host=True)}}" />
+    {{pass}}
+
     <!-- For the less-enabled mobile browsers like Opera Mini -->
     <link rel="stylesheet" media="handheld" href="{{=URL('static','css/handheld.css')}}">
     

Modified: trunk/web2py/applications/helyesiras_webdev/views/right_sidebar.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/right_sidebar.html	2013-09-06 10:07:14 UTC (rev 925)
+++ trunk/web2py/applications/helyesiras_webdev/views/right_sidebar.html	2013-09-06 15:06:53 UTC (rev 926)
@@ -1,16 +1,32 @@
+{{from blogutil import get_feed}}
+
 <div id="helyesiras-widget-2">
 	<dl>
+
 	    <dt>
 		    <img src="http://htp-devel.nytud.hu/helyesiras_webdev/static/widget/w2_head_top.png">
             <h2>Facebook</h2></dt>
         <dd class="init-open active"><div class="helyesiras-widget-2-dd-inner"><div class="helyesiras-widget-2-dd-inner-top"><iframe src="//www.facebook.com/plugins/likebox.php?href=https%3A%2F%2Fwww.facebook.com%2Fhelyesiras.hu&width=210&height=258&show_faces=true&colorscheme=light&stream=false&show_border=false&header=false&appId=1395313737350712" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:210px; height:258px;" allowTransparency="true"></iframe></div></div></dd>
+
 	    <dt>
 		    <img src="http://htp-devel.nytud.hu/helyesiras_webdev/static/widget/w2_head_top2.png">
 		    <h2>Blog</h2>
 		</dt>
-		 <dd class="init-open active"><div class="helyesiras-widget-2-dd-inner"><div class="helyesiras-widget-2-dd-inner-top">
-                <p>A svájci-francia határon működtetett Nagy Hadronütköztető a világ legnagyobb és legbonyolultabb kísérletegyüttese, amiben fizikusok egész serege figyeli, ahogy a közel fénysebességgel ütköző atommagokból és protonokból müonok, hadronok és bozonok lesznek. Halandó ember igazából fel sem fogja, mit is jelent az előző mondat második fele, még akkor sem, ha <a href="#">személyesen nézi meg, mi is ez az egész</a>. Mi azért megpróbáltuk.</p>
-                </div></div></dd>
+		 <dd class="init-open active">
+		 <div class="helyesiras-widget-2-dd-inner">
+		 <div class="helyesiras-widget-2-dd-inner-top">
+{{
+# top 5 blog post titles:
+feed = get_feed(dbblog, URL(c='blog', f='index', host=True, extension=''), 
+                        URL(c='blog', f='show', host=True, extension=''),
+                        URL(c='blog', f='feed', host=True, extension='rss'), limit=5)
+for item in feed.get('entries', []):
+  = P( A( item.get('title', '(notitle)'), _href=item.get('link', URL(c='blog', f='index'))))
+pass
+= P( A( 'További blogbejegyzések...', _href=URL(c='blog', f='index')))
+}}
+     </div></div></dd>
+
 	    <dt>
         	<img src="http://htp-devel.nytud.hu/helyesiras_webdev/static/widget/w2_head_top2.png">
         	<h2>Nyest</h2>
@@ -21,5 +37,6 @@
         	<h2>Ketsoros cimsor is elferjen ha kell</h2>
        	</dt>
         <dd><div class="helyesiras-widget-2-dd-inner"><div class="helyesiras-widget-2-dd-inner-top"></div></div></dd>
+
 	</dl>
 </div> 




More information about the Hejes-devel mailing list