Exemplo n.º 1
0
    def _get(self, request, *args, **kwargs):
        es = FeedItemIndexer.get_es()

        # Parse carrier and region.
        q = request.QUERY_PARAMS
        region = request.REGION.id
        carrier = None
        if q.get('carrier') and q['carrier'] in mkt.carriers.CARRIER_MAP:
            carrier = mkt.carriers.CARRIER_MAP[q['carrier']].id

        # Fetch FeedItems.
        sq = self.get_es_feed_query(FeedItemIndexer.search(using=es),
                                    region=region, carrier=carrier)
        feed_items = sq.execute().hits
        if not feed_items:
            # Fallback to RoW.
            sq = self.get_es_feed_query(FeedItemIndexer.search(using=es))
            feed_items = sq.execute().hits
            if not feed_items:
                return response.Response({'objects': []},
                                         status=status.HTTP_404_NOT_FOUND)

        # Set up serializer context.
        feed_element_map = {
            feed.FEED_TYPE_APP: {},
            feed.FEED_TYPE_BRAND: {},
            feed.FEED_TYPE_COLL: {},
            feed.FEED_TYPE_SHELF: {},
        }

        # Fetch feed elements to attach to FeedItems later.
        apps = []
        sq = self.get_es_feed_element_query(
            Search(using=es, index=self.get_feed_element_index()), feed_items)
        for feed_elm in sq.execute().hits:
            # Store the feed elements to attach to FeedItems later.
            feed_element_map[feed_elm['item_type']][feed_elm['id']] = feed_elm
            # Store the apps to retrieve later.
            apps += self.get_app_ids(feed_elm)

        # Fetch apps to attach to feed elements later (with mget).
        app_map = self.mget_apps(apps)

        # Super serialize.
        feed_items = FeedItemESSerializer(feed_items, many=True, context={
            'app_map': app_map,
            'feed_element_map': feed_element_map,
            'request': request
        }).data

        return response.Response({'objects': feed_items},
                                 status=status.HTTP_200_OK)
Exemplo n.º 2
0
    def get(self, request, *args, **kwargs):
        q = request.GET.get('q')

        # Make search.
        queries = [
            query.Q('match', slug=self._phrase(q)),  # Slug.
            query.Q('match', type=self._phrase(q)),  # Type.
            query.Q('match', search_names=self._phrase(q)),  # Name.
            query.Q('prefix', carrier=q),  # Shelf carrier.
            query.Q('term', region=q)  # Shelf region.
        ]
        sq = query.Bool(should=queries)

        # Search.
        res = {'apps': [], 'brands': [], 'collections': [], 'shelves': []}
        es = Search(using=FeedItemIndexer.get_es(),
                    index=self.get_feed_element_index())
        feed_elements = es.query(sq).execute().hits
        if not feed_elements:
            return response.Response(res, status=status.HTTP_404_NOT_FOUND)

        # Deserialize.
        ctx = {'app_map': self.get_apps(request,
                                        self.get_app_ids_all(feed_elements)),
               'request': request}
        for feed_element in feed_elements:
            item_type = feed_element.item_type
            serializer = self.SERIALIZERS[item_type]
            data = serializer(feed_element, context=ctx).data
            res[self.PLURAL_TYPES[item_type]].append(data)

        # Return.
        return response.Response(res, status=status.HTTP_200_OK)
Exemplo n.º 3
0
    def get(self, request, item_type, slug, **kwargs):
        item_type = self.ITEM_TYPES[item_type]

        # Hit ES.
        sq = self.get_feed_element_filter(
            Search(using=FeedItemIndexer.get_es(),
                   index=self.INDICES[item_type]),
            item_type, slug)
        try:
            feed_element = sq.execute().hits[0]
        except IndexError:
            return response.Response(status=status.HTTP_404_NOT_FOUND)

        # Deserialize.
        data = self.SERIALIZERS[item_type](feed_element, context={
            'app_map': self.mget_apps(self.get_app_ids(feed_element)),
            'request': request
        }).data

        # Filter data. If None of the apps are compatible, only run the
        # public apps filter.
        data = (self.filter_apps_feed_element(request, dict(data)) or
                self._filter(amo.STATUS_PUBLIC, 'status', feed_element))

        return response.Response(data, status=status.HTTP_200_OK)
