web/views/facets.py
changeset 6140 65a619eb31c4
parent 6040 9ae260b2d1c4
child 6141 b8287e54b528
equal deleted inserted replaced
6139:f76599a96238 6140:65a619eb31c4
    23 
    23 
    24 from cubicweb.appobject import objectify_selector
    24 from cubicweb.appobject import objectify_selector
    25 from cubicweb.selectors import (non_final_entity, multi_lines_rset,
    25 from cubicweb.selectors import (non_final_entity, multi_lines_rset,
    26                                 match_context_prop, yes, relation_possible)
    26                                 match_context_prop, yes, relation_possible)
    27 from cubicweb.utils import json_dumps
    27 from cubicweb.utils import json_dumps
    28 from cubicweb.web.box import BoxTemplate
    28 from cubicweb.web import box
    29 from cubicweb.web.facet import (AbstractFacet, FacetStringWidget, RelationFacet,
    29 from cubicweb.web.facet import (AbstractFacet, FacetStringWidget, RelationFacet,
    30                                 prepare_facets_rqlst, filter_hiddens, _cleanup_rqlst,
    30                                 prepare_facets_rqlst, filter_hiddens, _cleanup_rqlst,
    31                                 _prepare_vocabulary_rqlst)
    31                                 _prepare_vocabulary_rqlst)
    32 
    32 
    33 @objectify_selector
    33 @objectify_selector
    36     if view and getattr(view, 'filter_box_context_info', lambda: None)():
    36     if view and getattr(view, 'filter_box_context_info', lambda: None)():
    37         return 1
    37         return 1
    38     return 0
    38     return 0
    39 
    39 
    40 
    40 
    41 class FilterBox(BoxTemplate):
    41 class FilterBox(box.Box):
    42     """filter results of a query"""
    42     """filter results of a query"""
    43     __regid__ = 'filter_box'
    43     __regid__ = 'filter_box'
    44     __select__ = (((non_final_entity() & multi_lines_rset())
    44     __select__ = (((non_final_entity() & multi_lines_rset())
    45                    | contextview_selector()
    45                    | contextview_selector()
    46                    ) & match_context_prop())
    46                    ) & match_context_prop())
    47     context = 'left'
    47     context = 'left' # XXX doesn't support 'incontext', only 'left' or 'right'
    48     title = _('boxes_filter_box')
    48     title = _('boxes_filter_box')
    49     visible = True # functionality provided by the search box by default
    49     visible = True # functionality provided by the search box by default
    50     order = 1
    50     order = 1
    51     roundcorners = True
    51     roundcorners = True
    52 
    52 
    59         """this method returns the list of extra arguments that should
    59         """this method returns the list of extra arguments that should
    60         be used by the facet
    60         be used by the facet
    61         """
    61         """
    62         return {}
    62         return {}
    63 
    63 
    64     def _get_context(self, view):
    64     def _get_context(self):
       
    65         view = self.cw_extra_kwargs.get('view')
    65         context = getattr(view, 'filter_box_context_info', lambda: None)()
    66         context = getattr(view, 'filter_box_context_info', lambda: None)()
    66         if context:
    67         if context:
    67             rset, vid, divid, paginate = context
    68             rset, vid, divid, paginate = context
    68         else:
    69         else:
    69             rset = self.cw_rset
    70             rset = self.cw_rset
    70             vid, divid = None, 'pageContent'
    71             vid, divid = None, 'pageContent'
    71             paginate = view and view.paginable
    72             paginate = view and view.paginable
    72         return rset, vid, divid, paginate
    73         return rset, vid, divid, paginate
    73 
    74 
    74     def call(self, view=None):
    75     def render(self, w, **kwargs):
    75         req = self._cw
    76         req = self._cw
    76         req.add_js( self.needs_js )
    77         req.add_js( self.needs_js )
    77         req.add_css( self.needs_css)
    78         req.add_css( self.needs_css)
    78         if self.roundcorners:
    79         if self.roundcorners:
    79             req.html_headers.add_onload('jQuery(".facet").corner("tl br 10px");')
    80             req.html_headers.add_onload('jQuery(".facet").corner("tl br 10px");')
    80         rset, vid, divid, paginate = self._get_context(view)
    81         rset, vid, divid, paginate = self._get_context()
    81         if rset.rowcount < 2: # XXX done by selectors, though maybe necessary when rset has been hijacked
    82         # XXX done by selectors, though maybe necessary when rset has been hijacked
       
    83         if rset.rowcount < 2:
    82             return
    84             return
    83         rqlst = rset.syntax_tree()
    85         rqlst = rset.syntax_tree()
    84         # union not yet supported
    86         # union not yet supported
    85         if len(rqlst.children) != 1:
    87         if len(rqlst.children) != 1:
    86             return ()
    88             return ()
    95                     widgets.append(wdg)
    97                     widgets.append(wdg)
    96         if not widgets:
    98         if not widgets:
    97             return
    99             return
    98         if vid is None:
   100         if vid is None:
    99             vid = req.form.get('vid')
   101             vid = req.form.get('vid')
   100         w = self.w
       
   101         if self.bk_linkbox_template and req.vreg.schema['Bookmark'].has_perm(req, 'add'):
   102         if self.bk_linkbox_template and req.vreg.schema['Bookmark'].has_perm(req, 'add'):
   102             w(self.bookmark_link(rset))
   103             w(self.bookmark_link(rset))
   103         w(u'<form method="post" id="%sForm" cubicweb:facetargs="%s" action="">'  % (
   104         w(u'<form method="post" id="%sForm" cubicweb:facetargs="%s" action="">'  % (
   104             divid, xml_escape(json_dumps([divid, vid, paginate, self.facetargs()]))))
   105             divid, xml_escape(json_dumps([divid, vid, paginate, self.facetargs()]))))
   105         w(u'<fieldset>')
   106         w(u'<fieldset>')
   108         for param in ('subvid', 'vtitle'):
   109         for param in ('subvid', 'vtitle'):
   109             if param in req.form:
   110             if param in req.form:
   110                 hiddens[param] = req.form[param]
   111                 hiddens[param] = req.form[param]
   111         filter_hiddens(w, **hiddens)
   112         filter_hiddens(w, **hiddens)
   112         for wdg in widgets:
   113         for wdg in widgets:
   113             wdg.render(w=self.w)
   114             wdg.render(w=w)
   114         w(u'</fieldset>\n</form>\n')
   115         w(u'</fieldset>\n</form>\n')
   115 
   116 
   116     def bookmark_link(self, rset):
   117     def bookmark_link(self, rset):
   117         req = self._cw
   118         req = self._cw
   118         bk_path = u'rql=%s' % req.url_quote(rset.printable_rql())
   119         bk_path = u'rql=%s' % req.url_quote(rset.printable_rql())