200 def set_request_content_type(self): |
200 def set_request_content_type(self): |
201 """set the content type returned by this view""" |
201 """set the content type returned by this view""" |
202 self.req.set_content_type(self.content_type) |
202 self.req.set_content_type(self.content_type) |
203 |
203 |
204 # view utilities ########################################################## |
204 # view utilities ########################################################## |
205 |
205 |
206 def wview(self, __vid, rset, __fallback_vid=None, **kwargs): |
206 def wview(self, __vid, rset, __fallback_vid=None, **kwargs): |
207 """shortcut to self.view method automatically passing self.w as argument |
207 """shortcut to self.view method automatically passing self.w as argument |
208 """ |
208 """ |
209 self.view(__vid, rset, __fallback_vid, w=self.w, **kwargs) |
209 self.view(__vid, rset, __fallback_vid, w=self.w, **kwargs) |
210 |
210 |
211 # XXX Template bw compat |
211 # XXX Template bw compat |
212 template = obsolete('.template is deprecated, use .view')(wview) |
212 template = obsolete('.template is deprecated, use .view')(wview) |
213 |
213 |
214 def whead(self, data): |
214 def whead(self, data): |
215 self.req.html_headers.write(data) |
215 self.req.html_headers.write(data) |
301 label = display_name(self.req, label) |
301 label = display_name(self.req, label) |
302 w(u'<span class="label">%s</span>' % label) |
302 w(u'<span class="label">%s</span>' % label) |
303 w(u'<div class="field">%s</div>' % value) |
303 w(u'<div class="field">%s</div>' % value) |
304 if row: |
304 if row: |
305 w(u'</div>') |
305 w(u'</div>') |
306 |
306 |
307 def initialize_varmaker(self): |
307 def initialize_varmaker(self): |
308 varmaker = self.req.get_page_data('rql_varmaker') |
308 varmaker = self.req.get_page_data('rql_varmaker') |
309 if varmaker is None: |
309 if varmaker is None: |
310 varmaker = self.req.varmaker |
310 varmaker = self.req.varmaker |
311 self.req.set_page_data('rql_varmaker', varmaker) |
311 self.req.set_page_data('rql_varmaker', varmaker) |
312 self.varmaker = varmaker |
312 self.varmaker = varmaker |
313 |
313 |
314 |
314 |
315 |
315 |
316 # concrete views base classes ################################################# |
316 # concrete views base classes ################################################# |
317 |
317 |
318 class EntityView(View): |
318 class EntityView(View): |
327 """base class for views which doesn't need a particular result set to be |
327 """base class for views which doesn't need a particular result set to be |
328 displayed (so they can always be displayed !) |
328 displayed (so they can always be displayed !) |
329 """ |
329 """ |
330 __select__ = none_rset() |
330 __select__ = none_rset() |
331 registered = require_group_compat(View.registered) |
331 registered = require_group_compat(View.registered) |
332 |
332 |
333 category = 'startupview' |
333 category = 'startupview' |
334 |
334 |
335 def url(self): |
335 def url(self): |
336 """return the url associated with this view. We can omit rql here""" |
336 """return the url associated with this view. We can omit rql here""" |
337 return self.build_url('view', vid=self.id) |
337 return self.build_url('view', vid=self.id) |
338 |
338 |
339 def html_headers(self): |
339 def html_headers(self): |
403 else: |
403 else: |
404 label = translate(self.req, attr) |
404 label = translate(self.req, attr) |
405 labels.append(label) |
405 labels.append(label) |
406 return labels |
406 return labels |
407 |
407 |
408 |
408 |
409 # concrete template base classes ############################################## |
409 # concrete template base classes ############################################## |
410 |
410 |
411 class MainTemplate(View): |
411 class MainTemplate(View): |
412 """main template are primary access point to render a full HTML page. |
412 """main template are primary access point to render a full HTML page. |
413 There is usually at least a regular main template and a simple fallback |
413 There is usually at least a regular main template and a simple fallback |
441 if not xmldecl: |
441 if not xmldecl: |
442 self._stream.xmldecl = u'' |
442 self._stream.xmldecl = u'' |
443 |
443 |
444 def linkable(self): |
444 def linkable(self): |
445 return False |
445 return False |
446 |
446 |
447 # concrete component base classes ############################################# |
447 # concrete component base classes ############################################# |
448 |
448 |
449 class ReloadableMixIn(object): |
449 class ReloadableMixIn(object): |
450 """simple mixin for reloadable parts of UI""" |
450 """simple mixin for reloadable parts of UI""" |
451 |
451 |
452 def user_callback(self, cb, args, msg=None, nonify=False): |
452 def user_callback(self, cb, args, msg=None, nonify=False): |
453 """register the given user callback and return an url to call it ready to be |
453 """register the given user callback and return an url to call it ready to be |
454 inserted in html |
454 inserted in html |
455 """ |
455 """ |
456 self.req.add_js('cubicweb.ajax.js') |
456 self.req.add_js('cubicweb.ajax.js') |
458 _cb = cb |
458 _cb = cb |
459 def cb(*args): |
459 def cb(*args): |
460 _cb(*args) |
460 _cb(*args) |
461 cbname = self.req.register_onetime_callback(cb, *args) |
461 cbname = self.req.register_onetime_callback(cb, *args) |
462 return self.build_js(cbname, html_escape(msg or '')) |
462 return self.build_js(cbname, html_escape(msg or '')) |
463 |
463 |
464 def build_update_js_call(self, cbname, msg): |
464 def build_update_js_call(self, cbname, msg): |
465 rql = html_escape(self.rset.printable_rql()) |
465 rql = html_escape(self.rset.printable_rql()) |
466 return "javascript:userCallbackThenUpdateUI('%s', '%s', '%s', '%s', '%s', '%s')" % ( |
466 return "javascript:userCallbackThenUpdateUI('%s', '%s', '%s', '%s', '%s', '%s')" % ( |
467 cbname, self.id, rql, msg, self.__registry__, self.div_id()) |
467 cbname, self.id, rql, msg, self.__registry__, self.div_id()) |
468 |
468 |
469 def build_reload_js_call(self, cbname, msg): |
469 def build_reload_js_call(self, cbname, msg): |
470 return "javascript:userCallbackThenReloadPage('%s', '%s')" % (cbname, msg) |
470 return "javascript:userCallbackThenReloadPage('%s', '%s')" % (cbname, msg) |
471 |
471 |
472 build_js = build_update_js_call # expect updatable component by default |
472 build_js = build_update_js_call # expect updatable component by default |
473 |
473 |
474 def div_id(self): |
474 def div_id(self): |
475 return '' |
475 return '' |
476 |
476 |
477 |
477 |
478 class Component(ReloadableMixIn, View): |
478 class Component(ReloadableMixIn, View): |
480 __registry__ = 'components' |
480 __registry__ = 'components' |
481 __select__ = yes() |
481 __select__ = yes() |
482 property_defs = { |
482 property_defs = { |
483 _('visible'): dict(type='Boolean', default=True, |
483 _('visible'): dict(type='Boolean', default=True, |
484 help=_('display the component or not')), |
484 help=_('display the component or not')), |
485 } |
485 } |
486 |
486 |
487 def div_class(self): |
487 def div_class(self): |
488 return '%s %s' % (self.propval('htmlclass'), self.id) |
488 return '%s %s' % (self.propval('htmlclass'), self.id) |
489 |
489 |
490 def div_id(self): |
490 def div_id(self): |