Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions src/olympia/api/tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from django.test import override_settings

from rest_framework.test import APIRequestFactory

from olympia.api.utils import is_gate_active

factory = APIRequestFactory()


@override_settings(DRF_API_GATES={'v1': None, 'v2': {'foo'}})
def test_is_gate_active():
request = factory.get('/')

assert not is_gate_active(request, 'foo')

request.version = 'v2'

assert is_gate_active(request, 'foo')


@override_settings(DRF_API_GATES={
'v1': None, 'v2': {'foo'}, 'v3': {'baa'}})
def test_is_gate_active_explicit_upgrades():
# Test that we're not implicitly upgrading feature gates
request = factory.get('/')

assert not is_gate_active(request, 'baa')

request.version = 'v2'

assert not is_gate_active(request, 'baa')

request.version = 'v3'

assert is_gate_active(request, 'baa')
14 changes: 14 additions & 0 deletions src/olympia/api/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.conf import settings


def is_gate_active(request, name):
"""Check if a specific gate is active for the current API version.
Note that `request` has to be a :class:`~rest_framework.request.Request`
object that has `version` attached.
We're not examining Django request objects.
"""
gates = settings.DRF_API_GATES.get(getattr(request, 'version', None), None)
if not gates:
return False

return name in gates
8 changes: 8 additions & 0 deletions src/olympia/lib/settings_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -1673,6 +1673,14 @@ def get_redis_settings(uri):
'JWT_ALLOW_REFRESH': False,
}

DRF_API_GATES = {
'v3': (
'ratings-rating-shim',
),
'v4': (
)
}

REST_FRAMEWORK = {
# Set this because the default is to also include:
# 'rest_framework.renderers.BrowsableAPIRenderer'
Expand Down
13 changes: 11 additions & 2 deletions src/olympia/ratings/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from olympia.accounts.serializers import BaseUserSerializer
from olympia.addons.serializers import SimpleVersionSerializer
from olympia.api.utils import is_gate_active
from olympia.ratings.forms import RatingForm
from olympia.ratings.models import Rating
from olympia.versions.models import Version
Expand Down Expand Up @@ -135,13 +136,21 @@ def to_internal_value(self, data):

class RatingSerializer(BaseRatingSerializer):
reply = RatingSerializerReply(read_only=True)
rating = serializers.IntegerField(min_value=1, max_value=5)
version = RatingVersionSerializer()
score = serializers.IntegerField(min_value=1, max_value=5, source='rating')

class Meta:
model = Rating
fields = BaseRatingSerializer.Meta.fields + (
'rating', 'reply', 'version')
'score', 'reply', 'version')

def __init__(self, *args, **kwargs):
super(RatingSerializer, self).__init__(*args, **kwargs)
request = kwargs.get('context', {}).get('request')
if request and is_gate_active(request, 'ratings-rating-shim'):
score_field = self.fields.pop('score')
score_field.source = None # drf complains if we specifiy source.
self.fields['rating'] = score_field

def validate_version(self, version):
if self.partial:
Expand Down
18 changes: 17 additions & 1 deletion src/olympia/ratings/tests/test_serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
from django.test import override_settings

from mock import Mock
from rest_framework.test import APIRequestFactory

Expand Down Expand Up @@ -44,7 +46,7 @@ def test_basic(self):
assert result['title'] == unicode(self.rating.title)
assert result['previous_count'] == int(self.rating.previous_count)
assert result['is_latest'] == self.rating.is_latest
assert result['rating'] == int(self.rating.rating)
assert result['score'] == int(self.rating.rating)
assert result['reply'] is None
assert result['user'] == {
'id': self.user.pk,
Expand All @@ -61,6 +63,20 @@ def test_basic(self):
result = self.serialize()
assert result['version'] is None

@override_settings(DRF_API_GATES={None: ('ratings-rating-shim',)})
def test_ratings_score_is_rating_with_gate(self):
addon = addon_factory()
self.view.get_addon_object.return_value = addon
self.rating = Rating.objects.create(
addon=addon, user=self.user, rating=4,
version=addon.current_version, body=u'This is my rëview. Like ît?',
title=u'My Review Titlé')

result = self.serialize()

assert result['id'] == self.rating.pk
assert result['rating'] == int(self.rating.rating)

def test_url_for_yourself(self):
addon = addon_factory()
self.view.get_addon_object.return_value = addon
Expand Down
Loading