web/component.py
changeset 3023 7864fee8b4ec
parent 2890 fdcb8a2bb6eb
parent 3014 62ce5a139b52
child 3408 c92170fca813
equal deleted inserted replaced
2968:0e3460341023 3023:7864fee8b4ec
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 """
     7 """
     8 __docformat__ = "restructuredtext en"
     8 __docformat__ = "restructuredtext en"
     9 _ = unicode
     9 _ = unicode
       
    10 
       
    11 from simplejson import dumps
    10 
    12 
    11 from logilab.common.deprecation import class_renamed
    13 from logilab.common.deprecation import class_renamed
    12 from logilab.mtconverter import xml_escape
    14 from logilab.mtconverter import xml_escape
    13 
    15 
    14 from cubicweb import role
    16 from cubicweb import role
    41         _('context'):  dict(type='String', default='header',
    43         _('context'):  dict(type='String', default='header',
    42                             vocabulary=(_('navtop'), _('navbottom'),
    44                             vocabulary=(_('navtop'), _('navbottom'),
    43                                         _('navcontenttop'), _('navcontentbottom')),
    45                                         _('navcontenttop'), _('navcontentbottom')),
    44                             #vocabulary=(_('header'), _('incontext'), _('footer')),
    46                             #vocabulary=(_('header'), _('incontext'), _('footer')),
    45                             help=_('context where this component should be displayed')),
    47                             help=_('context where this component should be displayed')),
    46         _('htmlclass'):dict(type='String', default='mainRelated',
       
    47                             help=_('html class of the component')),
       
    48     }
    48     }
    49 
    49 
    50     context = 'navcontentbottom' # 'footer' | 'header' | 'incontext'
    50     context = 'navcontentbottom' # 'footer' | 'header' | 'incontext'
    51 
    51 
    52     def call(self, view=None):
    52     def call(self, view=None):
    70     start_param = '__start'
    70     start_param = '__start'
    71     stop_param = '__stop'
    71     stop_param = '__stop'
    72     page_link_templ = u'<span class="slice"><a href="%s" title="%s">%s</a></span>'
    72     page_link_templ = u'<span class="slice"><a href="%s" title="%s">%s</a></span>'
    73     selected_page_link_templ = u'<span class="selectedSlice"><a href="%s" title="%s">%s</a></span>'
    73     selected_page_link_templ = u'<span class="selectedSlice"><a href="%s" title="%s">%s</a></span>'
    74     previous_page_link_templ = next_page_link_templ = page_link_templ
    74     previous_page_link_templ = next_page_link_templ = page_link_templ
    75     no_previous_page_link = no_next_page_link = u''
    75     no_previous_page_link = u'&lt;&lt;'
       
    76     no_next_page_link = u'&gt;&gt;'
    76 
    77 
    77     def __init__(self, req, rset, **kwargs):
    78     def __init__(self, req, rset, **kwargs):
    78         super(NavigationComponent, self).__init__(req, rset=rset, **kwargs)
    79         super(NavigationComponent, self).__init__(req, rset=rset, **kwargs)
    79         self.starting_from = 0
    80         self.starting_from = 0
    80         self.total = rset.rowcount
    81         self.total = rset.rowcount
   110         if self.start_param in params:
   111         if self.start_param in params:
   111             del params[self.start_param]
   112             del params[self.start_param]
   112         if self.stop_param in params:
   113         if self.stop_param in params:
   113             del params[self.stop_param]
   114             del params[self.stop_param]
   114 
   115 
       
   116     def page_url(self, path, params, start, stop):
       
   117         params = merge_dicts(params, {self.start_param : start,
       
   118                                       self.stop_param : stop,})
       
   119         if path == 'json':
       
   120             rql = params.pop('rql', self.rset.printable_rql())
       
   121             # latest 'true' used for 'swap' mode
       
   122             url = 'javascript: replacePageChunk(%s, %s, %s, %s, true)' % (
       
   123                 dumps(params.get('divid', 'paginated-content')),
       
   124                 dumps(rql), dumps(params.pop('vid', None)), dumps(params))
       
   125         else:
       
   126             url = self.build_url(path, **params)
       
   127         return url
       
   128 
   115     def page_link(self, path, params, start, stop, content):
   129     def page_link(self, path, params, start, stop, content):
   116         url = self.build_url(path, **merge_dicts(params, {self.start_param : start,
   130         url = xml_escape(self.page_url(path, params, start, stop))
   117                                                           self.stop_param : stop,}))
       
   118         url = xml_escape(url)
       
   119         if start == self.starting_from:
   131         if start == self.starting_from:
   120             return self.selected_page_link_templ % (url, content, content)
   132             return self.selected_page_link_templ % (url, content, content)
   121         return self.page_link_templ % (url, content, content)
   133         return self.page_link_templ % (url, content, content)
   122 
   134 
   123     def previous_link(self, params, content='&lt;&lt;', title=_('previous_results')):
   135     def previous_link(self, path, params, content='&lt;&lt;', title=_('previous_results')):
   124         start = self.starting_from
   136         start = self.starting_from
   125         if not start :
   137         if not start :
   126             return self.no_previous_page_link
   138             return self.no_previous_page_link
   127         start = max(0, start - self.page_size)
   139         start = max(0, start - self.page_size)
   128         stop = start + self.page_size - 1
   140         stop = start + self.page_size - 1
   129         url = self.build_url(**merge_dicts(params, {self.start_param : start,
   141         url = xml_escape(self.page_url(path, params, start, stop))
   130                                                     self.stop_param : stop,}))
       
   131         url = xml_escape(url)
       
   132         return self.previous_page_link_templ % (url, title, content)
   142         return self.previous_page_link_templ % (url, title, content)
   133 
   143 
   134     def next_link(self, params, content='&gt;&gt;', title=_('next_results')):
   144     def next_link(self, path, params, content='&gt;&gt;', title=_('next_results')):
   135         start = self.starting_from + self.page_size
   145         start = self.starting_from + self.page_size
   136         if start >= self.total:
   146         if start >= self.total:
   137             return self.no_next_page_link
   147             return self.no_next_page_link
   138         stop = start + self.page_size - 1
   148         stop = start + self.page_size - 1
   139         url = self.build_url(**merge_dicts(params, {self.start_param : start,
   149         url = xml_escape(self.page_url(path, params, start, stop))
   140                                                     self.stop_param : stop,}))
       
   141         url = xml_escape(url)
       
   142         return self.next_page_link_templ % (url, title, content)
   150         return self.next_page_link_templ % (url, title, content)
   143 
   151 
   144 
   152 
   145 class RelatedObjectsVComponent(EntityVComponent):
   153 class RelatedObjectsVComponent(EntityVComponent):
   146     """a section to display some related entities"""
   154     """a section to display some related entities"""