コード例 #1
0
    def test_flag(self):
        profile = UserProfile.objects.get(pk=2519)

        flag = waffle.models.Flag.objects.create(name='override-app-payments')
        flag.everyone = None
        flag.users.add(profile.user)
        flag.save()

        self.req.user = profile.user
        with self.settings(PAYMENT_LIMITED=True):
            assert payments_enabled(self.req)
コード例 #2
0
ファイル: resources.py プロジェクト: rhelmer/zamboni
    def obj_create(self, bundle, request, **kwargs):
        region = getattr(request, 'REGION', None)
        app = bundle.data['app']

        if region and region.id not in app.get_price_region_ids():
            log.info('Region {0} is not in {1}'
                     .format(region.id, app.get_price_region_ids()))
            if payments_enabled(request):
                log.info('Flag not active')
                raise http_error(http.HttpForbidden,
                                 'Payments are limited and flag not enabled')

        bundle.obj = GenericObject(_prepare_pay(request, bundle.data['app']))
        return bundle
コード例 #3
0
    def obj_create(self, bundle, request, **kwargs):
        region = getattr(request, 'REGION', None)
        app = bundle.data['app']

        if region and region.id not in app.get_price_region_ids():
            log.info('Region {0} is not in {1}'.format(
                region.id, app.get_price_region_ids()))
            if payments_enabled(request):
                log.info('Flag not active')
                raise http_error(http.HttpForbidden,
                                 'Payments are limited and flag not enabled')

        bundle.obj = GenericObject(_prepare_pay(request, bundle.data['app']))
        return bundle
コード例 #4
0
ファイル: resources.py プロジェクト: chenliu0831/zamboni
    def post(self, request, *args, **kwargs):
        form = PrepareForm(request.DATA)
        if not form.is_valid():
            return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
        app = form.cleaned_data['app']

        region = getattr(request, 'REGION', None)
        if region and region.id not in app.get_price_region_ids():
            log.info('Region {0} is not in {1}'
                     .format(region.id, app.get_price_region_ids()))
            if payments_enabled(request):
                log.info('Flag not active')
                return Response('Payments are limited and flag not enabled',
                                status=status.HTTP_403_FORBIDDEN)

        try:
            data = _prepare_pay(request._request, app)
        except AlreadyPurchased:
            return Response({'reason': u'Already purchased app.'},
                            status=status.HTTP_409_CONFLICT)

        return Response(data, status=status.HTTP_201_CREATED)
コード例 #5
0
    def post(self, request, *args, **kwargs):
        form = PrepareForm(request.DATA)
        if not form.is_valid():
            return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
        app = form.cleaned_data['app']

        region = getattr(request, 'REGION', None)
        if region and region.id not in app.get_price_region_ids():
            log.info('Region {0} is not in {1}'.format(
                region.id, app.get_price_region_ids()))
            if payments_enabled(request):
                log.info('Flag not active')
                return Response('Payments are limited and flag not enabled',
                                status=status.HTTP_403_FORBIDDEN)

        try:
            data = _prepare_pay(request._request, app)
        except AlreadyPurchased:
            return Response({'reason': u'Already purchased app.'},
                            status=status.HTTP_409_CONFLICT)

        return Response(data, status=status.HTTP_201_CREATED)
コード例 #6
0
ファイル: utils.py プロジェクト: almosteverywhere/zamboni
def app_to_dict(app, region=None, profile=None, request=None):
    """Return app data as dict for API."""
    # Sad circular import issues.
    from mkt.api.resources import AppResource
    from mkt.developers.api import AccountResource
    from mkt.developers.models import AddonPaymentAccount
    from mkt.submit.api import PreviewResource
    from mkt.webapps.models import reverse_version

    supported_locales = getattr(app.current_version, 'supported_locales', '')

    data = {
        'app_type': app.app_type,
        'author': app.developer_name,
        'categories': list(app.categories.values_list('slug', flat=True)),
        'content_ratings': dict([(cr.get_body().name, {
            'name': cr.get_rating().name,
            'description': unicode(cr.get_rating().description),
        }) for cr in app.content_ratings.all()]) or None,
        'created': app.created,
        'current_version': (app.current_version.version if
                            getattr(app, 'current_version') else None),
        'default_locale': app.default_locale,
        'icons': dict([(icon_size,
                        app.get_icon_url(icon_size))
                       for icon_size in (16, 48, 64, 128)]),
        'is_packaged': app.is_packaged,
        'manifest_url': app.get_manifest_url(),
        'payment_required': False,
        'previews': PreviewResource().dehydrate_objects(app.previews.all()),
        'premium_type': amo.ADDON_PREMIUM_API[app.premium_type],
        'public_stats': app.public_stats,
        'price': None,
        'price_locale': None,
        'ratings': {'average': app.average_rating,
                    'count': app.total_reviews},
        'regions': RegionResource().dehydrate_objects(app.get_regions()),
        'slug': app.app_slug,
        'supported_locales': (supported_locales.split(',') if supported_locales
                              else []),
        'weekly_downloads': app.weekly_downloads if app.public_stats else None,
        'versions': dict((v.version, reverse_version(v)) for
                         v in app.versions.all())
    }

    data['upsell'] = False
    if app.upsell and region in app.upsell.premium.get_price_region_ids():
        upsell = app.upsell.premium
        data['upsell'] = {
            'id': upsell.id,
            'app_slug': upsell.app_slug,
            'icon_url': upsell.get_icon_url(128),
            'name': unicode(upsell.name),
            'resource_uri': AppResource().get_resource_uri(upsell),
        }

    if app.premium:
        q = AddonPaymentAccount.objects.filter(addon=app)
        if len(q) > 0 and q[0].payment_account:
            data['payment_account'] = AccountResource().get_resource_uri(
                q[0].payment_account)

        if (region in app.get_price_region_ids() or
            payments_enabled(request)):
            data['price'] = app.get_price(region=region)
            data['price_locale'] = app.get_price_locale(region=region)
        data['payment_required'] = (bool(app.get_tier().price)
                                    if app.get_tier() else False)

    with no_translation():
        data['device_types'] = [n.api_name
                                for n in app.device_types]
    if profile:
        data['user'] = {
            'developed': app.addonuser_set.filter(
                user=profile, role=amo.AUTHOR_ROLE_OWNER).exists(),
            'installed': app.has_installed(profile),
            'purchased': app.pk in profile.purchase_ids(),
        }

    return data
コード例 #7
0
ファイル: utils.py プロジェクト: almosteverywhere/zamboni
def es_app_to_dict(obj, region=None, profile=None, request=None):
    """
    Return app data as dict for API where `app` is the elasticsearch result.
    """
    # Circular import.
    from mkt.api.base import GenericObject
    from mkt.api.resources import AppResource, PrivacyPolicyResource
    from mkt.developers.api import AccountResource
    from mkt.developers.models import AddonPaymentAccount
    from mkt.webapps.models import Installed, Webapp

    src = obj._source
    # The following doesn't perform a database query, but gives us useful
    # methods like `get_detail_url`. If you use `obj` make sure the calls
    # don't query the database.
    is_packaged = src.get('app_type') != amo.ADDON_WEBAPP_HOSTED
    app = Webapp(app_slug=obj.app_slug, is_packaged=is_packaged)

    attrs = ('content_ratings', 'created', 'current_version', 'default_locale',
             'homepage', 'manifest_url', 'previews', 'ratings', 'status',
             'support_email', 'support_url', 'weekly_downloads')
    data = dict((a, getattr(obj, a, None)) for a in attrs)
    data.update({
        'absolute_url': absolutify(app.get_detail_url()),
        'app_type': app.app_type,
        'author': src.get('author', ''),
        'categories': [c for c in obj.category],
        'description': get_attr_lang(src, 'description', obj.default_locale),
        'device_types': [DEVICE_TYPES[d].api_name for d in src.get('device')],
        'icons': dict((i['size'], i['url']) for i in src.get('icons')),
        'id': str(obj._id),
        'is_packaged': is_packaged,
        'name': get_attr_lang(src, 'name', obj.default_locale),
        'payment_required': False,
        'premium_type': amo.ADDON_PREMIUM_API[src.get('premium_type')],
        'privacy_policy': PrivacyPolicyResource().get_resource_uri(
            GenericObject({'pk': obj._id})
        ),
        'public_stats': obj.has_public_stats,
        'supported_locales': src.get('supported_locales', ''),
        'slug': obj.app_slug,
        # TODO: Remove the type check once this code rolls out and our indexes
        # aren't between mapping changes.
        'versions': dict((v.get('version'), v.get('resource_uri')) for v in
                         src.get('versions') if type(v) == dict),
    })

    if not data['public_stats']:
        data['weekly_downloads'] = None

    data['regions'] = RegionResource().dehydrate_objects(
        map(REGIONS_CHOICES_ID_DICT.get,
            app.get_region_ids(worldwide=True,
                               excluded=obj.region_exclusions)))

    if src.get('premium_type') in amo.ADDON_PREMIUMS:
        acct = list(AddonPaymentAccount.objects.filter(addon=app))
        if acct and acct.payment_account:
            data['payment_account'] = AccountResource().get_resource_uri(
                acct.payment_account)
    else:
        data['payment_account'] = None

    data['upsell'] = False
    if hasattr(obj, 'upsell'):
        exclusions = obj.upsell.get('region_exclusions')
        if exclusions is not None and region not in exclusions:
            data['upsell'] = obj.upsell
            data['upsell']['resource_uri'] = AppResource().get_resource_uri(
                Webapp(id=obj.upsell['id']))

    data['price'] = data['price_locale'] = None
    try:
        price_tier = src.get('price_tier')
        if price_tier:
            price = Price.objects.get(name=price_tier)
            if (data['upsell'] or payments_enabled(request)):
                price_currency = price.get_price_currency(region=region)
                if price_currency and price_currency.paid:
                    data['price'] = price.get_price(region=region)
                    data['price_locale'] = price.get_price_locale(
                        region=region)
            data['payment_required'] = bool(price.price)
    except Price.DoesNotExist:
        log.warning('Issue with price tier on app: {0}'.format(obj._id))
        data['payment_required'] = True

    # TODO: Let's get rid of these from the API to avoid db hits.
    if profile and isinstance(profile, UserProfile):
        data['user'] = {
            'developed': AddonUser.objects.filter(addon=obj.id,
                user=profile, role=amo.AUTHOR_ROLE_OWNER).exists(),
            'installed': Installed.objects.filter(
                user=profile, addon_id=obj.id).exists(),
            'purchased': obj.id in profile.purchase_ids(),
        }

    return data
コード例 #8
0
ファイル: utils.py プロジェクト: sunbiz/zamboni
def app_to_dict(app, region=None, profile=None, request=None):
    """Return app data as dict for API."""
    # Sad circular import issues.
    from mkt.api.resources import AppResource
    from mkt.developers.api import AccountResource
    from mkt.developers.models import AddonPaymentAccount
    from mkt.submit.api import PreviewResource
    from mkt.webapps.models import reverse_version

    supported_locales = getattr(app.current_version, 'supported_locales', '')

    data = {
        'app_type':
        app.app_type,
        'author':
        app.developer_name,
        'categories':
        list(app.categories.values_list('slug', flat=True)),
        'content_ratings':
        dict([(cr.get_body().name, {
            'name': cr.get_rating().name,
            'description': unicode(cr.get_rating().description),
        }) for cr in app.content_ratings.all()]) or None,
        'created':
        app.created,
        'current_version': (app.current_version.version if getattr(
            app, 'current_version') else None),
        'default_locale':
        app.default_locale,
        'icons':
        dict([(icon_size, app.get_icon_url(icon_size))
              for icon_size in (16, 48, 64, 128)]),
        'is_packaged':
        app.is_packaged,
        'manifest_url':
        app.get_manifest_url(),
        'payment_required':
        False,
        'previews':
        PreviewResource().dehydrate_objects(app.previews.all()),
        'premium_type':
        amo.ADDON_PREMIUM_API[app.premium_type],
        'public_stats':
        app.public_stats,
        'price':
        None,
        'price_locale':
        None,
        'ratings': {
            'average': app.average_rating,
            'count': app.total_reviews
        },
        'regions':
        RegionResource().dehydrate_objects(app.get_regions()),
        'slug':
        app.app_slug,
        'supported_locales':
        (supported_locales.split(',') if supported_locales else []),
        'weekly_downloads':
        app.weekly_downloads if app.public_stats else None,
        'versions':
        dict((v.version, reverse_version(v)) for v in app.versions.all())
    }

    data['upsell'] = False
    if app.upsell and region in app.upsell.premium.get_price_region_ids():
        upsell = app.upsell.premium
        data['upsell'] = {
            'id': upsell.id,
            'app_slug': upsell.app_slug,
            'icon_url': upsell.get_icon_url(128),
            'name': unicode(upsell.name),
            'resource_uri': AppResource().get_resource_uri(upsell),
        }

    if app.premium:
        q = AddonPaymentAccount.objects.filter(addon=app)
        if len(q) > 0 and q[0].payment_account:
            data['payment_account'] = AccountResource().get_resource_uri(
                q[0].payment_account)

        if (region in app.get_price_region_ids() or payments_enabled(request)):
            data['price'] = app.get_price(region=region)
            data['price_locale'] = app.get_price_locale(region=region)
        data['payment_required'] = (bool(app.get_tier().price)
                                    if app.get_tier() else False)

    with no_translation():
        data['device_types'] = [n.api_name for n in app.device_types]
    if profile:
        data['user'] = {
            'developed':
            app.addonuser_set.filter(user=profile,
                                     role=amo.AUTHOR_ROLE_OWNER).exists(),
            'installed':
            app.has_installed(profile),
            'purchased':
            app.pk in profile.purchase_ids(),
        }

    return data
