Ejemplo n.º 1
0
    def verify_bango_boku_portals(self, app, response):
        bango = pq(response.content)('[data-provider-name=bango]')
        heading = pq('dt', bango).text()
        assert 'Bango' in heading, heading
        assert unicode(app.name) in heading, heading
        eq_(pq('dd a', bango).attr('href'),
            get_provider(name='bango').get_portal_url(app.app_slug))

        boku = pq(response.content)('[data-provider-name=boku]')
        heading = pq('dt', boku).text()
        assert 'Boku' in heading, heading
        assert unicode(app.name) in heading, heading
        eq_(pq('dd a', boku).attr('href'),
            get_provider(name='boku').get_portal_url(app.app_slug))
Ejemplo n.º 2
0
    def verify_bango_boku_portals(self, app, response):
        bango = pq(response.content)('[data-provider-name=bango]')
        heading = pq('dt', bango).text()
        assert 'Bango' in heading, heading
        assert unicode(app.name) in heading, heading
        eq_(pq('dd a', bango).attr('href'),
            get_provider(name='bango').get_portal_url(app.app_slug))

        boku = pq(response.content)('[data-provider-name=boku]')
        heading = pq('dt', boku).text()
        assert 'Boku' in heading, heading
        assert unicode(app.name) in heading, heading
        eq_(pq('dd a', boku).attr('href'),
            get_provider(name='boku').get_portal_url(app.app_slug))
Ejemplo n.º 3
0
 def post_save(self, obj, created=False):
     """Ensure that the setup_bango method is called after creation."""
     if created:
         provider = get_provider()
         uri = provider.product_create(obj.payment_account, obj.addon)
         obj.product_uri = uri
         obj.save()
Ejemplo n.º 4
0
    def get_provider(self):
        """Returns an instance of the payment provider for this account."""
        # TODO: fix circular import. Providers imports models which imports
        # forms which imports models.
        from mkt.developers.providers import get_provider

        return get_provider(id=self.provider)
Ejemplo n.º 5
0
 def post_save(self, obj, created=False):
     """Ensure that the setup_bango method is called after creation."""
     if created:
         provider = get_provider()
         uri = provider.product_create(obj.payment_account, obj.addon)
         obj.product_uri = uri
         obj.save()
Ejemplo n.º 6
0
    def setUp(self):
        super(TestPaidRereview, self).setUp()
        self.addon = Addon.objects.get(pk=337141)
        self.addon.update(status=amo.STATUS_NULL,
                          highest_status=amo.STATUS_PUBLIC)
        self.provider = get_provider(name='bango')
        self.price = Price.objects.filter()[0]
        AddonPremium.objects.create(addon=self.addon, price=self.price)
        self.user = UserProfile.objects.get(email='*****@*****.**')
        amo.set_user(self.user)
        seller = models.SolitudeSeller.objects.create(
            resource_uri='/path/to/sel', user=self.user)

        self.account = models.PaymentAccount.objects.create(
            user=self.user,
            uri='asdf',
            name='test',
            inactive=False,
            solitude_seller=seller,
            account_id=123,
            agreed_tos=True)

        self.kwargs = {
            'addon': self.addon,
            'user': self.user,
            'provider': self.provider,
        }
Ejemplo n.º 7
0
def get_payment_provider_portals(app=None, user=None):
    """
    Get a list of dicts describing the payment portals for this app or user.

    Either app or user is required.
    """
    provider_portals = []
    if app:
        q = dict(addon=app)
    elif user:
        q = dict(payment_account__user=user)
    else:
        raise ValueError('user or app is required')

    for acct in (AddonPaymentAccount.objects.filter(**q)
                 .select_related('payment_account')):
        provider = get_provider(id=acct.payment_account.provider)
        portal_url = provider.get_portal_url(acct.addon.app_slug)
        if portal_url:
            provider_portals.append({
                'provider': provider,
                'app': acct.addon,
                'portal_url': portal_url,
                'payment_account': acct.payment_account
            })
    return provider_portals
Ejemplo n.º 8
0
def agreement(request, id):
    account = get_object_or_404(PaymentAccount, pk=id, user=request.user)
    provider = get_provider()
    if request.method == 'POST':
        return provider.terms_update(account)

    return provider.terms_retrieve(account)
