Skip to content
This repository was archived by the owner on Mar 15, 2018. It is now read-only.

Commit fc285b1

Browse files
committed
allow developers to use accounts for which they have accepted the TOS (bug 834544)
1 parent c2e9844 commit fc285b1

File tree

10 files changed

+64
-85
lines changed

10 files changed

+64
-85
lines changed

media/css/devreg/payments.less

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -404,15 +404,17 @@
404404
}
405405

406406
.terms-accepted {
407-
color: orangered;
408407
font-family: monospace;
408+
}
409+
410+
.accepted .terms-accepted {
411+
color: green;
409412
&:before {
410-
content: "\2717";
411-
}
412-
&.accepted {
413-
color: green;
414-
&:before {
415-
content: "\2713";
416-
}
413+
content: "\2713";
417414
}
418415
}
416+
417+
.accepted .accept-tos,
418+
.rejected .modify-account {
419+
display: none;
420+
}

media/js/devreg/payments-manage.js

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,45 @@ define('payments-manage', ['payments'], function(payments) {
22
'use strict';
33

44
function refreshAccountForm(data) {
5-
var $account_list_form = $('#bango-account-list');
6-
$account_list_form.load($account_list_form.data('url'));
5+
var $accountListForm = $('#bango-account-list');
6+
$accountListForm.load($accountListForm.data('url'));
77
}
88

99
function newBangoPaymentAccount(e) {
1010
var $overlay = payments.getOverlay('add-bango-account');
1111
payments.setupPaymentAccountOverlay($overlay, showAgreement);
1212
}
1313

14-
function agreementSuccess(pk) {
15-
$('.account-list [data-account=' + pk + '] .terms-accepted').removeClass('rejected').addClass('accepted');
16-
}
14+
function setupAgreementOverlay(data, onsubmit) {
15+
var $waiting_overlay = payments.getOverlay('bango-waiting');
1716

18-
function agreementError(pk) {
19-
$('.account-list [data-account=' + pk + '] .terms-accepted').removeClass('accepted').addClass('rejected');
20-
}
17+
$.getJSON(data['agreement-url'], function(response) {
18+
var $overlay = payments.getOverlay('show-agreement');
19+
$overlay.on('submit', 'form', _pd(function(e) {
20+
var $form = $(this);
2121

22-
var agreementUrl = $('#show-agreement-template').data('url');
22+
// Assume the POST below was a success, and close the modal.
23+
$overlay.detach().trigger('overlay_dismissed');
24+
onsubmit.apply($form, data);
2325

24-
function setupAgreementOverlay(data, $overlay, onsubmit) {
25-
var url = format(agreementUrl, data.pk);
26+
// If the POST failed, we show an error message.
27+
$.post(data['agreement-url'], $form.serialize(), refreshAccountForm).fail(function() {
28+
$waiting_overlay.find('h2').text(gettext('Error'));
29+
$waiting_overlay.find('p').text(gettext('There was a problem contacting the payment server.'));
30+
});
31+
}));
2632

27-
// TODO: Do something with waiting overlays. This is slow.
28-
$.getJSON(url, function(data) {
2933
// Plop in date of agreement.
3034
var msg = $('.agreement-valid');
31-
msg.html(format(msg.html(), {date: data.valid}));
35+
msg.html(format(msg.html(), {date: response.valid}));
3236

3337
// Plop in text of agreement.
34-
$('.agreement-text').text(data.text);
35-
});
36-
37-
$overlay.on('submit', 'form', _pd(function(e) {
38-
var $form = $(this);
39-
40-
// Assume the POST below was a success, and close the modal.
41-
$overlay.detach();
42-
z.body.removeClass('overlayed');
43-
onsubmit.apply($form, data);
44-
45-
// If the POST failed, we show an error message.
46-
$.post(url, $form.serialize(), function(response) {
47-
if (response.accepted) {
48-
agreementSuccess(data.pk);
49-
} else {
50-
agreementError();
51-
}
52-
}, 'json').error(function() {
53-
agreementError(data.pk);
54-
});
55-
})).on('overlay_dismissed', function() {
56-
// If it wasn't already marked as successful, then the user cancelled.
57-
if (!$('.account-list [data-account=' + data.pk + '] .terms-accepted.success')) {
58-
agreementError(data.pk);
59-
}
38+
$('.agreement-text').text(response.text);
6039
});
6140
}
6241

6342
function showAgreement(data) {
64-
var $overlay = payments.getOverlay('show-agreement');
65-
setupAgreementOverlay(data, $overlay, function() {
43+
setupAgreementOverlay(data, function() {
6644
refreshAccountForm();
6745
$('#no-payment-providers').addClass('js-hidden');
6846
});
@@ -110,10 +88,12 @@ define('payments-manage', ['payments'], function(payments) {
11088

11189
// Post to the delete URL, then refresh the account form.
11290
$.post($tr.data('delete-url')).then(refreshAccountForm);
113-
})).on('click', 'a.modify-account', _pd(function() {
91+
})).on('click', '.modify-account', _pd(function() {
11492
// Get the account URL from the table row and pass it to
11593
// the function to handle the Edit overlay.
11694
editBangoPaymentAccount($(this).parents('tr').data('account-url'))();
95+
})).on('click', '.accept-tos', _pd(function() {
96+
showAgreement($(this).parents('tr').data());
11797
}));
11898
});
11999
}

media/js/devreg/payments.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ define('payments', [], function() {
88
overlay.html($('#' + name + '-template').html())
99
.addClass('show')
1010
.on('click', '.close', _pd(function() {
11-
// TODO: Generalize this with the event listeners in overlay.js.
12-
overlay.trigger('overlay_dismissed');
13-
z.body.removeClass('overlayed');
14-
overlay.remove();
11+
overlay.trigger('overlay_dismissed').remove();
1512
}));
1613
return overlay;
1714
}

media/js/mkt/overlay.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
var $overlay = $('.overlay.show');
99
if ($overlay.length) {
1010
$overlay.removeClass('show');
11-
z.body.removeClass('overlayed');
1211
$overlay.trigger('overlay_dismissed');
1312
}
1413
}
@@ -28,8 +27,11 @@
2827
e.preventDefault();
2928
dismiss();
3029
}
31-
}).on('dismiss', '.overlay', dismiss
32-
).on('click', '.overlay .dismiss', _pd(dismiss));
30+
}).on('dismiss', '.overlay', dismiss)
31+
.on('click', '.overlay .dismiss', _pd(dismiss))
32+
.on('overlay_dismissed', function() {
33+
z.body.removeClass('overlayed');
34+
});
3335

