diff --git a/mysite/settings.py b/mysite/settings.py
index 76d47c61..2a425a8a 100644
--- a/mysite/settings.py
+++ b/mysite/settings.py
@@ -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 = {} #权限字典
#日志配置
# 创建日志的路径
diff --git a/safesite/admin.py b/safesite/admin.py
index 47bc150d..8f8beaad 100644
--- a/safesite/admin.py
+++ b/safesite/admin.py
@@ -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)
\ No newline at end of file
diff --git a/safesite/daoru.py b/safesite/daoru.py
index f8c8f0ab..5ad38647 100644
--- a/safesite/daoru.py
+++ b/safesite/daoru.py
@@ -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] #小数点左边(整数位,可为正或负)
diff --git a/safesite/migrations/0297_merge_20191217_1200.py b/safesite/migrations/0297_merge_20191217_1200.py
new file mode 100644
index 00000000..7fbb12d3
--- /dev/null
+++ b/safesite/migrations/0297_merge_20191217_1200.py
@@ -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 = [
+ ]
diff --git a/safesite/migrations/0298_auto_20191217_1200.py b/safesite/migrations/0298_auto_20191217_1200.py
new file mode 100644
index 00000000..8f1ccef4
--- /dev/null
+++ b/safesite/migrations/0298_auto_20191217_1200.py
@@ -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),
+ ),
+ ]
diff --git a/safesite/migrations/0299_remove_menu_type.py b/safesite/migrations/0299_remove_menu_type.py
new file mode 100644
index 00000000..7d93103e
--- /dev/null
+++ b/safesite/migrations/0299_remove_menu_type.py
@@ -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',
+ ),
+ ]
diff --git a/safesite/migrations/0300_menu_type.py b/safesite/migrations/0300_menu_type.py
new file mode 100644
index 00000000..af5cd058
--- /dev/null
+++ b/safesite/migrations/0300_menu_type.py
@@ -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),
+ ),
+ ]
diff --git a/safesite/migrations/0301_auto_20191217_1414.py b/safesite/migrations/0301_auto_20191217_1414.py
new file mode 100644
index 00000000..caa02b7c
--- /dev/null
+++ b/safesite/migrations/0301_auto_20191217_1414.py
@@ -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),
+ ),
+ ]
diff --git a/safesite/migrations/0302_group_menulist.py b/safesite/migrations/0302_group_menulist.py
new file mode 100644
index 00000000..efbf0f83
--- /dev/null
+++ b/safesite/migrations/0302_group_menulist.py
@@ -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),
+ ),
+ ]
diff --git a/safesite/migrations/0303_trouble_yhlxo.py b/safesite/migrations/0303_trouble_yhlxo.py
new file mode 100644
index 00000000..f6952905
--- /dev/null
+++ b/safesite/migrations/0303_trouble_yhlxo.py
@@ -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'),
+ ),
+ ]
diff --git a/safesite/migrations/0304_trouble_submituser.py b/safesite/migrations/0304_trouble_submituser.py
new file mode 100644
index 00000000..627e4e4d
--- /dev/null
+++ b/safesite/migrations/0304_trouble_submituser.py
@@ -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'),
+ ),
+ ]
diff --git a/safesite/models.py b/safesite/models.py
index a455388b..f9e9a10e 100644
--- a/safesite/models.py
+++ b/safesite/models.py
@@ -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): # 预警预测表
diff --git a/safesite/static/safesite/mystatic/js/util.js b/safesite/static/safesite/mystatic/js/util.js
index 685679b2..28bcd191 100644
--- a/safesite/static/safesite/mystatic/js/util.js
+++ b/safesite/static/safesite/mystatic/js/util.js
@@ -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)
\ No newline at end of file
+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位包含数字,大小写字母'
+ }
+})
diff --git a/safesite/templates/abpart.html b/safesite/templates/abpart.html
index f7bb676e..0d521950 100644
--- a/safesite/templates/abpart.html
+++ b/safesite/templates/abpart.html
@@ -18,15 +18,15 @@
+