Skip to content

Commit 5168c52

Browse files
dioxeviljeff
authored andcommitted
Refactor eula_policy action write path to be cleaner & safer (#22586)
* Refactor eula_policy action write path to be cleaner & safer https://www.django-rest-framework.org/api-guide/viewsets/#routing-additional-http-methods-for-extra-actions --------- Co-authored-by: Andrew Williamson <awilliamson@mozilla.com>
1 parent e38ab6d commit 5168c52

File tree

2 files changed

+81
-25
lines changed

2 files changed

+81
-25
lines changed

src/olympia/addons/tests/test_views.py

Lines changed: 74 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3015,7 +3015,7 @@ def test_developer_version_serializer_used_for_authors(self):
30153015
# not logged in
30163016
assert 'source' not in self.client.get(self.url).data
30173017

3018-
user = UserProfile.objects.create(username='user')
3018+
user = user_factory()
30193019
self.client.login_api(user)
30203020

30213021
# logged in but not an author
@@ -5022,7 +5022,7 @@ def test_developer_version_serializer_used_for_authors(self):
50225022
assert 'source' not in self.client.get(self.url).data['results'][0]
50235023
assert 'source' not in self.client.get(self.url).data['results'][1]
50245024

5025-
user = UserProfile.objects.create(username='user')
5025+
user = user_factory()
50265026
self.client.login_api(user)
50275027

50285028
# logged in but not an author
@@ -5045,6 +5045,7 @@ def setUp(self):
50455045
guid=generate_addon_guid(), name='My Addôn', slug='my-addon'
50465046
)
50475047
self.url = reverse_ns('addon-eula-policy', kwargs={'pk': self.addon.pk})
5048+
self.user = user_factory(read_dev_agreement=self.days_ago(1))
50485049

50495050
def test_url(self):
50505051
self.detail_url = reverse_ns('addon-detail', kwargs={'pk': self.addon.pk})
@@ -5076,8 +5077,7 @@ def test_eula_and_policy(self):
50765077
assert data['privacy_policy'] == {'en-US': 'My Prïvacy, My Policy'}
50775078

