9 |
8 |
10 from time import timezone |
9 from time import timezone |
11 |
10 |
12 from logilab.mtconverter import xml_escape |
11 from logilab.mtconverter import xml_escape |
13 |
12 |
|
13 from cubicweb.selectors import non_final_entity, one_line_rset, appobject_selectable |
14 from cubicweb.view import EntityView, AnyRsetView |
14 from cubicweb.view import EntityView, AnyRsetView |
15 from cubicweb.web.httpcache import MaxAgeHTTPCacheManager |
15 from cubicweb.web.httpcache import MaxAgeHTTPCacheManager |
|
16 from cubicweb.web.component import Component |
|
17 from cubicweb.web.box import BoxTemplate |
16 from cubicweb.common.uilib import simple_sgml_tag |
18 from cubicweb.common.uilib import simple_sgml_tag |
17 |
19 |
|
20 _ = unicode |
|
21 |
|
22 |
|
23 # base xml views ############################################################## |
18 |
24 |
19 class XmlView(EntityView): |
25 class XmlView(EntityView): |
20 """xml view for entities""" |
26 """xml view for entities""" |
21 id = 'xml' |
27 id = 'xml' |
22 title = _('xml') |
28 title = _('xml') |
57 value = '<![CDATA[%s]]>' % b64encode(value.getvalue()) |
63 value = '<![CDATA[%s]]>' % b64encode(value.getvalue()) |
58 elif isinstance(value, basestring): |
64 elif isinstance(value, basestring): |
59 value = xml_escape(value) |
65 value = xml_escape(value) |
60 self.w(u' <%s>%s</%s>\n' % (attr, value, attr)) |
66 self.w(u' <%s>%s</%s>\n' % (attr, value, attr)) |
61 self.w(u'</%s>\n' % (entity.e_schema)) |
67 self.w(u'</%s>\n' % (entity.e_schema)) |
62 |
|
63 |
68 |
64 |
69 |
65 class XmlRsetView(AnyRsetView): |
70 class XmlRsetView(AnyRsetView): |
66 """dumps raw rset as xml""" |
71 """dumps raw rset as xml""" |
67 id = 'rsetxml' |
72 id = 'rsetxml' |
95 val = self.view('final', rset, displaytime=True, |
100 val = self.view('final', rset, displaytime=True, |
96 row=rowindex, col=colindex, format='text/plain') |
101 row=rowindex, col=colindex, format='text/plain') |
97 w(simple_sgml_tag(tag, val, **attrs)) |
102 w(simple_sgml_tag(tag, val, **attrs)) |
98 w(u' </row>\n') |
103 w(u' </row>\n') |
99 w(u'</%s>\n' % self.xml_root) |
104 w(u'</%s>\n' % self.xml_root) |
100 |
105 |
|
106 |
|
107 # RSS stuff ################################################################### |
|
108 |
|
109 class RSSFeedURL(Component): |
|
110 id = 'rss_feed_url' |
|
111 __select__ = non_final_entity() |
|
112 |
|
113 def feed_url(self): |
|
114 return self.build_url(rql=self.limited_rql(), vid='rss') |
|
115 |
|
116 |
|
117 class RSSEntityFeedURL(Component): |
|
118 id = 'rss_feed_url' |
|
119 __select__ = non_final_entity() & one_line_rset() |
|
120 |
|
121 def feed_url(self): |
|
122 return self.entity(0, 0).rss_feed_url() |
|
123 |
|
124 |
|
125 class RSSIconBox(BoxTemplate): |
|
126 """just display the RSS icon on uniform result set""" |
|
127 id = 'rss' |
|
128 __select__ = (BoxTemplate.__select__ |
|
129 & appobject_selectable('components', 'rss_feed_url')) |
|
130 |
|
131 visible = False |
|
132 order = 999 |
|
133 |
|
134 def call(self, **kwargs): |
|
135 try: |
|
136 rss = self.req.external_resource('RSS_LOGO') |
|
137 except KeyError: |
|
138 self.error('missing RSS_LOGO external resource') |
|
139 return |
|
140 urlgetter = self.vreg.select_component('rss_feed_url', self.req, self.rset) |
|
141 url = urlgetter.feed_url() |
|
142 self.w(u'<a href="%s"><img src="%s" alt="rss"/></a>\n' % (html_escape(url), rss)) |
|
143 |
101 |
144 |
102 class RssView(XmlView): |
145 class RssView(XmlView): |
103 id = 'rss' |
146 id = 'rss' |
104 title = _('rss') |
147 title = _('rss') |
105 templatable = False |
148 templatable = False |