web/views/facets.py
author Julien Cristau <julien.cristau@logilab.fr>
Thu, 22 Mar 2012 11:50:34 +0100
changeset 8328 c53bbeea7870
parent 8190 2a3c1b787688
child 8551 6cf9e4da54a9
permissions -rw-r--r--
Add missing with_statement import for python2.5 compat
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
     1
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5940
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    18
"""the facets box and some basic facets"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
__docformat__ = "restructuredtext en"
6582
8eb7883b4223 [pylint] fix a bug of pylint detected errors and i18n pb (calling builtins._ instead of req._)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6463
diff changeset
    21
_ = unicode
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
7956
db49658b2812 add missing imports
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7953
diff changeset
    23
from warnings import warn
db49658b2812 add missing imports
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7953
diff changeset
    24
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2283
diff changeset
    25
from logilab.mtconverter import xml_escape
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
    26
from logilab.common.decorators import cachedproperty
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
    27
from logilab.common.registry import objectify_predicate, yes
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    28
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
    29
from cubicweb.predicates import (non_final_entity, multi_lines_rset,
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
    30
                                 match_context_prop, relation_possible)
5940
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    31
from cubicweb.utils import json_dumps
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
    32
from cubicweb.uilib import css_em_num_value
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
    33
from cubicweb.view import AnyRsetView
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    34
from cubicweb.web import component, facet as facetbase
8128
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
    35
from cubicweb.web.views.ajaxcontroller import ajaxfunc
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    36
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
    37
def facets(req, rset, context, mainvar=None, **kwargs):
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    38
    """return the base rql and a list of widgets for facets applying to the
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    39
    given rset/context (cached version of :func:`_facet`)
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    40
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    41
    :param req: A :class:`~cubicweb.req.RequestSessionBase` object
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    42
    :param rset: A :class:`~cubicweb.rset.ResultSet`
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    43
    :param context: A string that match the ``__regid__`` of a ``FacetFilter``
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    44
    :param mainvar: A string that match a select var from the rset
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    45
    """
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    46
    try:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    47
        cache = req.__rset_facets
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    48
    except AttributeError:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    49
        cache = req.__rset_facets = {}
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    50
    try:
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    51
        return cache[(rset, context, mainvar)]
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    52
    except KeyError:
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
    53
        facets = _facets(req, rset, context, mainvar, **kwargs)
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    54
        cache[(rset, context, mainvar)] = facets
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    55
        return facets
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    56
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
    57
def _facets(req, rset, context, mainvar, **kwargs):
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    58
    """return the base rql and a list of widgets for facets applying to the
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    59
    given rset/context
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    60
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    61
    :param req: A :class:`~cubicweb.req.RequestSessionBase` object
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    62
    :param rset: A :class:`~cubicweb.rset.ResultSet`
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    63
    :param context: A string that match the ``__regid__`` of a ``FacetFilter``
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    64
    :param mainvar: A string that match a select var from the rset
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    65
    """
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    66
    ### initialisation
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    67
    # XXX done by selectors, though maybe necessary when rset has been hijacked
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    68
    # (e.g. contextview_selector matched)
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    69
    origqlst = rset.syntax_tree()
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    70
    # union not yet supported
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    71
    if len(origqlst.children) != 1:
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    72
        req.debug('facette disabled on union request %s', origqlst)
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    73
        return None, ()
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    74
    rqlst = origqlst.copy()
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    75
    select = rqlst.children[0]
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    76
    filtered_variable, baserql = facetbase.init_facets(rset, select, mainvar)
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    77
    ### Selection
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    78
    possible_facets = req.vreg['facets'].poss_visible_objects(
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
    79
        req, rset=rset, rqlst=origqlst, select=select,
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
    80
        context=context, filtered_variable=filtered_variable, **kwargs)
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
    81
    wdgs = [(facet, facet.get_widget()) for facet in possible_facets]
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
    82
    return baserql, [wdg for facet, wdg in wdgs if wdg is not None]
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
    83
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
    85
@objectify_predicate
2161
200481e7b156 prepare time where it won't be mandatory to give rset to select()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
    86
def contextview_selector(cls, req, rset=None, row=None, col=None, view=None,
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    87
                         **kwargs):
7663
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    88
    if view:
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    89
        try:
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    90
            getcontext = getattr(view, 'filter_box_context_info')
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    91
        except AttributeError:
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    92
            return 0
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    93
        rset = getcontext()[0]
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    94
        if rset is None or rset.rowcount < 2:
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    95
            return 0
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
    96
        wdgs = facets(req, rset, cls.__regid__, view=view)[1]
7663
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
    97
        return len(wdgs)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1132
diff changeset
    98
    return 0
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    99
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   100
@objectify_predicate
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   101
def has_facets(cls, req, rset=None, **kwargs):
7663
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
   102
    if rset is None or rset.rowcount < 2:
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   103
        return 0
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   104
    wdgs = facets(req, rset, cls.__regid__, **kwargs)[1]
7663
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
   105
    return len(wdgs)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   107
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   108
def filter_hiddens(w, baserql, wdgs, **kwargs):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   109
    kwargs['facets'] = ','.join(wdg.facet.__regid__ for wdg in wdgs)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   110
    kwargs['baserql'] = baserql
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   111
    for key, val in kwargs.items():
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   112
        w(u'<input type="hidden" name="%s" value="%s" />' % (
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   113
            key, xml_escape(val)))
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   114
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   115
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   116
class FacetFilterMixIn(object):
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   117
    """Mixin Class to generate Facet Filter Form
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   118
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   119
    To generate the form, you need to explicitly call the following method:
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   120
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   121
    .. automethod:: generate_form
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   122
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   123
    The most useful function to override is:
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   124
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   125
    .. automethod:: layout_widgets
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   126
    """
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   127
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   128
    needs_js = ['cubicweb.ajax.js', 'cubicweb.facets.js']
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   129
    needs_css = ['cubicweb.facets.css']
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   130
    roundcorners = True
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   131
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   132
    def generate_form(self, w, rset, divid, vid, vidargs=None, mainvar=None,
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   133
                      paginate=False, cssclass='', hiddens=None, **kwargs):
7937
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   134
        """display a form to filter some view's content
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   135
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   136
        :param w:        Write function
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   137
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   138
        :param rset:     ResultSet to be filtered
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   139
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   140
        :param divid:    Dom ID of the div where the rendering of the view is done.
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   141
        :type divid:     string
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   142
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   143
        :param vid:      ID of the view display in the div
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   144
        :type vid:       string
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   145
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   146
        :param paginate: Is the view paginated ?
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   147
        :type paginate:  boolean
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   148
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   149
        :param cssclass: Additional css classes to put on the form.
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   150
        :type cssclass:  string
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   151
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   152
        :param hiddens:  other hidden parametters to include in the forms.
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   153
        :type hiddens:   dict from extra keyword argument