50785079
def test_update_non_author(self):
5079-
user = UserProfile.objects.create(username='user')
5080-
self.client.login_api(user)
5080+
self.client.login_api(self.user)
50815081
response = self.client.patch(
50825082
self.url,
50835083
{
@@ -5136,9 +5136,8 @@ def test_update_anonymous(self):
51365136
assert response.status_code == 401
51375137

51385138
def test_update(self):
5139-
user = UserProfile.objects.create(username='user')
5140-
AddonUser.objects.create(user=user, addon=self.addon)
5141-
self.client.login_api(user)
5139+
AddonUser.objects.create(user=self.user, addon=self.addon)
5140+
self.client.login_api(self.user)
51425141
assert not ActivityLog.objects.filter(
51435142
action=amo.LOG.EDIT_PROPERTIES.id
51445143
).exists()
@@ -5178,9 +5177,8 @@ def test_update(self):
51785177
].details == ['eula', 'privacy_policy']
51795178

51805179
def test_update_put(self):
5181-
user = UserProfile.objects.create(username='user')
5182-
AddonUser.objects.create(user=user, addon=self.addon)
5183-
self.client.login_api(user)
5180+
AddonUser.objects.create(user=self.user, addon=self.addon)
5181+
self.client.login_api(self.user)
51845182
response = self.client.put(
51855183
self.url,
51865184
{
@@ -5195,12 +5193,73 @@ def test_update_put(self):
51955193
)
51965194
assert response.status_code == 405
51975195

5196+
def test_update_author_not_read_dev_agreement(self):
5197+
AddonUser.objects.create(user=self.user, addon=self.addon)
5198+
self.user.update(read_dev_agreement=None)
5199+
self.client.login_api(self.user)
5200+
response = self.client.patch(
5201+
self.url,
5202+
{
5203+
'eula': {
5204+
'en-US': 'My Updated Add-on EULA in English',
5205+
'fr': 'Mes Conditions générales d’utilisation',
5206+
},
5207+
'privacy_policy': {
5208+
'en-US': 'My privacy policy',
5209+
},
5210+
},
5211+
)
5212+
assert response.status_code == 403
5213+
self.addon.reload()
5214+
assert not self.addon.eula
5215+
assert not self.addon.privacy_policy
5216+
5217+
def test_update_reviewer_not_author(self):
5218+
self.grant_permission(self.user, 'Addons:Review')
5219+
self.client.login_api(self.user)
5220+
response = self.client.patch(
5221+
self.url,
5222+
{
5223+
'eula': {
5224+
'en-US': 'My Updated Add-on EULA in English',
5225+
'fr': 'Mes Conditions générales d’utilisation',
5226+
},
5227+
'privacy_policy': {
5228+
'en-US': 'My privacy policy',
5229+
},
5230+
},
5231+
)
5232+
assert response.status_code == 403
5233+
self.addon.reload()
5234+
assert not self.addon.eula
5235+
assert not self.addon.privacy_policy
5236+
5237+
def test_update_disabled(self):
5238+
AddonUser.objects.create(user=self.user, addon=self.addon)
5239+
self.client.login_api(self.user)
5240+
self.addon.update(status=amo.STATUS_DISABLED)
5241+
response = self.client.patch(
5242+
self.url,
5243+
{
5244+
'eula': {
5245+
'en-US': 'My Updated Add-on EULA in English',
5246+
'fr': 'Mes Conditions générales d’utilisation',
5247+
},
5248+
'privacy_policy': {
5249+
'en-US': 'My privacy policy',
5250+
},
5251+
},
5252+
)
5253+
assert response.status_code == 403
5254+
self.addon.reload()
5255+
assert not self.addon.eula
5256+
assert not self.addon.privacy_policy
5257+
51985258
def test_update_something_else(self):
51995259
assert self.addon.summary
52005260
original_summary = self.addon.summary
5201-
user = UserProfile.objects.create(username='user')
5202-
AddonUser.objects.create(user=user, addon=self.addon)
5203-
self.client.login_api(user)
5261+
AddonUser.objects.create(user=self.user, addon=self.addon)
5262+
self.client.login_api(self.user)
52045263
response = self.client.patch(
52055264
self.url,
52065265
{'summary': 'attempting to change the summary via wrong endpoint'},
@@ -5212,10 +5271,9 @@ def test_update_something_else(self):
52125271
assert self.addon.summary == original_summary
52135272

52145273
def test_update_on_theme(self):
5215-
user = UserProfile.objects.create(username='user')
52165274
self.addon.update(type=amo.ADDON_STATICTHEME)
5217-
AddonUser.objects.create(user=user, addon=self.addon)
5218-
self.client.login_api(user)
5275+
AddonUser.objects.create(user=self.user, addon=self.addon)
5276+
self.client.login_api(self.user)
52195277
response = self.client.patch(
52205278
self.url,
52215279
{

src/olympia/addons/views.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
RetrieveModelMixin,
2020
UpdateModelMixin,
2121
)
22-
from rest_framework.permissions import SAFE_METHODS, IsAuthenticated
22+
from rest_framework.permissions import IsAuthenticated
2323
from rest_framework.response import Response
2424
from rest_framework.settings import api_settings
2525
from rest_framework.views import APIView
@@ -346,20 +346,18 @@ def get_georestrictions(self):
346346

347347
@action(
348348
detail=True,
349-
methods=['get', 'patch'],
350349
serializer_class=AddonEulaPolicySerializer,
351350
# For this action, developers use the same serializer - it only
352351
# contains eula/privacy policy.
353352
serializer_class_for_developers=AddonEulaPolicySerializer,
354353
)
355354
def eula_policy(self, request, pk=None):
356-
kwargs = {}
357-
if request.method in SAFE_METHODS:
358-
method = self.retrieve
359-
else:
360-
kwargs['partial'] = True
361-
method = self.update
362-
return method(request, **kwargs)
355+
return self.retrieve(request)
356+
357+
@eula_policy.mapping.patch
358+
def update_eula_policy(self, request, pk=None):
359+
self.permission_classes = self.write_permission_classes
360+
return self.update(request, partial=True)
363361

364362
@action(detail=True)
365363
def delete_confirm(self, request, *args, **kwargs):

0 commit comments

Comments
 (0)