79 lines
2.9 KiB
Python
79 lines
2.9 KiB
Python
from rbac.permission import RbacPermission
|
|
from rbac.models import UserProfile
|
|
from crm.models import Consumer
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from django.core.cache import cache
|
|
from django.utils import timezone
|
|
from datetime import datetime, timedelta
|
|
# 学员接口列表
|
|
ConsumerPerms = [
|
|
'paper_view',
|
|
'gen_monitest',
|
|
'questioncat_view',
|
|
'my_collects',
|
|
'my_subjects',
|
|
'my_examtest',
|
|
'exercise',
|
|
'down_material'
|
|
]
|
|
|
|
VistorPerms = [
|
|
'gen_monitest',
|
|
'questioncat_view',
|
|
'my_examtest',
|
|
]
|
|
from .spider import getZs
|
|
def get_consumerperm_list(consumer):
|
|
perms = list(consumer.role.perms.values_list('code', flat=True))
|
|
if consumer.workscope:
|
|
if consumer.workscope.can_exam: # 如果是三类考试工作类别不做过期检测
|
|
pass
|
|
elif consumer.exceed_date and (consumer.exceed_date < datetime.date(timezone.now())):
|
|
# if consumer.name and consumer.ID_number1:
|
|
# candidates = getZs(consumer.name, consumer.ID_number1)
|
|
# if candidates:
|
|
# perms.append('account_exceed')
|
|
# else:
|
|
# # 未通过考试增加30天期限
|
|
# newdate = datetime.date(timezone.now() + timedelta(days=30))
|
|
# consumer.exceed_date = newdate
|
|
# consumer.save()
|
|
# else:
|
|
perms.append('account_exceed')
|
|
cache.set('cperms_'+str(consumer.id), perms, 60*60)
|
|
return perms
|
|
|
|
class MyPermission(RbacPermission):
|
|
|
|
def has_permission(self, request, view):
|
|
"""
|
|
权限校验逻辑
|
|
:param request:
|
|
:param view:
|
|
:return:
|
|
"""
|
|
perms = []
|
|
if isinstance(request.user, UserProfile): # 如果是管理员表
|
|
if 'perms' in request.session:
|
|
perms = request.session['perms']
|
|
perms.extend(ConsumerPerms)
|
|
elif isinstance(request.user, Consumer): # 如果是客户
|
|
perms = cache.get('cperms_'+str(request.user.id), None)
|
|
if not perms:
|
|
perms = get_consumerperm_list(request.user)
|
|
if perms:
|
|
if 'account_exceed' in perms: # 账户过期
|
|
if request.user.exceed_date and (request.user.exceed_date >= datetime.date(timezone.now())):
|
|
pass
|
|
else:
|
|
perms = ['questioncat_view','my_examtest','down_material', 'account_exceed']
|
|
if not hasattr(view, 'perms_map'):
|
|
return True
|
|
else:
|
|
perms_map = view.perms_map
|
|
_method = request._request.method.lower()
|
|
for i in perms_map:
|
|
for method, alias in i.items():
|
|
if ((_method == method or method == '*') and alias in perms) or alias == '*':
|
|
return True
|
|
return False |