mauflix/source/main/api.py

80 lines
2.3 KiB
Python

#!/usr/bin/env python3
from django.db.models import Q
from tastypie import fields
from tastypie.authentication import Authentication
from tastypie.resources import ModelResource
from tastypie.throttle import BaseThrottle
from tastypie.constants import ALL, ALL_WITH_RELATIONS
from main.models import Movie
from main.models import Person
from main.models import Country
from django.conf import settings
class CustomAuthentication(Authentication):
def is_authenticated(self, request, **kwargs):
if not 'ApiToken' in request.headers:
return False
if request.headers['ApiToken'] != settings.API_TOKEN:
return False
return True
class ResourceDirectors(ModelResource):
class Meta:
queryset = Person.objects.all().filter(is_director=True)
resource_name = 'directors'
class ResourceCountries(ModelResource):
class Meta:
queryset = Country.objects.all()
resource_name = 'countries'
class ResourceMovies(ModelResource):
directors = fields.ToManyField(ResourceDirectors, 'directors', full=True)
countries = fields.ToManyField(ResourceCountries, 'countries', full=True)
class Meta:
queryset = Movie.objects.all().order_by('-id')
resource_name = 'movies'
excludes = ['count', 'duration', 'published', 'stars']
throttle = BaseThrottle(throttle_at=50)
allowed_methods = ['get']
authentication = CustomAuthentication()
limit = 10
max_limit = 10
filtering = {
'name': ALL,
'original_name': ALL,
}
def dehydrate_directors(self, bundle):
names = ', '.join([d.obj.name for d in bundle.data['directors']])
return names
def dehydrate_countries(self, bundle):
names = ', '.join([c.obj.name for c in bundle.data['countries']])
return names
# ~ def build_filters(self, filters=None, **kwargs):
# ~ orm_filters = super().build_filters(filters or {}, **kwargs)
# ~ return orm_filters
def apply_filters(self, request, applicable_filters):
objects = self.get_object_list(request)
query = applicable_filters['name__icontains']
qset = (Q(name__icontains=query) | Q(original_name__icontains=query))
objects = objects.filter(qset)
return objects