Skip to content

Commit

Permalink
List results
Browse files Browse the repository at this point in the history
  • Loading branch information
edudouglas committed Apr 30, 2019
1 parent e2e3c97 commit 0068cb6
Show file tree
Hide file tree
Showing 10 changed files with 441 additions and 80 deletions.
1 change: 0 additions & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ requests = "==2.20.1"
coreapi = "==2.3.3"
whitenoise = "==4.1.2"
pytz = "==2018.7"
"psycopg2-binary" = "==2.8.2"

[dev-packages]
"flake8" = "*"
Expand Down
36 changes: 1 addition & 35 deletions Pipfile.lock

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

31 changes: 30 additions & 1 deletion bothub/api/v2/evaluate/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import NotFound

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


class EvaluatesFilter(filters.FilterSet):
Expand Down Expand Up @@ -66,3 +67,31 @@ def filter_label(self, queryset, name, value):

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


class ResultsFilter(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'))
11 changes: 11 additions & 0 deletions bothub/api/v2/evaluate/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,14 @@ def has_object_permission(self, request, view, obj):
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
104 changes: 104 additions & 0 deletions bothub/api/v2/evaluate/serializers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import json

from django.utils.translation import gettext as _
from rest_framework import serializers

from bothub.common.models import Repository
from bothub.common.models import RepositoryEvaluate
from bothub.common.models import RepositoryEvaluateEntity
from bothub.common.models import RepositoryEvaluateResult
from bothub.common.models import RepositoryEvaluateResultScore
from bothub.common.models import RepositoryEvaluateResultIntent
from bothub.common.models import RepositoryEvaluateResultEntity

from bothub.common.languages import LANGUAGE_CHOICES

from ..fields import EntityValueField
Expand Down Expand Up @@ -93,3 +100,100 @@ def update(self, instance, validated_data):
repository_evaluate=instance, **entity)

return instance


class RepositoryEvaluateResultVersionsSerializer(serializers.ModelSerializer):

class Meta:
model = RepositoryEvaluateResult
fields = [
'id',
'language'
]

language = serializers.SerializerMethodField()

def get_language(self, obj):
return obj.repository_update.language


class RepositoryEvaluateResultScore(serializers.ModelSerializer):

class Meta:
model = RepositoryEvaluateResultScore
fields = [
'precision',
'f1_score',
'accuracy',
'recall',
'support'
]


class RepositoryEvaluateResultIntentSerializer(serializers.ModelSerializer):

class Meta:
model = RepositoryEvaluateResultIntent
fields = [
'intent',
'score',
]

score = RepositoryEvaluateResultScore(read_only=True)


class RepositoryEvaluateResultEntitySerializer(serializers.ModelSerializer):

class Meta:
model = RepositoryEvaluateResultEntity
fields = [
'entity',
'score',
]

score = RepositoryEvaluateResultScore(read_only=True)
entity = serializers.SerializerMethodField()

def get_entity(self, obj):
return obj.entity.value


class RepositoryEvaluateResultSerializer(serializers.ModelSerializer):

class Meta:
model = RepositoryEvaluateResult
fields = [
'id',
'created_at',
'matrix_chart',
'confidence_chart',
'success_log',
'error_log',
'intents_list',
'entities_list',
'intent_results',
'entity_results'

]

success_log = serializers.SerializerMethodField()
error_log = serializers.SerializerMethodField()
intent_results = RepositoryEvaluateResultScore(read_only=True)
entity_results = RepositoryEvaluateResultScore(read_only=True)

intents_list = serializers.SerializerMethodField()
entities_list = serializers.SerializerMethodField()

def get_intents_list(self, obj):
return RepositoryEvaluateResultIntentSerializer(
obj.evaluate_result_intent.all(), many=True).data

def get_entities_list(self, obj):
return RepositoryEvaluateResultEntitySerializer(
obj.evaluate_result_entity.all(), many=True).data

def get_success_log(self, obj):
return json.loads(obj.success_log)

def get_error_log(self, obj):
return json.loads(obj.error_log)
36 changes: 36 additions & 0 deletions bothub/api/v2/evaluate/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,18 @@
from django_filters.rest_framework import DjangoFilterBackend

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

from ..metadata import Metadata
from .serializers import RepositoryEvaluateSerializer
from .serializers import RepositoryEvaluateResultVersionsSerializer
from .serializers import RepositoryEvaluateResultSerializer

from .filters import EvaluatesFilter
from .filters import ResultsFilter

from .permissions import RepositoryEvaluatePermission
from .permissions import RepositoryEvaluateResultPermission


class EvaluateViewSet(
Expand Down Expand Up @@ -49,3 +56,32 @@ def list(self, request, *args, **kwargs):
]

return super().list(request, *args, **kwargs)


class ResultsListViewSet(
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
GenericViewSet):

queryset = RepositoryEvaluateResult.objects
permission_classes = [
IsAuthenticatedOrReadOnly,
RepositoryEvaluateResultPermission,
]

def list(self, request, *args, **kwargs):
self.serializer_class = RepositoryEvaluateResultVersionsSerializer
self.filter_class = ResultsFilter
self.filter_backends = [
OrderingFilter,
DjangoFilterBackend,
]
self.ordering_fields = [
'created_at',
]

return super().list(request, *args, **kwargs)

def retrieve(self, request, *args, **kwargs):
self.serializer_class = RepositoryEvaluateResultSerializer
return super().retrieve(request, *args, **kwargs)
2 changes: 2 additions & 0 deletions bothub/api/v2/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
from .repository.views import RepositoriesViewSet
from .examples.views import ExamplesViewSet
from .evaluate.views import EvaluateViewSet
from .evaluate.views import ResultsListViewSet


router = routers.SimpleRouter()
router.register('repository', RepositoryViewSet)
router.register('repositories', RepositoriesViewSet)
router.register('examples', ExamplesViewSet)
router.register('evaluate/results', ResultsListViewSet)
router.register('evaluate', EvaluateViewSet)
Loading

0 comments on commit 0068cb6

Please sign in to comment.