Skip to content

Commit

Permalink
Add updates router
Browse files Browse the repository at this point in the history
  • Loading branch information
dougppaz committed Sep 26, 2018
1 parent 4497801 commit ffc7cb7
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 0 deletions.
2 changes: 2 additions & 0 deletions bothub/api/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from .views import RepositoryAuthorizationRequestsViewSet
from .views import ReviewAuthorizationRequestViewSet
from .views import RepositoryEntitiesViewSet
from .views import RepositoryUpdatesViewSet


class Router(routers.SimpleRouter):
Expand Down Expand Up @@ -121,3 +122,4 @@ def get_lookup_regex(self, viewset, lookup_prefix=''):
router.register('review-authorization-request',
ReviewAuthorizationRequestViewSet)
router.register('entities', RepositoryEntitiesViewSet)
router.register('updates', RepositoryUpdatesViewSet)
4 changes: 4 additions & 0 deletions bothub/api/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,7 @@
RequestRepositoryAuthorizationSerializer,
ReviewAuthorizationRequestSerializer,
)

from .update import ( # noqa: F401
RepositoryUpdateSerializer,
)
25 changes: 25 additions & 0 deletions bothub/api/serializers/update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework import serializers

from bothub.common.models import RepositoryUpdate


class RepositoryUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = RepositoryUpdate
fields = [
'id',
'repository',
'language',
'created_at',
'by',
'by__nickname',
'training_started_at',
'trained_at',
'failed_at',
'training_log',
]

by__nickname = serializers.SlugRelatedField(
source='by',
slug_field='nickname',
read_only=True)
54 changes: 54 additions & 0 deletions bothub/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from bothub.common.models import RepositoryAuthorization
from bothub.common.models import RequestRepositoryAuthorization
from bothub.common.models import RepositoryEntity
from bothub.common.models import RepositoryUpdate
from bothub.authentication.models import User

from .serializers import RepositorySerializer
Expand All @@ -52,6 +53,7 @@
from .serializers import RequestRepositoryAuthorizationSerializer
from .serializers import ReviewAuthorizationRequestSerializer
from .serializers import RepositoryEntitySerializer
from .serializers import RepositoryUpdateSerializer


# Permisions
Expand Down Expand Up @@ -119,6 +121,18 @@ def has_object_permission(self, request, view, obj):
return False


class RepositoryUpdateHasPermission(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
authorization = obj.repository.get_user_authorization(request.user)
if request.method in READ_METHODS:
return authorization.can_read
if request.user.is_authenticated:
if request.method in WRITE_METHODS:
return authorization.can_write
return authorization.is_admin
return False


# Filters

class ExamplesFilter(filters.FilterSet):
Expand Down Expand Up @@ -327,6 +341,34 @@ def filter_repository_uuid(self, queryset, name, value):
raise NotFound(_('Invalid repository UUID'))


class RepositoryUpdatesFilter(filters.FilterSet):
class Meta:
model = RepositoryUpdate
fields = [
'repository_uuid',
]

repository_uuid = filters.CharFilter(
name='repository_uuid',
required=True,
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.can_read:
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'))


# Mixins

class MultipleFieldLookupMixin(object):
Expand Down Expand Up @@ -951,3 +993,15 @@ class RepositoryEntitiesViewSet(
IsAuthenticated,
RepositoryEntityHasPermission,
]


class RepositoryUpdatesViewSet(
mixins.ListModelMixin,
GenericViewSet):
queryset = RepositoryUpdate.objects.all()
serializer_class = RepositoryUpdateSerializer
filter_class = RepositoryUpdatesFilter
permission_classes = [
IsAuthenticated,
RepositoryUpdateHasPermission,
]

0 comments on commit ffc7cb7

Please sign in to comment.