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 |