import json
import re
from django.views.generic.base import View
from django.shortcuts import HttpResponse, get_object_or_404
from django.views.generic import TemplateView,CreateView,UpdateView
from django.contrib.auth import get_user_model
from django.shortcuts import render
from django.forms.models import model_to_dict
from safesite.models import Role,Menu
class RoleView(TemplateView):
template_name = 'groups/role.html'
class RoleListView(View):
def get(self, reqeust):
fields = ['id', 'name', 'desc']
ret = dict(data=list(Role.objects.values(*fields)))
return HttpResponse(json.dumps(ret), content_type='application/json')
class RoleCreateView(CreateView):
model = Role
fields = '__all__'
template_name = 'groups/role_form.html'
def post(self, request, *args, **kwargs):
res = dict(result=False)
form = self.get_form()
if form.is_valid():
form.save()
res['result'] = True
else:
pattern = '
.*?- (.*?)
'
form_errors = str(form.errors)
errors = re.findall(pattern, form_errors)
res['error'] = errors[0]
return HttpResponse(json.dumps(res), content_type='application/json')
class RoleDeleteView(View):
def post(self, request):
ret = dict(result=False)
if 'id' in request.POST and request.POST['id']:
id_list = map(int, request.POST['id'].split(','))
Role.objects.filter(id__in=id_list).delete()
ret['result'] = True
return HttpResponse(json.dumps(ret), content_type='application/json')
class RoleUpdateView(UpdateView):
model = Role
fields = '__all__'
template_name = 'groups/role_update.html'
template_name_suffix = '_update'
def get_object(self, queryset=None):
if queryset is None:
queryset = self.get_queryset()
if 'id' in self.request.GET and self.request.GET['id']:
queryset = queryset.filter(id=int(self.request.GET['id']))
elif 'id' in self.request.POST and self.request.POST['id']:
queryset = queryset.filter(id=int(self.request.POST['id']))
else:
raise AttributeError("Generic detail view %s must be called with id. "
% self.__class__.__name__)
try:
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404("No %(verbose_name)s found matching the query" %
{'verbose_name': queryset.model._meta.verbose_name})
return obj
def post(self, request, *args, **kwargs):
self.object = self.get_object()
res = dict(result=False)
form = self.get_form()
if form.is_valid():
form.save()
res['result'] = True
else:
pattern = '- .*?
- (.*?)
'
form_errors = str(form.errors)
errors = re.findall(pattern, form_errors)
res['error'] = errors[0]
return HttpResponse(json.dumps(res), content_type='application/json')
class Role2MenuView(View):
"""
角色绑定菜单
"""
def get(self, request):
if 'id' in request.GET and request.GET['id']:
role = get_object_or_404(Role, pk=request.GET['id'])
ret = dict(role=role)
return render(request, 'groups/role_role2menu.html', ret)
def post(self, request):
res = dict(result=False)
role = get_object_or_404(Role, pk=request.POST['id'])
tree = json.loads(self.request.POST['tree'])
role.permissions.clear()
for menu in tree:
if menu['checked'] is True:
menu_checked = get_object_or_404(Menu, pk=menu['menuid'])
role.permissions.add(menu_checked)
res['result'] = True
return HttpResponse(json.dumps(res), content_type='application/json')
class Role2MenuListView(View):
"""
获取zTree菜单列表
"""
def get(self, request):
fields = ['menuid', 'menuname', 'parentid']
menus = Menu.objects.all()
if 'id' in request.GET and request.GET['id']:
role = Role.objects.get(id=request.GET.get('id'))
role_menus = role.permissions.all().values_list('menuid',flat=True)
menusqlist = menus.values(*fields)
for i in menusqlist:
if i['menuid'] in role_menus:
i['checked'] = True
else:
i['checked'] = False
ret = dict(data=list(menusqlist))
else:
ret = dict(data=list(menus.values(*fields)))
return HttpResponse(json.dumps(ret), content_type='application/json')