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

Commit 7035ead

Browse files
committed
tweaks to ACR compatibility tool (bug 692974)
1 parent 920d094 commit 7035ead

6 files changed

Lines changed: 81 additions & 27 deletions

File tree

apps/addons/admin.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django import forms
12
from django.contrib import admin
23

34
from . import models
@@ -64,9 +65,18 @@ class CompatOverrideRangeInline(admin.TabularInline):
6465
exclude = ('type',)
6566

6667

68+
class CompatOverrideAdminForm(forms.ModelForm):
69+
70+
def clean(self):
71+
if '_confirm' in self.data:
72+
raise forms.ValidationError('Click "Save" to confirm changes.')
73+
return self.cleaned_data
74+
75+
6776
class CompatOverrideAdmin(admin.ModelAdmin):
6877
raw_id_fields = ('addon',)
6978
inlines = [CompatOverrideRangeInline]
79+
form = CompatOverrideAdminForm
7080

7181

7282
admin.site.register(models.BlacklistedGuid)

apps/compat/forms.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ class CompatForm(forms.Form):
1616
('binary', _('Binary')),
1717
('non-binary', _('Non-binary'))),
1818
widget=RadioSelect, required=False)
19+
20+
21+
class AdminCompatForm(CompatForm):
22+
_choices = [('%.1f' % (x / 10.0), '%.0f%%' % (x * 10))
23+
for x in xrange(9, -1, -1)]
24+
ratio = forms.ChoiceField(choices=_choices, required=False)

