mauflix/source/main/api.py

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