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

Commit 850c700

Browse files
author
Andy McKay
committed
spot out of date dev agreements (bug 719222)
1 parent 69db369 commit 850c700

File tree

9 files changed

+110
-7
lines changed

9 files changed

+110
-7
lines changed

apps/amo/tests/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ def decorated(request, *args, **kwargs):
199199
return decorated
200200

201201

202+
def days_ago(days):
203+
return datetime.now() - timedelta(days=days)
204+
205+
202206
class TestCase(RedisTest, test_utils.TestCase):
203207
"""Base class for all amo tests."""
204208
client_class = TestClient
@@ -378,7 +382,7 @@ def grant_permission(self, user_obj, rules):
378382
GroupUser.objects.create(group=group, user=user_obj)
379383

380384
def days_ago(self, days):
381-
return datetime.now() - timedelta(days=days)
385+
return days_ago(days)
382386

383387

384388
class AMOPaths(object):

lib/settings_base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,3 +1546,9 @@ def read_only_mode(env):
15461546

15471547
# Set this to True if you want region stores (eg: marketplace).
15481548
REGION_STORES = False
1549+
1550+
# When the dev. agreement gets updated and you need users to re-accept it
1551+
# change this date. You won't want to do this for minor format changes.
1552+
# The tuple is passed through to datetime.date, so please use a valid date
1553+
# tuple. If the value is None, then it will just not be used at all.
1554+
DEV_AGREEMENT_LAST_UPDATED = None

mkt/developers/helpers.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from collections import defaultdict
22
import urllib
33

4+
from django.conf import settings
45
from django.utils.encoding import smart_unicode
56

67
import chardet
78
import jinja2
89
from jingo import register
9-
from jingo.helpers import datetime
10+
from jingo.helpers import datetime as jingo_datetime
1011
from tower import ugettext as _, ungettext as ngettext
1112

1213
import amo
@@ -125,11 +126,11 @@ def status_choices(addon):
125126
def file_status_message(file, addon, file_history=False):
126127
choices = status_choices(addon)
127128
return {'fileid': file.id, 'platform': file.amo_platform.name,
128-
'created': datetime(file.created),
129+
'created': jingo_datetime(file.created),
129130
'status': choices[file.status],
130131
'file_history': file_history,
131132
'actions': amo.LOG_REVIEW_EMAIL_USER,
132-
'status_date': datetime(file.datestatuschanged)}
133+
'status_date': jingo_datetime(file.datestatuschanged)}
133134

134135

