web/facet.py
changeset 8029 805d4e121b65
parent 7953 a37531c8a4a6
child 8067 3841d8793efb
equal deleted inserted replaced
8028:58e9bc8a1f2c 8029:805d4e121b65
    31 .. autoclass:: cubicweb.web.facet.HasRelationFacet
    31 .. autoclass:: cubicweb.web.facet.HasRelationFacet
    32 .. autoclass:: cubicweb.web.facet.AttributeFacet
    32 .. autoclass:: cubicweb.web.facet.AttributeFacet
    33 .. autoclass:: cubicweb.web.facet.RQLPathFacet
    33 .. autoclass:: cubicweb.web.facet.RQLPathFacet
    34 .. autoclass:: cubicweb.web.facet.RangeFacet
    34 .. autoclass:: cubicweb.web.facet.RangeFacet
    35 .. autoclass:: cubicweb.web.facet.DateRangeFacet
    35 .. autoclass:: cubicweb.web.facet.DateRangeFacet
       
    36 .. autoclass:: cubicweb.web.facet.BitFieldFacet
    36 
    37 
    37 Classes for facets implementor
    38 Classes for facets implementor
    38 ------------------------------
    39 ------------------------------
    39 Unless you didn't find the class that does the job you want above, you may want
    40 Unless you didn't find the class that does the job you want above, you may want
    40 to skip those classes...
    41 to skip those classes...
   975         try:
   976         try:
   976             filtered_variable = self.filtered_variable
   977             filtered_variable = self.filtered_variable
   977             cleanup_select(select, filtered_variable)
   978             cleanup_select(select, filtered_variable)
   978             newvar = prepare_vocabulary_select(select, filtered_variable, self.rtype, self.role)
   979             newvar = prepare_vocabulary_select(select, filtered_variable, self.rtype, self.role)
   979             _set_orderby(select, newvar, self.sortasc, self.sortfunc)
   980             _set_orderby(select, newvar, self.sortasc, self.sortfunc)
       
   981             if self.cw_rset:
       
   982                 args = self.cw_rset.args
       
   983             else: # vocabulary used for possible_values
       
   984                 args = None
   980             try:
   985             try:
   981                 rset = self.rqlexec(select.as_string(), self.cw_rset.args)
   986                 rset = self.rqlexec(select.as_string(), args)
   982             except Exception:
   987             except Exception:
   983                 self.exception('error while getting vocabulary for %s, rql: %s',
   988                 self.exception('error while getting vocabulary for %s, rql: %s',
   984                                self, select.as_string())
   989                                self, select.as_string())
   985                 return ()
   990                 return ()
   986         finally:
   991         finally:
  1362             self.select.add_relation(self.filtered_variable, self.rtype, var)
  1367             self.select.add_relation(self.filtered_variable, self.rtype, var)
  1363         else:
  1368         else:
  1364             self.select.add_relation(var, self.rtype, self.filtered_variable)
  1369             self.select.add_relation(var, self.rtype, self.filtered_variable)
  1365 
  1370 
  1366 
  1371 
       
  1372 class BitFieldFacet(AttributeFacet):
       
  1373     """Base facet class for Int field holding some bit values using binary
       
  1374     masks.
       
  1375 
       
  1376     label / value for each bit should be given using the :attr:`choices`
       
  1377     attribute.
       
  1378 
       
  1379     See also :class:`~cubicweb.web.formwidgets.BitSelect`.
       
  1380     """
       
  1381     choices = None # to be set on concret class
       
  1382     def add_rql_restrictions(self):
       
  1383         value = self._cw.form.get(self.__regid__)
       
  1384         if not value:
       
  1385             return
       
  1386         if isinstance(value, list):
       
  1387             value = reduce(lambda x, y: int(x) | int(y), value)
       
  1388         attr_var = self.select.make_variable()
       
  1389         self.select.add_relation(self.filtered_variable, self.rtype, attr_var)
       
  1390         comp = nodes.Comparison('=', nodes.Constant(value, 'Int'))
       
  1391         comp.append(nodes.MathExpression('&', nodes.variable_ref(attr_var),
       
  1392                                          nodes.Constant(value, 'Int')))
       
  1393         having = self.select.having
       
  1394         if having:
       
  1395             self.select.replace(having[0], nodes.And(having[0], comp))
       
  1396         else:
       
  1397             self.select.set_having([comp])
       
  1398 
       
  1399     def rset_vocabulary(self, rset):
       
  1400         mask = reduce(lambda x, y: x | (y[0] or 0), rset, 0)
       
  1401         return sorted([(self._cw._(label), val) for label, val in self.choices
       
  1402                        if val & mask])
       
  1403 
       
  1404     def possible_values(self):
       
  1405         return [unicode(val) for label, val in self.vocabulary()]
       
  1406 
       
  1407 
  1367 ## html widets ################################################################
  1408 ## html widets ################################################################
  1368 _DEFAULT_CONSTANT_VOCAB_WIDGET_HEIGHT = 12
  1409 _DEFAULT_CONSTANT_VOCAB_WIDGET_HEIGHT = 12
  1369 
  1410 
  1370 class FacetVocabularyWidget(htmlwidgets.HTMLWidget):
  1411 class FacetVocabularyWidget(htmlwidgets.HTMLWidget):
  1371 
  1412