Exemplo n.º 4
0
    def get(self, request, item_type, slug, **kwargs):
        item_type = self.ITEM_TYPES[item_type]

        # Hit ES.
        sq = self.get_feed_element_filter(
            Search(using=FeedItemIndexer.get_es(),
                   index=self.INDICES[item_type]),
            item_type, slug)
        try:
            feed_element = sq.execute().hits[0]
        except IndexError:
            return response.Response(status=status.HTTP_404_NOT_FOUND)

        # Deserialize.
        data = self.SERIALIZERS[item_type](feed_element, context={
            'app_map': self.get_apps(request, self.get_app_ids(feed_element)),
            'request': request
        }).data

        # Limit if necessary.
        limit = request.GET.get('limit')
        if limit and limit.isdigit() and 'apps' in data:
            data['apps'] = data['apps'][:int(limit)]

        return response.Response(data, status=status.HTTP_200_OK)
Exemplo n.º 5
0
    def get(self, request, item_type, slug, **kwargs):
        item_type = self.ITEM_TYPES[item_type]

        # Hit ES.
        sq = self.get_feed_element_filter(
            Search(using=FeedItemIndexer.get_es(), index=self.INDICES[item_type]), item_type, slug
        )
        try:
            feed_element = sq.execute().hits[0]
        except IndexError:
            return response.Response(status=status.HTTP_404_NOT_FOUND)

        # Deserialize.
        data = self.SERIALIZERS[item_type](
            feed_element, context={"app_map": self.mget_apps(self.get_app_ids(feed_element)), "request": request}
        ).data

        return response.Response(data, status=status.HTTP_200_OK)
Exemplo n.º 6
0
    def get(self, request, item_type, **kwargs):
        item_type = self.ITEM_TYPES[item_type]

        # Hit ES.
        sq = self.get_recent_feed_elements(Search(using=FeedItemIndexer.get_es(), index=self.INDICES[item_type]))
        feed_elements = self.paginate_queryset(sq)
        if not feed_elements:
            return response.Response({"objects": []}, status=status.HTTP_404_NOT_FOUND)

        # Deserialize. Manually use pagination serializer because this view
        # uses multiple serializers.
        meta = mkt.api.paginator.CustomPaginationSerializer(feed_elements, context={"request": request}).data["meta"]
        objects = self.SERIALIZERS[item_type](
            feed_elements,
            context={"app_map": self.mget_apps(self.get_app_ids_all(feed_elements)), "request": request},
            many=True,
        ).data

        return response.Response({"meta": meta, "objects": objects}, status=status.HTTP_200_OK)
Exemplo n.º 7
0
    def _get(self, request, rest_of_world=False, original_region=None,
             *args, **kwargs):
        es = FeedItemIndexer.get_es()

        # Parse region.
        if rest_of_world:
            region = mkt.regions.RESTOFWORLD.id
        else:
            region = request.REGION.id
        # Parse carrier.
        carrier = None
        q = request.QUERY_PARAMS
        if q.get('carrier') and q['carrier'] in mkt.carriers.CARRIER_MAP:
            carrier = mkt.carriers.CARRIER_MAP[q['carrier']].id

        # Fetch FeedItems.
        sq = self.get_es_feed_query(FeedItemIndexer.search(using=es),
                                    region=region, carrier=carrier,
                                    original_region=original_region)
        # The paginator triggers the ES request.
        with statsd.timer('mkt.feed.view.feed_query'):
            feed_items = self.paginate_queryset(sq)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            return self._handle_empty_feed(feed_ok, region, request, args,
                                           kwargs)

        # Build the meta object.
        meta = mkt.api.paginator.CustomPaginationSerializer(
            feed_items, context={'request': request}).data['meta']

        # Set up serializer context.
        feed_element_map = {
            feed.FEED_TYPE_APP: {},
            feed.FEED_TYPE_BRAND: {},
            feed.FEED_TYPE_COLL: {},
            feed.FEED_TYPE_SHELF: {},
        }

        # Fetch feed elements to attach to FeedItems later.
        apps = []
        sq = self.get_es_feed_element_query(
            Search(using=es, index=self.get_feed_element_index()), feed_items)
        with statsd.timer('mkt.feed.view.feed_element_query'):
            feed_elements = sq.execute().hits
        for feed_elm in feed_elements:
            # Store the feed elements to attach to FeedItems later.
            feed_element_map[feed_elm['item_type']][feed_elm['id']] = feed_elm
            # Store the apps to retrieve later.
            apps += self.get_app_ids(feed_elm)

        # Remove dupes from apps list.
        apps = list(set(apps))

        # Fetch apps to attach to feed elements later.
        app_map = self.get_apps(request, apps)

        # Super serialize.
        with statsd.timer('mkt.feed.view.serialize'):
            feed_items = FeedItemESSerializer(feed_items, many=True, context={
                'app_map': app_map,
                'feed_element_map': feed_element_map,
                'request': request
            }).data

        # Filter excluded apps. If there are feed items that have all their
        # apps excluded, they will be removed from the feed.
        feed_items = self.filter_feed_items(request, feed_items)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            if not rest_of_world:
                log.warning('Feed empty for region {0}. Requerying feed with '
                            'region=RESTOFWORLD'.format(region))
            return self._handle_empty_feed(feed_ok, region, request, args,
                                           kwargs)

        return response.Response({'meta': meta, 'objects': feed_items},
                                 status=status.HTTP_200_OK)
