safesite/groups/views.py

501 lines
22 KiB
Python

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
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
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')
return JsonResponse({'total':total,'rows':list(company_list)},encoder=MyEncoder)
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=menus)
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).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)+',')
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')
end = request.GET.get('end')
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
for i in companys:
# 员工数
user_count = s_models.User.objects.filter(usecomp=i, deletemark=1).count()
# 参加考试员工数
base = s_models.ExamTestDetail.objects.filter(user__usecomp=i, user__deletemark=1)
testuser_count = base.values('user').distinct().count()
# 参考率
rate1 = testuser_count/user_count
# 考试总数
test_count = base.count()
# 满分数
full_count = base.filter(score = F('examtest__totalscore')).count()
# 满分率
rate2 = full_count/test_count if test_count else 0
# 90分数
ninety_count = base.filter(score__gte = F('examtest__totalscore')*0.9).count()
# 90以上得分率
rate3 = ninety_count/test_count if test_count else 0
print(user_count, testuser_count)
# print(i.partname, rate1, rate2, rate3)