diff -r 3ab2682a4b37 -r 50e1a6ad3e98 web/facet.py --- a/web/facet.py Thu May 06 08:24:46 2010 +0200 +++ b/web/facet.py Mon Jul 19 15:36:16 2010 +0200 @@ -21,7 +21,6 @@ """ __docformat__ = "restructuredtext en" -from itertools import chain from copy import deepcopy from datetime import date, datetime, timedelta @@ -158,6 +157,10 @@ if rqlst.groupby: rqlst.add_group_var(newvar) rqlst.add_selected(newvar) + # add is restriction if necessary + if mainvar.stinfo['typerel'] is None: + etypes = frozenset(sol[mainvar.name] for sol in rqlst.solutions) + rqlst.add_type_restriction(mainvar, etypes) return newvar def _remove_relation(rqlst, rel, var): @@ -211,10 +214,6 @@ _set_orderby(rqlst, attrvar, sortasc, sortfuncname) # add attribute variable to selection rqlst.add_selected(attrvar) - # add is restriction if necessary - if not mainvar.stinfo['typerels']: - etypes = frozenset(sol[mainvar.name] for sol in rqlst.solutions) - rqlst.add_type_restriction(mainvar, etypes) return var def _cleanup_rqlst(rqlst, mainvar): @@ -241,12 +240,16 @@ for ovarname in linkedvars: vargraph[ovarname].remove(trvarname) # remove relation using this variable - for rel in chain(trvar.stinfo['relations'], trvar.stinfo['typerels']): + for rel in trvar.stinfo['relations']: if rel in removed: # already removed continue rqlst.remove_node(rel) removed.add(rel) + rel = trvar.stinfo['typerel'] + if rel is not None and not rel in removed: + rqlst.remove_node(rel) + removed.add(rel) # cleanup groupby clause if rqlst.groupby: for vref in rqlst.groupby[:]: @@ -342,9 +345,9 @@ def support_and(self): return False - def rqlexec(self, rql, args=None, cachekey=None): + def rqlexec(self, rql, args=None): try: - return self._cw.execute(rql, args, cachekey) + return self._cw.execute(rql, args) except Unauthorized: return [] @@ -385,7 +388,7 @@ if self.target_type is not None: rqlst.add_type_restriction(var, self.target_type) try: - rset = self.rqlexec(rqlst.as_string(), self.cw_rset.args, self.cw_rset.cachekey) + rset = self.rqlexec(rqlst.as_string(), self.cw_rset.args) except: self.exception('error while getting vocabulary for %s, rql: %s', self, rqlst.as_string()) @@ -464,6 +467,7 @@ attrtype = 'String' # type of comparison: default is an exact match on the attribute value comparator = '=' # could be '<', '<=', '>', '>=' + i18nable = True def vocabulary(self): """return vocabulary for this facet, eg a list of 2-uple (label, value) @@ -476,7 +480,7 @@ newvar = _prepare_vocabulary_rqlst(rqlst, mainvar, self.rtype, self.role) _set_orderby(rqlst, newvar, self.sortasc, self.sortfunc) try: - rset = self.rqlexec(rqlst.as_string(), self.cw_rset.args, self.cw_rset.cachekey) + rset = self.rqlexec(rqlst.as_string(), self.cw_rset.args) except: self.exception('error while getting vocabulary for %s, rql: %s', self, rqlst.as_string()) @@ -488,7 +492,10 @@ return rset and self.rset_vocabulary(rset) def rset_vocabulary(self, rset): - _ = self._cw._ + if self.i18nable: + _ = self._cw._ + else: + _ = unicode return [(_(value), value) for value, in rset] def support_and(self): @@ -513,7 +520,7 @@ def build_rql(self):#, tablefilter=False): form = self._cw.form facetids = form['facets'].split(',') - select = parse(form['baserql']).children[0] # XXX Union unsupported yet + select = self._cw.vreg.parse(self._cw, form['baserql']).children[0] # XXX Union unsupported yet mainvar = filtered_variable(select) toupdate = [] for facetid in facetids: