Skip to content

Commit

Permalink
Merge pull request #208 from Ilhasoft/improve-nlp-logging
Browse files Browse the repository at this point in the history
Improve nlp logging, updates list
  • Loading branch information
Douglas Paz committed Sep 27, 2018
2 parents 3f99ec7 + 252e794 commit 7767df5
Show file tree
Hide file tree
Showing 9 changed files with 183 additions and 12 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)
71 changes: 71 additions & 0 deletions bothub/api/tests/test_updates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import json

from django.test import TestCase
from django.test import RequestFactory
from rest_framework import status
from bothub.common.models import Repository
from bothub.common import languages

from ..views import RepositoryUpdatesViewSet
from .utils import create_user_and_token


class UpdatesTestCase(TestCase):
def setUp(self):
self.factory = RequestFactory()

self.owner, self.owner_token = create_user_and_token('owner')

self.repository = Repository.objects.create(
owner=self.owner,
name='Testing',
slug='test',
language=languages.LANGUAGE_EN)
self.repository.current_update()

def request(self, data, token=None):
authorization_header = {
'HTTP_AUTHORIZATION': 'Token {}'.format(token.key),
} if token else {}
request = self.factory.get(
'/api/updates/',
data,
**authorization_header)
response = RepositoryUpdatesViewSet.as_view(
{'get': 'list'})(request)
response.render()
content_data = json.loads(response.content)
return (response, content_data,)

def test_okay(self):
response, content_data = self.request(
{
'repository_uuid': str(self.repository.uuid),
},
self.owner_token)
self.assertEqual(
response.status_code,
status.HTTP_200_OK)
self.assertEqual(
content_data.get('count'),
1)

def test_not_authenticated(self):
response, content_data = self.request(
{
'repository_uuid': str(self.repository.uuid),
})
self.assertEqual(
response.status_code,
status.HTTP_401_UNAUTHORIZED)

def test_without_repository(self):
response, content_data = self.request(
{},
self.owner_token)
self.assertEqual(
response.status_code,
status.HTTP_200_OK)
self.assertEqual(
content_data.get('count'),
0)
66 changes: 55 additions & 11 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 @@ -91,16 +93,6 @@ def has_object_permission(self, request, view, obj):
return authorization.can_contribute


class RepositoryTranslatedExampleEntityPermission(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
repository = obj.repository_translated_example.original_example \
.repository_update.repository
authorization = repository.get_user_authorization(request.user)
if request.method in READ_METHODS:
return authorization.can_read
return authorization.can_contribute


class RepositoryAdminManagerAuthorization(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
authorization = obj.repository.get_user_authorization(request.user)
Expand All @@ -119,6 +111,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 +331,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 @@ -478,7 +510,7 @@ def analyze(self, request, **kwargs):
return Response(request.json()) # pragma: no cover

response = None # pragma: no cover
try:
try: # pragma: no cover
response = request.json() # pragma: no cover
except Exception:
pass
Expand Down Expand Up @@ -951,3 +983,15 @@ class RepositoryEntitiesViewSet(
IsAuthenticated,
RepositoryEntityHasPermission,
]


class RepositoryUpdatesViewSet(
mixins.ListModelMixin,
GenericViewSet):
queryset = RepositoryUpdate.objects.all()
serializer_class = RepositoryUpdateSerializer
filter_class = RepositoryUpdatesFilter
permission_classes = [
IsAuthenticated,
RepositoryUpdateHasPermission,
]
3 changes: 3 additions & 0 deletions bothub/common/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ class RepositoryUpdateAdmin(admin.ModelAdmin):
'trained_at',
'failed_at',
]
readonly_fields = [
'training_log',
]


@admin.register(RepositoryExample)
Expand Down
18 changes: 18 additions & 0 deletions bothub/common/migrations/0022_repositoryupdate_training_log.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.0.6 on 2018-09-26 17:43

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('common', '0021_auto_20180921_1259'),
]

operations = [
migrations.AddField(
model_name='repositoryupdate',
name='training_log',
field=models.TextField(blank=True, editable=False, verbose_name='training log'),
),
]
4 changes: 4 additions & 0 deletions bothub/common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,10 @@ class Meta:
_('failed at'),
blank=True,
null=True)
training_log = models.TextField(
_('training log'),
blank=True,
editable=False)

@property
def examples(self):
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

setup(
name='bothub',
version='1.15.4',
version='1.16.0',
description='bothub',
packages=find_packages(),
install_requires=[
Expand Down

0 comments on commit 7767df5

Please sign in to comment.