51 |
51 |
52 |
52 |
53 from cubicweb import _ |
53 from cubicweb import _ |
54 |
54 |
55 from functools import reduce |
55 from functools import reduce |
56 from warnings import warn |
|
57 from copy import deepcopy |
56 from copy import deepcopy |
58 from datetime import datetime, timedelta |
57 from datetime import datetime, timedelta |
59 |
58 |
60 from six import text_type, string_types |
59 from six import text_type, string_types |
61 |
60 |
715 def support_and(self): |
714 def support_and(self): |
716 return self._search_card('+*') |
715 return self._search_card('+*') |
717 |
716 |
718 # internal utilities ####################################################### |
717 # internal utilities ####################################################### |
719 |
718 |
720 @cached |
|
721 def _support_and_compat(self): |
|
722 support = self.support_and |
|
723 if callable(support): |
|
724 warn('[3.13] %s.support_and is now a property' % self.__class__, |
|
725 DeprecationWarning) |
|
726 support = support() |
|
727 return support |
|
728 |
|
729 def value_restriction(self, restrvar, rel, value): |
719 def value_restriction(self, restrvar, rel, value): |
730 # XXX handle rel is None case in RQLPathFacet? |
720 # XXX handle rel is None case in RQLPathFacet? |
731 if self.restr_attr != 'eid': |
721 if self.restr_attr != 'eid': |
732 self.select.set_distinct(True) |
722 self.select.set_distinct(True) |
733 if isinstance(value, string_types): |
723 if isinstance(value, string_types): |
738 self.restr_attr_type) |
728 self.restr_attr_type) |
739 else: |
729 else: |
740 rel.parent.replace(rel, nodes.Not(rel)) |
730 rel.parent.replace(rel, nodes.Not(rel)) |
741 elif self.operator == 'OR': |
731 elif self.operator == 'OR': |
742 # set_distinct only if rtype cardinality is > 1 |
732 # set_distinct only if rtype cardinality is > 1 |
743 if self._support_and_compat(): |
733 if self.support_and: |
744 self.select.set_distinct(True) |
734 self.select.set_distinct(True) |
745 # multiple ORed values: using IN is fine |
735 # multiple ORed values: using IN is fine |
746 if '' in value: |
736 if '' in value: |
747 value.remove('') |
737 value.remove('') |
748 self._add_not_rel_restr(rel) |
738 self._add_not_rel_restr(rel) |
1514 |
1504 |
1515 @cachedproperty |
1505 @cachedproperty |
1516 def height(self): |
1506 def height(self): |
1517 """ title, optional and/or dropdown, len(items) or upper limit """ |
1507 """ title, optional and/or dropdown, len(items) or upper limit """ |
1518 return (1.5 + # title + small magic constant |
1508 return (1.5 + # title + small magic constant |
1519 int(self.facet._support_and_compat() + |
1509 int(self.facet.support_and + |
1520 min(len(self.items), self.css_overflow_limit))) |
1510 min(len(self.items), self.css_overflow_limit))) |
1521 |
1511 |
1522 @property |
1512 @property |
1523 @cached |
1513 @cached |
1524 def overflows(self): |
1514 def overflows(self): |
1534 cssclass = 'facetTitle' |
1524 cssclass = 'facetTitle' |
1535 if self.facet.allow_hide: |
1525 if self.facet.allow_hide: |
1536 cssclass += ' hideFacetBody' |
1526 cssclass += ' hideFacetBody' |
1537 w(u'<div class="%s" cubicweb:facetName="%s">%s</div>\n' % |
1527 w(u'<div class="%s" cubicweb:facetName="%s">%s</div>\n' % |
1538 (cssclass, xml_escape(self.facet.__regid__), title)) |
1528 (cssclass, xml_escape(self.facet.__regid__), title)) |
1539 if self.facet._support_and_compat(): |
1529 if self.facet.support_and: |
1540 self._render_and_or(w) |
1530 self._render_and_or(w) |
1541 cssclass = 'facetBody vocabularyFacet' |
1531 cssclass = 'facetBody vocabularyFacet' |
1542 if not self.facet.start_unfolded: |
1532 if not self.facet.start_unfolded: |
1543 cssclass += ' hidden' |
1533 cssclass += ' hidden' |
1544 overflow = self.overflows |
1534 overflow = self.overflows |
1545 if overflow: |
1535 if overflow: |
1546 if self.facet._support_and_compat(): |
1536 if self.facet.support_and: |
1547 cssclass += ' vocabularyFacetBodyWithLogicalSelector' |
1537 cssclass += ' vocabularyFacetBodyWithLogicalSelector' |
1548 else: |
1538 else: |
1549 cssclass += ' vocabularyFacetBody' |
1539 cssclass += ' vocabularyFacetBody' |
1550 w(u'<div class="%s">\n' % cssclass) |
1540 w(u'<div class="%s">\n' % cssclass) |
1551 for value, label, selected in self.items: |
1541 for value, label, selected in self.items: |