def setUp(self): BaseTestCase.setUp(self) self._clear_index() self.create_video() self.create_video() self.create_video(status=Video.UNAPPROVED) self.nvl1 = utils.NormalizedVideoList( Video.objects.filter(status=Video.ACTIVE)) sqs = SearchQuerySet().models(Video) sqs = sqs.filter(utils._exact_q(sqs, 'site', 1)) self.nvl2 = utils.NormalizedVideoList(sqs)
def _tokens_to_sq(self, tokens): """ Takes a list of tokens and returns a single SQ instance representing those tokens, or ``None`` if no valid tokens were supplied. """ from localtv.search.utils import _exact_q sq_list = [] for token in tokens: if isinstance(token, basestring): negated = False if token[0] == '-': negated = True token = token[1:] if ':' not in token: sq = SQ(content=token) else: # possibly a special keyword keyword, rest = token.split(':', 1) keyword = keyword.lower() if keyword == 'category': category = self._get_object(Category, rest, 'name', 'slug', 'pk') if category is None: continue sq = _exact_q(self, 'categories', category.pk) elif keyword == 'feed': feed = self._get_object(Feed, rest, 'name', 'pk') if feed is None: continue sq = _exact_q(self, 'feed', feed.pk) elif keyword == 'search': search = self._get_object(SavedSearch, rest, 'query_string', 'pk') if search is None: continue sq = _exact_q(self, 'search', search.pk) elif keyword == 'tag': tag = self._get_object(Tag, rest, 'name') if tag is None: continue sq = _exact_q(self, 'tags', tag.pk) elif keyword == 'user': user = self._get_object(User, rest, 'username', 'pk') if user is None: continue sq = (_exact_q(self, 'user', user.pk) | _exact_q(self, 'authors', user.pk)) elif keyword == 'playlist': playlist = self._get_object(Playlist, rest, 'pk') if playlist is None and '/' in rest: # user/slug user, slug = rest.split('/', 1) try: playlist = Playlist.objects.get( user__username=user, slug=slug) except Playlist.DoesNotExist: pass if playlist is None: continue sq = _exact_q(self, 'playlists', playlist.pk) else: sq = SQ(content=token) if negated: sq = ~sq elif isinstance(token, (list, tuple)): # or block or_sq_list = filter(None, (self._tokens_to_sq([or_token]) for or_token in token)) if not or_sq_list: continue sq = reduce(operator.or_, or_sq_list) else: raise ValueError("Invalid token: {0!r}".format(token)) sq_list.append(sq) if not sq_list: return None return reduce(operator.and_, sq_list)