1.1 --- a/actions/EventAggregatorSummary.py Thu Apr 02 01:08:29 2009 +0200
1.2 +++ b/actions/EventAggregatorSummary.py Fri Apr 03 01:30:01 2009 +0200
1.3 @@ -14,6 +14,7 @@
1.4 from MoinMoin import config
1.5 from MoinMoin.Page import Page
1.6 import MoinMoin.util # for MoinMoin 1.5.x
1.7 +from MoinMoin import wikiutil
1.8 import EventAggregatorSupport
1.9
1.10 Dependencies = ['pages']
1.11 @@ -138,6 +139,7 @@
1.12 """
1.13
1.14 category_names = request.form.get("category", [])
1.15 + format = request.form.get("format", ["iCalendar"])[0]
1.16
1.17 # Otherwise, produce an iCalendar resource.
1.18
1.19 @@ -157,60 +159,93 @@
1.20 events, shown_events, all_shown_events, earliest, latest = \
1.21 EventAggregatorSupport.getEvents(request, category_names, calendar_start, calendar_end)
1.22
1.23 - # Output iCalendar data...
1.24 + latest_timestamp = EventAggregatorSupport.setEventTimestamps(request, all_shown_events)
1.25 +
1.26 + # Output summary data...
1.27
1.28 if EventAggregatorSupport.isMoin15():
1.29 send_headers = request.http_headers
1.30 else:
1.31 send_headers = request.emit_http_headers
1.32
1.33 - send_headers(["Content-Type: text/calendar; charset=%s" % config.charset])
1.34 + # Define headers.
1.35 +
1.36 + if format == "iCalendar":
1.37 + headers = ["Content-Type: text/calendar; charset=%s" % config.charset]
1.38 + elif format == "RSS":
1.39 + headers = ["Content-Type: application/rss+xml; charset=%s" % config.charset]
1.40 +
1.41 + # Define the last modified time.
1.42
1.43 - request.write("BEGIN:VCALENDAR\r\n")
1.44 - request.write("PRODID:-//MoinMoin//EventAggregatorSummary\r\n")
1.45 - request.write("VERSION:2.0\r\n")
1.46 + headers.append("Last-Modified: %s" % EventAggregatorSupport.getHTTPTimeString(latest_timestamp))
1.47 + send_headers(headers)
1.48 +
1.49 + # iCalendar output...
1.50
1.51 - for event_page, event_details in all_shown_events:
1.52 -
1.53 - # Get the summary and timestamp details.
1.54 + if format == "iCalendar":
1.55 + request.write("BEGIN:VCALENDAR\r\n")
1.56 + request.write("PRODID:-//MoinMoin//EventAggregatorSummary\r\n")
1.57 + request.write("VERSION:2.0\r\n")
1.58
1.59 - event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details)
1.60 + for event_page, event_details in all_shown_events:
1.61 +
1.62 + # Get the summary details.
1.63
1.64 - # Get the initial revision of the page.
1.65 + event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details)
1.66 +
1.67 + # Output the event details.
1.68
1.69 - revisions = event_page.getRevList()
1.70 - event_page_initial = Page(request, event_page.page_name, rev=revisions[-1])
1.71 + request.write("BEGIN:VEVENT\r\n")
1.72 + request.write("UID:%s\r\n" % request.getQualifiedURL(event_page.url(request)))
1.73 + request.write("URL:%s\r\n" % request.getQualifiedURL(event_page.url(request)))
1.74 + request.write("DTSTAMP:%04d%02d%02dT%02d%02d%02dZ\r\n" % event_details["created"][:6])
1.75 + request.write("LAST-MODIFIED:%04d%02d%02dT%02d%02d%02dZ\r\n" % event_details["last-modified"][:6])
1.76 + request.write("SEQUENCE:%d\r\n" % event_details["sequence"])
1.77 + request.write("DTSTART;VALUE=DATE:%04d%02d%02d\r\n" % event_details["start"])
1.78 + request.write("DTEND;VALUE=DATE:%04d%02d%02d\r\n" % EventAggregatorSupport.nextdate(event_details["end"]))
1.79 + request.write("SUMMARY:%s\r\n" % getQuotedText(event_summary))
1.80
1.81 - # Get the created and last modified times.
1.82 -
1.83 - created = EventAggregatorSupport.getPageDate(event_page_initial)
1.84 - last_modified = EventAggregatorSupport.getPageDate(event_page)
1.85 - sequence = len(revisions) - 1
1.86 + # Optional details.
1.87
1.88 - # Output the event details.
1.89 + if event_details.has_key("topics") or event_details.has_key("categories"):
1.90 + request.write("CATEGORIES:%s\r\n" % ",".join(
1.91 + [getQuotedText(topic) for topic in event_details.get("topics") or event_details.get("categories")]
1.92 + ))
1.93 + if event_details.has_key("location"):
1.94 + request.write("LOCATION:%s\r\n" % getQuotedText(event_details["location"]))
1.95 +
1.96 + request.write("END:VEVENT\r\n")
1.97
1.98 - request.write("BEGIN:VEVENT\r\n")
1.99 - request.write("UID:%s\r\n" % request.getQualifiedURL(event_page.url(request)))
1.100 - request.write("URL:%s\r\n" % request.getQualifiedURL(event_page.url(request)))
1.101 - request.write("DTSTAMP:%04d%02d%02dT%02d%02d%02dZ\r\n" % created[:6])
1.102 - request.write("LAST-MODIFIED:%04d%02d%02dT%02d%02d%02dZ\r\n" % last_modified[:6])
1.103 - request.write("SEQUENCE:%d\r\n" % sequence)
1.104 - request.write("DTSTART;VALUE=DATE:%04d%02d%02d\r\n" % event_details["start"])
1.105 - request.write("DTEND;VALUE=DATE:%04d%02d%02d\r\n" % EventAggregatorSupport.nextdate(event_details["end"]))
1.106 - request.write("SUMMARY:%s\r\n" % getQuotedText(event_summary))
1.107 + request.write("END:VCALENDAR\r\n")
1.108 +
1.109 + elif format == "RSS":
1.110 + request.write('<rss version="2.0">\r\n')
1.111 + request.write('<channel>\r\n')
1.112 + request.write('<title>Events</title>\r\n')
1.113 + request.write('<link>%s</link>\r\n' % request.getBaseURL())
1.114 + request.write('<description>Events published on %s</description>\r\n' % request.getBaseURL())
1.115 + request.write('<lastBuildDate>%s</lastBuildDate>\r\n' % EventAggregatorSupport.getHTTPTimeString(latest_timestamp))
1.116
1.117 - # Optional details.
1.118 + for event_page, event_details in all_shown_events:
1.119 +
1.120 + # Get the summary details.
1.121 +
1.122 + event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details)
1.123 + link = request.getQualifiedURL(event_page.url(request))
1.124
1.125 - if event_details.has_key("topics") or event_details.has_key("categories"):
1.126 - request.write("CATEGORIES:%s\r\n" % ",".join(
1.127 - [getQuotedText(topic) for topic in event_details.get("topics") or event_details.get("categories")]
1.128 - ))
1.129 - if event_details.has_key("location"):
1.130 - request.write("LOCATION:%s\r\n" % getQuotedText(event_details["location"]))
1.131 + request.write('<item>\r\n')
1.132 + request.write('<title>%s</title>\r\n' % wikiutil.escape(event_summary))
1.133 + request.write('<link>%s</link>\r\n' % link)
1.134 +
1.135 + for topic in event_details.get("topics") or event_details.get("categories") or []:
1.136 + request.write('<category>%s</category>\r\n' % topic)
1.137
1.138 - request.write("END:VEVENT\r\n")
1.139 + request.write('<pubDate>%s</pubDate>\r\n' % EventAggregatorSupport.getHTTPTimeString(event_details["created"]))
1.140 + request.write('<guid>%s#%s</guid>\r\n' % (link, event_details["sequence"]))
1.141 + request.write('</item>\r\n')
1.142
1.143 - request.write("END:VCALENDAR\r\n")
1.144 + request.write('</channel>\r\n')
1.145 + request.write('</rss>\r\n')
1.146
1.147 if EventAggregatorSupport.isMoin15():
1.148 raise MoinMoin.util.MoinMoinNoFooter