コード例 #9
0
ファイル: utils.py プロジェクト: sunbiz/zamboni
def es_app_to_dict(obj, region=None, profile=None, request=None):
    """
    Return app data as dict for API where `app` is the elasticsearch result.
    """
    # Circular import.
    from mkt.api.base import GenericObject
    from mkt.api.resources import AppResource, PrivacyPolicyResource
    from mkt.developers.api import AccountResource
    from mkt.developers.models import AddonPaymentAccount
    from mkt.webapps.models import Installed, Webapp

    src = obj._source
    # The following doesn't perform a database query, but gives us useful
    # methods like `get_detail_url`. If you use `obj` make sure the calls
    # don't query the database.
    is_packaged = src.get('app_type') != amo.ADDON_WEBAPP_HOSTED
    app = Webapp(app_slug=obj.app_slug, is_packaged=is_packaged)

    attrs = ('content_ratings', 'created', 'current_version', 'default_locale',
             'homepage', 'manifest_url', 'previews', 'ratings', 'status',
             'support_email', 'support_url', 'weekly_downloads')
    data = dict((a, getattr(obj, a, None)) for a in attrs)
    data.update({
        'absolute_url':
        absolutify(app.get_detail_url()),
        'app_type':
        app.app_type,
        'author':
        src.get('author', ''),
        'categories': [c for c in obj.category],
        'description':
        get_attr_lang(src, 'description', obj.default_locale),
        'device_types': [DEVICE_TYPES[d].api_name for d in src.get('device')],
        'icons':
        dict((i['size'], i['url']) for i in src.get('icons')),
        'id':
        str(obj._id),
        'is_packaged':
        is_packaged,
        'name':
        get_attr_lang(src, 'name', obj.default_locale),
        'payment_required':
        False,
        'premium_type':
        amo.ADDON_PREMIUM_API[src.get('premium_type')],
        'privacy_policy':
        PrivacyPolicyResource().get_resource_uri(GenericObject({'pk':
                                                                obj._id})),
        'public_stats':
        obj.has_public_stats,
        'supported_locales':
        src.get('supported_locales', ''),
        'slug':
        obj.app_slug,
        # TODO: Remove the type check once this code rolls out and our indexes
        # aren't between mapping changes.
        'versions':
        dict((v.get('version'), v.get('resource_uri'))
             for v in src.get('versions') if type(v) == dict),
    })

    if not data['public_stats']:
        data['weekly_downloads'] = None

    data['regions'] = RegionResource().dehydrate_objects(
        map(REGIONS_CHOICES_ID_DICT.get,
            app.get_region_ids(worldwide=True,
                               excluded=obj.region_exclusions)))

    if src.get('premium_type') in amo.ADDON_PREMIUMS:
        acct = list(AddonPaymentAccount.objects.filter(addon=app))
        if acct and acct.payment_account:
            data['payment_account'] = AccountResource().get_resource_uri(
                acct.payment_account)
    else:
        data['payment_account'] = None

    data['upsell'] = False
    if hasattr(obj, 'upsell'):
        exclusions = obj.upsell.get('region_exclusions')
        if exclusions is not None and region not in exclusions:
            data['upsell'] = obj.upsell
            data['upsell']['resource_uri'] = AppResource().get_resource_uri(
                Webapp(id=obj.upsell['id']))

    data['price'] = data['price_locale'] = None
    try:
        price_tier = src.get('price_tier')
        if price_tier:
            price = Price.objects.get(name=price_tier)
            if (data['upsell'] or payments_enabled(request)):
                price_currency = price.get_price_currency(region=region)
                if price_currency and price_currency.paid:
                    data['price'] = price.get_price(region=region)
                    data['price_locale'] = price.get_price_locale(
                        region=region)
            data['payment_required'] = bool(price.price)
    except Price.DoesNotExist:
        log.warning('Issue with price tier on app: {0}'.format(obj._id))
        data['payment_required'] = True

    # TODO: Let's get rid of these from the API to avoid db hits.
    if profile and isinstance(profile, UserProfile):
        data['user'] = {
            'developed':
            AddonUser.objects.filter(addon=obj.id,
                                     user=profile,
                                     role=amo.AUTHOR_ROLE_OWNER).exists(),
            'installed':
            Installed.objects.filter(user=profile, addon_id=obj.id).exists(),
            'purchased':
            obj.id in profile.purchase_ids(),
        }

    return data
コード例 #10
0
 def test_not_flag(self):
     with self.settings(PAYMENT_LIMITED=True):
         assert not payments_enabled(self.req)
コード例 #11
0
 def test_settings(self):
     with self.settings(PAYMENT_LIMITED=False):
         assert payments_enabled(self.req)
コード例 #12
0
ファイル: api.py プロジェクト: chenliu0831/zamboni
 def get_price_locale(self, app):
     region = self.context.get('region')
     if (region in app.get_price_region_ids() or
         payments_enabled(self.context['request'])):
         return app.get_price_locale(region=region)
コード例 #13
0
 def get_price_locale(self, app):
     region = self.context.get('region')
     if (region in app.get_price_region_ids()
             or payments_enabled(self.context['request'])):
         return app.get_price_locale(region=region)