示例#1
0
def payment_accounts(request):
    app_slug = request.GET.get('app-slug', '')
    accounts = PaymentAccount.objects.filter(
        user=request.amo_user,
        provider__in=[p.provider for p in get_providers()],
        inactive=False)

    def account(acc):
        app_names = (', '.join(unicode(apa.addon.name)
                     for apa in acc.addonpaymentaccount_set.all()
                        if hasattr(apa, 'addon')))
        provider = acc.get_provider()
        data = {
            'account-url':
                reverse('mkt.developers.provider.payment_account',
                        args=[acc.pk]),
            'agreement-url': acc.get_agreement_url(),
            'agreement': 'accepted' if acc.agreed_tos else 'rejected',
            'app-names': jinja2.escape(app_names),
            'delete-url':
                reverse('mkt.developers.provider.delete_payment_account',
                        args=[acc.pk]),
            'id': acc.pk,
            'name': jinja2.escape(unicode(acc)),
            'provider': provider.name,
            'provider-full': unicode(provider.full),
            'shared': acc.shared,
            'portal-url': provider.get_portal_url(app_slug)
        }
        return data

    return map(account, accounts)
示例#2
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})
示例#3
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})
示例#4
0
def payment_accounts(request):
    app_slug = request.GET.get('app-slug', '')
    if app_slug:
        app = Webapp.objects.get(app_slug=app_slug)
        app_name = app.name
    else:
        app_name = ''
    accounts = PaymentAccount.objects.filter(
        user=request.user,
        provider__in=[p.provider for p in get_providers()],
        inactive=False)

    def account(acc):
        def payment_account_names(app):
            account_names = [unicode(acc.payment_account)
                             for acc in app.all_payment_accounts()]
            return (unicode(app.name), account_names)

        addon_payment_accounts = acc.addonpaymentaccount_set.all()
        associated_apps = [apa.addon
                           for apa in addon_payment_accounts
                           if hasattr(apa, 'addon')]
        app_names = u', '.join(unicode(app.name) for app in associated_apps)
        app_payment_accounts = json.dumps(dict([payment_account_names(app)
                                                for app in associated_apps]))
        provider = acc.get_provider()
        data = {
            'account-url': reverse('mkt.developers.provider.payment_account',
                                   args=[acc.pk]),
            'agreement-url': acc.get_agreement_url(),
            'agreement': 'accepted' if acc.agreed_tos else 'rejected',
            'current-app-name': jinja2.escape(app_name),
            'app-names': jinja2.escape(app_names),
            'app-payment-accounts': jinja2.escape(app_payment_accounts),
            'delete-url': reverse(
                'mkt.developers.provider.delete_payment_account',
                args=[acc.pk]),
            'id': acc.pk,
            'name': jinja2.escape(unicode(acc)),
            'provider': provider.name,
            'provider-full': unicode(provider.full),
            'shared': acc.shared,
            'portal-url': provider.get_portal_url(app_slug)
        }
        return data

    return map(account, accounts)
示例#5
0
def payment_accounts(request):
    app_slug = request.GET.get('app-slug', '')
    if app_slug:
        app = Webapp.objects.get(app_slug=app_slug)
        app_name = app.name
    else:
        app_name = ''
    accounts = PaymentAccount.objects.filter(
        user=request.user,
        provider__in=[p.provider for p in get_providers()],
        inactive=False)

    def account(acc):
        def payment_account_names(app):
            account_names = [unicode(acc.payment_account)
                             for acc in app.all_payment_accounts()]
            return (unicode(app.name), account_names)

        addon_payment_accounts = acc.addonpaymentaccount_set.all()
        associated_apps = [apa.addon
                           for apa in addon_payment_accounts
                           if hasattr(apa, 'addon')]
        app_names = u', '.join(unicode(app.name) for app in associated_apps)
        app_payment_accounts = json.dumps(dict([payment_account_names(app)
                                                for app in associated_apps]))
        provider = acc.get_provider()
        data = {
            'account-url': reverse('mkt.developers.provider.payment_account',
                                   args=[acc.pk]),
            'agreement-url': acc.get_agreement_url(),
            'agreement': 'accepted' if acc.agreed_tos else 'rejected',
            'current-app-name': jinja2.escape(app_name),
            'app-names': jinja2.escape(app_names),
            'app-payment-accounts': jinja2.escape(app_payment_accounts),
            'delete-url': reverse(
                'mkt.developers.provider.delete_payment_account',
                args=[acc.pk]),
            'id': acc.pk,
            'name': jinja2.escape(unicode(acc)),
            'provider': provider.name,
            'provider-full': unicode(provider.full),
            'shared': acc.shared,
            'portal-url': provider.get_portal_url(app_slug)
        }
        return data

    return map(account, accounts)
示例#6
0
    def provider_regions(self):
        """A dict of provider regions keyed by provider id.

        Sorted by name (except for rest of world which is
        always last).

        """

        # Avoid circular import.
        from mkt.developers.providers import get_providers

        provider_regions = {}
        providers = get_providers()
        for prv in providers:
            provider_regions[prv.provider] = self.regions_by_name(
                provider=prv.provider)
        return provider_regions