3453c5f0db21 [facets] FacetFilterMixIn: add documention for class and generate_form
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7849
diff changeset
   154
        """
8000
9a73d5e762b0 [facets] fix context passing + a note for later
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7996
diff changeset
   155
        # XXX Facet.context property hijacks an otherwise well-behaved
9a73d5e762b0 [facets] fix context passing + a note for later
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7996
diff changeset
   156
        #     vocabulary with its own notions
9a73d5e762b0 [facets] fix context passing + a note for later
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7996
diff changeset
   157
        #     Hence we whack here to avoid a clash
9a73d5e762b0 [facets] fix context passing + a note for later
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7996
diff changeset
   158
        kwargs.pop('context', None)
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   159
        baserql, wdgs = facets(self._cw, rset, context=self.__regid__,
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   160
                               mainvar=mainvar, **kwargs)
7663
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
   161
        assert wdgs
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   162
        self._cw.add_js(self.needs_js)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   163
        self._cw.add_css(self.needs_css)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   164
        self._cw.html_headers.define_var('facetLoadingMsg',
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   165
                                         self._cw._('facet-loading-msg'))
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   166
        if self.roundcorners:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   167
            self._cw.html_headers.add_onload(
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   168
                'jQuery(".facet").corner("tl br 10px");')
7949
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   169
        if vidargs is not None:
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   170
            warn("[3.14] vidargs is deprecated. Maybe you're using some TableView?",
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   171
                 DeprecationWarning, stacklevel=2)
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   172
        else:
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   173
            vidargs = {}
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   174
        vidargs = dict((k, v) for k, v in vidargs.iteritems() if v)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   175
        facetargs = xml_escape(json_dumps([divid, vid, paginate, vidargs]))
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   176
        w(u'<form id="%sForm" class="%s" method="post" action="" '
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   177
          'cubicweb:facetargs="%s" >' % (divid, cssclass, facetargs))
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   178
        w(u'<fieldset>')
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   179
        if hiddens is None:
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   180
            hiddens = {}
7606
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
   181
        if mainvar:
01b49ec8fe80 [facets] allow to specify on which rqlst's variable facets should be applied. Closes #1795915
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7605
diff changeset
   182
            hiddens['mainvar'] = mainvar
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   183
        filter_hiddens(w, baserql, wdgs, **hiddens)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   184
        self.layout_widgets(w, self.sorted_widgets(wdgs))
7939
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   185
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   186
        # <Enter> is supposed to submit the form only if there is a single
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   187
        # input:text field. However most browsers will submit the form
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   188
        # on <Enter> anyway if there is an input:submit field.
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   189
        #
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   190
        # see: http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   191
        #
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   192
        # Firefox 7.0.1 does not submit form on <Enter> if there is more than a
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   193
        # input:text field and not input:submit but does it if there is an
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   194
        # input:submit.
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   195
        #
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   196
        # IE 6 or Firefox 2 behave the same way.
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   197
        w(u'<input type="submit" class="hidden" />')
e107204d3b27 Add a hidden input:submit field in facets form (closes #1988784)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7936
diff changeset
   198
        #
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   199
        w(u'</fieldset>\n')
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   200
        w(u'</form>\n')
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   201
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   202
    def sorted_widgets(self, wdgs):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   203
        """sort widgets: by default sort by widget height, then according to
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   204
        widget.order (the original widgets order)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   205
        """
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   206
        return sorted(wdgs, key=lambda x: 99 * (not x.facet.start_unfolded) or x.height )
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   207
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   208
    def layout_widgets(self, w, wdgs):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   209
        """layout widgets: by default simply render each of them
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   210
        (i.e. succession of <div>)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   211
        """
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   212
        for wdg in wdgs:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   213
            wdg.render(w=w)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   214
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   215
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   216
class FilterBox(FacetFilterMixIn, component.CtxComponent):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   217
    """filter results of a query"""
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   218
    __regid__ = 'facet.filterbox'
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   219
    __select__ = ((non_final_entity() & has_facets())
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   220
                  | contextview_selector()) # can't use has_facets because of
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   221
                                            # contextview mecanism
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6040
diff changeset
   222
    context = 'left' # XXX doesn't support 'incontext', only 'left' or 'right'
6463
67b0ad068f5d i18n update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6427
diff changeset
   223
    title = _('facet.filters')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   224
    visible = True # functionality provided by the search box by default
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   225
    order = 1
2214
a6b42cf05407 [facets] slightly better attr names
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2213
diff changeset
   226
2325
363b66a15668 [cleaning] minor cleaning over last two checkins
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2323
diff changeset
   227
    bk_linkbox_template = u'<div class="facetTitle">%s</div>'
2283
dc13ec07a70a cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2260
diff changeset
   228
7614
40f33b3d3ea6 [facetbox] put the facet box in a box
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7610
diff changeset
   229
    def render_body(self, w, **kwargs):
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   230
        req = self._cw
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   231
        rset, vid, divid, paginate = self._get_context()
7663
fb2501d29587 [facets] closes #1827464: facet box always appear
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7614
diff changeset
   232
        assert len(rset) > 1
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   233
        if vid is None:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   234
            vid = req.form.get('vid')
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   235
        if self.bk_linkbox_template and req.vreg.schema['Bookmark'].has_perm(req, 'add'):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   236
            w(self.bookmark_link(rset))
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   237
        hiddens = {}
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   238
        for param in ('subvid', 'vtitle'):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   239
            if param in req.form:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   240
                hiddens[param] = req.form[param]
7996
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   241
        self.generate_form(w, rset, divid, vid, paginate=paginate,
8de58d2674d6 [facets] view should be propagated up to facet selection, so we can get different facets according to the view. Closes #2036527
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7956
diff changeset
   242
                           hiddens=hiddens, **self.cw_extra_kwargs)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1132
diff changeset
   243
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6040
diff changeset
   244
    def _get_context(self):
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6040
diff changeset
   245
        view = self.cw_extra_kwargs.get('view')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   246
        context = getattr(view, 'filter_box_context_info', lambda: None)()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   247
        if context:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   248
            rset, vid, divid, paginate = context
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   249
        else:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   250
            rset = self.cw_rset
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   251
            vid, divid = None, 'pageContent'
4244
2c3de1953d00 rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
   252
            paginate = view and view.paginable
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   253
        return rset, vid, divid, paginate
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1132
diff changeset
   254
6040
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   255
    def bookmark_link(self, rset):
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   256
        req = self._cw
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   257
        bk_path = u'rql=%s' % req.url_quote(rset.printable_rql())
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   258
        if req.form.get('vid'):
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   259
            bk_path += u'&vid=%s' % req.url_quote(req.form['vid'])
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   260
        bk_path = u'view?' + bk_path
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   261
        bk_title = req._('my custom search')
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   262
        linkto = u'bookmarked_by:%s:subject' % req.user.eid
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   263
        bkcls = req.vreg['etypes'].etype_class('Bookmark')
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   264
        bk_add_url = bkcls.cw_create_url(req, path=bk_path, title=bk_title,
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   265
                                         __linkto=linkto)
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   266
        bk_base_url = bkcls.cw_create_url(req, title=bk_title, __linkto=linkto)
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   267
        bk_link = u'<a cubicweb:target="%s" id="facetBkLink" href="%s">%s</a>' % (
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   268
                xml_escape(bk_base_url), xml_escape(bk_add_url),
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   269
                req._('bookmark this search'))
9ae260b2d1c4 [facet] refactor bookmark this search link creation: check perm before calling the method, and use the new create url factory
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   270
        return self.bk_linkbox_template % bk_link
2260
080167dad19e split FilterBox call function
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2215
diff changeset
   271
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   272
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   273
class FilterTable(FacetFilterMixIn, AnyRsetView):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   274
    __regid__ = 'facet.filtertable'
7610
838a0c910bb5 [selectors, facet] make is_instance and other EClassSelector subclass gather entity classes from 'select' and 'filtered_variable' context information. Closes #1796732
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7606
diff changeset
   275
    __select__ = has_facets()
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   276
    average_perfacet_uncomputable_overhead = .3
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   277
7949
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   278
    def call(self, vid, divid, vidargs=None, cssclass=''):
8036
140a093015f8 [facetable views] allow extra hiddens to be specified when selecting the facets form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8026
diff changeset
   279
        hiddens = self.cw_extra_kwargs.setdefault('hiddens', {})
140a093015f8 [facetable views] allow extra hiddens to be specified when selecting the facets form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8026
diff changeset
   280
        hiddens['fromformfilter'] = '1'
7949
ce64860b3cdc [facets] on the way to vidargs removal
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7943
diff changeset
   281
        self.generate_form(self.w, self.cw_rset, divid, vid, vidargs=vidargs,
8036
140a093015f8 [facetable views] allow extra hiddens to be specified when selecting the facets form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8026
diff changeset
   282
                           cssclass=cssclass, **self.cw_extra_kwargs)
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   283
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   284
    @cachedproperty
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   285
    def per_facet_height_overhead(self):
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   286
        return (css_em_num_value(self._cw.vreg, 'facet_MarginBottom', .2) +
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   287
                css_em_num_value(self._cw.vreg, 'facet_Padding', .2) +
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   288
                self.average_perfacet_uncomputable_overhead)
7842
fa7e463cae9d [views/facets] simple horizontal layout when there are a few facets only (closes #1921709)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7664
diff changeset
   289
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   290
    def layout_widgets(self, w, wdgs):
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   291
        """layout widgets: put them in a table where each column should have
