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')