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