Skip to content

Commit

Permalink
Merge pull request #232 from Ilhasoft/bbe-391
Browse files Browse the repository at this point in the history
Create short repository serializer, add repositorories in api v2
  • Loading branch information
Douglas Paz committed Nov 19, 2018
2 parents 7ed45a0 + 6930f39 commit 0da70c4
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 2 deletions.
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ install_requirements:

lint:
@make development_mode_guard
@make check_environment
@PIPENV_DONT_LOAD_ENV=1 pipenv run flake8
@echo "${SUCCESS}${NC} The code is following the PEP8"

Expand Down
12 changes: 12 additions & 0 deletions bothub/api/v2/repository/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django_filters import rest_framework as filters

from bothub.common.models import Repository


class RepositoriesFilter(filters.FilterSet):
class Meta:
model = Repository
fields = [
'name',
'categories',
]
38 changes: 38 additions & 0 deletions bothub/api/v2/repository/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,3 +219,41 @@ def get_available_request_authorization(self, obj):
return False
except RequestRepositoryAuthorization.DoesNotExist:
return True


class ShortRepositorySerializer(serializers.ModelSerializer):
class Meta:
model = Repository
fields = [
'uuid',
'name',
'slug',
'description',
'is_private',
'categories',
'categories_list',
'language',
'available_languages',
'created_at',
'owner',
'owner__nickname',
'absolute_url',
]
read_only = fields

categories = RepositoryCategorySerializer(
many=True,
read_only=True)
categories_list = serializers.SlugRelatedField(
source='categories',
slug_field='name',
many=True,
read_only=True)
owner__nickname = serializers.SlugRelatedField(
source='owner',
slug_field='nickname',
read_only=True)
absolute_url = serializers.SerializerMethodField()

def get_absolute_url(self, obj):
return obj.get_absolute_url()
79 changes: 78 additions & 1 deletion bothub/api/v2/repository/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from ..tests.utils import create_user_and_token

from .views import RepositoryViewSet
from .views import RepositoriesViewSet
from .serializers import RepositorySerializer


Expand Down Expand Up @@ -366,7 +367,7 @@ def test_false_when_request(self):
self.assertFalse(available_request_authorization)


class IntentsInRepositorySerializer(TestCase):
class IntentsInRepositorySerializerTestCase(TestCase):
def setUp(self):
self.owner, self.owner_token = create_user_and_token('owner')

Expand Down Expand Up @@ -397,3 +398,79 @@ def test_example_deleted(self):
repository_data = RepositorySerializer(self.repository).data
intent = repository_data.get('intents')[0]
self.assertEqual(intent.get('examples__count'), 1)


class RepositoriesViewSetTestCase(TestCase):
def setUp(self):
self.factory = RequestFactory()
self.owner, self.owner_token = create_user_and_token('owner')
self.category_1 = RepositoryCategory.objects.create(name='Category 1')
self.category_2 = RepositoryCategory.objects.create(name='Category 2')
self.repositories = [
create_repository_from_mockup(self.owner, **mockup)
for mockup in get_valid_mockups([self.category_1])
]
self.public_repositories = list(
filter(
lambda r: not r.is_private,
self.repositories,
)
)

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

def test_count(self):
public_repositories_length = len(self.public_repositories)
response, content_data = self.request()
self.assertEqual(
content_data.get('count'),
public_repositories_length,
)

def test_name_filter(self):
response, content_data = self.request({
'name': self.public_repositories[0].name,
})
self.assertEqual(
content_data.get('count'),
1,
)
response, content_data = self.request({
'name': 'abc',
})
self.assertEqual(
content_data.get('count'),
0,
)

def test_category_filter(self):
response, content_data = self.request({
'categories': [
self.category_1.id,
],
})
self.assertEqual(
content_data.get('count'),
1,
)
response, content_data = self.request({
'categories': [
self.category_2.id,
],
})
self.assertEqual(
content_data.get('count'),
0,
)
24 changes: 24 additions & 0 deletions bothub/api/v2/repository/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
from rest_framework.viewsets import GenericViewSet
from rest_framework import mixins
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter

from bothub.common.models import Repository

from ..metadata import Metadata
from .serializers import RepositorySerializer
from .serializers import ShortRepositorySerializer
from .permissions import RepositoryPermission
from .filters import RepositoriesFilter


class RepositoryViewSet(
Expand All @@ -26,3 +30,23 @@ class RepositoryViewSet(
RepositoryPermission,
]
metadata_class = Metadata


class RepositoriesViewSet(
mixins.ListModelMixin,
GenericViewSet):
"""
List all public repositories.
"""
serializer_class = ShortRepositorySerializer
queryset = Repository.objects.all().publics().order_by_relevance()
filter_class = RepositoriesFilter
filter_backends = [
DjangoFilterBackend,
SearchFilter,
]
search_fields = [
'$name',
'^name',
'=name',
]
2 changes: 2 additions & 0 deletions bothub/api/v2/routers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from rest_framework import routers

from .repository.views import RepositoryViewSet
from .repository.views import RepositoriesViewSet
from .examples.views import ExamplesViewSet


router = routers.SimpleRouter()
router.register('repository', RepositoryViewSet)
router.register('repositories', RepositoriesViewSet)
router.register('examples', ExamplesViewSet)

0 comments on commit 0da70c4

Please sign in to comment.