xuigaiquanxian2

This commit is contained in:
shilixia 2019-12-25 13:57:05 +08:00
commit 80dd24a14c
28 changed files with 684 additions and 140 deletions

View File

@ -38,6 +38,7 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'safesite',
'safesite.templatetags',
'groups',
'captcha',
]
@ -148,6 +149,7 @@ CELERY_ENABLE_UTC=True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
#SESSION_COOKIE_AGE = 2400
SESSION_SAVE_EVERY_REQUEST = True
# PERMISSIONS_SESSION_KEY = {} #权限字典
#日志配置
# 创建日志的路径

View File

@ -6,3 +6,12 @@ admin.site.register(models.Trouble)
admin.site.register(models.Dicclass)
admin.site.register(models.Dickey)
admin.site.register(models.Partment)
@admin.register(models.Menu)
class Menuadmin(admin.ModelAdmin):
list_display = ('menuname','menucode','type','url')
list_display_links = ('menuname',)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "parentid":
kwargs["queryset"] = models.Menu.objects.filter(type=1)
return super().formfield_for_foreignkey(db_field, request, **kwargs)

View File

@ -10,6 +10,7 @@ import qrcode
import os
from django.contrib.auth.hashers import make_password
from django.db.models import Q
from .tasks import send_wechatmsg
def makeqr(data):
upload_folder = 'media/qr_equipment'
@ -109,7 +110,7 @@ def drquestions(companyid,path,userid):
obj.level = leveldict[level]
else:
obj.level = 1
obj.usecoms = ','+companyid+','
obj.usecomps = ','+companyid+','
obj.createuser = user
obj.save()
elif type == '多选':
@ -131,7 +132,7 @@ def drquestions(companyid,path,userid):
obj.level = leveldict[level]
else:
obj.level = 1
obj.usecoms = ','+companyid+','
obj.usecomps = ','+companyid+','
obj.createuser = user
obj.save()
elif type == '判断':
@ -153,14 +154,169 @@ def drquestions(companyid,path,userid):
obj.level = leveldict[level]
else:
obj.level = 1
obj.usecoms = ','+companyid+','
obj.usecomps = ','+companyid+','
obj.createuser = user
obj.save()
i = i +1
print(notinlist)
return notinlist
def drtodotroubles(companyid,path,userid):
wb = load_workbook(path)
sheet = wb.worksheets[0]
# 验证文件内容
if sheet['a2'].value != '检查类型':
return {'code':0,'msg':'excel格式错误!'}
if sheet['b2'].value != '隐患等级':
return {'code':0,'msg':'excel格式错误!'}
if sheet['h2'].value != '隐患地点':
return {'code':0,'msg':'excel格式错误!'}
partdict = {}
jclxdict = {}
yhdjdict = {}
yhlxdicto = {}
yhlbdict = {}
yhpgdict = {}
yhqydict = {}
parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门
for i in parts:
partdict[i.partname] = i
for i in Dickey.objects.filter(dicparent__dicid=14):
jclxdict[i.dickeyname] = i
for i in Dickey.objects.filter(dicparent__dicid=18):
yhdjdict[i.dickeyname] = i
for i in Dickey.objects.filter(dicparent__dicid=15):
yhlxdicto[i.dickeyname] = i
for i in Dickey.objects.filter(Q(dicparent__dicid=16)|Q(dicparent__dicid=17)):
yhlbdict[i.dickeyname] = i
for i in Dickey.objects.filter(dicparent__dicid=19):
yhpgdict[i.dickeyname] = i
for i in Area.objects.filter(usecomp__partid=companyid):
yhqydict[i.name]=i
i = 3
sheetimages = sheet._images #获取图片列表
username = User.objects.get(userid=userid).username
while sheet['B'+str(i)].value:
try:
jclx = sheet['A'+str(i)].value
yhdj = sheet['B'+str(i)].value
yhlxo = sheet['C'+str(i)].value
yhlb = sheet['D'+str(i)].value
yhpg = sheet['E'+str(i)].value
fxsj = sheet['F'+str(i)].value
yhqy = sheet['g'+str(i)].value
yhdd = sheet['h'+str(i)].value
fxbm = sheet['i'+str(i)].value
fxr = sheet['j'+str(i)].value
yhms = sheet['k'+str(i)].value
zgbm = sheet['l'+str(i)].value
zgr= sheet['m'+str(i)].value
zgqx = sheet['n'+str(i)].value
yyfx = sheet['o'+str(i)].value
zgcs = sheet['p'+str(i)].value
fcbm = sheet['q'+str(i)].value
fcr = sheet['r'+str(i)].value
obj = Trouble()
if jclx in jclxdict:
obj.jclx = jclxdict[jclx]
if yhdj in yhdjdict:
obj.yhdj = yhdjdict[yhdj]
if yhlxo in yhlxdicto:
obj.yhlxo = yhlxdicto[yhlxo]
for key in yhlbdict:
if key in yhlb:
obj.yhlb = yhlbdict[key]
obj.yhlx = obj.yhlb.dicparent
if yhpg in yhpgdict:
obj.yhpg = yhpgdict[yhpg]
if fxsj:
if isinstance(fxsj,datetime):
obj.fxsj = fxsj
else:
fxsj = fxsj.replace(' ','')
if '-' in fxsj:
obj.fxsj = datetime.strptime(fxsj,'%Y-%m-%d').date()
elif '.' in fdate:
obj.fxsj = datetime.strptime(fxsj,'%Y.%m.%d').date()
elif '/' in fdate:
obj.fxsj = datetime.strptime(fxsj,'%Y/%m/%d').date()
if yhqy in yhqydict:
obj.yhqy = yhqydict[yhqy]
if yhdd:
obj.yhdd = yhdd
if fxbm in partdict:
obj.fxbm = partdict[fxbm]
if fxr:
obj.fxr = User.objects.filter(name=fxr,ubelongpart=obj.fxbm)[0]
if yhms:
obj.yhms = yhms
if zgbm in partdict:
obj.zgbm = partdict[zgbm]
if zgr:
obj.zgr = User.objects.filter(name=zgr,ubelongpart=obj.zgbm)[0]
obj.todouser = obj.zgr
if zgqx:
if isinstance(zgqx,datetime):
obj.zgqx = zgqx
else:
zgqx = zgqx.replace(' ','')
if '-' in zgqx:
obj.zgqx = datetime.strptime(zgqx,'%Y-%m-%d').date()
elif '.' in fdate:
obj.zgqx = datetime.strptime(zgqx,'%Y.%m.%d').date()
elif '/' in fdate:
obj.zgqx = datetime.strptime(zgqx,'%Y/%m/%d').date()
if yyfx:
obj.yyfx = yyfx
if zgcs:
obj.zgcs = zgcs
if fcbm in partdict:
user = User.objects.filter(name=fcr,ubelongpart=partdict[fcbm])[0]
obj.fcr = user
for image in sheetimages:
if image.anchor._from.row == i-1 and image.anchor._from.col == 18:
imagedata = image._data()#图片二进制数据
file_name = datetime.now().strftime('%Y%m%d%H%M%S') + '_yh'+str(i)+'.jpg'
user_upload_folder = os.path.join('media', username)
if not os.path.exists(user_upload_folder):
os.mkdir(user_upload_folder)
filepath = os.path.join(user_upload_folder, file_name)
filepath = filepath.replace('\\', '/')
with open(filepath,'wb') as f:
f.write(imagedata)
obj.yhtp = filepath
obj.yhzt = 3 #待整改
obj.yhnum = 'YH'+datetime.now().strftime('%Y%m%d%H%M%S')+str(i)
obj.usecomp = Partment.objects.get(partid=companyid)
obj.save()
postdict = {
'touser': 'oPGqkweX75QtLmgehUN-ipR4hcyc',
'template_id': 'lOuwSE67vZC3ZVFYPZvz2eb7JdFxqx7ysMFkXrYmYh0',
"miniprogram": {"appid": "wx5c39b569f01c27db"},
'data': {
'first': {
'value': yhdj + '待整改:'
},
'keyword1': {
'value': yhms
},
'keyword2': {
'value': fxsj
},
'keyword3': {
'value': yhdd
},
'remark': {
'value': '请您及时完成整改。'
}
}
}
postdict['touser'] = obj.todouser.openid
send_wechatmsg.delay(postdict)
i = i + 1
except:
return ''+str(i)+'行数据错误,导入终止!'
def drequipments(companyid,path):
@ -298,12 +454,6 @@ def drequipments(companyid,path):
return {'code':2,'msg':'部分未导入成功!','info':numsdict}
def drusers(companyid,path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
@ -373,6 +523,7 @@ def drusers(companyid,path):
else:
return {'code':1,'msg':'导入全部成功!'}
def drrisks(companyid,path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
@ -530,6 +681,7 @@ def drrisks(companyid,path):
i = i+1
return errorlist
def cal_riskact_level(riskact):
levellist = []
for i in Risk.objects.filter(riskact=riskact):
@ -548,6 +700,7 @@ def cal_riskact_level(riskact):
riskact.save()
cal_area_risk_level(riskact.area)
def cal_area_risk_level(area):
levellist = []
objs = RiskAct.objects.filter(area=area,type__dickeyid=396)
@ -570,6 +723,7 @@ def cal_area_risk_level(area):
area.risklevel = None
area.save()
def is_float(str):
if str.count('.') == 1: #小数有且仅有一个小数点
left = str.split('.')[0] #小数点左边(整数位,可为正或负)

View File

@ -0,0 +1,14 @@
# Generated by Django 2.2.8 on 2019-12-17 12:00
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('safesite', '0296_auto_20191209_1029'),
('safesite', '0296_auto_20191206_1559'),
]
operations = [
]

View File

@ -0,0 +1,22 @@
# Generated by Django 2.2.8 on 2019-12-17 12:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0297_merge_20191217_1200'),
]
operations = [
migrations.RemoveField(
model_name='companyinfo',
name='liaison_fax',
),
migrations.AddField(
model_name='menu',
name='type',
field=models.IntegerField(default=1),
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 2.2.8 on 2019-12-17 12:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('safesite', '0298_auto_20191217_1200'),
]
operations = [
migrations.RemoveField(
model_name='menu',
name='type',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.8 on 2019-12-17 12:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0299_remove_menu_type'),
]
operations = [
migrations.AddField(
model_name='menu',
name='type',
field=models.IntegerField(default=1),
),
]

View File

@ -0,0 +1,28 @@
# Generated by Django 2.2.8 on 2019-12-17 14:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0300_menu_type'),
]
operations = [
migrations.AlterField(
model_name='menu',
name='deletemark',
field=models.IntegerField(default=1),
),
migrations.AlterField(
model_name='menu',
name='icon',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='menu',
name='sortnum',
field=models.IntegerField(default=1),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.8 on 2019-12-17 15:06
import django.contrib.postgres.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0301_auto_20191217_1414'),
]
operations = [
migrations.AddField(
model_name='group',
name='menulist',
field=django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), blank=True, null=True, size=None),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.8 on 2019-12-18 09:18
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0302_group_menulist'),
]
operations = [
migrations.AddField(
model_name='trouble',
name='yhlxo',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='yhlxo', to='safesite.Dickey'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.8 on 2019-12-19 16:00
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0303_trouble_yhlxo'),
]
operations = [
migrations.AddField(
model_name='trouble',
name='submituser',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submituser', to='safesite.User'),
),
]

View File

@ -162,6 +162,8 @@ class Trouble(models.Model): # 隐患排查
yhdd = models.CharField(max_length=200, default='test')
yhdj = models.ForeignKey(Dickey, related_name='yhdj',
on_delete=models.CASCADE, null=True, blank=True)
yhlxo = models.ForeignKey(Dickey, related_name='yhlxo',
on_delete=models.CASCADE, null=True, blank=True)
yhlx = models.ForeignKey(
Dicclass, related_name='yhlx', on_delete=models.CASCADE, null=True, blank=True)
yhlb = models.ForeignKey(Dickey, related_name='yhlb',
@ -208,6 +210,8 @@ class Trouble(models.Model): # 隐患排查
pgyj = models.TextField(null=True, blank=True) # 评估退回意见
yhqy = models.ForeignKey(
Area, on_delete=models.CASCADE, null=True, blank=True) # 隐患区域
submituser = models.ForeignKey(User, related_name='submituser',
on_delete=models.CASCADE, null=True, blank=True) # 记录人
class TroubleAccess(models.Model): # 隐患流程表
@ -357,6 +361,7 @@ class Group(models.Model): # 用户组,岗位
usecomp = models.ForeignKey(
Partment, on_delete=models.CASCADE, related_name='usecompg', default=1)
menulink = models.CharField(max_length=200, default='11')
menulist = ArrayField(models.IntegerField(), blank=True, null=True)
class Groupuser2(models.Model): # 比较好的方式
@ -367,16 +372,26 @@ class Groupuser2(models.Model): # 比较好的方式
class Menu(models.Model): # 菜单
menuid = models.AutoField(primary_key=True)
menuname = models.CharField(max_length=30, blank=True, null=True)
menucode = models.CharField(max_length=30, blank=True, null=True)
url = models.CharField(max_length=30, blank=True, null=True)
detail = models.CharField(max_length=100, blank=True, null=True)
type_choices = (
(1, '菜单'),
(2, '按钮'),
)
menuid = models.AutoField(primary_key=True,verbose_name='ID')
menuname = models.CharField(max_length=30, blank=True, null=True,verbose_name='名称')
menucode = models.CharField(max_length=30, blank=True, null=True,verbose_name='菜单标识')
url = models.CharField(max_length=30, blank=True, null=True,verbose_name='操作地址')
detail = models.CharField(max_length=100, blank=True, null=True,verbose_name='描述')
parentid = models.ForeignKey(
'self', blank=True, null=True, on_delete=models.CASCADE)
icon = models.CharField(max_length=100, default='')
sortnum = models.IntegerField(default='1')
deletemark = models.IntegerField(default='1')
'self', blank=True, null=True, on_delete=models.CASCADE,verbose_name='上级')
icon = models.CharField(max_length=100, blank=True, null=True,verbose_name='图标')
sortnum = models.IntegerField(default=1,verbose_name='排序号')
deletemark = models.IntegerField(default=1,verbose_name='删除标记')
type = models.IntegerField(default=1,choices=type_choices,verbose_name='类型')#1是菜单2是按钮
class Meta:
verbose_name = '菜单&按钮'
verbose_name_plural = "菜单&按钮"
def __str__(self):
return self.menuname+self.menucode
class Yjyc(models.Model): # 预警预测表

View File

@ -164,6 +164,9 @@ function convertmenu(rows) {
var row = rows[i];
if (row.parentid == node.id) {
var child = { id: row.menuid, text: row.menuname, attributes: row.url, iconCls: row.icon, checked: row.checked };
if (row.type!=1){
node.state = 'closed'
}
if (node.children) {
node.children.push(child);
} else {
@ -598,4 +601,54 @@ $.get('api/check_session',function(res){
})
}
var t1 = window.setInterval(update, 1000 * 60)
var t2 = window.setInterval(checksession,1000*60*41)
var t2 = window.setInterval(checksession,1000*60*41)
//扩展easyui表单的验证
$.extend($.fn.validatebox.defaults.rules, {
//验证汉字
CHS: {
validator: function (value) {
return /^[\u0391-\uFFE5]+$/.test(value);
},
message: '请输入汉字'
},
//移动手机号码验证
Mobile: {//value值为文本框中的值
validator: function (value) {
var reg = /^1[3|4|5|8|9]\d{9}$/;
return reg.test(value);
},
message: '请输入正确号码'
},
//国内邮编验证
ZipCode: {
validator: function (value) {
var reg = /^[0-9]\d{5}$/;
return reg.test(value);
},
message: '6位数字'
},
//数字
Number: {
validator: function (value) {
var reg =/^[0-9]*$/;
return reg.test(value);
},
message: '请输入数字'
},
//非负整数
Integer: {
validator: function (value) {
var reg = /^[1-9]\d*|0$/;
return reg.test(value);
},
message: '请输入非负整数'
},
Password:{
validator:function(value){
var reg = /(?=.*[0-9])(?=.*[a-zA-Z]).{8,30}/;
return reg.test(value);
},
message:'至少8位包含数字,大小写字母'
}
})

View File

@ -18,15 +18,15 @@
</form>
</div>
<script>
$('#parentid').combotree({
url: 'parthandle?a=tree',
var a = GetQueryString('a');
if (a == 'editparth') {
partid = GetQueryString('partid');
$('#parentid').combotree({
url: 'parthandle?a=tree4&expart='+ partid,
loadFilter: function (rows) {
return convert(rows);
},
});
var a = GetQueryString('a');
if (a == 'editparth') {
partid = GetQueryString('partid');
$.ajax({
type: "GET",
url: 'parthandle?a=detail&partid=' + partid,
@ -44,6 +44,13 @@
}
});
}else{
$('#parentid').combotree({
url: 'parthandle?a=tree',
loadFilter: function (rows) {
return convert(rows);
},
});
}
function submitFormp() {
var form = new FormData(document.getElementById("partff"));

View File

@ -16,7 +16,7 @@
<div style="margin-bottom:5px">
<input id="username" class="easyui-textbox" name="username" style="width:90%" data-options="label:'账户',required:true"></input></div>
<div style="margin-bottom:5px">
<input id="password" class="easyui-textbox" name="password" style="width:90%" data-options="label:'密码',required:true"></input></div>
<input id="password" class="easyui-passwordbox validatebox" name="password" style="width:90%" data-options="label:'密码',required:true,validType:'Password'"></input></div>
<div style="margin-bottom:5px">
<input id="ubelongpart" class="easyui-combotree" name="ubelongpart" style="width:90%"
data-options="

View File

@ -13,6 +13,15 @@
textField:'text',
" />
</div>
<div style="margin-bottom:5px">
<input class="easyui-combobox" editable="false" required=true name="yhlxo" id="yhlxo" style="width:480px;" data-options="
url:'getdickey?dicclass=56&a=combobox',
label:'隐患类型',
method: 'get',
valueField:'value',
textField:'text',
" />
</div>
<div style="margin-bottom:5px">
<input editable="false" required=true name="jclx" id="jclx" style="width:480px" data-options="
label:'检查类型',

View File

@ -57,7 +57,7 @@
<div class="center_top">
<div class="title"><img src="/static/safesite/mystatic/images/bigdata/icon03.png" /> 平台数据分布</div>
<div class="center_top_con" id="distribution_map">
<div id="map" class="map" style="width:100%;height:auto;outline: #4A74A8 solid 0.15em;">
<div id="map" class="map" style="width:100%;height:100%;outline: #4A74A8 solid 0.15em;">
</div>
<input type='hidden' id='mapshowinput'></input>
<div id="popup" class="ol-popup">
@ -67,25 +67,19 @@
</div>
</div>
<div class="center_bot">
<table name="" id="zgrpmtable" class='panel-table' title="隐患整改人排名" data-options="
rownumbers:true,
singleSelect:true,
striped: true,
method:'get',
url: 'fxhandle?a=yhzgpm',
toolbar:'#zgrpmbar'" bordercolor="#0d48e0" border="1">
<table class='panel-table' bordercolor="#0d48e0" border="1">
<thead bgcolor="#0e4ae0" align="center" >
<tr height="40">
<th colspan="7"> 隐患排查</th>
<th colspan="7" bgcolor="#FF0000"> 隐患排查</th>
</tr>
<tr>
<th data-options="field:'zgr__userid',hidden:true">编号</th>
<th data-options="field:'zgr__name',align:'right'">流程状态</th>
<th data-options="field:'number',align:'right'>整改隐患数">隐患等级</th>
<th data-options="field:'number',align:'right'>整改隐患数">隐患类别</th>
<th data-options="field:'number',align:'right'>整改隐患数">隐患评估</th>
<th data-options="field:'number',align:'right'>整改隐患数">发现人</th>
<th data-options="field:'zgbm__partname',align:'right'">下一步处理人</th>
<th>编号</th>
<th>流程状态</th>
<th>隐患等级</th>
<th>隐患类别</th>
<th>隐患评估</th>
<th>发现人</th>
<th>下一步处理人</th>
</tr>
</thead>
<tbody>
@ -337,7 +331,7 @@
.ol-popup-closer:after {
content: "✖";
}
</style>
</style>
<script>
var map, source, vector;// global so we can remove it later
var container = document.getElementById("popup");
@ -351,7 +345,6 @@
});
$.get('../api/map?a=default', function (res) {
$('#map').empty()
map = initMap(res.pic)
update()
})
@ -398,18 +391,18 @@
if (feature) {
var data = feature.getProperties()
//设置弹出框内容可以HTML自定义
var html = "<p style='color:blue'>" + data.name + "</span></p>"
var html = "<p style='color:blue'>" + data.name + "</p>"
if (data.type == 'yh') {
html = html + "<p>事故隐患数量:" + data.num.toString() + "</p>" + "<p><a href='#' onclick='opendetail(" + data.id.toString() + ")'>查看详情</a></p>"
html = html + "<p style='color:blue'>事故隐患数量:" + data.num.toString() + "</p>"
}
else if (data.type == 'ws') {
html = html + "<p>未遂事件数量:" + data.num.toString() + "</p>" + "<p><a href='#' onclick='opendetail(" + data.id.toString() + ")'>查看详情</a></p>"
}
else if (data.type == 'fx') {
html = html + "<p>风险等级:" + data.risklevel + "</p>" + "<p><a href='#' onclick='opendetail(" + data.id.toString() + ")'>查看详情</a></p>"
html = html + "<p style='color:blue'>未遂事件数量:" + data.num.toString() + "</p>"
}
else if (data.type == 'zy') {
html = html + "<p>危险作业数量:" + data.num.toString() + "</p>" + "<p><a href='#' onclick='opendetail(" + data.id.toString() + ")'>查看详情</a></p>"
html = html + "<p style='color:blue'>危险作业数量:" + data.num.toString() + "</p>"
}
else if (data.type == 'fx') {
html = html + "<p style='color:blue'>风险等级:" + data.risklevel + "</p>"
}
content.innerHTML = html;
//设置overlay的显示位置

View File

@ -69,7 +69,8 @@
function adddict() {
var row = $('#dicclasstree').tree('getSelected');
var x = 0;
if (row && ($('#dicclasstree').tree('isLeaf', row.target)) ) {
if (row&&($('#dicclasstree').tree('isLeaf', row.target))) {
x = row.id;
$("#dd").dialog({
maximizable: true,
@ -85,7 +86,7 @@
});
$("#dd").window('center');
}else{
$.messager.alert('提示', '请先选择左侧子目录!');
$.messager.alert('提示', '请先选择左侧根节点!');
}

View File

@ -125,7 +125,7 @@
var row = $('#kstable').datagrid('getSelected');
if (row) {
var url = 'html/examtest/detail/' + row.id
opendg('查看详情',url)
opendg('查看详情',url,1000)
}
else { $.messager.alert('提示', '请选择一行数据!'); }
}

View File

@ -75,6 +75,9 @@
<th style="width:10%">
得分
</th>
<th style="width:15%">
参考时间
</th>
<th style="width:10%">
用时
</th>
@ -98,6 +101,7 @@
<td><font color="green">已参加</font></td>
{{/if}}
<td>{{$value.score}}</td>
<td>{{$value.starttime}}</td>
<td>{{$value.took}}</td>
<td><a target="_blank" href="/html/examhistory/{{$value.id}}">点击查看</a></td>

View File

@ -27,6 +27,7 @@
<script src="https://cdn.bootcss.com/jquery.form/4.2.1/jquery.form.min.js"></script>
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
<script type="text/javascript" src="/static/safesite/mystatic/js/util.js"></script>
<script type="text/javascript" src="/static/safesite/easyui/datagrid-scrollview.js"></script>
<style type="text/css">
.easyui-linkbutton:hover {
background: #1148a0;
@ -84,7 +85,7 @@
<div style="width:30%;float:right">
<div style="margin-top: 10px;text-align: center;position: fixed;width: 500px;height: 70px;right: 20px;">
<span style=" padding-right:20px;font-size: 18px;color:#F5EBEB" class="head">
{{ username }} 欢迎您!
{{ user.username }} 欢迎您!
</span>
</div>
<div style="text-align: center;position: fixed;width: 500px;height: 70px;top: 40px;right: 60px;">
@ -145,16 +146,16 @@
</ul>
</div>
<div id='pwdg' title='修改密码' style="width:500px;height:250px;display:none" data-options="modal:true">
<form method="post" style="margin-top:10px">
<form method="post" style="margin:10px;">
<div style="margin-bottom:5px;">
<input id="oldpwd" class="easyui-textbox" name="oldpwd" type="password" style="width:100%;"
data-options="label:'旧密码'" /></div>
<input id="oldpwd" class="easyui-passwordbox" name="oldpwd" type="password"
data-options="label:'旧密码',required:true" style="width:90%"/></div>
<div style="margin-bottom:5px;">
<input id="newpwd" class="easyui-textbox" name="newpwd" type="password" style="width:100%;"
data-options="label:'新密码'" /></div>
<input id="newpwd" class="easyui-passwordbox validatebox" name="newpwd"
data-options="label:'新密码',validType:'Password',required:true" style="width:90%"/></div>
<div style="margin-bottom:5px;">
<input id="newpwd2" class="easyui-textbox" name="newpwd2" type="password" style="width:100%;"
data-options="label:'确认新密码'" /></div>
<input id="newpwd2" class="easyui-passwordbox validatebox" name="newpwd2"
data-options="label:'确认新密码',validType:'Password',required:true" style="width:90%"/></div>
</form>
<div style="text-align: center">
<a id="btnpwc" class="easyui-linkbutton" iconCls="icon-ok" onclick="btnpwc()">保存</a>
@ -183,6 +184,12 @@
}
});
}
var pwstr = {{pwstr}};
if(pwstr==0){
$.messager.alert('','您的密码复杂度太低,请修改!','warning',function(){
$('#pwdg').dialog()
});}
function bindwx() {
if (openid == 0 ||openid == 'None') {
$('#wxdg').dialog('open');

View File

@ -379,7 +379,7 @@ float: left;">
<script>
var data=JSON.parse(localStorage.getItem("data"));
bindmap9('gzbqst')
if(data.rights.indexOf('30')!=-1){ //有无地图功能
if(data.rights.indexOf(30)!=-1){ //有无地图功能
$('#panelxdiv').show()
$('#panelx').panel({
href:'html/mapshow',

View File

@ -30,7 +30,10 @@
return s;
}," />
<a id="BindZt" onclick="BindZt();">查询</a>
{% load myfilter %}
{% if request|has_permission:'b_report_export' %}
<a id="Export" onclick="Export()">导出</a>
{% endif %}
</form>
<div id="depinfo">
<form id="form1" method="post">

View File

@ -14,6 +14,7 @@
animate: true,
checkbox: true,
lines: true,
cascadeCheck :true,
loadFilter: function (rows) {
var rows = convertmenu(rows)
return rows;

View File

@ -1,16 +1,5 @@
<div id="yhtablebar" style="padding:4px;height:40px">
<div style="width: 600px;float: right;padding: 5px;">
<a id="addyh" onclick="javascript:opendg('新增隐患','addtrouble?a=addyh')">新增</a>
<a id="doyh" onclick="doyh()">处理</a>
<a id="delyh" onclick="delyh()">删除</a>
<a id="duibiao" class='easyui-linkbutton' onclick="duibiao()" data-options="iconCls: 'fa-thumb-tack',plain:true">对标</a>
<a id="detailyh2" onclick="detailyh()">查看详情</a>
<a id="exportword" onclick="exportyhword()">导出Word</a>
<a id="exportexcel" onclick="exportyhexcel()">导出Excel</a>
</div>
<div style="padding: 5px;float: left;width: 400px;">
<div id="yhtablebar" style="padding:4px;">
<div>
<label>快捷查询</label>
<select id='kjcxyh' style='width:150px;'>
<option value="">请选择</option>
@ -20,6 +9,29 @@
</select>
<a onclick="javascript:$('#sdg_yh').dialog('open')" class="easyui-linkbutton" data-options="iconCls: 'fa-search',plain:true">详细筛选</a>
</div>
<div>
{% load myfilter %}
{% if request|has_permission:'b_trouble_add' %}
<a id="addyh" onclick="javascript:opendg('新增隐患','addtrouble?a=addyh')">新增</a>
{% endif %}
<a id="doyh" onclick="doyh()">处理</a>
<a id="delyh" onclick="delyh()">删除</a>
<a id="duibiao" class='easyui-linkbutton' onclick="duibiao()" data-options="iconCls: 'fa-thumb-tack',plain:true">对标</a>
<a id="detailyh2" onclick="detailyh()">查看详情</a>
{% if request|has_permission:'b_trouble_import' %}
<a onclick="javascript:$('#drtroubledg').dialog('open').window('center');" class="easyui-linkbutton"
data-options="iconCls:'fa-upload',plain:true">导入待整改隐患</a>
{% endif %}
{% if request|has_permission:'b_trouble_exportdoc' %}
<a id="exportword" onclick="exportyhword()">导出Word</a>
{% endif %}
{% if request|has_permission:'b_trouble_exportxls' %}
<a id="exportexcel" onclick="exportyhexcel()">导出Excel</a>
{% endif %}
</div>
<div id="sdg_yh" class="easyui-dialog" title="筛选条件" style="width:400px;height:420px;"
data-options="iconCls:'fa-search',resizable:true,modal:true,closed:true,border:false">
<div class="easyui-layout" style="width:100%;height:100%;">
@ -56,7 +68,13 @@
</div>
</div>
<table id="yhtable" style="width:100%;height:100%;"></table>
<div id="drtroubledg" class="easyui-dialog" title="导入隐患" style="width:400px;height:200px;"
data-options="iconCls:'fa-upload',resizable:true,modal:true,closed:true,border:false">
<p style="color:red;margin-left: 10px">请按模板录入后导入</p>
<p style="margin-left: 10px"><a href="/static/safesite/muban/trouble.xlsx" target="_blank">点击下载模板</a></p>
<p style="margin-left: 10px">录入完成后点击下方按钮上传文件</p>
<input type="file" id="drfile" name="" accept=".xls,.xlsx" style="margin-left: 10px" />
</div>
<!-- <a id="downa" href="" target="_blank" style="display:none"></a> -->
<script>
$(function () {
@ -72,7 +90,7 @@
method: 'get',
url: '',
fitColumns: true,
pagination: 'true',
pagination:true,
pageSize: 20,
toolbar: '#yhtablebar',
border:false,
@ -221,27 +239,26 @@
url: 'getdickey?dicclass=19&a=combobox',
editable: false,
});
$("#sfxbm,#szgbm").combotree({
// $.get('parthandle?a=tree',function(res){
// var data = convert(res);
// $('#sfxbm,#szgbm').combotree();
// $("#sfxbm").combotree('loadData',data);
// $("#szgbm").combotree('loadData',data);
// })
$("#sfxbm").combotree({
url: 'parthandle?a=tree',
editable: false,
loadFilter: function (rows) {
return convert(rows);
},
});
$("#szgbm").combotree({
url: 'parthandle?a=tree',
editable: false,
loadFilter: function (rows) {
return convert(rows);
},
// formatter: function (node) {
// var s = node.text;
// if (node.children) {
// s += '&nbsp;<span style=\'color:blue\'>(' + node.children.length + ')</span>';
// }
// return s;
// },
// onSelect: function (node) {
// $('#sfxr').combobox({
// url: 'getuser?partid=' + node.id + '&a=combobox',
// editable: false,
// });
// }
});
function detailyh() {
var row = $('#yhtable').datagrid('getSelected');
if (row) {
@ -368,7 +385,39 @@
}
else { $.messager.alert('提示', '请选择一行数据!'); }
}
document.getElementById('drfile').onchange = function () {
var fileObj = this.files[0];
var url = 'drapi?a=todotrouble'
var form = new FormData();
form.append("upfile", fileObj); // 文件对象
xhr = new XMLHttpRequest(); // XMLHttpRequest 对象
xhr.open("post", url, true); //post方式url为服务器请求地址true 该参数规定请求是否异步处理。
xhr.send(form)
$('#drtroubledg').dialog('close')
loading('导入中。。');
xhr.onload = function (evt) { //服务断接收完文件返回的结果
var data = JSON.parse(evt.target.responseText);
removeLoading();
if (data.code == 1) {
$.messager.alert('提示', '上传成功!', 'info', function () {
$("#yhtable").datagrid('reload');
});
}
else if (data.code == 2) {
$.messager.alert('警告', data.msg, 'info', function () {
$("#yhtable").datagrid('reload');
});
}
else {
$.messager.alert('提示', '失败!文件内容有误');
}
document.getElementById('drfile').value = '';
}; //请求完成
xhr.onerror = function (evt) { $.messager.alert('提示', '失败!文件内容有误'); document.getElementById('drfile').value = ''; }; //请求失败
}
</script>
</body>
</html>

View File

View File

@ -0,0 +1,8 @@
from django import template # 导入模板模块
register = template.Library() # 获取模板库对象
#@register.filter(name='tostr') # 通过模板库对象中的装饰器装饰自定义过滤器参数name是过滤器的名称。
@register.filter
def has_permission(req,menucode):
if menucode in req.session.get('permissions'):
return True

View File

@ -7,6 +7,7 @@ from .models import User, Trouble, Dickey, Partment, Dicclass, Train, Drill, Tro
from django.template import RequestContext
from django.views.decorators.csrf import csrf_exempt
from django.core import serializers
from django.conf import settings
from .forms import UserForm
import json
from uuid import UUID
@ -17,7 +18,7 @@ from django.db.models import F, Count, Sum
import requests
from .tasks import send_wechatmsgs, send_wechatmsg, yjjs, gettime, yjjs_px, yjjs_yl, updateTzzs, updateAqzs, yjjs_gc, yjjs_ws
from .export import exportdoc, exportxlsx, exportyjdoc, exportsimplexlsx, exportdoc2
from .daoru import drusers, drequipments, drrisks, drquestions, cal_riskact_level, cal_area_risk_level, makeqr, makeqr_train, makeqr_riskact, makeqr_examtest, makeqr_area
from .daoru import drusers, drequipments, drrisks, drquestions, cal_riskact_level, cal_area_risk_level, makeqr, makeqr_train, makeqr_riskact, makeqr_examtest, makeqr_area,drtodotroubles
from django.forms.models import model_to_dict
from .safespider import getTzzs, getAqzs
from duibiao import calsim
@ -33,6 +34,7 @@ from django.contrib.sessions.models import Session
from groups import models as g_models
import logging
from django.contrib.auth.hashers import make_password, check_password
import re
logger = logging.getLogger('log')
# 分页功能
@ -511,6 +513,28 @@ def mainhtml(req):
first_day, first_day_of_next_month)).count()
return render(req, 'main.html', {'yhnum': yhnum, 'totalyh': totalyh, 'monthyh': monthyh, 'pxnum': pxnum, 'totalpx': totalpx, 'monthpx': monthpx, 'ylnum': ylnum, 'totalyl': totalyl, 'monthyl': monthyl})
def checkpw(data): #密码复杂度校验
reg = re.compile('(?=.*[0-9])(?=.*[a-zA-Z]).{8,30}')
return re.match(reg,data)
def init_permission(user,req):
permission_dict = {}
bgroups = user.userg.all() #所属用户组
x = []
for i in bgroups:
x.extend(i.menulist)
menus = Menu.objects.exclude(menuid__in=[11, 9]).filter(menuid__in=list(set(x)), deletemark=1)
for item in menus:
permission_dict[item.menucode] = ({
'url':item.url,
'parentid':item.parentid.menuid,
'id': item.menuid,
'name': item.menuname,
})
print(permission_dict)
req.session['permissions'] = permission_dict
def login(req):
if req.session.get('userid', None):
@ -525,6 +549,7 @@ def login(req):
if check_password(password, user[0].epassword):
req.session['userid'] = user[0].userid
req.session.set_expiry(60*40)
init_permission(user[0],req)
return redirect('index')
else:
msg = '密码错误'
@ -545,13 +570,17 @@ def index(req):
return redirect('login')
userid = req.session['userid']
user = User.objects.get(userid=userid)
pwstr = 0
if checkpw(user.password):
pwstr = 1
companyname = user.usecomp.partname
name = user.name
openid = user.openid
headimgurl = user.headimgurl
nickname = user.nickname
issuper = user.issuper
return render(req, 'index.html', {'username': name, 'userid': userid, 'openid': openid, 'headimgurl': headimgurl, 'nickname': nickname, 'companyname': companyname, 'issuper': issuper, 'token': user.token})
token = user.token
return render(req, 'index.html', locals())
def logout(req):
@ -781,16 +810,13 @@ def menutree(req):
userid = req.session['userid']
if User.objects.get(userid=userid).issuper == 1: # 如果是超管
companyid = getcompany(userid)
x = Group.objects.get(usecomp__partid=companyid, grouptype=0).menulink
list1 = x.split(',')
x = Group.objects.get(usecomp__partid=companyid, grouptype=0).menulist
else:
bgroups = User.objects.get(userid=userid).userg.all()
x = ''
x = []
for i in bgroups:
x = x + ',' + i.menulink
list1 = x.split(',')
# del list1[0]#删除首空字符
menus = Menu.objects.exclude(menuid__in=[11, 9]).filter(menuid__in=list(filter(None, list(set(list1)))), deletemark=1).order_by(
x.extend(i.menulist)
menus = Menu.objects.exclude(menuid__in=[11, 9]).filter(menuid__in=list(set(x)), deletemark=1,type=1).order_by(
'sortnum').values('menuid', 'menucode', 'parentid', 'url', 'menuname', 'icon').distinct()
return HttpResponse(json.dumps(list(menus)), content_type="application/json")
@ -799,15 +825,15 @@ def apirights(req):
a = req.GET.get('a')
if a == 'detail':
groupid = req.GET.get('groupid')
haverights = Group.objects.get(groupid=groupid).menulink.split(',')
haverights = Group.objects.get(groupid=groupid).menulist
userid = req.session['userid']
companyid = getcompany(userid)
allrights = Group.objects.get(
usecomp__partid=companyid, grouptype=0).menulink.split(',')
usecomp__partid=companyid, grouptype=0).menulist
menus = Menu.objects.exclude(menuid__in=[11, 9]).filter(menuid__in=allrights, deletemark=1).order_by(
'menuid').values('menuid', 'menucode', 'parentid', 'url', 'menuname', 'icon').distinct()
'menuid').values('menuid', 'menucode', 'parentid', 'url', 'menuname', 'icon','type').distinct()
for i in menus:
if str(i['menuid']) in haverights and i['url'] != None:
if i['menuid'] in haverights:
i['checked'] = True
else:
i['checked'] = False
@ -816,21 +842,17 @@ def apirights(req):
groupid = req.GET.get('groupid')
data = req.POST.get('data')
data = json.loads(data)
rlist = ['11', '9']
rlist = [11, 9]
for i in data:
rlist.append(str(i['id']))
# x = i['id']
# while Menu.objects.get(menuid=x).parentid != None:
# x = Menu.objects.get(menuid=x).parentid.menuid
# rlist.append(str(x))
rlist.append(i['id'])
Group.objects.filter(groupid=groupid).update(
menulink=','.join(list(set(rlist))))
menulist=rlist)
return JsonResponse({"code": 1})
elif a == 'have':
userid = req.session['userid']
companyid = getcompany(userid)
allrights = Group.objects.get(
usecomp__partid=companyid, grouptype=0).menulink.split(',')
usecomp__partid=companyid, grouptype=0).menulist
return JsonResponse({'code': 1, 'rights': allrights})
@ -848,6 +870,7 @@ def addyh(req):
yhpg = yhdata['yhpg'] if 'yhpg' in yhdata else ''
jclx = yhdata['jclx']
yhlx = yhdata['yhlx'] if 'yhlx' in yhdata else ''
yhlxo = yhdata['yhlxo'] if 'yhlxo' in yhdata else ''
yhlb = yhdata['yhlb'] if 'yhlb' in yhdata else ''
yyfx = yhdata['yyfx'] if 'yyfx' in yhdata else ''
zgcs = yhdata['zgcs'] if 'zgcs' in yhdata else ''
@ -881,6 +904,8 @@ def addyh(req):
a.yhpg = Dickey.objects.get(dickeyid=yhpg)
if jclx != '':
a.jclx = Dickey.objects.get(dickeyid=jclx)
if yhlxo:
a.yhlxo = Dickey.objects.get(dickeyid=yhlxo)
if yhlx != '':
a.yhlx = Dicclass.objects.get(dicid=yhlx)
if yhlb != '':
@ -1751,7 +1776,7 @@ def grouphandle(req):
userid = req.session['userid']
companyid = getcompany(userid)
a = Group.objects.filter(usecomp__partid=companyid).exclude(
grouptype=0).values('groupid', 'groupname', 'grouptype')
grouptype=0).order_by('groupid').values('groupid', 'groupname', 'grouptype')
total = a.count()
return HttpResponse(transjson(total, a), content_type="application/json")
elif req.GET.get('a') == 'list2': # 排除全体用户组
@ -2633,13 +2658,17 @@ def parthandle(req):
partname = req.POST.get('partname')
parentid = req.POST.get('parentid')
partobj = Partment.objects.get(partid=partid)
oldpartlink = partobj.partlink + partid + ','
partlink = Partment.objects.get(
partid=parentid).partlink + parentid + ','
Partment.objects.filter(partid=partid).update(
partname=partname, parentid=parentid, partlink=partlink)
Partment.objects.filter(partlink__contains=oldpartlink).update(
partlink=partlink + partid + ',')
if partobj.iscompany==1:
partobj.partname = partname
partobj.save()
else:
oldpartlink = partobj.partlink + partid + ','
partlink = Partment.objects.get(
partid=parentid).partlink + parentid + ','
Partment.objects.filter(partid=partid).update(
partname=partname, parentid=parentid, partlink=partlink)
Partment.objects.filter(partlink__contains=oldpartlink).update(
partlink=partlink + partid + ',')
return JsonResponse({"code": 1})
else:
try:
@ -2656,13 +2685,19 @@ def parthandle(req):
elif req.GET.get('a') == 'tree':
userid = req.session['userid']
companyid = getcompany(userid)
list_items = (Partment.objects.filter(partlink__contains=','+companyid+',') | Partment.objects.filter(partid=companyid)
list_items = (Partment.objects.filter(Q(partlink__contains=','+companyid+',') | Q(partid=companyid),Q(deletemark=1))
).annotate(id=F('partid'), parentId=F('parentid'), name=F('partname')).values('id', 'parentId', 'name')
return HttpResponse(json.dumps(list(list_items)), content_type="application/json")
elif req.GET.get('a') == 'tree4':#不能选自己部门及以下
userid = req.session['userid']
companyid = getcompany(userid)
expart = req.GET.get('expart')
list_items = (Partment.objects.filter(Q(partlink__contains=','+companyid+',') | Q(partid=companyid),Q(deletemark=1)).exclude(Q(partid=expart)|Q(partlink__contains=','+expart+','))).annotate(id=F('partid'), parentId=F('parentid'), name=F('partname')).values('id', 'parentId', 'name')
return HttpResponse(json.dumps(list(list_items)), content_type="application/json")
elif req.GET.get('a') == 'tree2':
userid = req.session['userid']
companyid = getcompany(userid)
list_items = (Partment.objects.filter(partlink__contains=','+companyid+',')).annotate(id=F('partid'),
list_items = (Partment.objects.filter(partlink__contains=','+companyid+',',deletemark=1)).annotate(id=F('partid'),
parentId=F('parentid'), name=F('partname')).values('id', 'parentId', 'name', 'iscompany')
return HttpResponse(json.dumps(list(list_items)), content_type="application/json")
elif req.GET.get('a') == 'tree3': # 能够指派的部门,包括自己所在的部门
@ -3596,7 +3631,7 @@ def importusers(req):
def apicompany(req):
if int(req.session.get('userid')) == 8:
a = req.GET.get('a')
menurights = '11,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,19,20,21,22,23,24,28,29,32,36,46,47,48,50' # 菜单编码
menurights = [11,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,19,20,21,22,23,24,28,29,32,36,46,47,48,50] # 初始化菜单编码
if a == 'add':
admin = req.GET.get('admin')
company = req.GET.get('company')
@ -3621,13 +3656,13 @@ def apicompany(req):
y.save()
part = Partment.objects.get(partid=y.partid)
Group.objects.create(
groupname='超管', grouptype=0, usecomp=part, menulink=menurights)
groupname='超管', grouptype=0, usecomp=part, menulist=menurights)
Group.objects.create(
groupname='安全员', grouptype=1, usecomp=part, menulink=menurights)
groupname='安全员', grouptype=1, usecomp=part, menulist=menurights)
Group.objects.create(
groupname='全体用户', grouptype=3, usecomp=part, menulink=menurights)
groupname='全体用户', grouptype=3, usecomp=part, menulist=menurights)
z = Group(groupname='主管', grouptype=2,
usecomp=part, menulink=menurights)
usecomp=part, menulist=menurights)
z.save()
z.users.add(x)
Yjsetup.objects.create(monthyhavg=100, safev=50, warnv=75, alertv=100, maxv=200, yhpgqz=4,
@ -3705,7 +3740,22 @@ def drapi(req):
return JsonResponse({"code": 2, "msg": msg})
else:
return JsonResponse({"code": 1})
elif a == 'todotrouble':
userid = req.session['userid']
companyid = getcompany(userid)
file_name = 'c'+str(companyid)+'_'+req.FILES['upfile'].name
upload_folder = 'media/temp'
if not os.path.exists(upload_folder):
os.mkdir(upload_folder)
filepath = os.path.join(upload_folder, file_name)
filepath = filepath.replace('\\', '/')
with open(filepath, 'wb') as f:
f.write(req.FILES['upfile'].read())
msg = drtodotroubles(companyid, filepath, userid)
if msg:
return JsonResponse({"code": 2, "msg": msg})
else:
return JsonResponse({"code": 1})
def apimiss(req):
a = req.GET.get('a')
@ -4514,9 +4564,9 @@ def apitool(req):
if req.GET.get('company'):
objs = objs.filter(usecomp__partid=req.GET.get('company'))
for i in objs:
menulist = i.menulink.split(',')
menulist = i.menulist
menulist.append(menu)
if menu == '30':
if menu == 30:
company = Partment.objects.get(partid=req.GET.get('company'))
objs = Map.objects.filter(usecomp=company)
if objs.exists():
@ -4524,8 +4574,7 @@ def apitool(req):
else:
Map.objects.create(
name='默认地图', pic='/static/safesite/mystatic/images/snc.jpg', usecomp=company, default=1)
newlist = list(set(menulist))
i.menulink = ','.join(newlist)
i.menulist = list(set(menulist))
i.save()
return JsonResponse({"code": 1})
elif a == 'correction':
@ -4658,6 +4707,27 @@ def apitool(req):
i.aqy = i.aqy.replace(',,', ',')
i.save()
return JsonResponse({"code": 1})
elif a == 'correct_question':
for i in Question.objects.exclude(questioncat__usecomp__partid=1):
i.usecomps = ','+str(i.questioncat.usecomp.partid)+','
i.save()
return JsonResponse({"code": 1})
elif a == 'correct_menulist':
for i in Group.objects.all():
if i.menulink:
i.menulist = list(set(list(filter(None, i.menulink.split(',')))))
i.save()
return JsonResponse({"code": 1})
elif a == 'correct_menuhas':
buttons = Menu.objects.filter(type=2)
for group in Group.objects.filter(grouptype=0):
menulist = group.menulist
for button in buttons:
if button.parentid.menuid in menulist: #如果菜单在所拥有权限内
menulist.append(button.menuid)
group.menulist = list(set(menulist))
group.save()
return JsonResponse({"code": 1})
def apinotice(req):
@ -5399,15 +5469,14 @@ def apiquestion(req):
companyid = getcompany(userid)
if a == 'listall':
x = Question.objects.filter(deletemark=1)
a = (x.filter(usecomps__contains=',1,') | x.filter(
usecomps__contains=','+companyid+',')).exclude(nousecomps__contains=','+companyid+',')
a = x.exclude(nousecomps__contains=','+companyid+',').filter(Q(usecomps__contains=',1,') | Q(usecomps__contains=','+companyid+','))
if req.GET.get('tmlx'):
tmlx = req.GET.get('tmlx')
a = x.filter(questioncat__link__contains=',' +
str(tmlx)+',') | x.filter(questioncat__id=tmlx)
a = a.filter(Q(questioncat__link__contains=',' +
str(tmlx)+',') | Q(questioncat__id=tmlx))
elif req.GET.get('gwlx'):
gwlx = req.GET.get('gwlx')
a = x.filter(station=Group.objects.get(groupid=gwlx))
a = a.filter(station=Group.objects.get(groupid=gwlx))
total = a.count()
startnum, endnum = fenye(req)
a = a.order_by('-id')[startnum:endnum].values('id', 'title', 'type', 'level', 'questioncat__id',
@ -5470,7 +5539,7 @@ def apiquestion(req):
if user.issuper == 1 or a.createuser == user:
nl = a.nousecomps.split(',')
nl.append(companyid)
nl = ','+','.join(list(filter(None, nl)))+','
nl = ','+','.join(list(set(list(filter(None, nl)))))+','
a.nousecomps = nl
a.save()
return JsonResponse({"code": 1})
@ -5815,8 +5884,12 @@ def apiexamtest(req):
a = ExamTest.objects.filter(id=id).values('id', 'num', 'name', 'starttime', 'endtime', 'duration', 'totalscore',
'passscore', 'exampaper__total', 'createtime', 'state', 'exampaper__name', 'createuser__name', 'type', 'qrcode')[0]
objs = ExamTestDetail.objects.filter(examtest__id=id).order_by('-score').values(
'id', 'user__name', 'user__ubelongpart__partname', 'took', 'score', 'ison', 'passcode')
'id', 'user__name', 'user__ubelongpart__partname', 'took', 'score', 'ison', 'passcode','starttime')
a['cjrydetail'] = list(objs)
a['ison'] = 1
tests = ExamTestDetail.objects.filter(examtest__id=id,user__userid=userid)#考试记录
if tests.exists():
a['ison'] = tests[0].ison
return HttpResponse(json.dumps(a, cls=MyEncoder), content_type="application/json")
elif a == 'detailtm':
id = req.GET.get('id')