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))
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))
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()
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)
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()
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, }
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
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)
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)
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)
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} )
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})
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})
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()}
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()}
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()}
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}
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"})
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, }
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, }
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()
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'})
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'})
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()
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, }
def save(self): if self.cleaned_data.get('accounts'): try: log.info('[[email protected]%s] Deleting app payment account' % self.addon.pk) AddonPaymentAccount.objects.get(addon=self.addon).delete() except AddonPaymentAccount.DoesNotExist: pass log.info('[[email protected]%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)
def save(self): if self.cleaned_data.get('accounts'): try: log.info('[[email protected]%s] Deleting app payment account' % self.addon.pk) AddonPaymentAccount.objects.get(addon=self.addon).delete() except AddonPaymentAccount.DoesNotExist: pass log.info('[[email protected]%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)
def test_multiple(self): with self.settings(PAYMENT_PROVIDERS=["foo", "bar"]): get_provider()
def test_multiple(self): with self.settings(PAYMENT_PROVIDERS=['foo', 'bar']): get_provider()
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, })
def test_multiple(self): with self.settings(PAYMENT_PROVIDERS=['foo', 'bar']): get_provider()
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, }, )
def test_multiple(self): with self.settings(PAYMENT_PROVIDERS=['bango', 'reference'], DEFAULT_PAYMENT_PROVIDER='bango'): eq_(get_provider().name, 'bango')
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, })
def test_multiple(self): with self.settings(PAYMENT_PROVIDERS=['bango', 'reference'], DEFAULT_PAYMENT_PROVIDER='bango'): eq_(get_provider().name, 'bango')
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)
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})
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, }, )