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

Commit 0805214

Browse files
committed
Updated to allow Sr Reviewers to certain admin tools (bug 750237)
1 parent 7a2bb9f commit 0805214

File tree

4 files changed

+58
-28
lines changed

4 files changed

+58
-28
lines changed

apps/zadmin/decorators.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,27 @@
66
from amo.decorators import login_required
77

88

9-
def admin_ish_required(f):
10-
"""Admin, or someone with AdminTools:View, required."""
11-
@functools.wraps(f)
12-
@login_required
13-
def wrapper(request, *args, **kw):
14-
if (action_allowed(request, 'Admin', '%') or
15-
action_allowed(request, 'AdminTools', 'View')):
16-
return f(request, *args, **kw)
17-
return http.HttpResponseForbidden()
18-
return wrapper
9+
def admin_required(reviewers=False):
10+
"""
11+
Admin, or someone with AdminTools:View, required.
12+
13+
If reviewers=True, ReviewerAdminTools:View is allowed also.
14+
"""
15+
def decorator(f):
16+
@login_required
17+
@functools.wraps(f)
18+
def wrapper(request, *args, **kw):
19+
admin = (action_allowed(request, 'Admin', '%') or
20+
action_allowed(request, 'AdminTools', 'View'))
21+
if reviewers == True:
22+
admin = (admin or
23+
action_allowed(request, 'ReviewerAdminTools', 'View'))
24+
if admin:
25+
return f(request, *args, **kw)
26+
return http.HttpResponseForbidden()
27+
return wrapper
28+
# If decorator has no args, and is "paren-less", it's callable.
29+
if callable(reviewers):
30+
return decorator(reviewers)
31+
else:
32+
return decorator

apps/zadmin/tests/test_views.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,6 +1854,21 @@ def test_staff_user(self):
18541854
eq_(self.client.get(
18551855
reverse('zadmin.oauth-consumer-create')).status_code, 403)
18561856

1857+
def test_sr_reviewers_user(self):
1858+
# Sr Reviewers users have only a few privileges.
1859+
user = UserProfile.objects.get(email='regular@mozilla.com')
1860+
group = Group.objects.create(name='Sr Reviewer',
1861+
rules='ReviewerAdminTools:View')
1862+
GroupUser.objects.create(group=group, user=user)
1863+
assert self.client.login(username='regular@mozilla.com',
1864+
password='password')
1865+
eq_(self.client.get(reverse('zadmin.index')).status_code, 200)
1866+
eq_(self.client.get(reverse('zadmin.flagged')).status_code, 200)
1867+
eq_(self.client.get(reverse('zadmin.addon-search')).status_code, 200)
1868+
eq_(self.client.get(reverse('zadmin.settings')).status_code, 403)
1869+
eq_(self.client.get(
1870+
reverse('zadmin.oauth-consumer-create')).status_code, 403)
1871+
18571872
def test_unprivileged_user(self):
18581873
# Unprivileged user.
18591874
assert self.client.login(username='regular@mozilla.com',

apps/zadmin/views.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
from zadmin.models import SiteEvent
5353

5454
from . import tasks
55-
from .decorators import admin_ish_required
55+
from .decorators import admin_required
5656
from .forms import (AddonStatusForm, BulkValidationForm, CompatForm,
5757
DevMailerForm, FeaturedCollectionFormSet, FileFormSet,
5858
JetpackUpgradeForm, MonthlyPickFormSet, NotifyForm,
@@ -62,7 +62,7 @@
6262
log = commonware.log.getLogger('z.zadmin')
6363

6464

65-
@admin_ish_required
65+
@admin_required(reviewers=True)
6666
def flagged(request):
6767
addons = Addon.objects.filter(admin_review=True).order_by('-created')
6868

@@ -138,7 +138,7 @@ def hera(request):
138138
{'form': form, 'boxes': boxes})
139139

140140

141-
@admin_ish_required
141+
@admin_required
142142
def show_settings(request):
143143
settings_dict = debug.get_safe_settings()
144144

@@ -159,7 +159,7 @@ def show_settings(request):
159159
{'settings_dict': settings_dict})
160160

161161

162-
@admin_ish_required
162+
@admin_required
163163
def env(request):
164164
return http.HttpResponse(u'<pre>%s</pre>' % (jinja2.escape(request)))
165165

