コード例 #1
0
 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)
コード例 #2
0
 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)
コード例 #3
0
 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
コード例 #4
0
ファイル: api.py プロジェクト: kmaglione/zamboni
 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
コード例 #5
0
ファイル: views.py プロジェクト: AALEKH/zamboni
 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)
コード例 #6
0
ファイル: views.py プロジェクト: j-barron/zamboni
 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)
コード例 #7
0
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
コード例 #8
0
ファイル: test_api.py プロジェクト: wraithan/zamboni
    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)
コード例 #9
0
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))
コード例 #10
0
ファイル: test_api.py プロジェクト: wraithan/zamboni
    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)
コード例 #11
0
    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)
コード例 #12
0
ファイル: test_views.py プロジェクト: j-barron/zamboni
    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)
コード例 #13
0
ファイル: utils.py プロジェクト: unghost/zamboni
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
コード例 #14
0
ファイル: test_api.py プロジェクト: chenliu0831/zamboni
    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)
コード例 #15
0
    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()]
コード例 #16
0
ファイル: serializers.py プロジェクト: rhelmer/zamboni
    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()]
コード例 #17
0
ファイル: utils.py プロジェクト: JaredKerim-Mozilla/zamboni
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))
コード例 #18
0
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))
コード例 #19
0
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
コード例 #20
0
ファイル: api.py プロジェクト: MikeLing/zamboni
    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
コード例 #21
0
ファイル: api.py プロジェクト: smillaedler/zamboni
    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
コード例 #22
0
    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
コード例 #23
0
ファイル: api.py プロジェクト: lissyx/zamboni
 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
コード例 #24
0
 def test_from_signature(self):
     profile = FeatureProfile.from_signature(self.signature)
     self._test_profile(profile)
コード例 #25
0
ファイル: api.py プロジェクト: jlongster/zamboni
    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)
コード例 #26
0
ファイル: test_features.py プロジェクト: sunbiz/zamboni
 def test_from_signature(self):
     profile = FeatureProfile.from_signature(self.signature)
     self._test_profile(profile)
コード例 #27
0
ファイル: api.py プロジェクト: smillaedler/zamboni
    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)
コード例 #28
0
    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)