cubicweb/web/component.py
changeset 12567 26744ad37953
parent 12189 ef46695adb68
equal deleted inserted replaced
12566:6b3523f81f42 12567:26744ad37953
    21 
    21 
    22 
    22 
    23 from cubicweb import _
    23 from cubicweb import _
    24 
    24 
    25 from warnings import warn
    25 from warnings import warn
    26 
       
    27 from six import PY3, add_metaclass, text_type
       
    28 
    26 
    29 from logilab.common.deprecation import class_deprecated, class_renamed, deprecated
    27 from logilab.common.deprecation import class_deprecated, class_renamed, deprecated
    30 from logilab.mtconverter import xml_escape
    28 from logilab.mtconverter import xml_escape
    31 
    29 
    32 from cubicweb import Unauthorized, role, target, tags
    30 from cubicweb import Unauthorized, role, target, tags
   237     def __init__(self, href, label, **attrs):
   235     def __init__(self, href, label, **attrs):
   238         self.href = href
   236         self.href = href
   239         self.label = label
   237         self.label = label
   240         self.attrs = attrs
   238         self.attrs = attrs
   241 
   239 
   242     def __unicode__(self):
   240     def __str__(self):
   243         return tags.a(self.label, href=self.href, **self.attrs)
   241         return tags.a(self.label, href=self.href, **self.attrs)
   244 
       
   245     if PY3:
       
   246         __str__ = __unicode__
       
   247 
   242 
   248     def render(self, w):
   243     def render(self, w):
   249         w(tags.a(self.label, href=self.href, **self.attrs))
   244         w(tags.a(self.label, href=self.href, **self.attrs))
   250 
   245 
   251     def __repr__(self):
   246     def __repr__(self):
   453         args['entity'] = self.entity
   448         args['entity'] = self.entity
   454         return args
   449         return args
   455 
   450 
   456     @property
   451     @property
   457     def domid(self):
   452     def domid(self):
   458         return domid(self.__regid__) + text_type(self.entity.eid)
   453         return domid(self.__regid__) + str(self.entity.eid)
   459 
   454 
   460     def lazy_view_holder(self, w, entity, oid, registry='views'):
   455     def lazy_view_holder(self, w, entity, oid, registry='views'):
   461         """add a holder and return a URL that may be used to replace this
   456         """add a holder and return a URL that may be used to replace this
   462         holder by the html generate by the view specified by registry and
   457         holder by the html generate by the view specified by registry and
   463         identifier. Registry defaults to 'views'.
   458         identifier. Registry defaults to 'views'.
   526         jscall = js.cw.utils.callAjaxFuncThenReload(fname,
   521         jscall = js.cw.utils.callAjaxFuncThenReload(fname,
   527                                                     self.rtype,
   522                                                     self.rtype,
   528                                                     args['subject'],
   523                                                     args['subject'],
   529                                                     args['object'])
   524                                                     args['object'])
   530         return u'[<a href="javascript: %s" class="action">%s</a>] %s' % (
   525         return u'[<a href="javascript: %s" class="action">%s</a>] %s' % (
   531             xml_escape(text_type(jscall)), label, etarget.view('incontext'))
   526             xml_escape(str(jscall)), label, etarget.view('incontext'))
   532 
   527 
   533     def related_boxitems(self, entity):
   528     def related_boxitems(self, entity):
   534         return [self.box_item(entity, etarget, 'delete_relation', u'-')
   529         return [self.box_item(entity, etarget, 'delete_relation', u'-')
   535                 for etarget in self.related_entities(entity)]
   530                 for etarget in self.related_entities(entity)]
   536 
   531 
   543 
   538 
   544     def unrelated_entities(self, entity):
   539     def unrelated_entities(self, entity):
   545         """returns the list of unrelated entities, using the entity's
   540         """returns the list of unrelated entities, using the entity's
   546         appropriate vocabulary function
   541         appropriate vocabulary function
   547         """
   542         """
   548         skip = set(text_type(e.eid) for e in entity.related(self.rtype, role(self),
   543         skip = set(str(e.eid) for e in entity.related(self.rtype, role(self),
   549                                                           entities=True))
   544                                                           entities=True))
   550         skip.add(None)
   545         skip.add(None)
   551         skip.add(INTERNAL_FIELD_VALUE)
   546         skip.add(INTERNAL_FIELD_VALUE)
   552         filteretype = getattr(self, 'etype', None)
   547         filteretype = getattr(self, 'etype', None)
   553         entities = []
   548         entities = []
   661                 # for each related entity, provide a link to remove the relation
   656                 # for each related entity, provide a link to remove the relation
   662                 subview = rentity.view(self.item_vid)
   657                 subview = rentity.view(self.item_vid)
   663                 if maydel:
   658                 if maydel:
   664                     if not js_css_added:
   659                     if not js_css_added:
   665                         js_css_added = self.add_js_css()
   660                         js_css_added = self.add_js_css()
   666                     jscall = text_type(js.ajaxBoxRemoveLinkedEntity(
   661                     jscall = str(js.ajaxBoxRemoveLinkedEntity(
   667                         self.__regid__, entity.eid, rentity.eid,
   662                         self.__regid__, entity.eid, rentity.eid,
   668                         self.fname_remove,
   663                         self.fname_remove,
   669                         self.removed_msg and _(self.removed_msg)))
   664                         self.removed_msg and _(self.removed_msg)))
   670                     w(u'<tr><td class="dellink">[<a href="javascript: %s">-</a>]</td>'
   665                     w(u'<tr><td class="dellink">[<a href="javascript: %s">-</a>]</td>'
   671                       '<td class="entity"> %s</td></tr>' % (xml_escape(jscall),
   666                       '<td class="entity"> %s</td></tr>' % (xml_escape(jscall),
   676         else:
   671         else:
   677             w(_('no related entity'))
   672             w(_('no related entity'))
   678         if mayadd:
   673         if mayadd:
   679             multiple = self.rdef.role_cardinality(self.role) in '*+'
   674             multiple = self.rdef.role_cardinality(self.role) in '*+'
   680             w(u'<table><tr><td>')
   675             w(u'<table><tr><td>')
   681             jscall = text_type(js.ajaxBoxShowSelector(
   676             jscall = str(js.ajaxBoxShowSelector(
   682                 self.__regid__, entity.eid, self.fname_vocabulary,
   677                 self.__regid__, entity.eid, self.fname_vocabulary,
   683                 self.fname_validate, self.added_msg and _(self.added_msg),
   678                 self.fname_validate, self.added_msg and _(self.added_msg),
   684                 _(stdmsgs.BUTTON_OK[0]), _(stdmsgs.BUTTON_CANCEL[0]),
   679                 _(stdmsgs.BUTTON_OK[0]), _(stdmsgs.BUTTON_CANCEL[0]),
   685                 multiple and self.separator))
   680                 multiple and self.separator))
   686             w('<a class="button sglink" href="javascript: %s">%s</a>' % (
   681             w('<a class="button sglink" href="javascript: %s">%s</a>' % (
   705         self._cw.view(self.vid, rset, w=w)
   700         self._cw.view(self.vid, rset, w=w)
   706 
   701 
   707 
   702 
   708 # old contextual components, deprecated ########################################
   703 # old contextual components, deprecated ########################################
   709 
   704 
   710 @add_metaclass(class_deprecated)
   705 class EntityVComponent(Component, metaclass=class_deprecated):
   711 class EntityVComponent(Component):
       
   712     """abstract base class for additinal components displayed in content
   706     """abstract base class for additinal components displayed in content
   713     headers and footer according to:
   707     headers and footer according to:
   714 
   708 
   715     * the displayed entity's type
   709     * the displayed entity's type
   716     * a context (currently 'header' or 'footer')
   710     * a context (currently 'header' or 'footer')