-
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
17 changed files
with
981 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
from django.utils.translation import ugettext_lazy as _ | ||
from django.core.exceptions import ValidationError as DjangoValidationError | ||
from django_filters import rest_framework as filters | ||
from rest_framework.exceptions import PermissionDenied, NotFound | ||
|
||
from bothub.common.models import QAKnowledgeBase, Repository, QAContext | ||
|
||
|
||
class QAKnowledgeBaseFilter(filters.FilterSet): | ||
class Meta: | ||
model = QAKnowledgeBase | ||
fields = ["title", "created_at", "repository_uuid"] | ||
|
||
repository_uuid = filters.CharFilter( | ||
field_name="repository_uuid", | ||
method="filter_repository_uuid", | ||
required=True, | ||
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")) | ||
|
||
|
||
class QAContextFilter(filters.FilterSet): | ||
class Meta: | ||
model = QAContext | ||
fields = [ | ||
"text", | ||
"language", | ||
"created_at", | ||
"repository_uuid", | ||
"knowledge_base_id", | ||
] | ||
|
||
knowledge_base_id = filters.CharFilter(field_name="knowledge_base__id") | ||
|
||
repository_uuid = filters.CharFilter( | ||
field_name="repository_uuid", | ||
method="filter_repository_uuid", | ||
required=True, | ||
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(knowledge_base__repository=repository) | ||
except Repository.DoesNotExist: | ||
raise NotFound(_("Repository {} does not exist").format(value)) | ||
except DjangoValidationError: | ||
raise NotFound(_("Invalid repository_uuid")) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
from rest_framework import permissions | ||
|
||
from bothub.api.v2 import READ_METHODS | ||
|
||
|
||
class QAKnowledgeBasePermission(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 | ||
return authorization.can_contribute | ||
|
||
|
||
class QAContextPermission(permissions.BasePermission): | ||
def has_object_permission(self, request, view, obj): | ||
authorization = obj.knowledge_base.repository.get_user_authorization( | ||
request.user | ||
) | ||
if request.method in READ_METHODS: | ||
return authorization.can_read | ||
|
||
return authorization.can_contribute |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
from rest_framework import serializers | ||
|
||
from bothub.common import languages | ||
from bothub.common.models import Repository, QAKnowledgeBase, QAContext | ||
|
||
|
||
class QAKnowledgeBaseSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = QAKnowledgeBase | ||
fields = ["id", "repository", "title"] | ||
read_only_fields = ["created_at", "last_update"] | ||
|
||
repository = serializers.PrimaryKeyRelatedField(queryset=Repository.objects) | ||
|
||
|
||
class QAContextSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = QAContext | ||
fields = ["id", "text", "language", "knowledge_base"] | ||
read_only_fields = ["created_at", "last_update"] | ||
|
||
knowledge_base = serializers.PrimaryKeyRelatedField( | ||
queryset=QAKnowledgeBase.objects | ||
) | ||
language = serializers.ChoiceField(languages.LANGUAGE_CHOICES, required=True) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
from rest_framework import mixins, permissions | ||
from rest_framework.viewsets import GenericViewSet | ||
|
||
from .filters import QAKnowledgeBaseFilter, QAContextFilter | ||
from .permissions import QAKnowledgeBasePermission, QAContextPermission | ||
from .serializers import QAKnowledgeBaseSerializer, QAContextSerializer | ||
from bothub.common.models import QAKnowledgeBase, QAContext | ||
|
||
|
||
class QAKnowledgeBaseViewSet( | ||
mixins.ListModelMixin, | ||
mixins.CreateModelMixin, | ||
mixins.RetrieveModelMixin, | ||
mixins.DestroyModelMixin, | ||
mixins.UpdateModelMixin, | ||
GenericViewSet, | ||
): | ||
queryset = QAKnowledgeBase.objects.all() | ||
serializer_class = QAKnowledgeBaseSerializer | ||
filter_class = QAKnowledgeBaseFilter | ||
permission_classes = [permissions.IsAuthenticated, QAKnowledgeBasePermission] | ||
|
||
|
||
class QAContextViewSet( | ||
mixins.ListModelMixin, | ||
mixins.CreateModelMixin, | ||
mixins.RetrieveModelMixin, | ||
mixins.DestroyModelMixin, | ||
mixins.UpdateModelMixin, | ||
GenericViewSet, | ||
): | ||
queryset = QAContext.objects.all() | ||
serializer_class = QAContextSerializer | ||
filter_class = QAContextFilter | ||
permission_classes = [permissions.IsAuthenticated, QAContextPermission] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.