apps/zadmin/templates/zadmin/compat.html

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<style>
99
#compat-form, #compat-form ul, #compat-form li { display: inline }
1010
#compat-form li { display: inline-block; margin-left: 1em }
11+
#compat-form label + label { margin-left: 1em }
1112
.bad { color: #800 }
1213
em.version { color: #888 }
1314
td, th { border-bottom-color: #ccc }
@@ -27,7 +28,7 @@
2728
<h2>{{ title }}</h2>
2829
<form class="go" action="" id="compat-form">
2930
<label>App: {{ form.appver }}</label>
30-
{{ form.version }}
31+
<label>Show reports over {{ form.ratio }} incompatibility</label>
3132
{{ form.type }}
3233
<noscript><button type="submit">Go</button></noscript>
3334
</form>
@@ -96,6 +97,8 @@ <h2>{{ title }}</h2>
9697
{{ csrf() }}
9798
<input type="hidden" name="_compat_ranges-TOTAL_FORMS" value="{{ initial + 1 }}">
9899
<input type="hidden" name="_compat_ranges-INITIAL_FORMS" value="{{ initial }}">
100+
<input type="hidden" name="_continue" value="1">
101+
<input type="hidden" name="_confirm" value="1">
99102
{% if not addon.self_hosted %}
100103
<input type="hidden" name="addon" value="{{ addon.id }}">
101104
{% endif %}
@@ -116,8 +119,7 @@ <h2>{{ title }}</h2>
116119
<input type="hidden" name="_compat_ranges-{{ initial }}-max_version" value="{{ addon.current_version }}">
117120
<input type="hidden" name="_compat_ranges-{{ initial }}-app" value="{{ app.id }}">
118121
<input type="hidden" name="_compat_ranges-{{ initial }}-min_app_version" value="{{ version }}a1">
119-
<input type="hidden" name="_compat_ranges-{{ initial }}-max_app_version" value="*">
120-
<input type="hidden" name="_continue" value="1">
122+
<input type="hidden" name="_compat_ranges-{{ initial }}-max_app_version" value="{{ version }}*">
121123
<button>Override Compat</button>
122124
</form>
123125
{% endif %}

apps/zadmin/tests/test_views.py

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from amo.tests import (formset, initial, close_to_now, assert_required,
2020
assert_no_validation_errors)
2121
from amo.urlresolvers import reverse
22-
from addons.models import Addon
22+
from addons.models import Addon, CompatOverride, CompatOverrideRange
2323
from applications.models import AppVersion
2424
from bandwagon.models import FeaturedCollection, MonthlyPick
2525
from compat.cron import compatibility_report
@@ -1495,6 +1495,11 @@ def generate_reports(self, addon, good, bad, app, app_version):
14951495
for x in xrange(bad):
14961496
CompatReport.objects.create(works_properly=False, **defaults)
14971497

1498+
def get_pq(self, **kw):
1499+
r = self.client.get(self.url, kw)
1500+
eq_(r.status_code, 200)
1501+
return pq(r.content)('#compat-results')
1502+
14981503
def test_defaults(self):
14991504
r = self.client.get(self.url)
15001505
eq_(r.status_code, 200)
@@ -1532,6 +1537,8 @@ def check_row(self, tr, addon, good, bad, percentage, app, app_version):
15321537
eq_(form.attr('action'), reverse('admin:addons_compatoverride_add'))
15331538
self.check_field(form, '_compat_ranges-TOTAL_FORMS', '1')
15341539
self.check_field(form, '_compat_ranges-INITIAL_FORMS', '0')
1540+
self.check_field(form, '_continue', '1')
1541+
self.check_field(form, '_confirm', '1')
15351542
self.check_field(form, 'addon', str(addon.id))
15361543
self.check_field(form, 'guid', addon.guid)
15371544

@@ -1541,7 +1548,8 @@ def check_row(self, tr, addon, good, bad, percentage, app, app_version):
15411548
self.check_field(form, compat_field % 'app', str(app.id))
15421549
self.check_field(form, compat_field % 'min_app_version',
15431550
app_version + 'a1')
1544-
self.check_field(form, compat_field % 'max_app_version', '*')
1551+
self.check_field(form, compat_field % 'max_app_version',
1552+
app_version + '*')
15451553

15461554
def check_field(self, form, name, val):
15471555
eq_(form.find('input[name="%s"]' % name).val(), val)
@@ -1552,23 +1560,28 @@ def test_firefox_hosted(self):
15521560
app_version=self.app_version)
15531561
self.update()
15541562

1555-
r = self.client.get(self.url)
1556-
eq_(r.status_code, 200)
1557-
table = pq(r.content)('#compat-results tbody')
1558-
tr = table.find('tr[data-addonid=%s]' % addon.id)
1563+
tr = self.get_pq().find('tr[data-addonid=%s]' % addon.id)
15591564
self.check_row(tr, addon, good=0, bad=11, percentage='100.0',
15601565
app=self.app, app_version=self.app_version)
15611566

1567+
# Add an override for this current app version.
1568+
compat = CompatOverride.objects.create(addon=addon, guid=addon.guid)
1569+
CompatOverrideRange.objects.create(compat=compat,
1570+
app_id=amo.FIREFOX.id, min_app_version=self.app_version + 'a1',
1571+
max_app_version=self.app_version + '*')
1572+
1573+
# Check that there is an override for this current app version.
1574+
tr = self.get_pq().find('tr[data-addonid=%s]' % addon.id)
1575+
eq_(tr.find('.overrides a').attr('href'),
1576+
reverse('admin:addons_compatoverride_change', args=[compat.id]))
1577+
15621578
def test_self_hosted(self):
15631579
addon = self.populate(guid='yyy', status=amo.STATUS_LISTED)
15641580
self.generate_reports(addon, good=2, bad=18, app=self.app,
15651581
app_version=self.app_version)
15661582
self.update()
15671583

1568-
r = self.client.get(self.url)
1569-
eq_(r.status_code, 200)
1570-
table = pq(r.content)('#compat-results tbody')
1571-
tr = table.find('tr[data-addonid=%s]' % addon.id)
1584+
tr = self.get_pq().find('tr[data-addonid=%s]' % addon.id)
15721585
eq_(tr.length, 1)
15731586

15741587
eq_(tr.find('.maxver').text(), 'Self Hosted')
@@ -1589,9 +1602,7 @@ def test_non_default_version(self):
15891602
app_version=app_version)
15901603
self.update()
15911604

1592-
r = self.client.get(self.url)
1593-
eq_(r.status_code, 200)
1594-
table = pq(r.content)('#compat-results tbody')
1605+
table = self.get_pq()
15951606
eq_(table.find('tr[data-addonid=%s]' % addon.id).length, 0)
15961607

15971608
r = self.client.get(self.url,
@@ -1601,3 +1612,20 @@ def test_non_default_version(self):
16011612
tr = table.find('tr[data-addonid=%s]' % addon.id)
16021613
self.check_row(tr, addon, good=0, bad=11, percentage='100.0',
16031614
app=self.app, app_version=app_version)
1615+
1616+
def test_ratio(self):
1617+
addon = self.populate(guid='aaa')
1618+
self.generate_reports(addon, good=11, bad=11, app=self.app,
1619+
app_version=self.app_version)
1620+
self.update()
1621+
1622+
# Should not show up for > 80%.
1623+
eq_(self.get_pq().find('tr[data-addonid=%s]' % addon.id).length, 0)
1624+
1625+
# Should not show up for > 50%.
1626+
tr = self.get_pq(ratio=.5).find('tr[data-addonid=%s]' % addon.id)
1627+
eq_(tr.length, 0)
1628+
1629+
# Should show up for > 40%.
1630+
tr = self.get_pq(ratio=.4).find('tr[data-addonid=%s]' % addon.id)
1631+
eq_(tr.length, 1)

apps/zadmin/views.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from addons.utils import ReverseNameLookup
4343
from bandwagon.models import Collection
4444
from compat.models import AppCompat
45-
from compat.forms import CompatForm
45+
from compat.forms import AdminCompatForm
4646
from devhub.models import ActivityLog
4747
from files.models import Approval, File
4848
from versions.compare import version_int as vint
@@ -402,23 +402,28 @@ def jetpack_resend(request, file_id):
402402
def compat(request):
403403
APP = amo.FIREFOX
404404
VER = site_settings.COMPAT[0]['main'] # Default: latest Firefox version.
405+
ratio = .8
405406
binary = None
406407

407408
# Expected usage:
408-
# For Firefox 8.0 reports: ?appver=1-8.0
409-
# For binary-only add-ons: ?appver=1-8.0&type=binary
410-
initial = {'appver': '%s-%s' % (APP.id, VER), 'type': 'all'}
409+
# For Firefox 8.0 reports: ?appver=1-8.0
410+
# For over 70% incompatibility: ?appver=1-8.0&ratio=0.7
411+
# For binary-only add-ons: ?appver=1-8.0&type=binary
412+
initial = {'appver': '%s-%s' % (APP.id, VER), 'ratio': ratio,
413+
'type': 'all'}
411414
initial.update(request.GET.items())
412415

413-
form = CompatForm(initial)
416+
form = AdminCompatForm(initial)
414417
if request.GET and form.is_valid():
415418
APP, VER = form.cleaned_data['appver'].split('-')
416419
APP = amo.APP_IDS[int(APP)]
420+
if form.cleaned_data['ratio']:
421+
ratio = float(form.cleaned_data['ratio'])
417422
if form.cleaned_data['type'] == 'binary':
418423
binary = True
419424

420-
app, ver = str(APP.id), str(vint(VER))
421-
usage_addons, usage_total = compat_stats(request, app, ver, binary)
425+
app, ver = str(APP.id), VER
426+
usage_addons, usage_total = compat_stats(request, app, ver, ratio, binary)
422427

423428
return jingo.render(request, 'zadmin/compat.html', {
424429
'app': APP,
@@ -429,15 +434,16 @@ def compat(request):
429434
})
430435

431436

432-
def compat_stats(request, app, ver, binary):
437+
def compat_stats(request, app, ver, ratio, binary):
433438
# Get the list of add-ons for usage stats.
434439
redis = redisutils.connections['master']
435440
# Show add-ons marked as incompatible with this current version having
436441
# greater than 10 incompatible reports and whose average exceeds 80%.
437-
prefix = 'works.%s.%s' % (app, ver)
442+
ver_int = str(vint(ver))
443+
prefix = 'works.%s.%s' % (app, ver_int)
438444
qs = (AppCompat.search()
439445
.filter(**{'%s.failure__gt' % prefix: 10,
440-
'%s.failure_ratio__gt' % prefix: .8,
446+
'%s.failure_ratio__gt' % prefix: ratio,
441447
'support.%s.max__gte' % app: 0})
442448
.order_by('-%s.failure_ratio' % prefix,
443449
'-%s.total' % prefix)
@@ -448,7 +454,7 @@ def compat_stats(request, app, ver, binary):
448454
for obj in addons.object_list:
449455
obj['usage'] = obj['usage'][app]
450456
obj['max_version'] = obj['max_version'][app]
451-
obj['works'] = obj['works'][app].get(ver, {})
457+
obj['works'] = obj['works'][app].get(ver_int, {})
452458
# Get all overrides for this add-on.
453459
obj['overrides'] = CompatOverride.objects.filter(addon__id=obj['id'])
454460
# Determine if there is an override for this current app version.

settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,8 @@ def read_only_mode(env):
12091209
# previous: the major version before :main.
12101210
COMPAT = (
12111211
# Firefox.
1212+
dict(app=1, main='11.0', versions=('11.0', '11.0a2', '11.0a1'),
1213+
previous='10.0'),
12121214
dict(app=1, main='10.0', versions=('10.0', '10.0a2', '10.0a1'),
12131215
previous='9.0'),
12141216
dict(app=1, main='9.0', versions=('9.0', '9.0a2', '9.0a1'),

0 commit comments

Comments
 (0)