471 lines
21 KiB
Python
471 lines
21 KiB
Python
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')
|
|
|
|
|
|
|