api.py 1.6 KB
Newer Older
baltery's avatar
baltery 已提交
1 2 3
# -*- coding: utf-8 -*-
#
from django.http import JsonResponse
baltery's avatar
baltery 已提交
4
from rest_framework.settings import api_settings
baltery's avatar
baltery 已提交
5

baltery's avatar
baltery 已提交
6
from common.drf.filters import IDSpmFilter, CustomFilter
baltery's avatar
baltery 已提交
7 8

__all__ = [
baltery's avatar
baltery 已提交
9
    "JSONResponseMixin", "CommonApiMixin",
baltery's avatar
baltery 已提交
10
    "IDSpmFilterMixin",
baltery's avatar
baltery 已提交
11 12 13 14 15 16 17 18 19 20
]


class JSONResponseMixin(object):
    """JSON mixin"""
    @staticmethod
    def render_json_response(context):
        return JsonResponse(context)


baltery's avatar
baltery 已提交
21 22 23 24 25
class IDSpmFilterMixin:
    def get_filter_backends(self):
        backends = super().get_filter_backends()
        backends.append(IDSpmFilter)
        return backends
baltery's avatar
baltery 已提交
26 27


baltery's avatar
baltery 已提交
28 29
class SerializerMixin:
    def get_serializer_class(self):
baltery's avatar
baltery 已提交
30 31
        if self.request.method.lower() == 'get' and\
                self.request.query_params.get('draw') \
baltery's avatar
baltery 已提交
32 33 34 35 36
                and hasattr(self, 'serializer_display_class'):
            return self.serializer_display_class
        return super().get_serializer_class()


baltery's avatar
baltery 已提交
37 38 39 40 41
class ExtraFilterFieldsMixin:
    default_added_filters = [CustomFilter, IDSpmFilter]
    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
    extra_filter_fields = []
    extra_filter_backends = []
baltery's avatar
baltery 已提交
42

baltery's avatar
baltery 已提交
43 44 45 46 47 48
    def get_filter_backends(self):
        if self.filter_backends != self.__class__.filter_backends:
            return self.filter_backends
        return list(self.filter_backends) + \
               self.default_added_filters + \
               list(self.extra_filter_backends)
baltery's avatar
baltery 已提交
49 50

    def filter_queryset(self, queryset):
baltery's avatar
baltery 已提交
51 52 53
        for backend in self.get_filter_backends():
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset
baltery's avatar
baltery 已提交
54 55


baltery's avatar
baltery 已提交
56
class CommonApiMixin(SerializerMixin, ExtraFilterFieldsMixin):
baltery's avatar
baltery 已提交
57
    pass