from safesite.models import ExamTestDetail from django.http import HttpResponse, JsonResponse from django.shortcuts import render,reverse from django.shortcuts import redirect from .models import Group, GroupUser from .forms import GroupUserForm, UserForm from safesite import models as s_models from safesite.tasks import gettime import requests import json import time import re from datetime import datetime, date, timedelta from django.core.serializers.json import DjangoJSONEncoder from django.db.models import Q, F, Count, Sum from django.forms.models import model_to_dict from django.http import Http404 from django.views.generic import View,TemplateView,CreateView,UpdateView from django.contrib.auth.hashers import make_password, check_password from django.core.serializers.json import DjangoJSONEncoder from .forms import CompanyForm from uuid import UUID import decimal def fenye(request): start = request.GET.get('offset',None) end = request.GET.get('limit',None) if start and end: return int(start),int(start)+int(end) else: return 0, 99 class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M') elif isinstance(obj, date): return obj.strftime("%Y-%m-%d") elif isinstance(obj, decimal.Decimal): return float(obj) elif isinstance(obj, UUID): # if the obj is uuid, we simply return the value of uuid return obj.hex else: return json.JSONEncoder.default(self, obj) def check_login(func): # 自定义登录验证装饰器 def warpper(request, *args, **kwargs): if request.session.get('is_login', None): return func(request, *args, **kwargs) else: return redirect(reverse('groups_login')) return warpper def login(request): # 不允许重复登录 if request.session.get('is_login', None): return redirect('/groups/index/') if request.method == "POST": groups_form = GroupUserForm(request.POST) message = '请检查填写的内容!' if groups_form.is_valid(): username = groups_form.cleaned_data.get('username') password = groups_form.cleaned_data.get('password') try: user = GroupUser.objects.get(username=username) except: message = '用户不存在!' return render(request, 'login.html', locals()) if user.password == password: request.session['is_login'] = True request.session['user_id'] = user.id request.session['user_name'] = user.username request.session['user_groupname'] = user.group.groupname if user.issuper==1: request.session['issuper'] = True #是否是超级管理员 return redirect('/groups/index/') else: return render(request, 'groups/login.html', locals()) else: return render(request, 'groups/login.html', locals()) groups_form = GroupUserForm() return render(request, 'groups/login.html', locals()) def logout(request): # if not request.session.get('is_login', None): # return redirect('/groups/login') request.session.flush() return redirect('/groups/login') import json from captcha.models import CaptchaStore from captcha.helpers import captcha_image_url def refresh_captcha(request): hashkey = CaptchaStore.generate_key() image_url = captcha_image_url(hashkey) return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json') @check_login def company(request): # userid = request.session['user_id'] # if GroupUser.objects.get(id=userid).issuper==1: # companys = s_models.Partment.objects.filter(iscompany=1).order_by('-creattime') # else: # companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all().order_by('-creattime') # for i in companys: # try: # i.useradmin = s_models.User.objects.get(ubelongpart=i, issuper=1).username # except: # i.useradmin = None return render(request, 'groups/company.html') def company_list(request): userid = request.session['user_id'] if GroupUser.objects.get(id=userid).issuper==1: companys = s_models.Partment.objects.filter(iscompany=1).order_by('-creattime') else: companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all().order_by('-creattime') total = companys.count() company_list = companys.values('partid','partname','creattime','position','role__name', 'enabled') return JsonResponse({'total':total,'rows':list(company_list)},encoder=MyEncoder) def company_toggle(request, id): company = s_models.Partment.objects.get(partid=id) if company.enabled: company.enabled = False else: company.enabled = True company.save() return JsonResponse({}) class CompanyCreateView(CreateView): # model = s_models.Partment # fields = ['partid','partname','role'] # template_name = 'groups/company_form.html' def get(self, request): roles = s_models.Role.objects.values() ret = { 'roles': roles, } return render(request, 'groups/company_form.html', ret) def post(self, request): res = dict(result=False) form = CompanyForm(request.POST) if form.is_valid(): companyname = form.cleaned_data['companyname'] admin = form.cleaned_data['admin'] role = form.cleaned_data['role'] if s_models.Partment.objects.filter(partname=companyname).exists(): res['error'] ='公司已存在' elif s_models.User.objects.filter(username=admin).exists(): res['error'] = '用户已存在' else: obj = s_models.Partment() obj.partname = companyname obj.partlink = ',' obj.iscompany = 1 obj.role = role try: positiondata = getPosition(companyname) if positiondata['status'] == '1' and int(positiondata['count']) > 0: obj.position = positiondata['geocodes'][0] else: companyname = companyname.replace('公司', '').replace('责任', '').replace('有限', '') positiondata = getPosition(companyname) if positiondata['status'] == '1' and int(positiondata['count']) > 0: obj.position = positiondata['geocodes'][0] except: pass obj.save() adminuser = s_models.User() adminuser.username = admin adminuser.name = '超级管理员' adminuser.password = 'Aq123456' adminuser.epassword = make_password('Aq123456') adminuser.issuper = 1 adminuser.ubelongpart = obj adminuser.usecomp = obj adminuser.save() obj.bmzg = ','+str(adminuser.userid)+',' obj.save() menus = list(role.permissions.all().values_list('menuid',flat=True)) s_models.Group.objects.create(groupname='超管', grouptype=0, usecomp=obj, menulist=menus) s_models.Group.objects.create(groupname='安全员', grouptype=1, usecomp=obj, menulist=menus) s_models.Group.objects.create(groupname='全体用户', grouptype=3, usecomp=obj, menulist=[11]) z = s_models.Group.objects.create(groupname='主管', grouptype=2,usecomp=obj, menulist=menus) z.users.add(adminuser) s_models.Yjsetup.objects.create(monthyhavg=100, safev=50, warnv=75, alertv=100, maxv=200, yhpgqz=4, yhdjqz=4, yhsblqz=1, yhzglqz=4, pxdjqz=3, pxxgqz=4, yldjqz=3, ylxgqz=3, usecomp=obj) s_models.Map.objects.create( name='默认地图', pic='/static/safesite/mystatic/images/snc.jpg', usecomp=obj, default=1) res['result'] = True else: errors = form.errors.as_text() res['error'] = errors return HttpResponse(json.dumps(res), content_type='application/json') class CompanyUpdateView(View): def get(self, request): roles = s_models.Role.objects.all() company = s_models.Partment.objects.get(partid=request.GET.get('id')) admin = s_models.User.objects.get(issuper=1,usecomp=company) return render(request,'groups/company_update.html',locals()) def post(self, request): res = dict(result=False) form = CompanyForm(request.POST) if form.is_valid(): id = form.cleaned_data['id'] companyname = form.cleaned_data['companyname'] role = form.cleaned_data['role'] if s_models.Partment.objects.filter(partname=companyname).exclude(partid=id).exists(): res['error'] ='公司已存在' else: s_models.Partment.objects.filter(partid=id).update(partname=companyname,role=role) res['result']=True else: errors = form.errors.as_text() res['error'] = errors return JsonResponse(res) def job(request): return render(request, 'groups/job.html', locals()) def company_user(request, cid): users = s_models.User.objects.filter(usecomp=cid, deletemark=1, issuper=0).order_by('userid') # for user in users: # dump(user) return render(request, 'groups/company_user.html', locals()) def company_userdetail(request, uid): try: user = s_models.User.objects.get(pk=uid) except s_models.User.DoesNotExist: raise Http404("User does not exist") # UserForm.set_usecomp(s_models.Partment.objects.filter(group__id=1)) user_form = UserForm(model_to_dict(user)) return render(request, 'groups/company_userdetail.html', locals()) def admininfo(request, id): user = s_models.User.objects.get(ubelongpart__partid=id,issuper=1) return JsonResponse({'username':user.username,'password':user.password}) def groups_userupdate(request): if request.method == 'POST': id = request.POST.get('id') company = request.POST.get('company') model_user = s_models.User.objects.filter(userid=id)[0] if model_user: for i in s_models.Partment.objects.filter(Q(aqy__contains=','+str(id)+',')|Q(bmzg__contains=','+str(id)+',')|Q(bsq__contains=','+str(id)+',')): i.aqy = i.aqy.replace(','+str(id)+',',',') i.bmzg = i.bmzg.replace(','+str(id)+',',',') i.bsq = i.bsq.replace(','+str(id)+',',',') i.save() company = s_models.Partment.objects.get(partid=company) model_user.ubelongpart = company model_user.usecomp = company model_user.save() bgroups = model_user.userg.all() #所属用户组 for i in bgroups: i.users.remove(model_user) groupobj = s_models.Group.objects.filter(usecomp=company, grouptype=3).first() groupobj.users.add(model_user) return redirect('/groups/company/') else: message = '没有发现该用户' return render(request, 'groups/company_userchange.html', locals()) else: return redirect('/groups/company/') def company_userchange_page(request, uid): try: user = s_models.User.objects.get(pk=uid) except s_models.User.DoesNotExist: raise Http404("User does not exist") oldcompany = user.usecomp if request.session.get('issuper', None): companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) else: companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all().order_by('creattime') return render(request, 'groups/company_userchange.html', locals()) def dump(obj): print('\n'.join(['%s:%s' % item for item in obj.__dict__.items()])) @check_login def index(req): first_day, first_day_of_next_month = gettime() groupuser = GroupUser.objects.get(id=req.session['user_id']) if groupuser.issuper==1: companys = s_models.Partment.objects.filter(iscompany=1) else: group = GroupUser.objects.get(id=req.session['user_id']).group companys = group.members.all() troublenum = s_models.Trouble.objects.filter(deletemark=1, usecomp__in=companys, fxsj__range=(first_day, first_day_of_next_month)).count() observenum = s_models.Observe.objects.filter(deletemark=1, usecomp__in=companys, looktime__range=(first_day, first_day_of_next_month)).count() missnum = s_models.Miss.objects.filter(deletemark=1, usecomp__in=companys, misstime__range=(first_day, first_day_of_next_month)).count() trainnum = s_models.Train.objects.filter(deletemark=1, usecomp__in=companys, starttime__range=(first_day, first_day_of_next_month)).count() companynum = companys.count() usernum = s_models.User.objects.filter(deletemark=1, usecomp__in=companys).count() return render(req, 'groups/index.html', locals()) def updateposition(req): allcompanys = s_models.Partment.objects.filter(deletemark=1, iscompany=1) for i in allcompanys: address = i.partname data = getPosition(address) if data['status'] == '1' and int(data['count']) > 0: i.position = data['geocodes'][0] i.save() else: address = i.partname.replace('公司', '').replace('责任', '').replace('有限', '').replace('水泥','') data = getPosition(address) if data['status'] == '1' and int(data['count']) > 0: i.position = data['geocodes'][0] i.save() return JsonResponse({"code": 1}) def getPosition(address): url = 'http://restapi.amap.com/v3/geocode/geo' par = {'address': address, 'key': '86e0993305a427ac2d0b5371ad97f242'} res = requests.get(url, par) json_data = json.loads(res.text) return json_data def apipositions(req): user = GroupUser.objects.get(id = req.session['user_id']) if user.issuper==1: companys = s_models.Partment.objects.filter(iscompany=1).order_by('-creattime') else: companys = user.group.members.all().order_by('-creattime') positions = companys.values('position','partname') return JsonResponse({"code":1,"data":list(positions)}) def trouble(request):#隐患排查 return render(request, 'groups/troublepic.html', locals()) def observe(request):#行为观察 return render(request, 'groups/observe.html', locals()) def miss(request):#未遂事件 return render(request, 'groups/miss.html', locals()) def risk(request):#风险管控 return render(request, 'groups/risk.html', locals()) def train(request):#教育培训 return render(request, 'groups/train.html', locals()) def exam(request):#在线考试 return render(request, 'groups/exam.html', locals()) def troubleChart(request):#隐患统计图 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') if code=='tbpic': companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() if request.session.get('issuper'): companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) troublelist = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname') if start: troublelist = troublelist.filter(fxsj__gte=start) if end: troublelist = troublelist.filter(fxsj__lte=end) troublelist=troublelist.annotate(number = Count('usecomp')).order_by('-number') return HttpResponse(json.dumps({'code':1,'data':{'troublelist':list(troublelist)}}), content_type='application/json') def observeChart(request):#行为观察 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') if code=='obv': companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() if request.session.get('issuper'): companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) observelist = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname') if start: observelist = observelist.filter(looktime__gte=start) if end: observelist = observelist.filter(looktime__lte=end) observelist=observelist.annotate(number = Count('usecomp')).order_by('-number') return HttpResponse(json.dumps({'code':1,'data':{'observelist':list(observelist)}}), content_type='application/json') def missChart(request):#未遂事件 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') if code=='miss': companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() if request.session.get('issuper'): companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) misslist = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname') if start: misslist = misslist.filter(misstime__gte=start) if end: misslist = misslist.filter(misstime__lte=end) misslist=misslist.annotate(number = Count('usecomp')).order_by('-number') return HttpResponse(json.dumps({'code':1,'data':{'misslist':list(misslist)}}), content_type='application/json') def riskChart(request):#风险管控 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') risks = [] if code=='risk': companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() if request.session.get('issuper'): companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) for i in companys: risk= s_models.RiskAct.objects.filter(usecomp__partid=i.partid) if start: risk = risk.filter(createtime__gte=start) if end: risk = risk.filter(createtime__lte=end) datariskact=risk.count() datariskact1=risk.filter(level="低风险").count() datariskact2=risk.filter(level="一般风险").count() datariskact3=risk.filter(level="较大风险").count() datariskact4=risk.filter(level="重大风险").count() risks.append({'companyName':i.partname,'datariskact':datariskact,'datariskact1':datariskact1,'datariskact2':datariskact2,'datariskact3':datariskact3,'datariskact4':datariskact4}) return HttpResponse(json.dumps({'code':1,'risks':risks}), content_type='application/json') def trainChart(request):#教育培训 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') if code=='train': companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() if request.session.get('issuper'): companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) trainlist = s_models.Train.objects.filter(usecomp__in=companys,deletemark=1).values('usecomp__partid','usecomp__partname') if start: trainlist = trainlist.filter(starttime__gte=start) if end: trainlist = trainlist.filter(starttime__lte=end) trainlist=trainlist.annotate(number = Count('usecomp')).order_by('-number') return HttpResponse(json.dumps({'code':1,'data':{'trainlist':list(trainlist)}}), content_type='application/json') def examChart(request):#在线考试 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') examjson = [] if code=='exam': companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() # if request.session.get('issuper'): # companys = s_models.Partment.objects.filter(iscompany=1,deletemark=1) examobjs = s_models.ExamTest.objects.all() if start: examobjs = examobjs.filter(starttime__gte=start) if end: examobjs = examobjs.filter(starttime__lte=end) for i in companys: examnumber = examobjs.filter(usecomps__contains=','+str(i.partid)+',').exclude(nousecomps__contains=','+str(i.partid)+',') examjson.append({'companyName':i.partname,'number':examnumber.count()}) return HttpResponse(json.dumps({'code':1,'data':examjson}), content_type='application/json') def exam_rate(request): # 考试通过率 start = request.GET.get('start', None) end = request.GET.get('end', None) groupuser = GroupUser.objects.get(id = request.session['user_id']) companys = groupuser.group.members.all() ret = {'x':{'name':'所属公司', 'data':[]}, 's':[{'name':'参考率', 'data':[]},{'name':'优秀率', 'data':[]}, {'name':'满分率', 'data':[]}], 't':'各公司考试比例统计'} ret_ = [] test_count_t = 0 answer_count_t = 0 user_count_t = 0 testuser_count_t = 0 full_count_t = 0 full_count_t_= 0 ninety_count_t = 0 ninety_count_t_ = 0 e_count_t_ = 0 for i in companys: # 员工数 user_count = s_models.User.objects.filter(usecomp=i, deletemark=1, issuper=0).count() # 参加考试员工数/考次数 base = s_models.ExamTestDetail.objects.filter(user__usecomp=i, user__deletemark=1, testnum__gte=1, user__issuper=0).exclude(examtest__nousecomps__contains=','+str(i.partid)+',') if start: base = base.filter(examtest__starttime__gte=start) if end: base = base.filter(examtest__starttime__lte=end) test = s_models.ExamTest.objects.filter(usecomps__contains=','+str(i.partid)+',').exclude(nousecomps__contains=','+str(i.partid)+',') if start: test = test.filter(starttime__gte=start) if end: test = test.filter(starttime__lte=end) test_count = test.count() # 参加考试员工数 testuser_count = base.values('user').distinct().count() # 参考率 rate1 = testuser_count/user_count if user_count else 0 # 答题总数 answer_count = base.count() # 满分人数 full_count = base.filter(score__gte= F('examtest__totalscore')).values('user').distinct().count() # 满分次数 full_count_ = base.filter(score__gte= F('examtest__totalscore')).count() # 满分率 rate2 = full_count/user_count if user_count else 0 # 满分率 rate2_ = full_count_/answer_count if answer_count else 0 # 90分数人数 ninety_count = base.filter(score__gte = F('examtest__totalscore')*0.9).values('user').distinct().count() # 80分数次数 e_count_= base.filter(score__gte = F('examtest__totalscore')*0.8).count() # 90分数次数 ninety_count_ = base.filter(score__gte = F('examtest__totalscore')*0.9).count() # 90以上得分率 rate3 = ninety_count/user_count if user_count else 0 # 90以上得分率 rate3_ = ninety_count_/answer_count if answer_count else 0 # 80以上得分率 rate4_ = e_count_/answer_count if answer_count else 0 # rate1 = '%.2f' % (rate1*100) rate1 = int(rate1*100+0.5) if int(rate1*100+0.5)<101 else 100 rate2 = int(rate2*100+0.5) if int(rate2*100+0.5)<101 else 100 rate2_ = int(rate2_*100+0.5) if int(rate2_*100+0.5)<101 else 100 rate3 = int(rate3*100+0.5) if int(rate3*100+0.5)<101 else 100 rate3_ = int(rate3_*100+0.5) if int(rate3_*100+0.5)<101 else 100 rate4_ = int(rate4_*100+0.5) if int(rate4_*100+0.5)<101 else 100 ret['x']['data'].append(i.partname) ret['s'][0]['data'].append(rate1) ret['s'][1]['data'].append(rate3) ret['s'][2]['data'].append(rate2) user_count_t = user_count_t + user_count testuser_count_t = testuser_count_t + testuser_count full_count_t = full_count_t + full_count full_count_t_ = full_count_t_ + full_count_ ninety_count_t = ninety_count_t + ninety_count ninety_count_t_ = ninety_count_t_ + ninety_count_ e_count_t_ = e_count_t_ + e_count_ test_count_t = test_count_t + test_count answer_count_t = answer_count_t + answer_count ret_.append({'company':i.partname,'test_count':test_count, 'user_count':user_count, 'testuser_count':testuser_count, 'ninety_count':ninety_count, 'full_count':full_count, 'rate1':rate1, 'rate2':rate2, 'rate3':rate3, 'answer_count': answer_count, 'rate2_':rate2_, 'rate3_':rate3_, 'rate4_':rate4_, 'full_count_':full_count_, 'ninty_count_':ninety_count_, 'e_count_':e_count_}) rate1_t = testuser_count_t/user_count_t rate2_t = full_count_t/user_count_t if user_count_t else 0 rate2_t_ = full_count_t_/answer_count_t if answer_count_t else 0 rate3_t = ninety_count_t/user_count_t if user_count_t else 0 rate3_t_ = ninety_count_t_/answer_count_t if answer_count_t else 0 rate4_t_ = e_count_t_/answer_count_t if answer_count_t else 0 rate1_t = int(rate1_t*100+0.5) if int(rate1_t*100+0.5)<101 else 100 rate2_t = int(rate2_t*100+0.5) if int(rate2_t*100+0.5)<101 else 100 rate2_t_ = int(rate2_t_*100+0.5) if int(rate2_t_*100+0.5)<101 else 100 rate3_t = int(rate3_t*100+0.5) if int(rate3_t*100+0.5)<101 else 100 rate3_t_ = int(rate3_t_*100+0.5) if int(rate3_t_*100+0.5)<101 else 100 rate4_t_ = int(rate4_t_*100+0.5) if int(rate4_t_*100+0.5)<101 else 100 ret['x']['data'].insert(0, groupuser.group.groupname) ret['s'][0]['data'].insert(0, rate1_t) ret['s'][1]['data'].insert(0, rate3_t) ret['s'][2]['data'].insert(0, rate2_t) ret_.insert(0,{'company':groupuser.group.groupname,'test_count':test_count_t, 'user_count':user_count_t, 'testuser_count':testuser_count_t, 'ninety_count':ninety_count_t, 'full_count':full_count_t, 'rate1':rate1_t, 'rate2':rate2_t, 'rate3':rate3_t, 'answer_count': answer_count_t, 'rate2_':rate2_t_, 'rate3_':rate3_t_, 'rate4_':rate4_t_, 'full_count_':full_count_t_, 'ninty_count_':ninety_count_t_, 'e_count_':e_count_t_}) return HttpResponse(json.dumps({'code':200,'data':[ret, {'total':len(ret_),'rows':ret_}]}), content_type='application/json')