koriaf/django-calories-log

View on GitHub
src/nutricalc/food_api_v1/views.py

Summary

Maintainability
A
55 mins
Test Coverage
from django.db.models import Q
from rest_framework.viewsets import ReadOnlyModelViewSet

from nutricalc.food.models import Product
from nutricalc.food_api_v1.serializers import ProductSerializer


class ProductReadonlyViewSet(ReadOnlyModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_fields = ('title', )

    def get_queryset(self):
        """Custom filtering procedure.
        Accepts 'title' GET argument.
        Do search from food database and return partial matches
        """
        q = self.request.GET.get('title', '').strip()
        if not q:
            return Product.objects.none()

        words = q.split()
        qs = Q(title__icontains="")
        for word in words:
            if word[0] == '-':
                qs &= ~Q(title__icontains=word[1:])
            else:
                qs &= Q(title__icontains=word)
        qset = super(ProductReadonlyViewSet, self).get_queryset().filter(
            qs
        )
        if not self.request.user.is_staff:
            if self.request.user.is_authenticated():
                qset = qset.filter(
                    Q(is_public=True) | Q(user=self.request.user)
                )
            else:
                qset = qset.filter(
                    is_public=True
                )
        return qset[:200]