3436
})();
3537

@@ -51,4 +53,4 @@ function notify(msg, title) {
5153
z.win.on('notify', function(e, o) {
5254
if (!o.msg) return;
5355
notify(o.msg, o.title);
54-
});
56+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE payment_accounts ADD COLUMN agreed_tos tinyint(1) unsigned;

mkt/developers/forms_payments.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,6 @@ def save(self):
214214

215215

216216
class UpsellForm(happyforms.Form):
217-
218217
upsell_of = AddonChoiceField(queryset=Addon.objects.none(), required=False,
219218
label=_lazy(u'This is a paid upgrade of'),
220219
empty_label=_lazy(u'Not an upgrade'))
@@ -259,7 +258,6 @@ def save(self):
259258

260259

261260
class BangoPaymentAccountForm(happyforms.Form):
262-
263261
bankAccountPayeeName = forms.CharField(
264262
max_length=50, label=_lazy(u'Account Holder Name'))
265263
companyName = forms.CharField(
@@ -349,8 +347,8 @@ def __init__(self, *args, **kwargs):
349347

350348
super(BangoAccountListForm, self).__init__(*args, **kwargs)
351349

352-
self.fields['accounts'].queryset = (
353-
PaymentAccount.objects.filter(user=user, inactive=False))
350+
self.fields['accounts'].queryset = PaymentAccount.objects.filter(
351+
user=user, inactive=False, agreed_tos=True)
354352

355353
try:
356354
current_account = AddonPaymentAccount.objects.get(addon=self.addon)

mkt/developers/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def create(cls, user):
5151
class PaymentAccount(CurlingHelper, amo.models.ModelBase):
5252
user = UserForeignKey()
5353
name = models.CharField(max_length=64)
54+
agreed_tos = models.BooleanField()
5455
solitude_seller = models.ForeignKey(SolitudeSeller)
5556

5657
# These two fields can go away when we're not 1:1 with SolitudeSellers.

mkt/developers/templates/developers/payments/includes/accept_terms.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
<script type="text/template" id="show-agreement-template"
2-
data-url="{{ url('mkt.developers.bango.agreement', '0')|replace('0', '{0}') }}">
1+
<script type="text/template" id="show-agreement-template">
32
<section class="show-agreement">
43
<header>
54
<h2>{{ _('Bango Terms of Agreement') }}</h2>

mkt/developers/templates/developers/payments/includes/account_list.html

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ <h2>{{ _('Payment Accounts') }}</h2>
2727
</script>
2828

2929
<script type="text/template" id="account-row-template">
30-
<tr data-account="{id}"
31-
data-delete-url="{delete-url}"
32-
data-account-url="{account-url}">
30+
<tr class="{agreement}"
31+
data-account="{id}"
32+
data-account-url="{account-url}"
33+
data-agreement-url="{agreement-url}"
34+
data-delete-url="{delete-url}">
3335
<td><div class="terms-accepted {agreement}"></div></td>
3436
<td>{name}</td>
35-
<td><a href="#" class="modify-account">{{ _('Modify') }}</a></td>
37+
<td><a href="#" class="modify-account">{{ _('Modify') }}</a> <a href="#" class="accept-tos">{{ _('Accept Terms of Service') }}</a></td>
3638
<td><a href="#" class="delete-account">{{ _('Delete') }}</a></td>
3739
</tr>
3840
</script>

mkt/developers/views_payments.py

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,11 @@ def account(acc):
146146
reverse('mkt.developers.bango.payment_account', args=[acc.pk]),
147147
'delete-url':
148148
reverse('mkt.developers.bango.delete_payment_account',
149-
args=[acc.pk])
149+
args=[acc.pk]),
150+
'agreement-url':
151+
reverse('mkt.developers.bango.agreement', args=[acc.pk]),
152+
'agreement': 'accepted' if acc.agreed_tos else 'rejected'
150153
}
151-
data['agreement'] = 'rejected'
152-
try:
153-
if _agreement(request, acc.pk)['accepted']:
154-
data['agreement'] = 'accepted'
155-
except KeyError:
156-
pass
157154
return data
158155

