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)
예제 #2
0
 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)
예제 #3
0
    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)
예제 #4
0
    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)