示例#7
0
    def provider_regions(self):
        """A dict of provider regions keyed by provider id.

        Sorted by name (except for rest of world which is
        always last).

        """

        # Avoid circular import.
        from mkt.developers.providers import get_providers

        provider_regions = {}
        providers = get_providers()
        for prv in providers:
            provider_regions[prv.provider] = self.regions_by_name(
                provider=prv.provider)
        return provider_regions
示例#8
0
def payment_accounts(request):
    app_slug = request.GET.get('app-slug', '')
    accounts = PaymentAccount.objects.filter(
        user=request.amo_user,
        provider__in=[p.provider for p in get_providers()],
        inactive=False)

    def account(acc):
        app_names = (', '.join(
            unicode(apa.addon.name)
            for apa in acc.addonpaymentaccount_set.all()
            if hasattr(apa, 'addon')))
        provider = acc.get_provider()
        data = {
            'account-url':
            reverse('mkt.developers.provider.payment_account', args=[acc.pk]),
            'agreement-url':
            acc.get_agreement_url(),
            'agreement':
            'accepted' if acc.agreed_tos else 'rejected',
            'app-names':
            jinja2.escape(app_names),
            'delete-url':
            reverse('mkt.developers.provider.delete_payment_account',
                    args=[acc.pk]),
            'id':
            acc.pk,
            'name':
            jinja2.escape(unicode(acc)),
            'provider':
            provider.name,
            'provider-full':
            unicode(provider.full),
            'shared':
            acc.shared,
            'portal-url':
            provider.get_portal_url(app_slug)
        }
        return data

    return map(account, accounts)
示例#9
0
def payment_accounts(request):
    app_slug = request.GET.get("app-slug", "")
    if app_slug:
        app = Webapp.objects.get(app_slug=app_slug)
        app_name = app.name
    else:
        app_name = ""
    accounts = PaymentAccount.objects.filter(
        user=request.user, provider__in=[p.provider for p in get_providers()], inactive=False
    )

    def account(acc):
        def payment_account_names(app):
            account_names = [unicode(acc.payment_account) for acc in app.all_payment_accounts()]
            return (unicode(app.name), account_names)

        addon_payment_accounts = acc.addonpaymentaccount_set.all()
        associated_apps = [apa.addon for apa in addon_payment_accounts if hasattr(apa, "addon")]
        app_names = u", ".join(unicode(app.name) for app in associated_apps)
        app_payment_accounts = json.dumps(dict([payment_account_names(app) for app in associated_apps]))
        provider = acc.get_provider()
        data = {
            "account-url": reverse("mkt.developers.provider.payment_account", args=[acc.pk]),
            "agreement-url": acc.get_agreement_url(),
            "agreement": "accepted" if acc.agreed_tos else "rejected",
            "current-app-name": jinja2.escape(app_name),
            "app-names": jinja2.escape(app_names),
            "app-payment-accounts": jinja2.escape(app_payment_accounts),
            "delete-url": reverse("mkt.developers.provider.delete_payment_account", args=[acc.pk]),
            "id": acc.pk,
            "name": jinja2.escape(unicode(acc)),
            "provider": provider.name,
            "provider-full": unicode(provider.full),
            "shared": acc.shared,
            "portal-url": provider.get_portal_url(app_slug),
        }
        return data

    return map(account, accounts)
示例#10
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(request.POST or None,
                                              request=request,
                                              addon=addon,
                                              user=request.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.user)

    providers = get_providers()

    if 'form-TOTAL_FORMS' in request.POST:
        formset_data = request.POST
    else:
        formset_data = None
    account_list_formset = forms_payments.AccountListFormSet(
        data=formset_data,
        provider_data=[{
            'addon': addon,
            'user': request.user,
            'provider': provider
        } for provider in providers])

    if request.method == 'POST':

        active_forms = [premium_form, region_form, upsell_form]
        if formset_data is not None:
            active_forms.append(account_list_formset)

        success = all(form.is_valid() for form in active_forms)

        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 == mkt.ADDON_FREE_INAPP
            is_now_paid = (addon.premium_type in mkt.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()
                    if formset_data is not None:
                        account_list_formset.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)
    android_pay = waffle.flag_is_active(request, 'android-payments')
    desktop_pay = waffle.flag_is_active(request, 'desktop-payments')

    # 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 not android_pay:
        # When android-payments is off...
        invalid_paid_platform_state += [('android-mobile', True),
                                        ('android-tablet', True),
                                        ('firefoxos', False)]

    if not desktop_pay:
        # When desktop-payments is off...
        invalid_paid_platform_state += [('desktop', True)]

    cannot_be_paid = (addon.premium_type == mkt.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_name = []
    if tier_zero:
        paid_region_ids_by_name = tier_zero.region_ids_by_name()

    platforms = PAID_PLATFORMS(request)
    paid_platform_names = [unicode(platform[1]) for platform in platforms]

    provider_regions = {}
    if tier_zero:
        provider_regions = tier_zero.provider_regions()

    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,
            'PLATFORMS_NAMES':
            PLATFORMS_NAMES,
            'is_paid': (addon.premium_type in mkt.ADDON_PREMIUMS
                        or addon.premium_type == mkt.ADDON_FREE_INAPP),
            'cannot_be_paid':
            cannot_be_paid,
            'paid_platform_names':
            paid_platform_names,
            'is_packaged':
            addon.is_packaged,
            # Bango values
            'account_list_forms':
            account_list_formset.forms,
            'account_list_formset':
            account_list_formset,
            # Waffles
            'api_pricelist_url':
            reverse('price-list'),
            'payment_methods': {
                PAYMENT_METHOD_ALL: _('All'),
                PAYMENT_METHOD_CARD: _('Credit card'),
                PAYMENT_METHOD_OPERATOR: _('Carrier'),
            },
            'provider_lookup':
            dict(PROVIDER_CHOICES),
            'all_paid_region_ids_by_name':
            paid_region_ids_by_name,
            'providers':
            providers,
            'provider_regions':
            provider_regions,
            'enabled_provider_ids': [
                acct.payment_account.provider
                for acct in addon.all_payment_accounts()
            ]
        })