Ejemplo n.º 9
0
 def create(self, request, *args, **kwargs):
     provider = get_provider()
     form = provider.forms['account'](request.DATA)
     if form.is_valid():
         try:
             provider = get_provider()
             obj = provider.account_create(request.amo_user, form.data)
         except HttpClientError as e:
             log.error('Client error creating Bango account; %s' % e)
             return Response(e.content,
                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
         except HttpServerError as e:
             log.error('Error creating Bango payment account; %s' % e)
             return Response(_(u'Could not connect to payment server.'),
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
         serializer = self.get_serializer(obj)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 10
0
 def create(self, request, *args, **kwargs):
     provider = get_provider()
     form = provider.forms['account'](request.DATA)
     if form.is_valid():
         try:
             provider = get_provider()
             obj = provider.account_create(request.amo_user, form.data)
         except HttpClientError as e:
             log.error('Client error creating Bango account; %s' % e)
             return Response(e.content,
                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
         except HttpServerError as e:
             log.error('Error creating Bango payment account; %s' % e)
             return Response(_(u'Could not connect to payment server.'),
                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
         serializer = self.get_serializer(obj)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 11
0
def payment_accounts_form(request):
    webapp = get_object_or_404(Webapp, app_slug=request.GET.get("app_slug"))
    provider = get_provider(name=request.GET.get("provider"))
    account_list_formset = forms_payments.AccountListFormSet(
        provider_data=[{"user": request.user, "addon": webapp, "provider": p} for p in get_providers()]
    )
    account_list_form = next(form for form in account_list_formset.forms if form.provider.name == provider.name)
    return render(
        request, "developers/payments/includes/bango_accounts_form.html", {"account_list_form": account_list_form}
    )
Ejemplo n.º 12
0
def payment_accounts_form(request):
    webapp = get_object_or_404(Webapp, app_slug=request.GET.get('app_slug'))
    provider = get_provider(name=request.GET.get('provider'))
    account_list_formset = forms_payments.AccountListFormSet(
        provider_data=[
            {'user': request.user, 'addon': webapp, 'provider': p}
            for p in get_providers()])
    account_list_form = next(form for form in account_list_formset.forms
                             if form.provider.name == provider.name)
    return render(request,
                  'developers/payments/includes/bango_accounts_form.html',
                  {'account_list_form': account_list_form})
Ejemplo n.º 13
0
def payment_accounts_form(request):
    webapp = get_object_or_404(Webapp, app_slug=request.GET.get('app_slug'))
    provider = get_provider(name=request.GET.get('provider'))
    account_list_formset = forms_payments.AccountListFormSet(
        provider_data=[
            {'user': request.user, 'addon': webapp, 'provider': p}
            for p in get_providers()])
    account_list_form = next(form for form in account_list_formset.forms
                             if form.provider.name == provider.name)
    return render(request,
                  'developers/payments/includes/bango_accounts_form.html',
                  {'account_list_form': account_list_form})
Ejemplo n.º 14
0
def payments_accounts_add(request):
    provider = get_provider()
    form = provider.forms["account"](request.POST)
    if not form.is_valid():
        return json_view.error(form.errors)

    try:
        obj = provider.account_create(request.amo_user, form.cleaned_data)
    except HttpClientError as e:
        log.error("Client error create {0} account: {1}".format(provider.name, e))
        return http.HttpResponseBadRequest(json.dumps(e.content))

    return {"pk": obj.pk, "agreement-url": obj.get_agreement_url()}
Ejemplo n.º 15
0
def payments_accounts_add(request):
    provider = get_provider()
    form = provider.forms['account'](request.POST)
    if not form.is_valid():
        return json_view.error(form.errors)

    try:
        obj = provider.account_create(request.amo_user, form.cleaned_data)
    except HttpClientError as e:
        log.error('Client error create {0} account: {1}'.format(
            provider.name, e))
        return http.HttpResponseBadRequest(json.dumps(e.content))

    return {'pk': obj.pk, 'agreement-url': obj.get_agreement_url()}
Ejemplo n.º 16
0
def payments_accounts_add(request):
    provider = get_provider(name=request.POST.get('provider'))
    form = provider.forms['account'](request.POST)
    if not form.is_valid():
        return json_view.error(form.errors)

    try:
        obj = provider.account_create(request.user, form.cleaned_data)
    except HttpClientError as e:
        log.error('Client error create {0} account: {1}'.format(
            provider.name, e))
        return http.HttpResponseBadRequest(json.dumps(e.content))

    return {'pk': obj.pk, 'agreement-url': obj.get_agreement_url()}
Ejemplo n.º 17
0
    def setUp(self):
        super(TestAccountListForm, self).setUp()
        self.addon = Addon.objects.get(pk=337141)
        self.addon.update(status=amo.STATUS_NULL, highest_status=amo.STATUS_PUBLIC)
        self.provider = get_provider(name="bango")
        self.price = Price.objects.filter()[0]
        AddonPremium.objects.create(addon=self.addon, price=self.price)

        self.user = UserProfile.objects.get(pk=31337)
        amo.set_user(self.user)

        self.other = UserProfile.objects.get(pk=999)
        self.admin = UserProfile.objects.get(email="*****@*****.**")

        self.kwargs = {"addon": self.addon, "provider": self.provider}
Ejemplo n.º 18
0
    def test_create_bango(self):
        # Return a seller object without hitting Bango.
        self.bango_patcher.package.post.return_value = {"resource_uri": "zipzap", "package_id": 123}

        res = get_provider().account_create(self.user, {"account_name": "Test Account"})
        eq_(res.name, "Test Account")
        eq_(res.user, self.user)
        eq_(res.seller_uri, "selleruri")
        eq_(res.account_id, 123)
        eq_(res.uri, "zipzap")

        self.bango_patcher.package.post.assert_called_with(
            data={"paypalEmailAddress": "*****@*****.**", "seller": "selleruri"}
        )

        self.bango_patcher.bank.post.assert_called_with(data={"seller_bango": "zipzap"})
Ejemplo n.º 19
0
    def setUp(self):
        super(TestAccountListForm, self).setUp()
        self.addon = Webapp.objects.get(pk=337141)
        self.addon.update(status=mkt.STATUS_NULL,
                          highest_status=mkt.STATUS_PUBLIC)
        self.provider = get_provider(name='bango')
        self.price = Price.objects.filter()[0]
        AddonPremium.objects.create(addon=self.addon, price=self.price)

        self.user = UserProfile.objects.get(pk=31337)
        mkt.set_user(self.user)

        self.other = UserProfile.objects.get(pk=999)
        self.admin = UserProfile.objects.get(email='*****@*****.**')

        self.kwargs = {
            'addon': self.addon,
            'provider': self.provider,
        }
Ejemplo n.º 20
0
    def setUp(self):
        super(TestAccountListForm, self).setUp()
        self.addon = Addon.objects.get(pk=337141)
        self.addon.update(status=amo.STATUS_NULL,
                          highest_status=amo.STATUS_PUBLIC)
        self.provider = get_provider(name='bango')
        self.price = Price.objects.filter()[0]
        AddonPremium.objects.create(addon=self.addon, price=self.price)

        self.user = UserProfile.objects.get(pk=31337)
        amo.set_user(self.user)

        self.other = UserProfile.objects.get(pk=999)
        self.admin = UserProfile.objects.get(email='*****@*****.**')

        self.kwargs = {
            'addon': self.addon,
            'provider': self.provider,
        }
Ejemplo n.º 21
0
    def perform_create(self, serializer, created=True):
        if not AddonPaymentAccountPermission().check(
                self.request, serializer.validated_data['addon'],
                serializer.validated_data['payment_account']):
            raise PermissionDenied('Not allowed to alter that object.')

        if self.request.method != 'POST':
            if not self.queryset.filter(
                    addon=serializer.validated_data['addon'],
                    payment_account=serializer.
                    validated_data['payment_account']).exists():
                # This should be a 400 error.
                raise PermissionDenied('Cannot change the add-on.')

        obj = serializer.save()

        if created:
            provider = get_provider()
            uri = provider.product_create(obj.payment_account, obj.addon)
            obj.product_uri = uri
        obj.save()
Ejemplo n.º 22
0
    def test_create_bango(self):
        # Return a seller object without hitting Bango.
        self.bango_patcher.package.post.return_value = {
            'resource_uri': 'zipzap',
            'package_id': 123,
        }

        res = get_provider().account_create(
            self.user, {'account_name': 'Test Account'})
        eq_(res.name, 'Test Account')
        eq_(res.user, self.user)
        eq_(res.seller_uri, 'selleruri')
        eq_(res.account_id, 123)
        eq_(res.uri, 'zipzap')

        self.bango_patcher.package.post.assert_called_with(
            data={'paypalEmailAddress': '*****@*****.**',
                  'seller': 'selleruri'})

        self.bango_patcher.bank.post.assert_called_with(
            data={'seller_bango': 'zipzap'})
Ejemplo n.º 23
0
    def test_create_bango(self):
        # Return a seller object without hitting Bango.
        self.bango_patcher.package.post.return_value = {
            'resource_uri': 'zipzap',
            'package_id': 123,
        }

        res = get_provider().account_create(
            self.user, {'account_name': 'Test Account'})
        eq_(res.name, 'Test Account')
        eq_(res.user, self.user)
        eq_(res.seller_uri, 'selleruri')
        eq_(res.account_id, 123)
        eq_(res.uri, 'zipzap')

        self.bango_patcher.package.post.assert_called_with(
            data={'paypalEmailAddress': '*****@*****.**',
                  'seller': 'selleruri'})

        self.bango_patcher.bank.post.assert_called_with(
            data={'seller_bango': 'zipzap'})
Ejemplo n.º 24
0
    def perform_create(self, serializer, created=True):
        if not AddonPaymentAccountPermission().check(
                self.request,
                serializer.validated_data['addon'],
                serializer.validated_data['payment_account']):
            raise PermissionDenied('Not allowed to alter that object.')

        if self.request.method != 'POST':
            if not self.queryset.filter(
                    addon=serializer.validated_data['addon'],
                    payment_account=serializer.validated_data[
                        'payment_account']).exists():
                # This should be a 400 error.
                raise PermissionDenied('Cannot change the add-on.')

        obj = serializer.save()

        if created:
            provider = get_provider()
            uri = provider.product_create(obj.payment_account, obj.addon)
            obj.product_uri = uri
        obj.save()
Ejemplo n.º 25
0
    def setUp(self):
        super(TestPaidRereview, self).setUp()
        self.addon = Addon.objects.get(pk=337141)
        self.addon.update(status=amo.STATUS_NULL,
                          highest_status=amo.STATUS_PUBLIC)
        self.provider = get_provider(name='bango')
        self.price = Price.objects.filter()[0]
        AddonPremium.objects.create(addon=self.addon, price=self.price)
        self.user = UserProfile.objects.get(email='*****@*****.**')
        amo.set_user(self.user)
        seller = models.SolitudeSeller.objects.create(
            resource_uri='/path/to/sel', user=self.user)

        self.account = models.PaymentAccount.objects.create(
            user=self.user, uri='asdf', name='test', inactive=False,
            solitude_seller=seller, account_id=123, agreed_tos=True)

        self.kwargs = {
            'addon': self.addon,
            'user': self.user,
            'provider': self.provider,
        }
Ejemplo n.º 26
0
    def save(self):
        if self.cleaned_data.get('accounts'):
            try:
                log.info('[1@%s] Deleting app payment account' % self.addon.pk)
                AddonPaymentAccount.objects.get(addon=self.addon).delete()
            except AddonPaymentAccount.DoesNotExist:
                pass

            log.info('[1@%s] Creating new app payment account' % self.addon.pk)
            from mkt.developers.providers import get_provider

            provider = get_provider()
            account = self.cleaned_data['accounts']

            uri = provider.product_create(account, self.addon)
            AddonPaymentAccount.objects.create(addon=self.addon,
                                               account_uri=account.uri,
                                               payment_account=account,
                                               product_uri=uri)

            # If the app is marked as paid and the information is complete
            # and the app is currently marked as incomplete, put it into the
            # re-review queue.
            if (self.addon.status == amo.STATUS_NULL
                    and self.addon.highest_status
                    in amo.WEBAPPS_APPROVED_STATUSES):
                # FIXME: This might cause noise in the future if bank accounts
                # get manually closed by Bango and we mark apps as STATUS_NULL
                # until a new account is selected. That will trigger a
                # re-review.

                log.info(u'[Webapp:%s] (Re-review) Public app, premium type '
                         u'upgraded.' % self.addon)
                RereviewQueue.flag(self.addon,
                                   amo.LOG.REREVIEW_PREMIUM_TYPE_UPGRADE)

            if self.addon.has_incomplete_status(
            ) and self.addon.is_fully_complete():
                _restore_app_status(self.addon)
Ejemplo n.º 27
0
    def save(self):
        if self.cleaned_data.get('accounts'):
            try:
                log.info('[1@%s] Deleting app payment account' % self.addon.pk)
                AddonPaymentAccount.objects.get(addon=self.addon).delete()
            except AddonPaymentAccount.DoesNotExist:
                pass

            log.info('[1@%s] Creating new app payment account' % self.addon.pk)
            from mkt.developers.providers import get_provider

            provider = get_provider()
            account = self.cleaned_data['accounts']

            uri = provider.product_create(account, self.addon)
            AddonPaymentAccount.objects.create(
                addon=self.addon, account_uri=account.uri,
                payment_account=account, product_uri=uri)

            # If the app is marked as paid and the information is complete
            # and the app is currently marked as incomplete, put it into the
            # re-review queue.
            if (self.addon.status == amo.STATUS_NULL and
                self.addon.highest_status in amo.WEBAPPS_APPROVED_STATUSES):
                # FIXME: This might cause noise in the future if bank accounts
                # get manually closed by Bango and we mark apps as STATUS_NULL
                # until a new account is selected. That will trigger a
                # re-review.

                log.info(u'[Webapp:%s] (Re-review) Public app, premium type '
                         u'upgraded.' % self.addon)
                RereviewQueue.flag(
                    self.addon, amo.LOG.REREVIEW_PREMIUM_TYPE_UPGRADE)

            if self.addon.has_incomplete_status() and self.addon.is_fully_complete():
                _restore_app_status(self.addon)
Ejemplo n.º 28
0
 def test_multiple(self):
     with self.settings(PAYMENT_PROVIDERS=["foo", "bar"]):
         get_provider()
Ejemplo n.º 29
0
 def test_multiple(self):
     with self.settings(PAYMENT_PROVIDERS=['foo', 'bar']):
         get_provider()
Ejemplo n.º 30
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(
        request.POST or None, request=request, addon=addon,
        user=request.amo_user)

    region_form = forms.RegionForm(
        request.POST or None, product=addon, request=request)

    upsell_form = forms_payments.UpsellForm(
        request.POST or None, addon=addon, user=request.amo_user)

    bango_account_list_form = forms_payments.BangoAccountListForm(
        request.POST or None, addon=addon, user=request.amo_user)

    if request.method == 'POST':

        success = all(form.is_valid() for form in
                      [premium_form, region_form, upsell_form,
                       bango_account_list_form])

        if success:
            region_form.save()

            try:
                premium_form.save()
            except client.Error as err:
                success = False
                log.error('Error setting payment information (%s)' % err)
                messages.error(
                    request, _(u'We encountered a problem connecting to the '
                               u'payment server.'))
                raise  # We want to see these exceptions!

            is_free_inapp = addon.premium_type == amo.ADDON_FREE_INAPP
            is_now_paid = (addon.premium_type in amo.ADDON_PREMIUMS
                           or is_free_inapp)

            # If we haven't changed to a free app, check the upsell.
            if is_now_paid and success:
                try:
                    if not is_free_inapp:
                        upsell_form.save()
                    bango_account_list_form.save()
                except client.Error as err:
                    log.error('Error saving payment information (%s)' % err)
                    messages.error(
                        request, _(u'We encountered a problem connecting to '
                                   u'the payment server.'))
                    success = False
                    raise  # We want to see all the solitude errors now.

        # If everything happened successfully, give the user a pat on the back.
        if success:
            messages.success(request, _('Changes successfully saved.'))
            return redirect(addon.get_dev_url('payments'))

    # TODO: This needs to be updated as more platforms support payments.
    cannot_be_paid = (
        addon.premium_type == amo.ADDON_FREE and
        any(premium_form.device_data['free-%s' % x] == y for x, y in
            [('android-mobile', True), ('android-tablet', True),
             ('desktop', True), ('firefoxos', False)]))

    try:
        tier_zero = Price.objects.get(price='0.00', active=True)
        tier_zero_id = tier_zero.pk
    except Price.DoesNotExist:
        tier_zero = None
        tier_zero_id = ''

    # Get the regions based on tier zero. This should be all the
    # regions with payments enabled.
    paid_region_ids_by_slug = []
    if tier_zero:
        paid_region_ids_by_slug = tier_zero.region_ids_by_slug()

    provider = get_provider()

    return jingo.render(
        request, 'developers/payments/premium.html',
        {'addon': addon, 'webapp': webapp, 'premium': addon.premium,
         'form': premium_form, 'upsell_form': upsell_form,
         'tier_zero_id': tier_zero_id,
         'region_form': region_form,
         'DEVICE_LOOKUP': DEVICE_LOOKUP,
         'is_paid': (addon.premium_type in amo.ADDON_PREMIUMS
                     or addon.premium_type == amo.ADDON_FREE_INAPP),
         'no_paid': cannot_be_paid,
         'is_incomplete': addon.status == amo.STATUS_NULL,
         'is_packaged': addon.is_packaged,
         # Bango values
         'account_form': provider.forms['account'](),
         'bango_account_list_form': bango_account_list_form,
         # Waffles
         'payments_enabled':
             waffle.flag_is_active(request, 'allow-b2g-paid-submission') and
             not waffle.switch_is_active('disabled-payments'),
         'api_pricelist_url': reverse('price-list'),
         'payment_methods': {
             PAYMENT_METHOD_ALL: _('All'),
             PAYMENT_METHOD_CARD: _('Credit card'),
             PAYMENT_METHOD_OPERATOR: _('Carrier'),
         },
         'all_paid_region_ids_by_slug': paid_region_ids_by_slug,
         'provider': provider,
        })
Ejemplo n.º 31
0
 def test_multiple(self):
     with self.settings(PAYMENT_PROVIDERS=['foo', 'bar']):
         get_provider()
Ejemplo n.º 32
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(request.POST or None, request=request, addon=addon, user=request.amo_user)

    region_form = forms.RegionForm(request.POST or None, product=addon, request=request)

    upsell_form = forms_payments.UpsellForm(request.POST or None, addon=addon, user=request.amo_user)

    account_list_form = forms_payments.AccountListForm(request.POST or None, addon=addon, user=request.amo_user)

    if request.method == "POST":

        success = all(form.is_valid() for form in [premium_form, region_form, upsell_form, account_list_form])

        if success:
            region_form.save()

            try:
                premium_form.save()
            except client.Error as err:
                success = False
                log.error("Error setting payment information (%s)" % err)
                messages.error(request, _(u"We encountered a problem connecting to the " u"payment server."))
                raise  # We want to see these exceptions!

            is_free_inapp = addon.premium_type == amo.ADDON_FREE_INAPP
            is_now_paid = addon.premium_type in amo.ADDON_PREMIUMS or is_free_inapp

            # If we haven't changed to a free app, check the upsell.
            if is_now_paid and success:
                try:
                    if not is_free_inapp:
                        upsell_form.save()
                    account_list_form.save()
                except client.Error as err:
                    log.error("Error saving payment information (%s)" % err)
                    messages.error(request, _(u"We encountered a problem connecting to " u"the payment server."))
                    success = False
                    raise  # We want to see all the solitude errors now.

        # If everything happened successfully, give the user a pat on the back.
        if success:
            messages.success(request, _("Changes successfully saved."))
            return redirect(addon.get_dev_url("payments"))

    # TODO: refactor this (bug 945267)
    is_packaged = addon.is_packaged
    android_payments_enabled = waffle.flag_is_active(request, "android-payments")
    android_packaged_enabled = waffle.flag_is_active(request, "android-packaged")
    desktop_packaged_enabled = waffle.flag_is_active(request, "desktop-packaged")

    # If android payments is not allowed then firefox os must
    # be 'checked' and android-mobile and android-tablet should not be.
    invalid_paid_platform_state = []

    # If isn't packaged or it is packaged and the android-packaged flag is on
    # then we should check that desktop isn't set to True.
    if not is_packaged or (is_packaged and desktop_packaged_enabled):
        invalid_paid_platform_state.append(("desktop", True))

    if not android_payments_enabled:
        # When android-payments is off...
        # If isn't packaged or it is packaged and the android-packaged flag is on
        # then we should check for the state of android-mobile and android-tablet.
        if not is_packaged or (is_packaged and android_packaged_enabled):
            invalid_paid_platform_state += [("android-mobile", True), ("android-tablet", True)]
        invalid_paid_platform_state.append(("firefoxos", False))

    cannot_be_paid = addon.premium_type == amo.ADDON_FREE and any(
        premium_form.device_data["free-%s" % x] == y for x, y in invalid_paid_platform_state
    )

    try:
        tier_zero = Price.objects.get(price="0.00", active=True)
        tier_zero_id = tier_zero.pk
    except Price.DoesNotExist:
        tier_zero = None
        tier_zero_id = ""

    # Get the regions based on tier zero. This should be all the
    # regions with payments enabled.
    paid_region_ids_by_slug = []
    if tier_zero:
        paid_region_ids_by_slug = tier_zero.region_ids_by_slug()

    provider = get_provider()
    paid_platform_names = [unicode(platform[1]) for platform in PAID_PLATFORMS(request, is_packaged)]

    return render(
        request,
        "developers/payments/premium.html",
        {
            "addon": addon,
            "webapp": webapp,
            "premium": addon.premium,
            "form": premium_form,
            "upsell_form": upsell_form,
            "tier_zero_id": tier_zero_id,
            "region_form": region_form,
            "DEVICE_LOOKUP": DEVICE_LOOKUP,
            "is_paid": (addon.premium_type in amo.ADDON_PREMIUMS or addon.premium_type == amo.ADDON_FREE_INAPP),
            "cannot_be_paid": cannot_be_paid,
            "paid_platform_names": paid_platform_names,
            "has_incomplete_status": addon.status == amo.STATUS_NULL,
            "is_packaged": addon.is_packaged,
            # Bango values
            "account_form": provider.forms["account"](),
            "account_list_form": account_list_form,
            # Waffles
            "api_pricelist_url": reverse("price-list"),
            "payment_methods": {
                PAYMENT_METHOD_ALL: _("All"),
                PAYMENT_METHOD_CARD: _("Credit card"),
                PAYMENT_METHOD_OPERATOR: _("Carrier"),
            },
            "all_paid_region_ids_by_slug": paid_region_ids_by_slug,
            "provider": provider,
        },
    )
Ejemplo n.º 33
0
 def test_multiple(self):
     with self.settings(PAYMENT_PROVIDERS=['bango', 'reference'],
                        DEFAULT_PAYMENT_PROVIDER='bango'):
         eq_(get_provider().name, 'bango')
Ejemplo n.º 34
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(request.POST or None,
                                              request=request,
                                              addon=addon,
                                              user=request.amo_user)

    region_form = forms.RegionForm(request.POST or None,
                                   product=addon,
                                   request=request)

    upsell_form = forms_payments.UpsellForm(request.POST or None,
                                            addon=addon,
                                            user=request.amo_user)

    bango_account_list_form = forms_payments.BangoAccountListForm(
        request.POST or None, addon=addon, user=request.amo_user)

    if request.method == 'POST':

        success = all(
            form.is_valid() for form in
            [premium_form, region_form, upsell_form, bango_account_list_form])

        if success:
            region_form.save()

            try:
                premium_form.save()
            except client.Error as err:
                success = False
                log.error('Error setting payment information (%s)' % err)
                messages.error(
                    request,
                    _(u'We encountered a problem connecting to the '
                      u'payment server.'))
                raise  # We want to see these exceptions!

            is_free_inapp = addon.premium_type == amo.ADDON_FREE_INAPP
            is_now_paid = (addon.premium_type in amo.ADDON_PREMIUMS
                           or is_free_inapp)

            # If we haven't changed to a free app, check the upsell.
            if is_now_paid and success:
                try:
                    if not is_free_inapp:
                        upsell_form.save()
                    bango_account_list_form.save()
                except client.Error as err:
                    log.error('Error saving payment information (%s)' % err)
                    messages.error(
                        request,
                        _(u'We encountered a problem connecting to '
                          u'the payment server.'))
                    success = False
                    raise  # We want to see all the solitude errors now.

        # If everything happened successfully, give the user a pat on the back.
        if success:
            messages.success(request, _('Changes successfully saved.'))
            return redirect(addon.get_dev_url('payments'))

    # TODO: This needs to be updated as more platforms support payments.
    cannot_be_paid = (addon.premium_type == amo.ADDON_FREE and any(
        premium_form.device_data['free-%s' % x] == y
        for x, y in [('android-mobile',
                      True), ('android-tablet',
                              True), ('desktop', True), ('firefoxos', False)]))

    try:
        tier_zero = Price.objects.get(price='0.00', active=True)
        tier_zero_id = tier_zero.pk
    except Price.DoesNotExist:
        tier_zero = None
        tier_zero_id = ''

    # Get the regions based on tier zero. This should be all the
    # regions with payments enabled.
    paid_region_ids_by_slug = []
    if tier_zero:
        paid_region_ids_by_slug = tier_zero.region_ids_by_slug()

    provider = get_provider()

    return jingo.render(
        request,
        'developers/payments/premium.html',
        {
            'addon':
            addon,
            'webapp':
            webapp,
            'premium':
            addon.premium,
            'form':
            premium_form,
            'upsell_form':
            upsell_form,
            'tier_zero_id':
            tier_zero_id,
            'region_form':
            region_form,
            'DEVICE_LOOKUP':
            DEVICE_LOOKUP,
            'is_paid': (addon.premium_type in amo.ADDON_PREMIUMS
                        or addon.premium_type == amo.ADDON_FREE_INAPP),
            'no_paid':
            cannot_be_paid,
            'is_incomplete':
            addon.status == amo.STATUS_NULL,
            'is_packaged':
            addon.is_packaged,
            # Bango values
            'account_form':
            provider.forms['account'](),
            'bango_account_list_form':
            bango_account_list_form,
            # Waffles
            'payments_enabled':
            waffle.flag_is_active(request, 'allow-b2g-paid-submission')
            and not waffle.switch_is_active('disabled-payments'),
            'api_pricelist_url':
            reverse('price-list'),
            'payment_methods': {
                PAYMENT_METHOD_ALL: _('All'),
                PAYMENT_METHOD_CARD: _('Credit card'),
                PAYMENT_METHOD_OPERATOR: _('Carrier'),
            },
            'all_paid_region_ids_by_slug':
            paid_region_ids_by_slug,
            'provider':
            provider,
        })
Ejemplo n.º 35
0
 def test_multiple(self):
     with self.settings(PAYMENT_PROVIDERS=['bango', 'reference'],
                        DEFAULT_PAYMENT_PROVIDER='bango'):
         eq_(get_provider().name, 'bango')
Ejemplo n.º 36
0
 def get_provider(self):
     """Returns an instance of the payment provider for this account."""
     # TODO: fix circular import. Providers imports models which imports
     # forms which imports models.
     from mkt.developers.providers import get_provider
     return get_provider(id=self.provider)
Ejemplo n.º 37
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(
        request.POST or None, request=request, addon=addon,
        user=request.amo_user)

    region_form = forms.RegionForm(
        request.POST or None, product=addon, request=request)

    upsell_form = forms_payments.UpsellForm(
        request.POST or None, addon=addon, user=request.amo_user)

    account_list_form = forms_payments.AccountListForm(
        request.POST or None, addon=addon, user=request.amo_user)

    if request.method == 'POST':

        success = all(form.is_valid() for form in
                      [premium_form, region_form, upsell_form,
                       account_list_form])

        if success:
            region_form.save()

            try:
                premium_form.save()
            except client.Error as err:
                success = False
                log.error('Error setting payment information (%s)' % err)
                messages.error(
                    request, _(u'We encountered a problem connecting to the '
                               u'payment server.'))
                raise  # We want to see these exceptions!

            is_free_inapp = addon.premium_type == amo.ADDON_FREE_INAPP
            is_now_paid = (addon.premium_type in amo.ADDON_PREMIUMS
                           or is_free_inapp)

            # If we haven't changed to a free app, check the upsell.
            if is_now_paid and success:
                try:
                    if not is_free_inapp:
                        upsell_form.save()
                    account_list_form.save()
                except client.Error as err:
                    log.error('Error saving payment information (%s)' % err)
                    messages.error(
                        request, _(u'We encountered a problem connecting to '
                                   u'the payment server.'))
                    success = False
                    raise  # We want to see all the solitude errors now.

        # If everything happened successfully, give the user a pat on the back.
        if success:
            messages.success(request, _('Changes successfully saved.'))
            return redirect(addon.get_dev_url('payments'))

    # TODO: refactor this (bug 945267)
    is_packaged = addon.is_packaged
    android_payments_enabled = waffle.flag_is_active(request,
                                                     'android-payments')
    android_packaged_enabled = waffle.flag_is_active(request,
                                                     'android-packaged')
    desktop_packaged_enabled = waffle.flag_is_active(request,
                                                     'desktop-packaged')

    # If android payments is not allowed then firefox os must
    # be 'checked' and android-mobile and android-tablet should not be.
    invalid_paid_platform_state = []

    # If isn't packaged or it is packaged and the android-packaged flag is on
    # then we should check that desktop isn't set to True.
    if not is_packaged or (is_packaged and desktop_packaged_enabled):
        invalid_paid_platform_state.append(('desktop', True))

    if not android_payments_enabled:
        # When android-payments is off...
        # If isn't packaged or it is packaged and the android-packaged flag is on
        # then we should check for the state of android-mobile and android-tablet.
        if not is_packaged or (is_packaged and android_packaged_enabled):
            invalid_paid_platform_state += [('android-mobile', True),
                                            ('android-tablet', True)]
        invalid_paid_platform_state.append(('firefoxos', False))

    cannot_be_paid = (
        addon.premium_type == amo.ADDON_FREE and
        any(premium_form.device_data['free-%s' % x] == y
            for x, y in invalid_paid_platform_state))

    try:
        tier_zero = Price.objects.get(price='0.00', active=True)
        tier_zero_id = tier_zero.pk
    except Price.DoesNotExist:
        tier_zero = None
        tier_zero_id = ''

    # Get the regions based on tier zero. This should be all the
    # regions with payments enabled.
    paid_region_ids_by_slug = []
    if tier_zero:
        paid_region_ids_by_slug = tier_zero.region_ids_by_slug()

    provider = get_provider()
    paid_platform_names = [unicode(platform[1])
                           for platform in PAID_PLATFORMS(request, is_packaged)]

    return render(request, 'developers/payments/premium.html',
                  {'addon': addon, 'webapp': webapp, 'premium': addon.premium,
                   'form': premium_form, 'upsell_form': upsell_form,
                   'tier_zero_id': tier_zero_id, 'region_form': region_form,
                   'DEVICE_LOOKUP': DEVICE_LOOKUP,
                   'is_paid': (addon.premium_type in amo.ADDON_PREMIUMS
                               or addon.premium_type == amo.ADDON_FREE_INAPP),
                   'cannot_be_paid': cannot_be_paid,
                   'paid_platform_names': paid_platform_names,
                   'has_incomplete_status': addon.status == amo.STATUS_NULL,
                   'is_packaged': addon.is_packaged,
                   # Bango values
                   'account_form': provider.forms['account'](),
                   'account_list_form': account_list_form,
                   # Waffles
                   'api_pricelist_url': reverse('price-list'),
                   'payment_methods': {
                       PAYMENT_METHOD_ALL: _('All'),
                       PAYMENT_METHOD_CARD: _('Credit card'),
                       PAYMENT_METHOD_OPERATOR: _('Carrier'),
                   },
                   'all_paid_region_ids_by_slug': paid_region_ids_by_slug,
                   'provider': provider})
Ejemplo n.º 38
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(request.POST or None, request=request, addon=addon, user=request.amo_user)

    region_form = forms.RegionForm(request.POST or None, product=addon, request=request)

    upsell_form = forms_payments.UpsellForm(request.POST or None, addon=addon, user=request.amo_user)

    bango_account_list_form = forms_payments.BangoAccountListForm(
        request.POST or None, addon=addon, user=request.amo_user
    )

    if request.method == "POST":

        success = all(form.is_valid() for form in [premium_form, region_form, upsell_form, bango_account_list_form])

        if success:
            region_form.save()

            try:
                premium_form.save()
            except client.Error as err:
                success = False
                log.error("Error setting payment information (%s)" % err)
                messages.error(request, _(u"We encountered a problem connecting to the " u"payment server."))
                raise  # We want to see these exceptions!

            is_free_inapp = addon.premium_type == amo.ADDON_FREE_INAPP
            is_now_paid = addon.premium_type in amo.ADDON_PREMIUMS or is_free_inapp

            # If we haven't changed to a free app, check the upsell.
            if is_now_paid and success:
                try:
                    if not is_free_inapp:
                        upsell_form.save()
                    bango_account_list_form.save()
                except client.Error as err:
                    log.error("Error saving payment information (%s)" % err)
                    messages.error(request, _(u"We encountered a problem connecting to " u"the payment server."))
                    success = False
                    raise  # We want to see all the solitude errors now.

        # If everything happened successfully, give the user a pat on the back.
        if success:
            messages.success(request, _("Changes successfully saved."))
            return redirect(addon.get_dev_url("payments"))

    # TODO: This needs to be updated as more platforms support payments.
    cannot_be_paid = addon.premium_type == amo.ADDON_FREE and any(
        premium_form.device_data["free-%s" % x] == y
        for x, y in [("android-mobile", True), ("android-tablet", True), ("desktop", True), ("firefoxos", False)]
    )

    try:
        tier_zero = Price.objects.get(price="0.00", active=True)
        tier_zero_id = tier_zero.pk
    except Price.DoesNotExist:
        tier_zero = None
        tier_zero_id = ""

    # Get the regions based on tier zero. This should be all the
    # regions with payments enabled.
    paid_region_ids_by_slug = []
    if tier_zero:
        paid_region_ids_by_slug = tier_zero.region_ids_by_slug()

    provider = get_provider()

    return jingo.render(
        request,
        "developers/payments/premium.html",
        {
            "addon": addon,
            "webapp": webapp,
            "premium": addon.premium,
            "form": premium_form,
            "upsell_form": upsell_form,
            "tier_zero_id": tier_zero_id,
            "region_form": region_form,
            "DEVICE_LOOKUP": DEVICE_LOOKUP,
            "is_paid": (addon.premium_type in amo.ADDON_PREMIUMS or addon.premium_type == amo.ADDON_FREE_INAPP),
            "no_paid": cannot_be_paid,
            "is_incomplete": addon.status == amo.STATUS_NULL,
            "is_packaged": addon.is_packaged,
            # Bango values
            "account_form": provider.forms["account"](),
            "bango_account_list_form": bango_account_list_form,
            # Waffles
            "payments_enabled": waffle.flag_is_active(request, "allow-b2g-paid-submission")
            and not waffle.switch_is_active("disabled-payments"),
            "api_pricelist_url": reverse("api_dispatch_list", kwargs={"resource_name": "prices", "api_name": "webpay"}),
            "payment_methods": {
                PAYMENT_METHOD_ALL: _("All"),
                PAYMENT_METHOD_CARD: _("Credit card"),
                PAYMENT_METHOD_OPERATOR: _("Carrier"),
            },
            "all_paid_region_ids_by_slug": paid_region_ids_by_slug,
            "provider": provider,
        },
    )