Skip to content

Commit

Permalink
Merge pull request #249 from Ilhasoft/feature/evaluate
Browse files Browse the repository at this point in the history
Feature/evaluate
  • Loading branch information
johncordeiro committed May 6, 2019
2 parents 230fc4b + f3f4611 commit 0553d14
Show file tree
Hide file tree
Showing 18 changed files with 1,282 additions and 105 deletions.
1 change: 1 addition & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ pytz = "==2018.7"
"flake8" = "*"
coverage = "*"
ipython = "*"
autopep8 = "*"

[requires]
python_version = "3.6"
224 changes: 124 additions & 100 deletions Pipfile.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions bothub/api/v1/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
RepositorySerializer,
RepositoryAuthorizationSerializer,
AnalyzeTextSerializer,
EvaluateSerializer,
EditRepositorySerializer,
VoteSerializer,
RepositoryAuthorizationRoleSerializer,
Expand Down
4 changes: 4 additions & 0 deletions bothub/api/v1/serializers/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,10 @@ class AnalyzeTextSerializer(serializers.Serializer):
text = serializers.CharField(allow_blank=False)


class EvaluateSerializer(serializers.Serializer):
language = serializers.ChoiceField(LANGUAGE_CHOICES, required=True)


class VoteSerializer(serializers.ModelSerializer):
class Meta:
model = RepositoryVote
Expand Down
37 changes: 36 additions & 1 deletion bothub/api/v1/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from .serializers import RepositoryCategorySerializer
from .serializers import NewRepositoryExampleSerializer
from .serializers import AnalyzeTextSerializer
from .serializers import EvaluateSerializer
from .serializers import EditRepositorySerializer
from .serializers import NewRepositoryTranslatedExampleSerializer
from .serializers import VoteSerializer
Expand Down Expand Up @@ -523,6 +524,40 @@ def analyze(self, request, **kwargs):
message = error.get('message') # pragma: no cover
raise APIException(detail=message) # pragma: no cover

@detail_route(
methods=['POST'],
url_name='repository-evaluate')
def evaluate(self, request, **kwargs):
"""
Evaluate repository using Bothub NLP service
"""
repository = self.get_object()
user_authorization = repository.get_user_authorization(request.user)
if not user_authorization.can_write:
raise PermissionDenied()
serializer = EvaluateSerializer(
data=request.data) # pragma: no cover
serializer.is_valid(raise_exception=True) # pragma: no cover

if not repository.evaluations(
language=request.data.get('language')).count():
raise APIException(
detail=_('You need to have at least ' +
'one registered test phrase')) # pragma: no cover

if len(repository.intents) <= 1:
raise APIException(
detail=_('You need to have at least ' +
'two registered intents')) # pragma: no cover

request = Repository.request_nlp_evaluate( # pragma: no cover
user_authorization, serializer.data)
if request.status_code != status.HTTP_200_OK: # pragma: no cover
raise APIException( # pragma: no cover
{'status_code': request.status_code},
code=request.status_code)
return Response(request.json()) # pragma: no cover

@detail_route(
methods=['POST'],
url_name='repository-vote',
Expand Down Expand Up @@ -552,7 +587,7 @@ def vote(self, request, **kwargs):
def get_serializer_class(self):
if self.request and self.request.method in \
['OPTIONS'] + WRITE_METHODS or not self.request:
return self.edit_serializer_class
return self.edit_serializer_class
return self.serializer_class

def get_action_permissions_classes(self):
Expand Down
Empty file.
135 changes: 135 additions & 0 deletions bothub/api/v2/evaluate/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
from django.utils.translation import gettext as _
from django.core.exceptions import ValidationError as DjangoValidationError
from django_filters import rest_framework as filters

from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import NotFound

from bothub.common.models import Repository
from bothub.common.models import RepositoryEvaluate
from bothub.common.models import RepositoryEvaluateResult


class EvaluatesFilter(filters.FilterSet):

class Meta:
model = RepositoryEvaluate
fields = [
'text',
'language',
'intent',
]

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

language = filters.CharFilter(
field_name='language',
method='filter_language',
help_text='Filter by language, default is repository base language')

label = filters.CharFilter(
field_name='label',
method='filter_label',
help_text=_(
'Filter evaluations with entities with a specific label.'
)
)

entity = filters.CharFilter(
field_name='entity',
method='filter_entity',
help_text=_('Filter evaluations with an entity.'))

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 repository.evaluations(queryset=queryset)
except Repository.DoesNotExist:
raise NotFound(
_('Repository {} does not exist').format(value))
except DjangoValidationError:
raise NotFound(_('Invalid repository_uuid'))

def filter_language(self, queryset, name, value):
return queryset.filter(repository_update__language=value)

def filter_label(self, queryset, name, value):
if value == 'other':
return queryset.filter(entities__entity__label__isnull=True)
return queryset.filter(entities__entity__label__value=value)

def filter_entity(self, queryset, name, value):
return queryset.filter(entities__entity__value=value)


class EvaluateResultsFilter(filters.FilterSet):

class Meta:
model = RepositoryEvaluateResult
fields = []

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 repository.evaluations_results(queryset=queryset)
except Repository.DoesNotExist:
raise NotFound(
_('Repository {} does not exist').format(value))
except DjangoValidationError:
raise NotFound(_('Invalid repository_uuid'))


class EvaluateResultFilter(filters.FilterSet):

class Meta:
model = RepositoryEvaluateResult
fields = []

text = filters.CharFilter(
field_name='text',
method='filter_evaluate_text',
required=False,
help_text=_('Evaluate Text'))

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

def filter_evaluate_text(self, queryset, name, value):
return queryset.filter(log__icontains=value)

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 repository.evaluations_results(queryset=queryset)
except Repository.DoesNotExist:
raise NotFound(
_('Repository {} does not exist').format(value))
except DjangoValidationError:
raise NotFound(_('Invalid repository_uuid'))
29 changes: 29 additions & 0 deletions bothub/api/v2/evaluate/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from rest_framework import permissions

from .. import READ_METHODS
from .. import WRITE_METHODS


class RepositoryEvaluatePermission(permissions.BasePermission):

def has_object_permission(self, request, view, obj):
authorization = obj.repository_update. \
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


class RepositoryEvaluateResultPermission(permissions.BasePermission):

def has_object_permission(self, request, view, obj):
authorization = obj.repository_update. \
repository.get_user_authorization(request.user)

if request.method in READ_METHODS:
return authorization.can_read
return authorization.can_contribute

0 comments on commit 0553d14

Please sign in to comment.