The debug version of atom feeds work.
[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 xml.etree.ElementTree import Element, SubElement, tostring
17
18 from sqlalchemy.engine import create_engine
19
20 import logging
21
22 from pylons import request, response, session, config, tmpl_context as c, url
23 from pylons.controllers.util import abort, redirect
24
25 from feed.lib.base import BaseController, render
26
27 log = logging.getLogger(__name__)
28
29
30 def create_feed(page_title=None, page_ids=None):
31     """If a page_title is given, only the reports for the given sled are shown.
32     If a list of page_ids is given, only the reports for the selected pages are shown.
33     Otherwise, all reports are shown."""
34
35     engine = create_engine(config['sqlalchemy.url'])
36     conn = engine.connect()
37
38     select = "select id, page_title, date_report, date_entry, `condition`, description, author_name, author_username from wrreport "
39     if not page_title is None:
40         # page_title is given
41         sql = select + "where lcase(page_title) = lcase(%s) and date_invalid > now() and delete_date is null order by id desc limit 50"
42         result = conn.execute(sql, page_title)
43     elif not page_ids is None:
44         # a list of page_ids is given
45         sql = [select + "where "]
46         if len(page_ids) > 0:
47             sql += '('
48             sql += " or ".join(['page_id=%s' for page_id in page_ids])
49             sql += ') '
50         sql += 'and date_invalid > now() and delete_date is null order by id desc limit 50'
51         page_ids_str = [str(page_id) for page_id in page_ids]
52         result = conn.execute("".join(sql), *page_ids_str)
53     else:
54         # user wants to have all reports
55         sql = select + "where date_invalid > now() and delete_date is null order by id desc limit 50"
56         # Debug:
57         sql = select + "where delete_date is null order by id limit 5"
58         result = conn.execute(sql)
59
60
61     feed = Element("feed", xmlns="http://www.w3.org/2005/Atom")
62     feed_title = SubElement(feed, "title")
63     feed_title.text = "Winterrodeln Rodelbahnberichte"
64     feed_id = SubElement(feed, "id")
65     if not page_title is None:
66         feed_id.text = url(controller='berichte', action='bahn', id=page_title)
67     elif not page_ids is None:
68         feed_id.text = url(controller='berichte', action='bahnen', id="+".join(page_ids_str))
69     else:
70         feed_id.text = url(controller='berichte', action='alle')
71     feed_updated = SubElement(feed, "updated")
72     feed.append(Element("link", rel="self", href=feed_id.text))
73
74     last_updated = None
75     for row in result:
76         id, page_title, date_report, date_entry, condition, description, author_name, author_username = row
77         page_title_url = page_title.replace(u' ', u'_')
78         entry = SubElement(feed, "entry")
79         entry_title = SubElement(entry, "title")
80         entry_title.text = page_title
81         entry.append(Element("link", rel="alternate", href=u"http://www.winterrodeln.org/wiki/{0}".format(page_title_url), type="text/html", hreflang="de"))
82         entry_id = SubElement(entry, "id")
83         entry_id.text = "http://www.winterrodeln.org/feeds/schneelage/{0}/{1}".format(page_title_url, id)
84         entry_updated = SubElement(entry, "updated")
85         entry_updated.text = date_entry.isoformat() + "+01:00"
86         if last_updated is None: last_updated = date_entry
87         # entry_summary = SubElement(entry, "summary")
88         # entry_summary.text = str(condition)
89         entry_content = SubElement(entry, "content")
90         entry_content.attrib["type"] = "xhtml"
91         entry_content_div = SubElement(entry_content, "div")
92         entry_content_div.attrib["xmlns"] = "http://www.w3.org/1999/xhtml"
93         entry_content_ul = SubElement(entry_content_div, "ul")
94         if not date_report is None:
95             entry_content_date = SubElement(entry_content_ul, "li")
96             entry_content_date.text = u"Bericht für " + date_report.isoformat()
97         if not condition is None:
98             entry_content_condition = SubElement(entry_content_ul, "li")
99             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]
100         entry_content_description = SubElement(entry_content_ul, "li")
101         entry_content_description.text = description
102         entry_author = SubElement(entry, "author")
103         entry_author_name = SubElement(entry_author, "name")
104         if author_name is None: entry_author_name.text = "Anonymous user"
105         else: entry_author_name.text = author_name
106
107     if last_updated is None: last_updated = datetime.datetime.now()
108     feed_updated.text = last_updated.isoformat() + "+01:00"
109
110     feed_xml =  '<?xml version="1.0" encoding="utf-8"?>\n' + tostring(feed)
111     conn.close()
112     return feed_xml
113
114
115
116 class BerichteController(BaseController):
117
118     def alle(self):
119         """http://www.winterrodeln.org/feeds/berichte/alle"""
120         response.content_type = 'application/atom+xml'
121         return create_feed()
122
123
124     def bahn(self, id):
125         """http://www.winterrodeln.org/feeds/berichte/bahn/kemater_alm"""
126         response.content_type = 'application/atom+xml'
127         return create_feed(page_title=id)
128
129
130     def bahnen(self, id):
131         """http://www.winterrodeln.org/feeds/berichte/bahnen/22+42+132"""
132         page_ids = id.split('+')
133         page_ids = [int(page_id) for page_id in page_ids]
134         response.content_type = 'application/atom+xml'
135         return create_feed(page_ids=page_ids)