7943
ad0581296e2c [facets] try to get rid of arbitrary constants, be prettier and eat less space (closes #1988706)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7937
diff changeset
   292
        sum(wdg.height) < wdg_stack_size.
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   293
        """
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   294
        w(u'<div class="filter">\n')
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   295
        widget_queue = []
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   296
        queue_height = 0
8104
71d9fb78b772 [facets] forcing a fixed height to the group is a bad idea: the container will not properly overflow
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8093
diff changeset
   297
        wdg_stack_size = facetbase._DEFAULT_FACET_GROUP_HEIGHT
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   298
        for wdg in wdgs:
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   299
            height = wdg.height + self.per_facet_height_overhead
7849
7937cf60f2ce [facets] fix height computation (incorporates and/or element if present, use css value to compute likely maximum height, kill wdg_stack_size) (closes #1954077)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7842
diff changeset
   300
            if queue_height + height <= wdg_stack_size:
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   301
                widget_queue.append(wdg)
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   302
                queue_height += height
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   303
                continue
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   304
            w(u'<div class="facetGroup">')
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   305
            for queued in widget_queue:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   306
                queued.render(w=w)
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   307
            w(u'</div>')
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   308
            widget_queue = [wdg]
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   309
            queue_height = height
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   310
        if widget_queue:
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   311
            w(u'<div class="facetGroup">')
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   312
            for queued in widget_queue:
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   313
                queued.render(w=w)
8093
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   314
            w(u'</div>')
3efb83e4e8f3 [facets] do no stretch to the right when there are many facets; instead use a floating layout (closes #2093160)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8036
diff changeset
   315
        w(u'</div>\n')
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   316
8128
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   317
# python-ajax remote functions used by facet widgets #########################
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   318
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   319
@ajaxfunc(output_type='json')
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   320
def filter_build_rql(self, names, values):
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   321
    form = self._rebuild_posted_form(names, values)
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   322
    self._cw.form = form
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   323
    builder = facetbase.FilterRQLBuilder(self._cw)
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   324
    return builder.build_rql()
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   325
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   326
@ajaxfunc(output_type='json')
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   327
def filter_select_content(self, facetids, rql, mainvar):
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   328
    # Union unsupported yet
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   329
    select = self._cw.vreg.parse(self._cw, rql).children[0]
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   330
    filtered_variable = facetbase.get_filtered_variable(select, mainvar)
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   331
    facetbase.prepare_select(select, filtered_variable)
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   332
    update_map = {}
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   333
    for fid in facetids:
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   334
        fobj = facetbase.get_facet(self._cw, fid, select, filtered_variable)
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   335
        update_map[fid] = fobj.possible_values()
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   336
    return update_map
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   337
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8104
diff changeset
   338
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1132
diff changeset
   339
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   340
# facets ######################################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   341
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   342
class CWSourceFacet(facetbase.RelationFacet):
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   343
    __regid__ = 'cw_source-facet'
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   344
    rtype = 'cw_source'
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   345
    target_attr = 'name'
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6141
diff changeset
   346
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   347
class CreatedByFacet(facetbase.RelationFacet):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3023
diff changeset
   348
    __regid__ = 'created_by-facet'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   349
    rtype = 'created_by'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   350
    target_attr = 'login'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   351
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   352
class InGroupFacet(facetbase.RelationFacet):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3023
diff changeset
   353
    __regid__ = 'in_group-facet'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   354
    rtype = 'in_group'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   355
    target_attr = 'name'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   356
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   357
class InStateFacet(facetbase.RelationAttributeFacet):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3023
diff changeset
   358
    __regid__ = 'in_state-facet'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   359
    rtype = 'in_state'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   360
    target_attr = 'name'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   361
7605
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   362
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   363
# inherit from RelationFacet to benefit from its possible_values implementation
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   364
class ETypeFacet(facetbase.RelationFacet):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3023
diff changeset
   365
    __regid__ = 'etype-facet'
742
99115e029dca replaced most of __selectors__ assignments with __select__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 692
diff changeset
   366
    __select__ = yes()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   367
    order = 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   368
    rtype = 'is'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   369
    target_attr = 'name'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   370
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   371
    @property
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   372
    def title(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   373
        return self._cw._('entity type')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   374
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   375
    def vocabulary(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   376
        """return vocabulary for this facet, eg a list of 2-uple (label, value)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   377
        """
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   378
        etypes = self.cw_rset.column_types(0)
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   379
        return sorted((self._cw._(etype), etype) for etype in etypes)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1132
diff changeset
   380
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   381
    def add_rql_restrictions(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   382
        """add restriction for this facet into the rql syntax tree"""
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   383
        value = self._cw.form.get(self.__regid__)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   384
        if not value:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   385
            return
7605
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   386
        self.select.add_type_restriction(self.filtered_variable, value)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   387
2337
6620e5abcd99 select right possible_values for ETypeFacet
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2323
diff changeset
   388
    def possible_values(self):
6620e5abcd99 select right possible_values for ETypeFacet
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2323
diff changeset
   389
        """return a list of possible values (as string since it's used to
6620e5abcd99 select right possible_values for ETypeFacet
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2323
diff changeset
   390
        compare to a form value in javascript) for this facet
6620e5abcd99 select right possible_values for ETypeFacet
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2323
diff changeset
   391
        """
7605
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   392
        select = self.select
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   393
        select.save_state()
2337
6620e5abcd99 select right possible_values for ETypeFacet
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2323
diff changeset
   394
        try:
7605
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   395
            facetbase.cleanup_select(select, self.filtered_variable)
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   396
            etype_var = facetbase.prepare_vocabulary_select(
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   397
                select, self.filtered_variable, self.rtype, self.role)
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   398
            attrvar = select.make_variable()
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   399
            select.add_selected(attrvar)
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   400
            select.add_relation(etype_var, 'name', attrvar)
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   401
            return [etype for _, etype in self.rqlexec(select.as_string())]
2337
6620e5abcd99 select right possible_values for ETypeFacet
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 2323
diff changeset
   402
        finally:
7605
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   403
            select.recover()
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   404
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   405
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   406
class HasTextFacet(facetbase.AbstractFacet):
742
99115e029dca replaced most of __selectors__ assignments with __select__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 692
diff changeset
   407
    __select__ = relation_possible('has_text', 'subject') & match_context_prop()
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3023
diff changeset
   408
    __regid__ = 'has_text-facet'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   409
    rtype = 'has_text'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   410
    role = 'subject'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   411
    order = 0
7402
826e5663a686 [facets/table] vertically group facets by two when possible in order to have a more compact horizontal layout in table filter form
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7300
diff changeset
   412
826e5663a686 [facets/table] vertically group facets by two when possible in order to have a more compact horizontal layout in table filter form
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7300
diff changeset
   413
    @property
826e5663a686 [facets/table] vertically group facets by two when possible in order to have a more compact horizontal layout in table filter form
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7300
diff changeset
   414
    def wdgclass(self):
7600
75d208ab8444 [facets] factorize table filter form / facets box generation, moving out filter form from the table view so it's usable from other views. Closes #1794009
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7402
diff changeset
   415
        return facetbase.FacetStringWidget
7402
826e5663a686 [facets/table] vertically group facets by two when possible in order to have a more compact horizontal layout in table filter form
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7300
diff changeset
   416
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   417
    @property
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   418
    def title(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   419
        return self._cw._('has_text')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1132
diff changeset
   420
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   421
    def get_widget(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   422
        """return the widget instance to use to display this facet
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   423
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   424
        default implentation expects a .vocabulary method on the facet and
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   425
        return a combobox displaying this vocabulary
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   426
        """
7402
826e5663a686 [facets/table] vertically group facets by two when possible in order to have a more compact horizontal layout in table filter form
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7300
diff changeset
   427
        return self.wdgclass(self)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   428
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   429
    def add_rql_restrictions(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   430
        """add restriction for this facet into the rql syntax tree"""
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   431
        value = self._cw.form.get(self.__regid__)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   432
        if not value:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   433
            return
7605
48abeac162fd [facets] refactor / cleanup facet api: more consistent variable naming and easier to reuse function. Closes #1796804
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7600
diff changeset
   434
        self.select.add_constant_restriction(self.filtered_variable, 'has_text', value, 'String')