8 """ |
8 """ |
9 __docformat__ = "restructuredtext en" |
9 __docformat__ = "restructuredtext en" |
10 _ = unicode |
10 _ = unicode |
11 |
11 |
12 from logilab.common.textutils import unormalize |
12 from logilab.common.textutils import unormalize |
13 from logilab.mtconverter import html_escape |
13 from logilab.mtconverter import xml_escape |
14 |
14 |
15 from cubicweb.view import StartupView |
15 from cubicweb.view import StartupView |
16 from cubicweb.selectors import match_user_groups, implements |
16 from cubicweb.selectors import match_user_groups, implements |
17 from cubicweb.schema import display_name |
17 from cubicweb.schema import display_name |
18 from cubicweb.common.uilib import ureport_as_html |
18 from cubicweb.common.uilib import ureport_as_html |
75 href = rset.get_entity(0, 0).absolute_url(vid='edition') |
75 href = rset.get_entity(0, 0).absolute_url(vid='edition') |
76 label = self.req._('edit the index page') |
76 label = self.req._('edit the index page') |
77 else: |
77 else: |
78 href = req.build_url('view', vid='creation', etype='Card', wikiid='index') |
78 href = req.build_url('view', vid='creation', etype='Card', wikiid='index') |
79 label = self.req._('create an index page') |
79 label = self.req._('create an index page') |
80 self.w(u'<br/><a href="%s">%s</a>\n' % (html_escape(href), label)) |
80 self.w(u'<br/><a href="%s">%s</a>\n' % (xml_escape(href), label)) |
81 |
81 |
82 def folders(self): |
82 def folders(self): |
83 self.w(u'<h4>%s</h4>\n' % self.req._('Browse by category')) |
83 self.w(u'<h4>%s</h4>\n' % self.req._('Browse by category')) |
84 self.vreg.select_view('tree', self.req, None).render(w=self.w) |
84 self.vreg.select_view('tree', self.req, None).render(w=self.w) |
85 |
85 |
90 def startupviews_table(self): |
90 def startupviews_table(self): |
91 for v in self.vreg.possible_views(self.req, None): |
91 for v in self.vreg.possible_views(self.req, None): |
92 if v.category != 'startupview' or v.id in ('index', 'tree', 'manage'): |
92 if v.category != 'startupview' or v.id in ('index', 'tree', 'manage'): |
93 continue |
93 continue |
94 self.w('<p><a href="%s">%s</a></p>' % ( |
94 self.w('<p><a href="%s">%s</a></p>' % ( |
95 html_escape(v.url()), html_escape(self.req._(v.title).capitalize()))) |
95 xml_escape(v.url()), xml_escape(self.req._(v.title).capitalize()))) |
96 |
96 |
97 def entities(self): |
97 def entities(self): |
98 schema = self.schema |
98 schema = self.schema |
99 self.w(u'<h4>%s</h4>\n' % self.req._('The repository holds the following entities')) |
99 self.w(u'<h4>%s</h4>\n' % self.req._('The repository holds the following entities')) |
100 manager = self.req.user.matching_groups('managers') |
100 manager = self.req.user.matching_groups('managers') |
144 view = self.vreg.select_view('list', req, req.etype_rset(etype)) |
144 view = self.vreg.select_view('list', req, req.etype_rset(etype)) |
145 url = view.url() |
145 url = view.url() |
146 else: |
146 else: |
147 url = self.build_url('view', rql='%s X' % etype) |
147 url = self.build_url('view', rql='%s X' % etype) |
148 etypelink = u' <a href="%s">%s</a> (%d)' % ( |
148 etypelink = u' <a href="%s">%s</a> (%d)' % ( |
149 html_escape(url), label, nb) |
149 xml_escape(url), label, nb) |
150 yield (label, etypelink, self.add_entity_link(eschema, req)) |
150 yield (label, etypelink, self.add_entity_link(eschema, req)) |
151 |
151 |
152 def add_entity_link(self, eschema, req): |
152 def add_entity_link(self, eschema, req): |
153 """creates a [+] link for adding an entity if user has permission to do so""" |
153 """creates a [+] link for adding an entity if user has permission to do so""" |
154 if not eschema.has_perm(req, 'add'): |
154 if not eschema.has_perm(req, 'add'): |
155 return u'' |
155 return u'' |
156 return u'[<a href="%s" title="%s">+</a>]' % ( |
156 return u'[<a href="%s" title="%s">+</a>]' % ( |
157 html_escape(self.create_url(eschema.type)), |
157 xml_escape(self.create_url(eschema.type)), |
158 self.req.__('add a %s' % eschema)) |
158 self.req.__('add a %s' % eschema)) |
159 |
159 |
160 |
160 |
161 class IndexView(ManageView): |
161 class IndexView(ManageView): |
162 id = 'index' |
162 id = 'index' |
184 |
184 |
185 def call(self): |
185 def call(self): |
186 self.w(_(u'<div>This schema of the data model <em>excludes</em> the ' |
186 self.w(_(u'<div>This schema of the data model <em>excludes</em> the ' |
187 u'meta-data, but you can also display a <a href="%s">complete ' |
187 u'meta-data, but you can also display a <a href="%s">complete ' |
188 u'schema with meta-data</a>.</div>') |
188 u'schema with meta-data</a>.</div>') |
189 % html_escape(self.build_url('view', vid='schemagraph', withmeta=1))) |
189 % xml_escape(self.build_url('view', vid='schemagraph', withmeta=1))) |
190 self.w(u'<img src="%s" alt="%s"/>\n' % ( |
190 self.w(u'<img src="%s" alt="%s"/>\n' % ( |
191 html_escape(self.req.build_url('view', vid='schemagraph', withmeta=0)), |
191 xml_escape(self.req.build_url('view', vid='schemagraph', withmeta=0)), |
192 self.req._("graphical representation of the application'schema"))) |
192 self.req._("graphical representation of the application'schema"))) |
193 |
193 |
194 |
194 |
195 class SchemaTabTextView(StartupView): |
195 class SchemaTabTextView(StartupView): |
196 id = 'schema-text' |
196 id = 'schema-text' |
232 self.w(u'<div id="schema_security"><a id="index" href="index"/>') |
232 self.w(u'<div id="schema_security"><a id="index" href="index"/>') |
233 self.w(u'<h2 class="schema">%s</h2>' % _('index').capitalize()) |
233 self.w(u'<h2 class="schema">%s</h2>' % _('index').capitalize()) |
234 self.w(u'<h4>%s</h4>' % _('Entities').capitalize()) |
234 self.w(u'<h4>%s</h4>' % _('Entities').capitalize()) |
235 ents = [] |
235 ents = [] |
236 for eschema in sorted(entities): |
236 for eschema in sorted(entities): |
237 url = html_escape(self.build_url('schema', **formparams)) |
237 url = xml_escape(self.build_url('schema', **formparams)) |
238 ents.append(u'<a class="grey" href="%s#%s">%s</a> (%s)' % ( |
238 ents.append(u'<a class="grey" href="%s#%s">%s</a> (%s)' % ( |
239 url, eschema.type, eschema.type, _(eschema.type))) |
239 url, eschema.type, eschema.type, _(eschema.type))) |
240 self.w(u', '.join(ents)) |
240 self.w(u', '.join(ents)) |
241 self.w(u'<h4>%s</h4>' % (_('relations').capitalize())) |
241 self.w(u'<h4>%s</h4>' % (_('relations').capitalize())) |
242 rels = [] |
242 rels = [] |
243 for rschema in sorted(relations): |
243 for rschema in sorted(relations): |
244 url = html_escape(self.build_url('schema', **formparams)) |
244 url = xml_escape(self.build_url('schema', **formparams)) |
245 rels.append(u'<a class="grey" href="%s#%s">%s</a> (%s), ' % ( |
245 rels.append(u'<a class="grey" href="%s#%s">%s</a> (%s), ' % ( |
246 url , rschema.type, rschema.type, _(rschema.type))) |
246 url , rschema.type, rschema.type, _(rschema.type))) |
247 self.w(u', '.join(ents)) |
247 self.w(u', '.join(ents)) |
248 # entities |
248 # entities |
249 self.display_entities(entities, formparams) |
249 self.display_entities(entities, formparams) |
257 self.w(u'<a id="entities" href="entities"/>') |
257 self.w(u'<a id="entities" href="entities"/>') |
258 self.w(u'<h2 class="schema">%s</h2>' % _('permissions for entities').capitalize()) |
258 self.w(u'<h2 class="schema">%s</h2>' % _('permissions for entities').capitalize()) |
259 for eschema in sorted(entities): |
259 for eschema in sorted(entities): |
260 self.w(u'<a id="%s" href="%s"/>' % (eschema.type, eschema.type)) |
260 self.w(u'<a id="%s" href="%s"/>' % (eschema.type, eschema.type)) |
261 self.w(u'<h3 class="schema">%s (%s) ' % (eschema.type, _(eschema.type))) |
261 self.w(u'<h3 class="schema">%s (%s) ' % (eschema.type, _(eschema.type))) |
262 url = html_escape(self.build_url('schema', **formparams) + '#index') |
262 url = xml_escape(self.build_url('schema', **formparams) + '#index') |
263 self.w(u'<a href="%s"><img src="%s" alt="%s"/></a>' % (url, self.req.external_resource('UP_ICON'), _('up'))) |
263 self.w(u'<a href="%s"><img src="%s" alt="%s"/></a>' % (url, self.req.external_resource('UP_ICON'), _('up'))) |
264 self.w(u'</h3>') |
264 self.w(u'</h3>') |
265 self.w(u'<div style="margin: 0px 1.5em">') |
265 self.w(u'<div style="margin: 0px 1.5em">') |
266 self.schema_definition(eschema, link=False) |
266 self.schema_definition(eschema, link=False) |
267 |
267 |
287 self.w(u'<a id="relations" href="relations"/>') |
287 self.w(u'<a id="relations" href="relations"/>') |
288 self.w(u'<h2 class="schema">%s </h2>' % _('permissions for relations').capitalize()) |
288 self.w(u'<h2 class="schema">%s </h2>' % _('permissions for relations').capitalize()) |
289 for rschema in sorted(relations): |
289 for rschema in sorted(relations): |
290 self.w(u'<a id="%s" href="%s"/>' % (rschema.type, rschema.type)) |
290 self.w(u'<a id="%s" href="%s"/>' % (rschema.type, rschema.type)) |
291 self.w(u'<h3 class="schema">%s (%s) ' % (rschema.type, _(rschema.type))) |
291 self.w(u'<h3 class="schema">%s (%s) ' % (rschema.type, _(rschema.type))) |
292 url = html_escape(self.build_url('schema', **formparams) + '#index') |
292 url = xml_escape(self.build_url('schema', **formparams) + '#index') |
293 self.w(u'<a href="%s"><img src="%s" alt="%s"/></a>' % (url, self.req.external_resource('UP_ICON'), _('up'))) |
293 self.w(u'<a href="%s"><img src="%s" alt="%s"/></a>' % (url, self.req.external_resource('UP_ICON'), _('up'))) |
294 self.w(u'</h3>') |
294 self.w(u'</h3>') |
295 self.w(u'<div style="margin: 0px 1.5em">') |
295 self.w(u'<div style="margin: 0px 1.5em">') |
296 subjects = [str(subj) for subj in rschema.subjects()] |
296 subjects = [str(subj) for subj in rschema.subjects()] |
297 self.w(u'<div><strong>%s</strong> %s (%s)</div>' % (_('subject_plural:'), |
297 self.w(u'<div><strong>%s</strong> %s (%s)</div>' % (_('subject_plural:'), |