Skip to content

Commit

Permalink
Merge 3eefbd7 into c60507c
Browse files Browse the repository at this point in the history
  • Loading branch information
Douglas Paz committed Jul 5, 2018
2 parents c60507c + 3eefbd7 commit 6067e0c
Show file tree
Hide file tree
Showing 10 changed files with 624 additions and 0 deletions.
8 changes: 8 additions & 0 deletions bothub/api/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
from .views import RepositoryAuthorizationViewSet
from .views import RepositoryAuthorizationRoleViewSet
from .views import SearchUserViewSet
from .views import RequestAuthorizationViewSet
from .views import RepositoryAuthorizationRequestsViewSet
from .views import ReviewAuthorizationRequestViewSet


class Router(routers.SimpleRouter):
Expand Down Expand Up @@ -117,3 +120,8 @@ def get_lookup_regex(self, viewset, lookup_prefix=''):
router.register('authorization-role',
RepositoryAuthorizationRoleViewSet)
router.register('search-user', SearchUserViewSet)
router.register('request-authorization', RequestAuthorizationViewSet)
router.register('authorization-requests',
RepositoryAuthorizationRequestsViewSet)
router.register('review-authorization-request',
ReviewAuthorizationRequestViewSet)
6 changes: 6 additions & 0 deletions bothub/api/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,9 @@
ResetPasswordSerializer,
LoginSerializer,
)

from .request import ( # noqa: F401
NewRequestRepositoryAuthorizationSerializer,
RequestRepositoryAuthorizationSerializer,
ReviewAuthorizationRequestSerializer,
)
36 changes: 36 additions & 0 deletions bothub/api/serializers/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
from bothub.common.models import RepositoryCategory
from bothub.common.models import RepositoryAuthorization
from bothub.common.models import RepositoryVote
from bothub.common.models import RequestRepositoryAuthorization
from bothub.common.languages import LANGUAGE_CHOICES

from ..fields import ModelMultipleChoiceField
from ..fields import TextField

from .category import RepositoryCategorySerializer
from .request import RequestRepositoryAuthorizationSerializer


class NewRepositorySerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -67,6 +69,8 @@ class Meta:
'entities',
'examples__count',
'authorization',
'available_request_authorization',
'request_authorization',
'ready_for_train',
'votes_sum',
'created_at',
Expand All @@ -82,6 +86,8 @@ class Meta:
categories_list = serializers.SerializerMethodField()
authorization = serializers.SerializerMethodField()
examples__count = serializers.SerializerMethodField()
request_authorization = serializers.SerializerMethodField()
available_request_authorization = serializers.SerializerMethodField()

def get_categories_list(self, obj):
return RepositoryCategorySerializer(obj.categories, many=True).data
Expand All @@ -96,6 +102,36 @@ def get_authorization(self, obj):
def get_examples__count(self, obj):
return obj.examples().count()

def get_available_request_authorization(self, obj):
request = self.context.get('request')
if not request or not request.user.is_authenticated:
return False
authorization = obj.get_user_authorization(request.user)
if authorization.role is not RepositoryAuthorization.ROLE_NOT_SETTED:
return False
if authorization.is_owner:
return False
try:
RequestRepositoryAuthorization.objects.get(
user=request.user,
repository=obj)
return False
except RequestRepositoryAuthorization.DoesNotExist:
return True

def get_request_authorization(self, obj):
request = self.context.get('request')
if not request or not request.user.is_authenticated:
return None
try:
request_authorization = RequestRepositoryAuthorization.objects.get(
user=request.user,
repository=obj)
return RequestRepositoryAuthorizationSerializer(
request_authorization).data
except RequestRepositoryAuthorization.DoesNotExist:
return None


class RepositoryAuthorizationSerializer(serializers.ModelSerializer):
class Meta:
Expand Down
60 changes: 60 additions & 0 deletions bothub/api/serializers/request.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from rest_framework import serializers
from django.utils.translation import gettext as _

from bothub.common.models import RequestRepositoryAuthorization
from bothub.common.models import Repository
from ..fields import TextField


class NewRequestRepositoryAuthorizationSerializer(serializers.ModelSerializer):
class Meta:
model = RequestRepositoryAuthorization
fields = [
'user',
'repository',
'text',
]

repository = serializers.PrimaryKeyRelatedField(
queryset=Repository.objects,
style={'show': False})
user = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault(),
style={'show': False})
text = TextField(
label=_('Leave a message for repository administrators'),
min_length=5,
max_length=RequestRepositoryAuthorization._meta.get_field(
'text').max_length)


class RequestRepositoryAuthorizationSerializer(serializers.ModelSerializer):
class Meta:
model = RequestRepositoryAuthorization
fields = [
'id',
'user',
'user__nickname',
'repository',
'text',
'created_at',
]

user__nickname = serializers.SlugRelatedField(
source='user',
slug_field='nickname',
read_only=True)


class ReviewAuthorizationRequestSerializer(serializers.ModelSerializer):
class Meta:
model = RequestRepositoryAuthorization
fields = [
'approved_by'
]

approved_by = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault(),
style={'show': False})
56 changes: 56 additions & 0 deletions bothub/api/tests/test_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
from bothub.common.models import RepositoryExample
from bothub.common.models import RepositoryExampleEntity
from bothub.common.models import RepositoryVote
from bothub.common.models import RepositoryAuthorization
from bothub.common.models import RequestRepositoryAuthorization

from ..views import NewRepositoryViewSet
from ..views import RepositoryViewSet
Expand Down Expand Up @@ -223,6 +225,60 @@ def test_languages_status(self):
response.status_code,
status.HTTP_200_OK)

def test_available_request_authorization(self):
response, content_data = self.request(
self.repository,
self.user_token)
self.assertTrue(content_data.get('available_request_authorization'))

def test_owner_not_available_request_authorization(self):
response, content_data = self.request(
self.repository,
self.owner_token)
self.assertFalse(content_data.get('available_request_authorization'))

def test_user_not_available_request_authorization(self):
authorization = self.repository.get_user_authorization(self.user)
authorization.role = RepositoryAuthorization.ROLE_USER
authorization.save()
response, content_data = self.request(
self.repository,
self.user_token)
self.assertFalse(content_data.get('available_request_authorization'))

def test_requested_not_available_request_authorization(self):
RequestRepositoryAuthorization.objects.create(
user=self.user,
repository=self.repository,
text='I can contribute')
response, content_data = self.request(
self.repository,
self.user_token)
self.assertFalse(content_data.get('available_request_authorization'))

def test_none_request_authorization(self):
response, content_data = self.request(
self.repository,
self.user_token)
self.assertIsNone(content_data.get('request_authorization'))

def test_request_authorization(self):
text = 'I can contribute'
request = RequestRepositoryAuthorization.objects.create(
user=self.user,
repository=self.repository,
text=text)
response, content_data = self.request(
self.repository,
self.user_token)
request_authorization = content_data.get('request_authorization')
self.assertEqual(
request_authorization.get('id'),
request.id)
self.assertEqual(
request_authorization.get('text'),
text)


class UpdateRepositoryTestCase(TestCase):
def setUp(self):
Expand Down
Loading

0 comments on commit 6067e0c

Please sign in to comment.