Exemplo n.º 8
0
    def _get(self, request, rest_of_world=False, original_region=None, *args, **kwargs):
        es = FeedItemIndexer.get_es()

        # Parse region.
        if rest_of_world:
            region = mkt.regions.RESTOFWORLD.id
        else:
            region = request.REGION.id
        # Parse carrier.
        carrier = None
        q = request.query_params
        if q.get("carrier") and q["carrier"] in mkt.carriers.CARRIER_MAP:
            carrier = mkt.carriers.CARRIER_MAP[q["carrier"]].id

        # Fetch FeedItems.
        sq = self.get_es_feed_query(
            FeedItemIndexer.search(using=es), region=region, carrier=carrier, original_region=original_region
        )
        # The paginator triggers the ES request.
        with statsd.timer("mkt.feed.view.feed_query"):
            feed_items = self.paginate_queryset(sq)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            return self._handle_empty_feed(feed_ok, region, request, args, kwargs)

        # Build the meta object.
        meta = self.paginator.get_paginated_response(feed_items).data["meta"]

        # Set up serializer context.
        feed_element_map = {
            feed.FEED_TYPE_APP: {},
            feed.FEED_TYPE_BRAND: {},
            feed.FEED_TYPE_COLL: {},
            feed.FEED_TYPE_SHELF: {},
        }

        # Fetch feed elements to attach to FeedItems later.
        apps = []
        sq = self.get_es_feed_element_query(Search(using=es, index=self.get_feed_element_index()), feed_items)
        with statsd.timer("mkt.feed.view.feed_element_query"):
            feed_elements = sq.execute().hits
        for feed_elm in feed_elements:
            # Store the feed elements to attach to FeedItems later.
            feed_element_map[feed_elm["item_type"]][feed_elm["id"]] = feed_elm
            # Store the apps to retrieve later.
            apps += self.get_app_ids(feed_elm)

        # Remove dupes from apps list.
        apps = list(set(apps))

        # Fetch apps to attach to feed elements later.
        app_map = self.get_apps(request, apps)

        # Super serialize.
        with statsd.timer("mkt.feed.view.serialize"):
            feed_items = FeedItemESSerializer(
                feed_items,
                many=True,
                context={"app_map": app_map, "feed_element_map": feed_element_map, "request": request},
            ).data

        # Filter excluded apps. If there are feed items that have all their
        # apps excluded, they will be removed from the feed.
        feed_items = self.filter_feed_items(request, feed_items)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            if not rest_of_world:
                log.warning("Feed empty for region {0}. Requerying feed with " "region=RESTOFWORLD".format(region))
            return self._handle_empty_feed(feed_ok, region, request, args, kwargs)

        with statsd.timer("mkt.feed.view.feed_website_query"):
            websites = self.get_featured_websites()

        return response.Response({"meta": meta, "objects": feed_items, "websites": websites}, status=status.HTTP_200_OK)
