def test_app_ids(self): """ Test all apps are returned if app IDs is passed. Natural ES limit is 10. """ sq = WebappIndexer.filter_by_apps(app_ids=self.app_ids) results = sq.execute().hits eq_(len(results), 11)
def get_apps(self, request, app_ids): """ Takes a list of app_ids. Gets the apps, including filters. Returns an app_map for serializer context. """ sq = WebappIndexer.search() if request.QUERY_PARAMS.get('filtering', '1') == '1': # With filtering (default). for backend in self.filter_backends: sq = backend().filter_queryset(request, sq, self) sq = WebappIndexer.filter_by_apps(app_ids, sq) # Store the apps to attach to feed elements later. with statsd.timer('mkt.feed.views.apps_query'): apps = sq.execute().hits return dict((app.id, app) for app in apps)
def get_apps(self, request, app_ids): """ Takes a list of app_ids. Gets the apps, including filters. Returns an app_map for serializer context. """ sq = WebappIndexer.search() if request.query_params.get('filtering', '1') == '1': # With filtering (default). for backend in self.filter_backends: sq = backend().filter_queryset(request, sq, self) sq = WebappIndexer.filter_by_apps(app_ids, sq) # Store the apps to attach to feed elements later. with statsd.timer('mkt.feed.views.apps_query'): apps = sq.execute().hits return dict((app.id, app) for app in apps)
def list(self, request, *args, **kwargs): if (not settings.RECOMMENDATIONS_ENABLED or not settings.RECOMMENDATIONS_API_URL or not self.request.user.is_authenticated()): return self._popular() else: app_ids = [] url = '{base_url}/api/v2/recommend/{limit}/{user_hash}/'.format( base_url=settings.RECOMMENDATIONS_API_URL, limit=20, user_hash=self.request.user.recommendation_hash) try: with statsd.timer('recommendation.get'): resp = requests.get( url, timeout=settings.RECOMMENDATIONS_API_TIMEOUT) if resp.status_code == 200: app_ids = resp.json()['recommendations'] except Timeout as e: log.warning(u'Recommendation timeout: {error}'.format(error=e)) except RequestException as e: # On recommendation API exceptions we return popular. log.error(u'Recommendation exception: {error}'.format(error=e)) if not app_ids: # Fall back to a popularity search. return self._popular() # Get list of installed apps and remove from app_ids. installed = list( request.user.installed_set.values_list('addon_id', flat=True)) app_ids = filter(lambda a: a not in installed, app_ids) queryset = self.filter_queryset(self.get_queryset()) queryset = WebappIndexer.filter_by_apps(app_ids, queryset) return Response({ 'objects': self.serializer_class(queryset.execute().hits, many=True, context={ 'request': self.request }).data })
def list(self, request, *args, **kwargs): if (not settings.RECOMMENDATIONS_ENABLED or not settings.RECOMMENDATIONS_API_URL or not self.request.user.is_authenticated()): return self._popular() else: app_ids = [] url = '{base_url}/api/v2/recommend/{limit}/{user_hash}/'.format( base_url=settings.RECOMMENDATIONS_API_URL, limit=20, user_hash=self.request.user.recommendation_hash) try: with statsd.timer('recommendation.get'): resp = requests.get( url, timeout=settings.RECOMMENDATIONS_API_TIMEOUT) if resp.status_code == 200: app_ids = resp.json()['recommendations'] except Timeout as e: log.warning(u'Recommendation timeout: {error}'.format(error=e)) except RequestException as e: # On recommendation API exceptions we return popular. log.error(u'Recommendation exception: {error}'.format(error=e)) if not app_ids: # Fall back to a popularity search. return self._popular() # Get list of installed apps and remove from app_ids. installed = list( request.user.installed_set.values_list('addon_id', flat=True)) app_ids = filter(lambda a: a not in installed, app_ids) queryset = self.filter_queryset(self.get_queryset()) queryset = WebappIndexer.filter_by_apps(app_ids, queryset) return Response({ 'objects': self.serializer_class( queryset.execute().hits, many=True, context={'request': self.request}).data})