from __future__ import absolute_import

from __future__ import unicode_literals

from django.core.exceptions import PermissionDenied

from rest_framework.permissions import BasePermission

from acls.models import AccessControlList
from permissions import Permission


class MayanPermission(BasePermission):
    def has_permission(self, request, view):
        required_permission = getattr(
            view, 'mayan_view_permissions', {}
        ).get(request.method, None)

        if required_permission:
            try:
                Permission.check_permissions(
                    requester=request.user, permissions=required_permission
                )
            except PermissionDenied:
                return False
            else:
                return True
        else:
            return True

    def has_object_permission(self, request, view, obj):
        required_permission = getattr(
            view, 'mayan_object_permissions', {}
        ).get(request.method, None)

        if required_permission:
            try:
                if hasattr(view, 'mayan_permission_attribute_check'):
                    AccessControlList.objects.check_access(
                        permissions=required_permission,
                        user=request.user, obj=obj,
                        related=view.mayan_permission_attribute_check
                    )
                else:
                    AccessControlList.objects.check_access(
                        permissions=required_permission, user=request.user,
                        obj=obj
                    )
            except PermissionDenied:
                return False
            else:
                return True
        else:
            return True
