def test_from_old_signature(self): profile = FeatureProfile.from_signature(self.signature) self._test_profile_values(profile) new_signature = profile.to_signature() ok_(new_signature != self.signature) profile = FeatureProfile.from_signature(new_signature) self._test_profile_values(profile)
def test_from_old_signature(self): profile = FeatureProfile.from_signature(self.signature) self._test_profile_values(profile) new_signature = profile.to_signature() ok_(new_signature != self.signature) profile = FeatureProfile.from_signature(new_signature) self._test_profile_values(profile)
def get_feature_profile(self, request): profile = None if request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) return profile
def get_feature_profile(self, request): profile = None if request.GET.get("dev") in ("firefoxos", "android"): sig = request.GET.get("pro") if sig: profile = FeatureProfile.from_signature(sig) return profile
def get(self, request, *args, **kwargs): if 'pro' in request.GET: self.profile = FeatureProfile.from_signature(request.GET['pro']) else: self.profile = None features = OrderedDict(self._feature(i, slug) for i, slug in enumerate(APP_FEATURES.keys())) return Response(features, status=status.HTTP_200_OK)
def get(self, request, *args, **kwargs): if 'pro' in request.GET: self.profile = FeatureProfile.from_signature(request.GET['pro']) else: self.profile = None features = OrderedDict( self._feature(i, slug) for i, slug in enumerate(APP_FEATURES.keys())) return Response(features, status=status.HTTP_200_OK)
def get_feature_profile(request): profile = None if request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: try: profile = FeatureProfile.from_signature(sig) except ValueError: pass return profile
def test_all_good_features_with_category(self): """Enable app features so they exactly match our device profile.""" fp = FeatureProfile.from_signature(self.profile) self.app.current_version.features.update(**dict(("has_%s" % k, v) for k, v in fp.items())) self.reindex(Webapp, "webapp") res = self.client.get(self.list_url + (self.qs,)) eq_(res.status_code, 200) eq_(len(res.json["featured"]), 1) eq_(int(res.json["featured"][0]["id"]), self.app.pk)
def device_queue_search(request): """ Returns a queryset that can be used as a base for searching the device specific queue. """ filters = {"type": amo.ADDON_WEBAPP, "status": amo.STATUS_PENDING, "disabled_by_user": False} sig = request.GET.get("pro") if sig: profile = FeatureProfile.from_signature(sig) filters.update(dict(**profile.to_kwargs(prefix="_current_version__features__has_"))) return Webapp.version_and_file_transformer(Webapp.objects.filter(**filters))
def test_all_good_features(self): # Enable app features so they exactly match our device profile. fp = FeatureProfile.from_signature(self.profile) self.webapp.current_version.features.update(**dict(("has_%s" % k, v) for k, v in fp.items())) self.webapp.save() self.refresh("webapp") res = self.client.get(self.url + (self.qs,)) eq_(res.status_code, 200) obj = json.loads(res.content)["objects"][0] eq_(obj["slug"], self.webapp.app_slug)
def test_all_good_features_with_category(self): """Enable app features so they exactly match our device profile.""" fp = FeatureProfile.from_signature(self.profile) self.app.current_version.features.update(**dict( ('has_%s' % k, v) for k, v in fp.items())) self.reindex(Webapp, 'webapp') res = self.client.get(self.list_url + (self.qs, )) eq_(res.status_code, 200) eq_(len(res.json['featured']), 1) eq_(int(res.json['featured'][0]['id']), self.app.pk)
def test_all_good_features(self): # Enable app features so they exactly match our device profile. fp = FeatureProfile.from_signature(self.features) self.webapp.current_version.features.update( **dict(('has_%s' % k, v) for k, v in fp.items())) self.webapp.save() self.refresh('webapp') res = self.client.get(self.url, data=self.qs) eq_(res.status_code, 200) obj = json.loads(res.content)['objects'][0] eq_(obj['slug'], self.webapp.app_slug)
def get_feature_profile(request): profile = None platforms = ('firefoxos', 'android') if (request.GET.get('dev') in platforms or request.GET.get('platform') in platforms): sig = request.GET.get('pro') if sig: try: profile = FeatureProfile.from_signature(sig) except ValueError: pass return profile
def test_all_good_features(self): # Enable app features so they exactly match our device profile. fp = FeatureProfile.from_signature(self.profile) self.webapp.current_version.features.update(**dict( ('has_%s' % k, v) for k, v in fp.items())) self.webapp.save() self.refresh('webapp') res = self.client.get(self.url + (self.qs, )) eq_(res.status_code, 200) obj = json.loads(res.content)['objects'][0] eq_(obj['slug'], self.webapp.app_slug)
def field_to_native(self, obj, field_name): value = get_component(obj, self.source) # Filter apps based on feature profiles. if hasattr(self, 'context') and 'request' in self.context: sig = self.context['request'].GET.get('pro') if sig: try: profile = FeatureProfile.from_signature(sig) except ValueError: pass else: value = value.filter(**profile.to_kwargs( prefix='app___current_version__features__has_')) return [self.to_native(item) for item in value.all()]
def field_to_native(self, obj, field_name): value = get_component(obj, self.source) # Filter apps based on feature profiles. if hasattr(self, 'context') and 'request' in self.context: sig = self.context['request'].GET.get('pro') if sig: try: profile = FeatureProfile.from_signature(sig) except ValueError: pass else: value = value.filter(**profile.to_kwargs( prefix='app___current_version__features__has_')) return [self.to_native(item) for item in value.all()]
def device_queue_search(request): """ Returns a queryset that can be used as a base for searching the device specific queue. """ filters = { 'status': amo.STATUS_PENDING, 'disabled_by_user': False, } sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) filters.update(dict( **profile.to_kwargs(prefix='_latest_version__features__has_') )) return Webapp.version_and_file_transformer( Webapp.objects.filter(**filters))
def device_queue_search(request): """ Returns a queryset that can be used as a base for searching the device specific queue. """ filters = { 'status': amo.STATUS_PENDING, 'disabled_by_user': False, } sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) filters.update(dict( **profile.to_kwargs(prefix='_latest_version__features__has_') )) return Webapp.version_and_file_transformer( Webapp.objects.filter(**filters))
def load_feature_profile(request): """ Adds a `feature_profile` on the request object if one is present and the dev parameter is either firefoxos or android. Does nothing if one was already set. """ if hasattr(request, 'feature_profile'): return profile = None if request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: try: profile = FeatureProfile.from_signature(sig) except ValueError: pass request.feature_profile = profile
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 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 to_native(self, obj): ret = super(AppFeaturesSerializer, self).to_native(obj) profile = FeatureProfile.from_signature(obj.to_signature()) ret['required'] = profile.to_list() return ret
def test_from_signature(self): profile = FeatureProfile.from_signature(self.signature) self._test_profile(profile)
def get_list(self, request=None, **kwargs): form_data = self.search_form(request) is_admin = acl.action_allowed(request, 'Admin', '%') is_reviewer = acl.action_allowed(request, 'Apps', 'Review') uses_es = waffle.switch_is_active('search-api-es') # Pluck out status and addon type first since it forms part of the base # query, but only for privileged users. status = form_data['status'] addon_type = form_data['type'] base_filters = { 'type': addon_type, } # Allow reviewers and admins to search by statuses other than PUBLIC. if status and (status == 'any' or status != amo.STATUS_PUBLIC): if is_admin or is_reviewer: base_filters['status'] = status else: return http.HttpUnauthorized( content=json.dumps( {'reason': _('Unauthorized to filter by status.')})) # Filter by device feature profile. profile = None # TODO: Remove uses_es conditional with 'search-api-es' waffle. if uses_es and request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) # Filter by region. region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) qs = _get_query(region, gaia=request.GAIA, mobile=request.MOBILE, tablet=request.TABLET, filters=base_filters, new_idx=True) qs = _filter_search(request, qs, form_data, region=region, profile=profile) paginator = self._meta.paginator_class(request.GET, qs, resource_uri=self.get_resource_list_uri(), limit=self._meta.limit) page = paginator.page() # Rehydrate the results as per tastypie. objs = [] for obj in page['objects']: obj.pk = obj.id objs.append(self.build_bundle(obj=obj, request=request)) if uses_es: page['objects'] = [self.full_dehydrate(bundle) for bundle in objs] else: page['objects'] = [AppResource().full_dehydrate(bundle) for bundle in objs] # This isn't as quite a full as a full TastyPie meta object, # but at least it's namespaced that way and ready to expand. to_be_serialized = self.alter_list_data_to_serialize(request, page) return self.create_response(request, to_be_serialized)
def test_from_signature(self): profile = FeatureProfile.from_signature(self.signature) self._test_profile(profile)
def get_list(self, request=None, **kwargs): form_data = self.search_form(request) is_admin = acl.action_allowed(request, 'Admin', '%') is_reviewer = acl.action_allowed(request, 'Apps', 'Review') # Pluck out status and addon type first since it forms part of the base # query, but only for privileged users. status = form_data['status'] addon_type = form_data['type'] base_filters = { 'type': addon_type, } # Allow reviewers and admins to search by statuses other than PUBLIC. if status and (status == 'any' or status != amo.STATUS_PUBLIC): if is_admin or is_reviewer: base_filters['status'] = status else: raise http_error(http.HttpUnauthorized, _('Unauthorized to filter by status.')) # Only allow reviewers and admin to search by private fields or fields # depending on the latest_version (which may or may not be public yet). restricted_data = [form_data.get('is_privileged', None), form_data.get('has_editor_comment', None), form_data.get('has_info_request', None), form_data.get('is_escalated', None)] if not (is_admin or is_reviewer) and any(f is not None for f in restricted_data): return http.HttpUnauthorized(content=json.dumps( {'reason': _('Unauthorized to filter by private fields.')})) # 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) # Filter by region. region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) qs = _get_query(request, region, gaia=request.GAIA, mobile=request.MOBILE, tablet=request.TABLET, filters=base_filters, new_idx=True) qs = _filter_search(request, qs, form_data, region=region, profile=profile) paginator = self._meta.paginator_class(request.GET, qs, resource_uri=self.get_resource_list_uri(), limit=self._meta.limit) page = paginator.page() # Rehydrate the results as per tastypie. objs = [] for obj in page['objects']: obj.pk = obj.id objs.append(self.build_bundle(obj=obj, request=request)) page['objects'] = [self.full_dehydrate(bundle) for bundle in objs] # This isn't as quite a full as a full TastyPie meta object, # but at least it's namespaced that way and ready to expand. to_be_serialized = self.alter_list_data_to_serialize(request, page) return self.create_response(request, to_be_serialized)
def get_list(self, request=None, **kwargs): form_data = self.search_form(request) is_admin = acl.action_allowed(request, 'Admin', '%') is_reviewer = acl.action_allowed(request, 'Apps', 'Review') uses_es = waffle.switch_is_active('search-api-es') # Pluck out status and addon type first since it forms part of the base # query, but only for privileged users. status = form_data['status'] addon_type = form_data['type'] base_filters = { 'type': addon_type, } # Allow reviewers and admins to search by statuses other than PUBLIC. if status and (status == 'any' or status != amo.STATUS_PUBLIC): if is_admin or is_reviewer: base_filters['status'] = status else: return http.HttpUnauthorized(content=json.dumps( {'reason': _('Unauthorized to filter by status.')})) # Filter by device feature profile. profile = None # TODO: Remove uses_es conditional with 'search-api-es' waffle. if uses_es and request.GET.get('dev') in ('firefoxos', 'android'): sig = request.GET.get('pro') if sig: profile = FeatureProfile.from_signature(sig) # Filter by region. region = getattr(request, 'REGION', mkt.regions.WORLDWIDE) qs = _get_query(region, gaia=request.GAIA, mobile=request.MOBILE, tablet=request.TABLET, filters=base_filters, new_idx=True) qs = _filter_search(request, qs, form_data, region=region, profile=profile) paginator = self._meta.paginator_class( request.GET, qs, resource_uri=self.get_resource_list_uri(), limit=self._meta.limit) page = paginator.page() # Rehydrate the results as per tastypie. objs = [] for obj in page['objects']: obj.pk = obj.id objs.append(self.build_bundle(obj=obj, request=request)) if uses_es: page['objects'] = [self.full_dehydrate(bundle) for bundle in objs] else: page['objects'] = [ AppResource().full_dehydrate(bundle) for bundle in objs ] # This isn't as quite a full as a full TastyPie meta object, # but at least it's namespaced that way and ready to expand. to_be_serialized = self.alter_list_data_to_serialize(request, page) return self.create_response(request, to_be_serialized)