mixins.py 3.44 KB
import logging
from django.contrib.auth.models import AnonymousUser
from rest_framework.generics import GenericAPIView
from common.exceptions import (
    NeedLoginException,
    InvalidParamsException,
    InternalErrorException,
    ObjectNotExitException,
    AsyncWaitException,
    NoPermissionException,
    IllegalOperationException)


class GenericExceptionMixin:

    def need_login(self, msg='need login'):
        raise NeedLoginException(msg)

    def invalid_params(self, msg='invalid params'):
        raise InvalidParamsException(msg)

    def internal_error(self, msg='internal error'):
        raise InternalErrorException(msg)

    def object_not_exit(self, msg='object not exit'):
        raise ObjectNotExitException(msg)

    def async_wait(self, msg='async wait'):
        raise AsyncWaitException(msg)

    def no_permission(self, msg='no permission'):
        raise NoPermissionException(msg)

    def illegal_operation(self, msg='illegal operation'):
        raise IllegalOperationException(msg)


class LoggerMixin:
    running_log = logging.getLogger('running')
    exception_log = logging.getLogger('exception')
    cronjob_log = logging.getLogger('cronjob')
    folder_log = logging.getLogger('folder')
    bs_log = logging.getLogger('bs')
    license_log = logging.getLogger('license')
    idcard_log = logging.getLogger('idcard')


class GenericView(LoggerMixin, GenericExceptionMixin, GenericAPIView):
    need_print_logger = True

    def print_logger(self, request):
        parameters = getattr(request, request.method, {})
        if not parameters:
            parameters = getattr(request, 'data', {})
        if not parameters:
            parameters = {}
        parameters_string = ''
        for key, value in parameters.items():
            parameters_string += '[%s=%s] ' % (key, value)
        for key, value in self.kwargs.items():
            parameters_string += '[%s=%s] ' % (key, value)
        if request.user and not isinstance(request.user, AnonymousUser):
            user_id = request.user.id
        else:
            user_id = 0
        self.running_log.info('[%s_%s_request] with parameters [user_id=%s] %s'
                              % (self.__class__.__name__, request.method,
                                 user_id, parameters_string))

    def dispatch(self, request, *args, **kwargs):
        """
        `.dispatch()` is pretty much the same as Django's regular dispatch,
        but with extra hooks for startup, finalize, and exception handling.
        """
        self.args = args
        self.kwargs = kwargs
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        self.headers = self.default_response_headers  # deprecate?
        try:
            self.initial(request, *args, **kwargs)

            # Get the appropriate handler method
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            if self.need_print_logger:
                self.print_logger(request)

            response = handler(request, *args, **kwargs)
        except Exception as exc:
            response = self.handle_exception(exc)

        self.response = self.finalize_response(
            request, response, *args, **kwargs)
        return self.response

    def get_object(self):
        return None