def _search(request, category=None): ctx = {'browse': True} region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if category is not None: qs = Category.objects.filter(type=amo.ADDON_WEBAPP, weight__gte=0) ctx['category'] = get_object_or_404(qs, slug=category) ctx['featured'] = Webapp.featured(cat=ctx['category'], region=region, mobile=request.MOBILE) # Do a search filtered by this category and sort by Weekly Downloads. # TODO: Listen to andy and do not modify `request.GET` but at least # the traceback is fixed now. request.GET = request.GET.copy() request.GET.update({'cat': ctx['category'].id}) if not request.GET.get('sort'): request.GET['sort'] = 'downloads' else: ctx['featured'] = Webapp.featured(region=region, mobile=request.MOBILE) # Always show three (or zero) featured apps - nothing in between. ctx['featured'] = ctx['featured'][:0 if len(ctx['featured']) < 3 else 3] ctx.update(_app_search(request, category=ctx.get('category'), browse=True)) # If category is not listed as a facet, then remove redirect to search. if ctx.get('redirect'): return http.HttpResponseRedirect(ctx['redirect']) return jingo.render(request, 'search/results.html', ctx)
def _search(request, category=None): ctx = {'browse': True} region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if category is not None: qs = Category.objects.filter(type=amo.ADDON_WEBAPP, weight__gte=0) ctx['category'] = get_object_or_404(qs, slug=category) ctx['featured'] = Webapp.featured(cat=ctx['category'], region=region) # Do a search filtered by this category and sort by Weekly Downloads. # TODO: Listen to andy and do not modify `request.GET` but at least # the traceback is fixed now. request.GET = request.GET.copy() request.GET.update({'cat': ctx['category'].id}) if not request.GET.get('sort'): request.GET['sort'] = 'downloads' else: ctx['featured'] = Webapp.featured(region=region) # Always show three (or zero) featured apps - nothing in between. ctx['featured'] = ctx['featured'][:0 if len(ctx['featured']) < 3 else 3] ctx.update(_app_search(request, category=ctx.get('category'), browse=True)) # If category is not listed as a facet, then remove redirect to search. if ctx.get('redirect'): return http.HttpResponseRedirect(ctx['redirect']) return jingo.render(request, 'search/results.html', ctx)
def _landing(request, category=None): if category: category = get_object_or_404(Category.objects.filter(type=amo.ADDON_WEBAPP, weight__gte=0), slug=category) featured = Webapp.featured(category) popular = Webapp.popular().filter(category=category.id) else: popular = Webapp.popular() featured = Webapp.featured(None) return jingo.render( request, "browse/landing.html", {"category": category, "featured": featured[:6], "popular": popular[:6]} )
def alter_list_data_to_serialize(self, request, data): if waffle.switch_is_active('rocketfuel'): types = ( ('collections', COLLECTIONS_TYPE_BASIC), ('featured', COLLECTIONS_TYPE_FEATURED), ('operator', COLLECTIONS_TYPE_OPERATOR), ) self.filter_fallbacks = {} for name, col_type in types: data[name], fallback = self.collections(request, collection_type=col_type) if fallback: self.filter_fallbacks[name] = fallback else: form_data = self.get_search_data(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) cat_slug = form_data.get('cat') if cat_slug: cat_slug = [cat_slug] # Filter by device feature profile. profile = self.get_feature_profile(request) qs = Webapp.featured(cat=cat_slug, region=region, profile=profile) bundles = (self.build_bundle(obj=obj, request=request) for obj in qs) data['featured'] = [AppResource().full_dehydrate(bundle) for bundle in bundles] # Alter the _view_name so that statsd logs seperately from search. request._view_name = 'featured' return data
def home(request): """The home page.""" MOBILE = request.MOBILE and not request.TABLET region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) featured = Webapp.featured(region=region, cat=None, mobile=False, limit=9 if MOBILE else 12) featured_cnt = len(featured) # Show featured apps in multiples of three. if MOBILE: if featured_cnt >= 9: featured = featured[:9] elif featured_cnt >= 6: featured = featured[:6] elif featured_cnt >= 3: featured = featured[:3] else: if featured_cnt >= 12: featured = featured[:12] elif featured_cnt >= 8: featured = featured[:8] elif featured_cnt >= 4: # Once we allow for the giant featured app we'll require at least # 5 featured apps on desktop. featured = featured[:4] return jingo.render(request, 'home/home.html', { 'featured': featured, })
def _landing(request, category=None): if category: category = get_object_or_404(Category.objects.filter( type=amo.ADDON_WEBAPP, weight__gte=0), slug=category) featured = Webapp.featured(category) popular = Webapp.popular().filter(category=category.id) else: popular = Webapp.popular() featured = Webapp.featured(None) return jingo.render(request, 'browse/landing.html', { 'category': category, 'featured': featured[:6], 'popular': popular[:6] })
def home(request): """The home page.""" MOBILE = request.MOBILE and not request.TABLET region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) featured = Webapp.featured(region=region, cat=None, mobile=False, limit=6 if MOBILE else 12) featured_cnt = len(featured) # Show featured apps in multiples of three. if MOBILE: if featured_cnt >= 9: featured = featured[:9] elif featured_cnt >= 6: featured = featured[:6] elif featured_cnt >= 3: featured = featured[:3] else: if featured_cnt >= 12: featured = featured[:12] elif featured_cnt >= 8: featured = featured[:8] elif featured_cnt >= 4: # Once we allow for the giant featured app we'll require at least # 5 featured apps on desktop. featured = featured[:4] return jingo.render(request, 'home/home.html', { 'featured': featured, })
def alter_list_data_to_serialize(self, request, data): if waffle.switch_is_active("rocketfuel"): types = ( ("collections", COLLECTIONS_TYPE_BASIC), ("featured", COLLECTIONS_TYPE_FEATURED), ("operator", COLLECTIONS_TYPE_OPERATOR), ) for name, col_type in types: data[name] = self.collections(request, collection_type=col_type) else: form_data = self.get_search_data(request) region = getattr(request, "REGION", mkt.regions.WORLDWIDE) cat_slug = form_data.get("cat") if cat_slug: cat_slug = [cat_slug] # Filter by device feature profile. profile = self.get_feature_profile(request) qs = Webapp.featured(cat=cat_slug, region=region, profile=profile) bundles = (self.build_bundle(obj=obj, request=request) for obj in qs) data["featured"] = [AppResource().full_dehydrate(bundle) for bundle in bundles] # Alter the _view_name so that statsd logs seperately from search. request._view_name = "featured" return data
def obj_get_list(self, request=None, **kwargs): form = Featured(request.GET, region=getattr(request, 'REGION', regions.WORLDWIDE).slug) if not form.is_valid(): raise self.form_errors(form) return Webapp.featured(**form.as_featured())
def _landing(request, category=None): region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if category: category = get_object_or_404( Category.objects.filter(type=amo.ADDON_WEBAPP, weight__gte=0), slug=category) featured = Webapp.featured(cat=category, region=region) popular = _add_mobile_filter(request, Webapp.popular(cat=category, region=region)) else: popular = _add_mobile_filter(request, Webapp.popular(region=region)) featured = Webapp.featured(region=region) return jingo.render(request, 'browse/landing.html', { 'category': category, 'featured': featured[:6], 'popular': popular[:6] })
def _landing(request, category=None): region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if category: category = get_object_or_404(Category.objects.filter( type=amo.ADDON_WEBAPP, weight__gte=0), slug=category) featured = Webapp.featured(cat=category, region=region) popular = _add_mobile_filter( request, Webapp.popular(cat=category, region=region)) else: popular = _add_mobile_filter(request, Webapp.popular(region=region)) featured = Webapp.featured(region=region) return jingo.render(request, 'browse/landing.html', { 'category': category, 'featured': featured[:6], 'popular': popular[:6] })
def home(request): """The home page.""" if not getattr(request, 'can_view_consumer', True): return jingo.render(request, 'home/home_walled.html') featured = Webapp.featured('home')[:3] popular = Webapp.popular()[:6] return jingo.render(request, 'home/home.html', { 'featured': featured, 'popular': popular })
def home(request): """The home page.""" if not getattr(request, 'can_view_consumer', True): return jingo.render(request, 'home/home_walled.html') region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) featured = Webapp.featured(region=region, cat=None)[:9] popular = _add_mobile_filter(request, Webapp.popular(region=region))[:10] latest = _add_mobile_filter(request, Webapp.latest(region=region))[:10] return jingo.render(request, 'home/home.html', { 'featured': featured, })
def __init__(self, *args, **kw): self.request = kw.pop("request", None) self.product = kw.pop("product", None) super(CategoryForm, self).__init__(*args, **kw) self.cats_before = list(self.product.categories.values_list("id", flat=True)) self.initial["categories"] = self.cats_before # If this app is featured, category changes are forbidden. self.disabled = not acl.action_allowed(self.request, "Addons", "Edit") and Webapp.featured(cat=self.cats_before)
def home(request): """The home page.""" if not getattr(request, 'can_view_consumer', True): return jingo.render(request, 'home/home_walled.html') featured = Webapp.featured('home')[:6] popular = Webapp.popular()[:10] latest = Webapp.latest()[:10] return jingo.render(request, 'home/home.html', { 'featured': featured, 'popular': popular, 'latest': latest })
def home(request): """The home page.""" if not getattr(request, 'can_view_consumer', True): return jingo.render(request, 'home/home_walled.html') featured = Webapp.featured(cat=None) popular = Webapp.popular()[:10] latest = Webapp.latest()[:10] return jingo.render(request, 'home/home.html', { 'featured': featured, 'popular': popular, 'latest': latest })
def alter_list_data_to_serialize(self, request, data): form_data = self.search_form(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if form_data['cat']: category = Category.objects.get(pk=form_data['cat']) else: category = None bundles = [self.build_bundle(obj=obj, request=request) for obj in Webapp.featured(cat=category, region=region)] data['featured'] = [self.full_dehydrate(bundle) for bundle in bundles] return data
def alter_list_data_to_serialize(self, request, data): form_data = self.search_form(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if not form_data['cat']: data['creatured'] = [] return data category = Category.objects.get(pk=form_data['cat']) bundles = [ self.build_bundle(obj=obj, request=request) for obj in Webapp.featured(cat=category, region=region) ] data['creatured'] = [self.full_dehydrate(bundle) for bundle in bundles] return data
def __init__(self, *args, **kw): self.request = kw.pop('request', None) self.product = kw.pop('product', None) super(CategoryForm, self).__init__(*args, **kw) self.cats_before = list( self.product.categories.values_list('id', flat=True)) self.initial['categories'] = self.cats_before # If this app is featured, category changes are forbidden. self.disabled = (not acl.action_allowed(self.request, 'Addons', 'Edit') and Webapp.featured(cat=self.cats_before))
def test_featured_no_creatured(self): # Three creatured apps for this category for the US region. creatured = [] for x in xrange(3): app = amo.tests.app_factory() self.make_featured(app=app, category=None, region=mkt.regions.US) creatured.append(app) creatured_ids = [app.id for app in creatured] # Check that these apps are featured for this category - # and only in US region. for abbr, region in mkt.regions.REGIONS_CHOICES: self.assertSetEqual( [a.id for a in Webapp.featured(cat=None, region=region)], creatured_ids if abbr == 'us' else [])
def __init__(self, *args, **kw): self.request = kw.pop('request', None) self.product = kw.pop('product', None) super(CategoryForm, self).__init__(*args, **kw) self.cats_before = list(self.product.categories .values_list('id', flat=True)) self.initial['categories'] = self.cats_before # If this app is featured, category changes are forbidden. self.disabled = ( not acl.action_allowed(self.request, 'Addons', 'Edit') and Webapp.featured(cat=self.cats_before) )
def test_featured_no_creatured(self): # Three creatured apps for this category for the US region. creatured = [] for x in xrange(3): app = amo.tests.app_factory() self.make_featured(app=app, category=None, region=mkt.regions.US) creatured.append(app) creatured_ids = [app.id for app in creatured] # Check that these apps are featured for this category - # and only in US region. for abbr, region in mkt.regions.REGIONS_CHOICES: self.assertSetEqual( [a.id for a in Webapp.featured(cat=None, region=region)], creatured_ids if abbr == "us" else [] )
def _landing(request, category=None): featured = Webapp.featured('category') popular = Webapp.popular() if category: category = get_object_or_404( Category.objects.filter(type=amo.ADDON_WEBAPP, weight__gte=0), slug=category) featured = featured.filter(category=category)[:6] popular = popular.filter(category=category.id) return jingo.render(request, 'browse/landing.html', { 'category': category, 'featured': featured[:6], 'popular': popular[:6] })
def test_featured_creatured(self): cat = Category.objects.create(type=amo.ADDON_WEBAPP, slug='cat') # Three creatured apps for this category for the US region. creatured = [] for x in xrange(3): app = amo.tests.app_factory() self.make_featured(app=app, category=cat, region=mkt.regions.US) creatured.append(app) creatured_ids = [app.id for app in creatured] # Check that these apps are featured for this category - # and only in US region. for abbr, region in mkt.regions.REGIONS_CHOICES: self.assertSetEqual( [a.id for a in Webapp.featured(cat=[cat.slug], region=region)], creatured_ids if abbr == 'us' else [])
def test_featured_creatured(self): cat = Category.objects.create(type=amo.ADDON_WEBAPP, slug='cat') # Three creatured apps for this category for the US region. creatured = [] for x in xrange(3): app = amo.tests.app_factory() self.make_featured(app=app, category=cat, region=mkt.regions.US) creatured.append(app) creatured_ids = [app.id for app in creatured] # Check that these apps are featured for this category - # and only in US region. for abbr, region in mkt.regions.REGIONS_CHOICES: self.assertSetEqual( [a.id for a in Webapp.featured(cat=cat, region=region)], creatured_ids if abbr == 'us' else [])
def alter_list_data_to_serialize(self, request, data): form_data = self.get_search_data(request) region = getattr(request, "REGION", mkt.regions.WORLDWIDE) cat_slug = form_data.get("cat") if cat_slug: cat_slug = [cat_slug] # Filter by device feature profile. profile = self.get_feature_profile(request) qs = Webapp.featured(cat=cat_slug, region=region, profile=profile) bundles = [self.build_bundle(obj=obj, request=request) for obj in qs] data["featured"] = [AppResource().full_dehydrate(bundle) for bundle in bundles] # Alter the _view_name so that statsd logs seperately from search. request._view_name = "featured" return data
def test_featured_fallback_to_worldwide(self): usa_app = app_factory() self.make_featured(usa_app, category=None, region=mkt.regions.US) worldwide_apps = [] for x in xrange(3): app = app_factory() self.make_featured(app, category=None, region=mkt.regions.WORLDWIDE) worldwide_apps.append(app.id) # In US: 1 US-featured app + 3 Worldwide-featured apps. # Elsewhere: 3 Worldwide-featured apps. for abbr, region in mkt.regions.REGIONS_CHOICES: if abbr == "us": expected = [usa_app.id] + worldwide_apps else: expected = worldwide_apps self.assertSetEqual([a.id for a in Webapp.featured(cat=None, region=region)], expected)
def home(request): """The home page.""" if not getattr(request, 'can_view_consumer', True): return jingo.render(request, 'home/home_walled.html') region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) featured = Webapp.featured(region=region, cat=None) featured_cnt = len(featured) # Show featured apps in multiples of three. if featured_cnt >= 9: featured = featured[:9] elif featured_cnt >= 6: featured = featured[:6] elif featured_cnt >= 3: featured = featured[:3] return jingo.render(request, 'home/home.html', { 'featured': featured, })
def alter_list_data_to_serialize(self, request, data): form_data = self.get_search_data(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) cat_slug = form_data.get('cat') if cat_slug: cat_slug = [cat_slug] # Filter by device feature profile. profile = self.get_feature_profile(request) qs = Webapp.featured(cat=cat_slug, region=region, profile=profile) bundles = [self.build_bundle(obj=obj, request=request) for obj in qs] data['featured'] = [ AppResource().full_dehydrate(bundle) for bundle in bundles ] # Alter the _view_name so that statsd logs seperately from search. request._view_name = 'featured' return data
def get_list(self, request, **kwargs): form = Featured(request.GET, region=getattr(request, 'REGION', regions.WORLDWIDE).slug) if not form.is_valid(): raise self.form_errors(form) data = form.as_featured() # By default the home page has no category. data['cat'] = None # Regardless of the limit, we will override that. data['limit'] = 9 if data['mobile'] else 12 cat = CategoryResource() featured = Webapp.featured(**data) return self.create_response(request, { 'categories': cat.dehydrate_objects(cat.obj_get_list()), 'featured': AppResource().dehydrate_objects(featured) })
def get_list(self, request=None, **kwargs): rg = request.GET _get = { 'region': mkt.regions.REGIONS_DICT.get(rg.get('region'), mkt.regions.WORLDWIDE), 'limit': rg.get('limit', 12), 'mobile': rg.get('dev') in ('android', 'fxos'), 'tablet': rg.get('dev') != 'desktop' and rg.get('scr') == 'wide', 'gaia': rg.get('dev') == 'fxos', } qs = Webapp.featured(**_get) paginator = self._meta.paginator_class( request.GET, qs, resource_uri=self.get_resource_list_uri(), limit=self._meta.limit) page = paginator.page() objs = [self.build_bundle(obj=obj, request=request) for obj in page['objects']] page['objects'] = [self.full_dehydrate(bundle) for bundle in objs] return self.create_response(request, page)
def get_list(self, request, **kwargs): form = Featured(request.GET, region=getattr(request, 'REGION', regions.WORLDWIDE).slug) if not form.is_valid(): raise self.form_errors(form) data = form.as_featured() # By default the home page has no category. data['cat'] = None # Regardless of the limit, we will override that. data['limit'] = 9 if data['mobile'] else 12 cat = CategoryResource() featured = Webapp.featured(**data) return self.create_response( request, { 'categories': cat.dehydrate_objects(cat.obj_get_list()), 'featured': AppResource().dehydrate_objects(featured) })
def alter_list_data_to_serialize(self, request, data): form_data = self.search_form(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if form_data['cat']: category = Category.objects.get(pk=form_data['cat']) else: category = None # Filter by device feature profile. profile = None if request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) qs = Webapp.featured(cat=category, region=region, profile=profile) bundles = [self.build_bundle(obj=obj, request=request) for obj in qs] data['featured'] = [AppResource().full_dehydrate(bundle) for bundle in bundles] return data
def __init__(self, *args, **kw): self.request = kw.pop('request', None) self.product = kw.pop('product', None) super(CategoryForm, self).__init__(*args, **kw) supervisor_of = self.special_cats() self.special_cats = lambda *args: supervisor_of # Caching! if supervisor_of.exists(): # Update the list of categories with the supervisor categories, # excluding categories which are region-exclusive to regions that # the app is unavailable in. self.fields['categories'].queryset |= supervisor_of self.cats_before = list( self.product.categories.values_list('id', flat=True)) self.initial['categories'] = self.cats_before # If this app is featured, category changes are forbidden. self.disabled = (not acl.action_allowed(self.request, 'Addons', 'Edit') and Webapp.featured(cat=self.cats_before))
def app_search(request): ctx = _app_search(request) category = None if 'query' in ctx and 'cat' in ctx['query']: cat = ctx['query']['cat'] cats = Category.objects.filter(type=amo.ADDON_WEBAPP, pk=cat) if cats.exists(): category = cats[0] else: cat = None # If we're supposed to redirect, then do that. if ctx.get('redirect'): return redirect(ctx['redirect']) if category: ctx['featured'] = Webapp.featured(cat=category)[:3] # Otherwise render results. return jingo.render(request, 'search/results.html', ctx)
def test_featured_fallback_to_worldwide(self): usa_app = app_factory() self.make_featured(usa_app, category=None, region=mkt.regions.US) worldwide_apps = [] for x in xrange(3): app = app_factory() self.make_featured(app, category=None, region=mkt.regions.WORLDWIDE) worldwide_apps.append(app.id) # In US: 1 US-featured app + 3 Worldwide-featured apps. # Elsewhere: 3 Worldwide-featured apps. for abbr, region in mkt.regions.REGIONS_CHOICES: if abbr == 'us': expected = [usa_app.id] + worldwide_apps else: expected = worldwide_apps self.assertSetEqual( [a.id for a in Webapp.featured(cat=None, region=region)], expected)
def app_search(request): ctx = _app_search(request) category = None if "query" in ctx and "cat" in ctx["query"]: cat = ctx["query"]["cat"] cats = Category.objects.filter(type=amo.ADDON_WEBAPP, pk=cat) if cats.exists(): category = cats[0] else: cat = None # If we're supposed to redirect, then do that. if ctx.get("redirect"): return redirect(ctx["redirect"]) if category: ctx["featured"] = Webapp.featured(cat=category)[:3] # Otherwise render results. return jingo.render(request, "search/results.html", ctx)
def alter_list_data_to_serialize(self, request, data): form_data = self.search_form(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) if form_data['cat']: category = Category.objects.get(pk=form_data['cat']) else: category = None # Filter by device feature profile. profile = None if request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) qs = Webapp.featured(cat=category, region=region, profile=profile) bundles = [self.build_bundle(obj=obj, request=request) for obj in qs] data['featured'] = [ AppResource().full_dehydrate(bundle) for bundle in bundles ] return data
def alter_list_data_to_serialize(self, request, data): form_data = self.search_form(request) region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) cat_slug = form_data.get('cat') if cat_slug: cat_slug = [cat_slug] # Filter by device feature profile. profile = None if request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) qs = Webapp.featured(cat=cat_slug, region=region, profile=profile) bundles = [self.build_bundle(obj=obj, request=request) for obj in qs] data['featured'] = [AppResource().full_dehydrate(bundle) for bundle in bundles] # Alter the _view_name so that statsd logs seperately from search. request._view_name = 'featured' return data
def __init__(self, *args, **kw): self.request = kw.pop('request', None) self.product = kw.pop('product', None) super(CategoryForm, self).__init__(*args, **kw) supervisor_of = self.special_cats() self.special_cats = lambda *args: supervisor_of # Caching! if supervisor_of.exists(): # Update the list of categories with the supervisor categories, # excluding categories which are region-exclusive to regions that # the app is unavailable in. self.fields['categories'].queryset |= supervisor_of self.cats_before = list(self.product.categories .values_list('id', flat=True)) self.initial['categories'] = self.cats_before # If this app is featured, category changes are forbidden. self.disabled = ( not acl.action_allowed(self.request, 'Addons', 'Edit') and Webapp.featured(cat=self.cats_before) )
def test_disable_paid_featured_apps(self): eq_(list(Webapp.featured(region=mkt.regions.WORLDWIDE)), [])