Skip to content

Commit

Permalink
Merge 669108d into cd1a98a
Browse files Browse the repository at this point in the history
  • Loading branch information
dyohan9 committed Aug 8, 2019
2 parents cd1a98a + 669108d commit 6e11948
Show file tree
Hide file tree
Showing 18 changed files with 572 additions and 111 deletions.
1 change: 1 addition & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ coreapi = "==2.3.3"
whitenoise = "==4.1.2"
pytz = "==2018.7"
drf-yasg = "*"
pyparsing = "==2.4.2"

[dev-packages]
"flake8" = "*"
Expand Down
150 changes: 88 additions & 62 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 18 additions & 3 deletions bothub/api/v1/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,8 @@ def create(self, request, *args, **kwargs):
description='Nickname User to find repositories',
type=openapi.TYPE_STRING
),
]
],
deprecated=True
)
)
class SearchRepositoriesViewSet(
Expand Down Expand Up @@ -952,6 +953,12 @@ class UserProfileViewSet(
lookup_field = 'nickname'


@method_decorator(
name='list',
decorator=swagger_auto_schema(
deprecated=True,
)
)
class Categories(
mixins.ListModelMixin,
GenericViewSet):
Expand Down Expand Up @@ -1000,6 +1007,12 @@ class TranslationsViewSet(
filter_class = TranslationsFilter


@method_decorator(
name='list',
decorator=swagger_auto_schema(
deprecated=True,
)
)
class RepositoryAuthorizationViewSet(
mixins.ListModelMixin,
GenericViewSet):
Expand Down Expand Up @@ -1030,7 +1043,8 @@ class RepositoryAuthorizationViewSet(
type=openapi.TYPE_STRING,
required=True
),
]
],
deprecated=True
)
)
@method_decorator(
Expand All @@ -1051,7 +1065,8 @@ class RepositoryAuthorizationViewSet(
type=openapi.TYPE_STRING,
required=True
),
]
],
deprecated=True
)
)
class RepositoryAuthorizationRoleViewSet(
Expand Down
6 changes: 3 additions & 3 deletions bothub/api/v2/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ def __init__(self, *args, validators=[], **kwargs):
**kwargs)

def to_representation(self, obj):
return obj.value
return obj.value # pragma: no cover


class LabelValueField(serializers.CharField):
class LabelValueField(serializers.CharField): # pragma: no cover
def __init__(self, *args, validators=[], **kwargs):
kwargs.pop('max_length', 0)
kwargs.pop('help_text', '')
Expand All @@ -53,4 +53,4 @@ def __init__(self, *args, validators=[], **kwargs):
**kwargs)

def to_representation(self, obj):
return obj.value
return obj.value # pragma: no cover
8 changes: 4 additions & 4 deletions bothub/api/v2/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class Metadata(BaseMetadata):
EntityText: 'entity text',
})

def determine_metadata(self, request, view):
def determine_metadata(self, request, view): # pragma: no cover
metadata = OrderedDict()
metadata['name'] = view.get_view_name()
metadata['description'] = view.get_view_description()
Expand All @@ -60,23 +60,23 @@ def determine_metadata(self, request, view):
metadata['actions'] = actions
return metadata

def determine_actions(self, request, view):
def determine_actions(self, request, view): # pragma: no cover
actions = {}
for method in {'PUT', 'POST'} & set(view.allowed_methods):
serializer = view.get_serializer()
actions[method] = self.get_serializer_info(serializer)
view.request = request
return actions

def get_serializer_info(self, serializer):
def get_serializer_info(self, serializer): # pragma: no cover
if hasattr(serializer, 'child'):
serializer = serializer.child
return OrderedDict([
(field_name, self.get_field_info(field))
for field_name, field in serializer.fields.items()
])

def get_field_info(self, field):
def get_field_info(self, field): # pragma: no cover
field_info = OrderedDict()
field_info['type'] = self.label_lookup[field] or 'field'
field_info['required'] = getattr(field, 'required', False)
Expand Down
20 changes: 20 additions & 0 deletions bothub/api/v2/mixins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.shortcuts import get_object_or_404


class MultipleFieldLookupMixin(object):
"""
Apply this mixin to any view or viewset to get multiple field filtering
based on a `lookup_fields` attribute, instead of the default single field
filtering.
"""

def get_object(self):
queryset = self.get_queryset()
queryset = self.filter_queryset(queryset)
filter = {}
for field in self.lookup_fields:
if self.kwargs.get(field):
filter[field] = self.kwargs[field]
obj = get_object_or_404(queryset, **filter)
self.check_object_permissions(self.request, obj)
return obj
29 changes: 29 additions & 0 deletions bothub/api/v2/repository/filters.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from django_filters import rest_framework as filters
from django.utils.translation import gettext as _
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import NotFound
from django.core.exceptions import ValidationError as DjangoValidationError

from bothub.common.models import Repository
from bothub.common.models import RepositoryAuthorization


class RepositoriesFilter(filters.FilterSet):
Expand All @@ -19,3 +23,28 @@ class Meta:

def filter_language(self, queryset, name, value):
return queryset.supported_language(value)


class RepositoryAuthorizationFilter(filters.FilterSet):
class Meta:
model = RepositoryAuthorization
fields = ['repository']

repository = filters.CharFilter(
field_name='repository',
method='filter_repository_uuid',
help_text=_('Repository\'s UUID'))

def filter_repository_uuid(self, queryset, name, value):
request = self.request
try:
repository = Repository.objects.get(uuid=value)
authorization = repository.get_user_authorization(request.user)
if not authorization.is_admin:
raise PermissionDenied()
return queryset.filter(repository=repository)
except Repository.DoesNotExist:
raise NotFound(
_('Repository {} does not exist').format(value))
except DjangoValidationError:
raise NotFound(_('Invalid repository UUID'))
Loading

0 comments on commit 6e11948

Please sign in to comment.