示例#11
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(
        request.POST or None, request=request, addon=addon,
        user=request.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.user)

    providers = get_providers()

    if 'form-TOTAL_FORMS' in request.POST:
        formset_data = request.POST
    else:
        formset_data = None
    account_list_formset = forms_payments.AccountListFormSet(
        data=formset_data,
        provider_data=[
            {'addon': addon, 'user': request.user, 'provider': provider}
            for provider in providers])

    if request.method == 'POST':

        active_forms = [premium_form, region_form, upsell_form]
        if formset_data is not None:
            active_forms.append(account_list_formset)

        success = all(form.is_valid() for form in active_forms)

        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()
                    if formset_data is not None:
                        account_list_formset.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_name = []
    if tier_zero:
        paid_region_ids_by_name = tier_zero.region_ids_by_name()

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

    provider_regions = {}
    if tier_zero:
        provider_regions = tier_zero.provider_regions()

    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,
                   'PLATFORMS_NAMES': PLATFORMS_NAMES,
                   '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,
                   'is_packaged': addon.is_packaged,
                   # Bango values
                   'account_list_forms': account_list_formset.forms,
                   'account_list_formset': account_list_formset,
                   # Waffles
                   'api_pricelist_url': reverse('price-list'),
                   'payment_methods': {
                       PAYMENT_METHOD_ALL: _('All'),
                       PAYMENT_METHOD_CARD: _('Credit card'),
                       PAYMENT_METHOD_OPERATOR: _('Carrier'),
                   },
                   'provider_lookup': dict(PROVIDER_CHOICES),
                   'all_paid_region_ids_by_name': paid_region_ids_by_name,
                   'providers': providers,
                   'provider_regions': provider_regions,
                  })
示例#12
0
def payments(request, addon_id, addon, webapp=False):
    premium_form = forms_payments.PremiumForm(request.POST or None, request=request, addon=addon, user=request.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.user)

    providers = get_providers()

    if "form-TOTAL_FORMS" in request.POST:
        formset_data = request.POST
    else:
        formset_data = None
    account_list_formset = forms_payments.AccountListFormSet(
        data=formset_data,
        provider_data=[{"addon": addon, "user": request.user, "provider": provider} for provider in providers],
    )

    if request.method == "POST":

        active_forms = [premium_form, region_form, upsell_form]
        if formset_data is not None:
            active_forms.append(account_list_formset)

        success = all(form.is_valid() for form in active_forms)

        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()
                    if formset_data is not None:
                        account_list_formset.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)
    android_payments_enabled = waffle.flag_is_active(request, "android-payments")

    # 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 = [("desktop", True)]

    if not android_payments_enabled:
        # When android-payments is off...
        invalid_paid_platform_state += [("android-mobile", True), ("android-tablet", True), ("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_name = []
    if tier_zero:
        paid_region_ids_by_name = tier_zero.region_ids_by_name()

    platforms = PAID_PLATFORMS(request)
    paid_platform_names = [unicode(platform[1]) for platform in platforms]

    provider_regions = {}
    if tier_zero:
        provider_regions = tier_zero.provider_regions()

    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,
            "PLATFORMS_NAMES": PLATFORMS_NAMES,
            "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,
            "is_packaged": addon.is_packaged,
            # Bango values
            "account_list_forms": account_list_formset.forms,
            "account_list_formset": account_list_formset,
            # Waffles
            "api_pricelist_url": reverse("price-list"),
            "payment_methods": {
                PAYMENT_METHOD_ALL: _("All"),
                PAYMENT_METHOD_CARD: _("Credit card"),
                PAYMENT_METHOD_OPERATOR: _("Carrier"),
            },
            "provider_lookup": dict(PROVIDER_CHOICES),
            "all_paid_region_ids_by_name": paid_region_ids_by_name,
            "providers": providers,
            "provider_regions": provider_regions,
        },
    )
示例#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}
    )