Exemplo n.º 9
0
    def _get(self,
             request,
             rest_of_world=False,
             original_region=None,
             *args,
             **kwargs):
        es = FeedItemIndexer.get_es()

        # Parse region.
        if rest_of_world:
            region = mkt.regions.RESTOFWORLD.id
        else:
            region = request.REGION.id
        # Parse carrier.
        carrier = None
        q = request.query_params
        if q.get('carrier') and q['carrier'] in mkt.carriers.CARRIER_MAP:
            carrier = mkt.carriers.CARRIER_MAP[q['carrier']].id

        # Fetch FeedItems.
        sq = self.get_es_feed_query(FeedItemIndexer.search(using=es),
                                    region=region,
                                    carrier=carrier,
                                    original_region=original_region)
        # The paginator triggers the ES request.
        with statsd.timer('mkt.feed.view.feed_query'):
            feed_items = self.paginate_queryset(sq)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            return self._handle_empty_feed(feed_ok, region, request, args,
                                           kwargs)

        # Build the meta object.
        meta = (self.paginator.get_paginated_response(feed_items).data['meta'])

        # Set up serializer context.
        feed_element_map = {
            feed.FEED_TYPE_APP: {},
            feed.FEED_TYPE_BRAND: {},
            feed.FEED_TYPE_COLL: {},
            feed.FEED_TYPE_SHELF: {},
        }

        # Fetch feed elements to attach to FeedItems later.
        apps = []
        sq = self.get_es_feed_element_query(
            Search(using=es, index=self.get_feed_element_index()), feed_items)
        with statsd.timer('mkt.feed.view.feed_element_query'):
            feed_elements = sq.execute().hits
        for feed_elm in feed_elements:
            # Store the feed elements to attach to FeedItems later.
            feed_element_map[feed_elm['item_type']][feed_elm['id']] = feed_elm
            # Store the apps to retrieve later.
            apps += self.get_app_ids(feed_elm)

        # Remove dupes from apps list.
        apps = list(set(apps))

        # Fetch apps to attach to feed elements later.
        app_map = self.get_apps(request, apps)

        # Super serialize.
        with statsd.timer('mkt.feed.view.serialize'):
            feed_items = FeedItemESSerializer(feed_items,
                                              many=True,
                                              context={
                                                  'app_map': app_map,
                                                  'feed_element_map':
                                                  feed_element_map,
                                                  'request': request
                                              }).data

        # Filter excluded apps. If there are feed items that have all their
        # apps excluded, they will be removed from the feed.
        feed_items = self.filter_feed_items(request, feed_items)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            if not rest_of_world:
                log.warning('Feed empty for region {0}. Requerying feed with '
                            'region=RESTOFWORLD'.format(region))
            return self._handle_empty_feed(feed_ok, region, request, args,
                                           kwargs)

        with statsd.timer('mkt.feed.view.feed_website_query'):
            websites = self.get_featured_websites()

        return response.Response(
            {
                'meta': meta,
                'objects': feed_items,
                'websites': websites
            },
            status=status.HTTP_200_OK)
