4f97f3efbb036842a32b25a7e02991d5d0977cbb
[philipp/winterrodeln/wrfeed.git] / feed / controllers / berichte.py
1 #!/usr/bin/python2.6
2 # -*- coding: UTF-8 -*-
3 """Creates an Atom-Feed for single or multiple winterrodeln sled reports.
4
5 Format:
6     http://www.winterrodeln.org/feeds/berichte/alle
7     http://www.winterrodeln.org/feeds/berichte/bahn/kemater_alm
8     http://www.winterrodeln.org/feeds/berichte/bahnen/22+42+132 
9 See:
10     http://www.atompub.org/
11     http://effbot.org/zone/element.htm
12     http://www.winterrodeln.org/trac/wiki/UrlSchema
13 """
14 import sys
15 import datetime
16 # from elementtree.ElementTree import Element, SubElement, tostring
17 from xml.etree.ElementTree import Element, SubElement, tostring
18
19 from sqlalchemy.engine import create_engine
20
21 import logging
22
23 from pylons import request, response, session, config, tmpl_context as c, url
24 from pylons.controllers.util import abort, redirect
25
26 from feed.lib.base import BaseController, render
27
28 log = logging.getLogger(__name__)
29
30
31 def create_feed(engine):
32     param_page_title = None
33
34     conn = engine.connect()
35     if param_page_title is None:
36         sql = "select id, page_title, date_report, date_entry, `condition`, description, author_name, author_username from wrreport where date_invalid > now() and delete_date is null order by id desc limit 50"
37         # Debug:
38         sql = "select id, page_title, date_report, date_entry, `condition`, description, author_name, author_username from wrreport where delete_date is null order by id limit 5"
39         result = conn.execute(sql)
40     else:
41         sql = "select id, page_title, date_report, date_entry, `condition`, description, author_name, author_username from wrreport where page_title ilike ? and date_invalid > now() and delete_date is null order by id desc limit 50"
42         result = conn.execute(sql, param_page_title)
43
44
45     feed = Element("feed", xmlns="http://www.w3.org/2005/Atom")
46     feed_title = SubElement(feed, "title")
47     feed_title.text = "Winterrodeln Rodelbahnberichte"
48     feed_id = SubElement(feed, "id")
49     if param_page_title is None:
50         feed_id.text = "http://www.winterrodeln.org/feeds/schneelage"
51     else:
52         feed_id.text = "http://www.winterrodeln.org/feeds/schneelage/{0}".format(param_page_title.replace(u' ', u'_'))
53     feed_updated = SubElement(feed, "updated")
54     feed.append(Element("link", rel="self", href=feed_id.text))
55
56     last_updated = None
57     for row in result:
58         id, page_title, date_report, date_entry, condition, description, author_name, author_username = row
59         page_title_url = page_title.replace(u' ', u'_')
60         entry = SubElement(feed, "entry")
61         entry_title = SubElement(entry, "title")
62         entry_title.text = page_title
63         entry.append(Element("link", rel="alternate", href=u"http://www.winterrodeln.org/wiki/{0}".format(page_title_url), type="text/html", hreflang="de"))
64         entry_id = SubElement(entry, "id")
65         entry_id.text = "http://www.winterrodeln.org/feeds/schneelage/{0}/{1}".format(page_title_url, id)
66         entry_updated = SubElement(entry, "updated")
67         entry_updated.text = date_entry.isoformat() + "+01:00"
68         if last_updated is None: last_updated = date_entry
69         # entry_summary = SubElement(entry, "summary")
70         # entry_summary.text = str(condition)
71         entry_content = SubElement(entry, "content")
72         entry_content.attrib["type"] = "xhtml"
73         entry_content_div = SubElement(entry_content, "div")
74         entry_content_div.attrib["xmlns"] = "http://www.w3.org/1999/xhtml"
75         entry_content_ul = SubElement(entry_content_div, "ul")
76         if not date_report is None:
77             entry_content_date = SubElement(entry_content_ul, "li")
78             entry_content_date.text = u"Bericht für " + date_report.isoformat()
79         if not condition is None:
80             entry_content_condition = SubElement(entry_content_ul, "li")
81             entry_content_condition.text = u"Schneelage: " + {1: u'Sehr gut', 2: u'Gut', 3: u'Mittelmäßig', 4: u'Schlecht', 5: u'Geht nicht'}[condition]
82         entry_content_description = SubElement(entry_content_ul, "li")
83         entry_content_description.text = description
84         entry_author = SubElement(entry, "author")
85         entry_author_name = SubElement(entry_author, "name")
86         if author_name is None: entry_author_name.text = "Anonymous user"
87         else: entry_author_name.text = author_name
88
89     if last_updated is None: last_updated = datetime.datetime.now()
90     feed_updated.text = last_updated.isoformat() + "+01:00"
91
92     feed_xml =  '<?xml version="1.0" encoding="utf-8"?>\n' + tostring(feed)
93     conn.close()
94     return feed_xml
95
96
97
98 class BerichteController(BaseController):
99
100     def index(self):
101         # Return a rendered template
102         #return render('/berichte.mako')
103         # or, return a response
104         engine = create_engine(config['sqlalchemy.url'])
105         return create_feed(engine)