80 lines
2.3 KiB
Python
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
|