web/component.py
branchtls-sprint
changeset 799 ad129d374ee2
parent 747 af9c15653ea9
child 817 12320ff8d6e4
equal deleted inserted replaced
798:0015b33a7336 799:ad129d374ee2
     7 __docformat__ = "restructuredtext en"
     7 __docformat__ = "restructuredtext en"
     8 
     8 
     9 from logilab.common.deprecation import class_renamed
     9 from logilab.common.deprecation import class_renamed
    10 from logilab.mtconverter import html_escape
    10 from logilab.mtconverter import html_escape
    11 
    11 
       
    12 from cubicweb import role
    12 from cubicweb.utils import merge_dicts
    13 from cubicweb.utils import merge_dicts
    13 from cubicweb.view import View, Component
    14 from cubicweb.view import View, Component
    14 from cubicweb.selectors import (
    15 from cubicweb.selectors import (
    15     paginated_rset, one_line_rset, primary_view, match_context_prop,
    16     paginated_rset, one_line_rset, primary_view, match_context_prop,
       
    17     abstract_has_related_entities,
    16     condition_compat, accepts_compat, has_relation_compat)
    18     condition_compat, accepts_compat, has_relation_compat)
    17 from cubicweb.common.registerers import accepts_registerer
    19 from cubicweb.common.registerers import accepts_registerer
    18 
    20 
    19 _ = unicode
    21 _ = unicode
    20 
    22 
    67     stop_param = '__stop'
    69     stop_param = '__stop'
    68     page_link_templ = u'<span class="slice"><a href="%s" title="%s">%s</a></span>'
    70     page_link_templ = u'<span class="slice"><a href="%s" title="%s">%s</a></span>'
    69     selected_page_link_templ = u'<span class="selectedSlice"><a href="%s" title="%s">%s</a></span>'
    71     selected_page_link_templ = u'<span class="selectedSlice"><a href="%s" title="%s">%s</a></span>'
    70     previous_page_link_templ = next_page_link_templ = page_link_templ
    72     previous_page_link_templ = next_page_link_templ = page_link_templ
    71     no_previous_page_link = no_next_page_link = u''
    73     no_previous_page_link = no_next_page_link = u''
    72 
       
    73     @classmethod
       
    74     def selected(cls, req, rset, row=None, col=None, page_size=None, **kwargs):
       
    75         """by default web app objects are usually instantiated on
       
    76         selection according to a request, a result set, and optional
       
    77         row and col
       
    78         """
       
    79         instance = super(NavigationComponent, cls).selected(req, rset, row, col, **kwargs)
       
    80         if page_size is not None:
       
    81             instance.page_size = page_size
       
    82         elif 'page_size' in req.form:
       
    83             instance.page_size = int(req.form['page_size'])
       
    84         return instance
       
    85     
    74     
    86     def __init__(self, req, rset):
    75     def __init__(self, req, rset):
    87         super(NavigationComponent, self).__init__(req, rset)
    76         super(NavigationComponent, self).__init__(req, rset)
    88         self.starting_from = 0
    77         self.starting_from = 0
    89         self.total = rset.rowcount
    78         self.total = rset.rowcount
    90 
    79 
    91     def get_page_size(self):
    80     def get_page_size(self):
    92         try:
    81         try:
    93             return self._page_size
    82             return self._page_size
    94         except AttributeError:
    83         except AttributeError:
    95             self._page_size = self.req.property_value(self.page_size_property)
    84             if 'page_size' in self.extra_kwargs:
    96             return self._page_size
    85                 page_size = self.extra_kwargs['page_size']
       
    86             elif 'page_size' in self.req.form:
       
    87                 page_size = int(self.req.form['page_size'])
       
    88             else:
       
    89                 page_size = self.req.property_value(self.page_size_property)
       
    90             self._page_size = page_size
       
    91             return page_size
    97 
    92 
    98     def set_page_size(self, page_size):
    93     def set_page_size(self, page_size):
    99         self._page_size = page_size
    94         self._page_size = page_size
   100         
    95         
   101     page_size = property(get_page_size, set_page_size)
    96     page_size = property(get_page_size, set_page_size)
   146 
   141 
   147 
   142 
   148 class RelatedObjectsVComponent(EntityVComponent):
   143 class RelatedObjectsVComponent(EntityVComponent):
   149     """a section to display some related entities"""
   144     """a section to display some related entities"""
   150     vid = 'list'
   145     vid = 'list'
   151 
   146     __select__ = abstract_has_related_entities()
       
   147     
   152     def rql(self):
   148     def rql(self):
   153         """override this method if you want to use a custom rql query"""
   149         """override this method if you want to use a custom rql query"""
   154         return None
   150         return None
   155     
   151     
   156     def cell_call(self, row, col, view=None):
   152     def cell_call(self, row, col, view=None):
   157         rql = self.rql()
   153         rql = self.rql()
   158         if rql is None:
   154         if rql is None:
   159             entity = self.rset.get_entity(row, col)
   155             entity = self.rset.get_entity(row, col)
   160             if self.target == 'object':
   156             rset = entity.related(self.rtype, role(self))
   161                 role = 'subject'
       
   162             else:
       
   163                 role = 'object'
       
   164             rset = entity.related(self.rtype, role)
       
   165         else:
   157         else:
   166             eid = self.rset[row][col]
   158             eid = self.rset[row][col]
   167             rset = self.req.execute(self.rql(), {'x': eid}, 'x')
   159             rset = self.req.execute(self.rql(), {'x': eid}, 'x')
   168         if not rset.rowcount:
   160         if not rset.rowcount:
   169             return
   161             return