153 def _open(self): |
153 def _open(self): |
154 req = self.req |
154 req = self.req |
155 self.w(u'<?xml version="1.0" encoding="%s"?>\n' % req.encoding) |
155 self.w(u'<?xml version="1.0" encoding="%s"?>\n' % req.encoding) |
156 self.w(u'<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">\n') |
156 self.w(u'<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">\n') |
157 self.w(u' <channel>\n') |
157 self.w(u' <channel>\n') |
158 self.w(u' <title>%s RSS Feed</title>\n' % html_escape(self.page_title())) |
158 self.w(u' <title>%s RSS Feed</title>\n' % xml_escape(self.page_title())) |
159 self.w(u' <description>%s</description>\n' % html_escape(req.form.get('vtitle', ''))) |
159 self.w(u' <description>%s</description>\n' % xml_escape(req.form.get('vtitle', ''))) |
160 params = req.form.copy() |
160 params = req.form.copy() |
161 params.pop('vid', None) |
161 params.pop('vid', None) |
162 self.w(u' <link>%s</link>\n' % html_escape(self.build_url(**params))) |
162 self.w(u' <link>%s</link>\n' % xml_escape(self.build_url(**params))) |
163 |
163 |
164 def _close(self): |
164 def _close(self): |
165 self.w(u' </channel>\n') |
165 self.w(u' </channel>\n') |
166 self.w(u'</rss>') |
166 self.w(u'</rss>') |
167 |
167 |
173 self._close() |
173 self._close() |
174 |
174 |
175 def cell_call(self, row, col): |
175 def cell_call(self, row, col): |
176 self.wview('rssitem', self.rset, row=row, col=col) |
176 self.wview('rssitem', self.rset, row=row, col=col) |
177 |
177 |
|
178 |
178 class RssItemView(EntityView): |
179 class RssItemView(EntityView): |
179 id = 'rssitem' |
180 id = 'rssitem' |
180 date_format = '%%Y-%%m-%%dT%%H:%%M%+03i:00' % (timezone / 3600) |
181 date_format = '%%Y-%%m-%%dT%%H:%%M%+03i:00' % (timezone / 3600) |
181 add_div_section = False |
182 add_div_section = False |
182 |
183 |
183 def cell_call(self, row, col): |
184 def cell_call(self, row, col): |
184 entity = self.complete_entity(row, col) |
185 entity = self.complete_entity(row, col) |
185 self.w(u'<item>\n') |
186 self.w(u'<item>\n') |
186 self.w(u'<guid isPermaLink="true">%s</guid>\n' % html_escape(entity.absolute_url())) |
187 self.w(u'<guid isPermaLink="true">%s</guid>\n' % xml_escape(entity.absolute_url())) |
187 self.render_title_link(entity) |
188 self.render_title_link(entity) |
188 self._marker('description', html_escape(entity.dc_description())) |
189 self._marker('description', xml_escape(entity.dc_description())) |
189 self._marker('dc:date', entity.dc_date(self.date_format)) |
190 self._marker('dc:date', entity.dc_date(self.date_format)) |
190 self.render_entity_creator(entity) |
191 self.render_entity_creator(entity) |
191 self.w(u'</item>\n') |
192 self.w(u'</item>\n') |
192 |
193 |
193 def render_title_link(self, entity): |
194 def render_title_link(self, entity): |
199 self._marker('dc:creator', entity.dc_creator()) |
200 self._marker('dc:creator', entity.dc_creator()) |
200 |
201 |
201 |
202 |
202 def _marker(self, marker, value): |
203 def _marker(self, marker, value): |
203 if value: |
204 if value: |
204 self.w(u' <%s>%s</%s>\n' % (marker, html_escape(value), marker)) |
205 self.w(u' <%s>%s</%s>\n' % (marker, xml_escape(value), marker)) |