[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