159156
return map(account, accounts)
@@ -185,7 +182,10 @@ def payments_accounts_add(request):
185182
raise # We want to see these exceptions!
186183
return http.HttpResponse(
187184
_(u'Could not connect to payment server.'), status=400)
188-
return {'pk': obj.pk}
185+
return {
186+
'pk': obj.pk,
187+
'agreement-url': reverse('mkt.developers.bango.agreement', args=[obj.pk]),
188+
}
189189

190190

191191
@write
@@ -273,21 +273,18 @@ def get_seller_product(account):
273273
.get_object_or_404())
274274

275275

276-
def _agreement(request, id):
276+
# TODO: move these into a tastypie API.
277+
@login_required
278+
@json_view
279+
def agreement(request, id):
277280
account = get_object_or_404(models.PaymentAccount, pk=id,
278281
user=request.user)
279282
# It's a shame we have to do another get to find this out.
280283
package = client.api.bango.package(account.uri).get_object_or_404()
281284
if request.method == 'POST':
282285
# Set the agreement.
286+
account.update(agreed_tos=True)
283287
return (client.api.bango.sbi.post(
284288
data={'seller_bango': package['resource_uri']}))
285289
return (client.api.bango.sbi.agreement
286290
.get_object(data={'seller_bango': package['resource_uri']}))
287-
288-
289-
# TODO: move these into a tastypie API.
290-
@login_required
291-
@json_view
292-
def agreement(request, id):
293-
return _agreement(request, id)

0 commit comments

Comments
 (0)