2 # -*- coding: UTF-8 -*-
3 """Creates an Atom-Feed for single or multiple winterrodeln sled reports.
6 http://www.winterrodeln.org/feed/berichte/alle
7 http://www.winterrodeln.org/feed/berichte/bahn/kemater_alm
8 http://www.winterrodeln.org/feed/berichte/bahnen/22+42+132
10 http://www.atompub.org/
11 http://effbot.org/zone/element.htm
12 http://www.winterrodeln.org/trac/wiki/UrlSchema
16 from xml.etree.ElementTree import Element, SubElement, tostring
18 from sqlalchemy.engine import create_engine
22 from pylons import request, response, session, config, tmpl_context as c, url
23 from pylons.controllers.util import abort, redirect
25 from wrfeed.lib.base import BaseController, render
27 log = logging.getLogger(__name__)
30 def create_feed(page_title=None, page_ids=None):
31 """If a page_title is given, only the reports for the given sledrun 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."""
35 engine = create_engine(config['sqlalchemy.url'])
36 limit = int(config['feedentrylimit'])
37 conn = engine.connect()
39 select = "select id, wrreport.page_title, date_report, date_entry, `condition`, description, author_name, author_username, position_longitude, position_latitude from wrreport left outer join wrsledruncache on wrreport.page_id=wrsledruncache.page_id "
40 if not page_title is None:
42 page_title = page_title.replace('_', ' ')
43 sql = select + "where lcase(wrreport.page_title) = lcase(%s) and date_invalid > now() and delete_date is null order by id desc limit {0}".format(limit)
44 result = conn.execute(sql, page_title)
45 elif not page_ids is None:
46 # a list of page_ids is given
47 sql = [select + "where "]
50 sql += " or ".join(['wrreport.page_id=%s' for page_id in page_ids])
52 sql += 'and date_invalid > now() and delete_date is null order by id desc limit {0}'.format(limit)
53 page_ids_str = [str(page_id) for page_id in page_ids]
54 result = conn.execute("".join(sql), *page_ids_str)
56 # user wants to have all reports
57 sql = select + "where date_invalid > now() and delete_date is null order by id desc limit {0}".format(limit)
58 result = conn.execute(sql)
61 feed = Element("feed", xmlns="http://www.w3.org/2005/Atom", attrib={'xmlns:georss': 'http://www.georss.org/georss'})
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(qualified=True, controller='berichte', action='bahn', id=page_title)
67 elif not page_ids is None:
68 feed_id.text = url(qualified=True, controller='berichte', action='bahnen', id="+".join(page_ids_str))
70 feed_id.text = url(qualified=True, controller='berichte', action='alle')
71 feed_updated = SubElement(feed, "updated")
72 feed.append(Element("link", rel="self", href=feed_id.text))
76 id, page_title, date_report, date_entry, condition, description, author_name, author_username, lon, lat = 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 = u"http://www.winterrodeln.org/wiki/{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 or len(author_name.strip()) == 0: entry_author_name.text = "Anonymous user"
105 else: entry_author_name.text = author_name
106 if not lon is None and not lat is None:
107 entry_geo = SubElement(entry, "georss:point")
108 entry_geo.text = "{lat} {lon}".format(lat=lat, lon=lon)
110 if last_updated is None: last_updated = datetime.datetime.now()
111 feed_updated.text = last_updated.isoformat() + "+01:00"
113 feed_xml = '<?xml version="1.0" encoding="utf-8"?>\n' + tostring(feed)
119 class BerichteController(BaseController):
122 """http://www.winterrodeln.org/feed/berichte/alle"""
123 response.content_type = 'application/atom+xml'
128 """http://www.winterrodeln.org/feed/berichte/bahn/kemater_alm"""
129 response.content_type = 'application/atom+xml'
130 return create_feed(page_title=id)
133 def bahnen(self, id):
134 """http://www.winterrodeln.org/feed/berichte/bahnen/22+42+132"""
135 page_ids = id.split('+')
136 page_ids = [int(page_id) for page_id in page_ids]
137 response.content_type = 'application/atom+xml'
138 return create_feed(page_ids=page_ids)