135136
@register.function
@@ -208,3 +209,23 @@ def disabled_payments_notice(context, addon=None):
208209
"""
209210
addon = context.get('addon', addon)
210211
return {'request': context.get('request'), 'addon': addon}
212+
213+
214+
@register.function
215+
def dev_agreement_ok(user):
216+
latest = settings.DEV_AGREEMENT_LAST_UPDATED
217+
if not latest:
218+
# Value not set for last updated.
219+
return True
220+
221+
if not user.read_dev_agreement:
222+
# If you don't have any apps, we we won't worry about this because
223+
# you'll be prompted on the first submission.
224+
return True
225+
226+
current = user.read_dev_agreement
227+
if current and current.date() < latest:
228+
# The dev agreement has been updated since you last submitted.
229+
return False
230+
231+
return True

mkt/developers/templates/developers/skeleton_impala.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ <h1 class="logo"><a href="{{ url('ecosystem.landing') }}">
8383
{% endblock %}
8484
{% endblock site_header %}
8585
</section>
86-
{% if ADMIN_MESSAGE or settings.READ_ONLY %}
86+
{% if ADMIN_MESSAGE or settings.READ_ONLY or not dev_agreement_ok(amo_user) %}
8787
<div id="site-notice">
8888
<div class="pad">
8989
{% if ADMIN_MESSAGE %}
@@ -95,9 +95,16 @@ <h1 class="logo"><a href="{{ url('ecosystem.landing') }}">
9595
website maintenance. We'll be back to full capacity shortly.
9696
{% endtrans %}</p>
9797
{% endif %}
98+
{% if not dev_agreement_ok(amo_user) %}
99+
<p>{% trans url=url('mkt.developers.apps.terms') %}
100+
The Terms of Service have changed since you last agreed to them.
101+
Please read and agree to the <a href="{{ url }}">new terms</a>.
102+
{% endtrans %}</p>
103+
{% endif %}
98104
</div>
99105
</div>
100106
{% endif %}
107+
101108
<div id="wrap">
102109
<div id="page" class="pad section c" role="main">
103110
{# Overridden in base_side_categories, which expands categories

mkt/developers/templates/developers/terms.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ <h1>{{ title }}</h1>
2222
{{ _('Additional Marketplace Policies') }}</a>
2323
</li>
2424
</ol>
25-
{% if not accepted %}
25+
{% if not accepted or not dev_agreement_ok(amo_user) %}
2626
<form id="agreement-form" method="post">
2727
{{ csrf() }}
2828
{{ agreement_form.read_dev_agreement }}

mkt/developers/tests/test_helpers.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# -*- coding: utf-8 -*-
2+
from datetime import datetime, timedelta
23
import unittest
34
import urllib
45

@@ -15,6 +16,7 @@
1516
from addons.models import Addon
1617
from mkt.developers import helpers
1718
from files.models import File, Platform
19+
from users.models import UserProfile
1820
from versions.models import Version
1921

2022

@@ -202,3 +204,36 @@ def test_disabled(self):
202204
self.addon.status = amo.STATUS_PUBLIC
203205
self.file.status = amo.STATUS_DISABLED
204206
self.expect(amo.STATUS_CHOICES[amo.STATUS_DISABLED])
207+
208+
209+
class TestDevAgreement(amo.tests.TestCase):
210+
211+
def setUp(self):
212+
self.user = UserProfile()
213+
214+
def test_none(self):
215+
with self.settings(DEV_AGREEMENT_LAST_UPDATED=None):
216+
eq_(helpers.dev_agreement_ok(self.user), True)
217+
218+
def test_date_oops(self):
219+
with self.settings(DEV_AGREEMENT_LAST_UPDATED=('wat?')):
220+
eq_(helpers.dev_agreement_ok(self.user), True)
221+
222+
def test_not_agreed(self):
223+
# The user has never agreed to it so in this case we don't need to
224+
# worry them about changes.
225+
self.user.update(read_dev_agreement=None)
226+
with self.settings(DEV_AGREEMENT_LAST_UPDATED=
227+
self.days_ago(10).date()):
228+
eq_(helpers.dev_agreement_ok(self.user), True)
229+
230+
def test_past_agreed(self):
231+
self.user.update(read_dev_agreement=self.days_ago(10))
232+
with self.settings(DEV_AGREEMENT_LAST_UPDATED=self.days_ago(5).date()):
233+
eq_(helpers.dev_agreement_ok(self.user), False)
234+
235+
def test_not_past(self):
236+
self.user.update(read_dev_agreement=self.days_ago(5))
237+
with self.settings(DEV_AGREEMENT_LAST_UPDATED=
238+
self.days_ago(10).date()):
239+
eq_(helpers.dev_agreement_ok(self.user), True)

mkt/developers/tests/test_views.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,3 +1649,30 @@ def test_accept(self):
16491649
res = self.client.post(self.url, {'read_dev_agreement': 'yeah'})
16501650
eq_(res.status_code, 200)
16511651
assert self.get_user().read_dev_agreement
1652+
1653+
@mock.patch.object(settings, 'DEV_AGREEMENT_LAST_UPDATED',
1654+
amo.tests.days_ago(-5).date())
1655+
def test_update(self):
1656+
past = self.days_ago(10)
1657+
self.user.update(read_dev_agreement=past)
1658+
res = self.client.post(self.url, {'read_dev_agreement': 'yeah'})
1659+
eq_(res.status_code, 200)
1660+
assert self.get_user().read_dev_agreement != past
1661+
1662+
@mock.patch.object(settings, 'DEV_AGREEMENT_LAST_UPDATED',
1663+
amo.tests.days_ago(-5).date())
1664+
def test_past(self):
1665+
past = self.days_ago(10)
1666+
self.user.update(read_dev_agreement=past)
1667+
res = self.client.get(self.url)
1668+
doc = pq(res.content)
1669+
eq_(doc('#site-notice').length, 1)
1670+
eq_(doc('#dev-agreement').length, 1)
1671+
eq_(doc('#agreement-form').length, 1)
1672+
1673+
def test_not_past(self):
1674+
res = self.client.get(self.url)
1675+
doc = pq(res.content)
1676+
eq_(doc('#site-notice').length, 0)
1677+
eq_(doc('#dev-agreement').length, 1)
1678+
eq_(doc('#agreement-form').length, 0)

mkt/developers/utils.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,3 @@ def check_upload(file_obj, upload_type, content_type):
8888
errors.append(_('Icons must be square.'))
8989

9090
return errors, upload_hash
91-

mkt/settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
import os
23

34
from lib.settings_base import *
@@ -381,3 +382,6 @@ def APPCACHE_MEDIA_DEBUG():
381382
# The hidden list from AMO's settings:
382383
'cy', 'sr', 'sr-Latn', 'tr',
383384
)
385+
386+
# Update this each time there's a major update.
387+
DEV_AGREEMENT_LAST_UPDATED = datetime.date(2012, 2, 23)

0 commit comments

Comments
 (0)