diff --git a/core/serializers.py b/core/serializers.py index 7f2005d..f5e4c8a 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -226,3 +226,10 @@ class BoardSerializer(serializers.HyperlinkedModelSerializer): ) validated_data['submitter'] = user return super(BoardSerializer, self).create(validated_data) + + +class TagAutoCompleteSerializer(serializers.ModelSerializer): + + class Meta: + model = Tag + fields = ('name', ) diff --git a/core/views.py b/core/views.py index 8510626..543486b 100644 --- a/core/views.py +++ b/core/views.py @@ -1,7 +1,10 @@ +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_page from django_filters.rest_framework import DjangoFilterBackend from rest_framework import viewsets, mixins, routers from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.viewsets import GenericViewSet +from taggit.models import Tag from core import serializers as api from core.models import Image, Pin, Board @@ -49,8 +52,23 @@ class BoardAutoCompleteViewSet( pagination_class = None +class TagAutoCompleteViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + queryset = Tag.objects.all() + serializer_class = api.TagAutoCompleteSerializer + pagination_class = None + + @method_decorator(cache_page(60 * 5)) + def list(self, request, *args, **kwargs): + return super(TagAutoCompleteViewSet, self).list( + request, + *args, + **kwargs + ) + + drf_router = routers.DefaultRouter() drf_router.register(r'pins', PinViewSet) drf_router.register(r'images', ImageViewSet) drf_router.register(r'boards', BoardViewSet) +drf_router.register(r'tags-auto-complete', TagAutoCompleteViewSet) drf_router.register(r'boards-auto-complete', BoardAutoCompleteViewSet) diff --git a/pinry-spa/src/components/api.js b/pinry-spa/src/components/api.js index b926e7f..9157d17 100644 --- a/pinry-spa/src/components/api.js +++ b/pinry-spa/src/components/api.js @@ -258,7 +258,15 @@ const User = { }, }; +const Tag = { + fetchList() { + const url = `${API_PREFIX}tags-auto-complete/`; + return axios.get(url); + }, +}; + export default { + Tag, Pin, Board, fetchPin, diff --git a/pinry-spa/src/components/pin_edit/FilterSelect.vue b/pinry-spa/src/components/pin_edit/FilterSelect.vue index 43a510a..5f647eb 100644 --- a/pinry-spa/src/components/pin_edit/FilterSelect.vue +++ b/pinry-spa/src/components/pin_edit/FilterSelect.vue @@ -38,21 +38,10 @@