@@ -187,7 +187,7 @@ def application_versions_json(request):
187187
return {'choices': f.version_choices_for_app_id(app_id)}
188188

189189

190-
@admin_ish_required
190+
@admin_required
191191
def validation(request, form=None):
192192
if not form:
193193
form = BulkValidationForm()
@@ -217,7 +217,7 @@ def find_files(job):
217217
tasks.add_validation_jobs.delay(pks, job.pk)
218218

219219

220-
@admin_ish_required
220+
@admin_required
221221
def start_validation(request):
222222
form = BulkValidationForm(request.POST)
223223
if form.is_valid():
@@ -230,7 +230,7 @@ def start_validation(request):
230230
return validation(request, form=form)
231231

232232

233-
@admin_ish_required
233+
@admin_required
234234
@post_required
235235
@json_view
236236
def job_status(request):
@@ -255,7 +255,7 @@ def completed_versions_dirty(job):
255255
.values_list('pk', flat=True).distinct())
256256

257257

258-
@admin_ish_required
258+
@admin_required
259259
@post_required
260260
@json_view
261261
def notify_syntax(request):
@@ -266,7 +266,7 @@ def notify_syntax(request):
266266
return {'valid': True, 'error': None}
267267

268268

269-
@admin_ish_required
269+
@admin_required
270270
@post_required
271271
def notify_failure(request, job):
272272
job = get_object_or_404(ValidationJob, pk=job)
@@ -284,7 +284,7 @@ def notify_failure(request, job):
284284
return redirect(reverse('zadmin.validation'))
285285

286286

287-
@admin_ish_required
287+
@admin_required
288288
@post_required
289289
def notify_success(request, job):
290290
job = get_object_or_404(ValidationJob, pk=job)
@@ -317,7 +317,7 @@ def email_preview_csv(request, topic):
317317
return resp
318318

319319

320-
@admin_ish_required
320+
@admin_required
321321
def validation_tally_csv(request, job_id):
322322
resp = http.HttpResponse()
323323
resp['Content-Type'] = 'text/csv; charset=utf-8'
@@ -402,7 +402,7 @@ def jetpack_resend(request, file_id):
402402
return redirect('zadmin.jetpack')
403403

404404

405-
@admin_ish_required
405+
@admin_required
406406
def compat(request):
407407
APP = amo.FIREFOX
408408
VER = settings.COMPAT[0]['main'] # Default: latest Firefox version.
@@ -495,7 +495,7 @@ def es_collections_json(request):
495495
return data
496496

497497

498-
@admin_ish_required
498+
@admin_required
499499
@post_required
500500
def featured_collection(request):
501501
try:
@@ -507,7 +507,7 @@ def featured_collection(request):
507507
dict(collection=c))
508508

509509

510-
@admin_ish_required
510+
@admin_required
511511
def features(request):
512512
form = FeaturedCollectionFormSet(request.POST or None)
513513
if request.method == 'POST' and form.is_valid():
@@ -642,13 +642,13 @@ def addon_name_blocklist(request):
642642
dict(rn=rn, addon=addon))
643643

644644

645-
@admin_ish_required
645+
@admin_required(reviewers=True)
646646
def index(request):
647647
log = ActivityLog.objects.admin_events()[:5]
648648
return jingo.render(request, 'zadmin/index.html', {'log': log})
649649

650650

651-
@admin_ish_required
651+
@admin_required(reviewers=True)
652652
def addon_search(request):
653653
ctx = {}
654654
if 'q' in request.GET:
@@ -702,7 +702,7 @@ def general_search(request, app_id, model_id):
702702
for o in qs[:limit]]
703703

704704

705-
@admin_ish_required
705+
@admin_required(reviewers=True)
706706
@addon_view
707707
def addon_manage(request, addon):
708708

@@ -814,7 +814,7 @@ def delete_site_event(request, event_id):
814814
return redirect('zadmin.site_events')
815815

816816

817-
@admin_ish_required
817+
@admin_required
818818
def generate_error(request):
819819
form = GenerateErrorForm(request.POST or None)
820820
if request.method == 'POST' and form.is_valid():

migrations/397-perms-sr-reviewers.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
UPDATE groups SET rules=CONCAT(rules, ',ReviewerAdminTools:View') WHERE name='Senior Add-on Reviewers';

0 commit comments

Comments
 (0)