Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create short repository serializer, add repositorories in api v2 #232

Merged
merged 3 commits into from
Nov 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)