Exemplo n.º 10
0
    def _get(self, request, *args, **kwargs):
        es = FeedItemIndexer.get_es()

        # Parse carrier and region.
        q = request.QUERY_PARAMS
        region = request.REGION.id
        carrier = None
        if q.get('carrier') and q['carrier'] in mkt.carriers.CARRIER_MAP:
            carrier = mkt.carriers.CARRIER_MAP[q['carrier']].id

        # Fetch FeedItems.
        sq = self.get_es_feed_query(FeedItemIndexer.search(using=es),
                                    region=region, carrier=carrier)
        feed_items = self.paginate_queryset(sq)

        # No items returned; try to fall back to RoW.
        if not feed_items:
            world_sq = self.get_es_feed_query(FeedItemIndexer.search(using=es))
            world_feed_items = self.paginate_queryset(world_sq)

            # No RoW feed items, either. Let's 404.
            if not world_feed_items:
                world_meta = mkt.api.paginator.CustomPaginationSerializer(
                    world_feed_items,
                    context={'request': request}).data['meta']
                return response.Response({'meta': world_meta, 'objects': []},
                                         status=status.HTTP_404_NOT_FOUND)

            # Return RoW items.
            else:
                feed_items = world_feed_items

        # Build the meta object.
        meta = mkt.api.paginator.CustomPaginationSerializer(
            feed_items, context={'request': request}).data['meta']

        # Set up serializer context.
        feed_element_map = {
            feed.FEED_TYPE_APP: {},
            feed.FEED_TYPE_BRAND: {},
            feed.FEED_TYPE_COLL: {},
            feed.FEED_TYPE_SHELF: {},
        }

        # Fetch feed elements to attach to FeedItems later.
        apps = []
        sq = self.get_es_feed_element_query(
            Search(using=es, index=self.get_feed_element_index()), feed_items)
        for feed_elm in sq.execute().hits:
            # Store the feed elements to attach to FeedItems later.
            feed_element_map[feed_elm['item_type']][feed_elm['id']] = feed_elm
            # Store the apps to retrieve later.
            apps += self.get_app_ids(feed_elm)

        # Fetch apps to attach to feed elements later (with mget).
        app_map = self.mget_apps(apps)

        # Super serialize.
        feed_items = FeedItemESSerializer(feed_items, many=True, context={
            'app_map': app_map,
            'feed_element_map': feed_element_map,
            'request': request
        }).data

        # Filter excluded apps. If there are feed items that have all their
        # apps excluded, they will be removed from the feed.
        feed_items = self.filter_apps_feed_items(request, feed_items)

        # Slice AFTER filtering so that filtering works correctly.
        self.limit_apps_feed_items(feed_items)

        # TODO (chuck): paginate after filtering/slicing.

        return response.Response({'meta': meta, 'objects': feed_items},
                                 status=status.HTTP_200_OK)
Exemplo n.º 11
0
    def _get(self, request, rest_of_world=False, original_region=None,
             *args, **kwargs):
        es = FeedItemIndexer.get_es()

        # Parse region.
        if rest_of_world:
            region = mkt.regions.RESTOFWORLD.id
        else:
            region = request.REGION.id
        # Parse carrier.
        carrier = None
        q = request.QUERY_PARAMS
        if q.get('carrier') and q['carrier'] in mkt.carriers.CARRIER_MAP:
            carrier = mkt.carriers.CARRIER_MAP[q['carrier']].id

        # Fetch FeedItems.
        sq = self.get_es_feed_query(FeedItemIndexer.search(using=es),
                                    region=region, carrier=carrier,
                                    original_region=original_region)
        feed_items = self.paginate_queryset(sq)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            return self._handle_empty_feed(feed_ok, region, request, args,
                                           kwargs)

        # Build the meta object.
        meta = mkt.api.paginator.CustomPaginationSerializer(
            feed_items, context={'request': request}).data['meta']

        # Set up serializer context.
        feed_element_map = {
            feed.FEED_TYPE_APP: {},
            feed.FEED_TYPE_BRAND: {},
            feed.FEED_TYPE_COLL: {},
            feed.FEED_TYPE_SHELF: {},
        }

        # Fetch feed elements to attach to FeedItems later.
        apps = []
        sq = self.get_es_feed_element_query(
            Search(using=es, index=self.get_feed_element_index()), feed_items)
        for feed_elm in sq.execute().hits:
            # Store the feed elements to attach to FeedItems later.
            feed_element_map[feed_elm['item_type']][feed_elm['id']] = feed_elm
            # Store the apps to retrieve later.
            apps += self.get_app_ids(feed_elm)

        # Fetch apps to attach to feed elements later.
        app_map = self.get_apps(request, apps)

        # Super serialize.
        feed_items = FeedItemESSerializer(feed_items, many=True, context={
            'app_map': app_map,
            'feed_element_map': feed_element_map,
            'request': request
        }).data

        # Filter excluded apps. If there are feed items that have all their
        # apps excluded, they will be removed from the feed.
        feed_items = self.filter_feed_items(request, feed_items)
        feed_ok = self._check_empty_feed(feed_items, rest_of_world)
        if feed_ok != 1:
            return self._handle_empty_feed(feed_ok, region, request, args,
                                           kwargs)

        return response.Response({'meta': meta, 'objects': feed_items},
                                 status=status.HTTP_200_OK)