54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from .utils import json_response
|
||
|
||
|
||
# 混入类,提供Model实例to_dict方法
|
||
class ModelMixin(object):
|
||
__slots__ = ()
|
||
|
||
def to_dict(self, excludes: tuple = None, selects: tuple = None) -> dict:
|
||
if not hasattr(self, '_meta'):
|
||
raise TypeError('<%r> does not a django.db.models.Model object.' % self)
|
||
elif selects:
|
||
return {f: getattr(self, f) for f in selects}
|
||
elif excludes:
|
||
return {f.attname: getattr(self, f.attname) for f in self._meta.fields if f.attname not in excludes}
|
||
else:
|
||
return {f.attname: getattr(self, f.attname) for f in self._meta.fields}
|
||
|
||
|
||
# 使用该混入类,需要request.user对象实现has_perms方法
|
||
class PermissionMixin(object):
|
||
"""
|
||
CBV mixin which verifies that the current user has all specified
|
||
permissions.
|
||
"""
|
||
permission_required = None
|
||
|
||
def get_permission_required(self):
|
||
"""
|
||
Override this method to override the permission_required attribute.
|
||
Must return an iterable.
|
||
"""
|
||
if self.permission_required is None:
|
||
raise AttributeError(
|
||
'{0} is missing the permission_required attribute. Define {0}.permission_required, or override '
|
||
'{0}.get_permission_required().'.format(self.__class__.__name__)
|
||
)
|
||
if isinstance(self.permission_required, str):
|
||
perms = (self.permission_required,)
|
||
else:
|
||
perms = self.permission_required
|
||
return perms
|
||
|
||
def has_permission(self):
|
||
"""
|
||
Override this method to customize the way permissions are checked.
|
||
"""
|
||
perms = self.get_permission_required()
|
||
return self.request.user.has_perms(perms)
|
||
|
||
def dispatch(self, request, *args, **kwargs):
|
||
if not self.has_permission():
|
||
return json_response(error='拒绝访问')
|
||
return super(PermissionMixin, self).dispatch(request, *args, **kwargs)
|