class OpAddMeetingEmp(ModelOperation): visible = True verbose_name = _(u"添加会议人员") help_text = _(u"新增会议人员") params = ( ('meeting', MeetingForeignKey(verbose_name=_(u'会议'))), ('user', EmpMultForeignKey(verbose_name=_(u'人员'), blank=True)), ) def action(self, user, meeting): # print "len(user)",len(user) if len(user) < 1: raise Exception(_(u'请选择人员')) if self.request: ce = MeetingEmp.objects.filter(user__in=user, meetingID=meeting) if ce.count() > 0: raise Exception( _(u'%s %s 已经添加到该会议') % (ce[0].user.PIN, ce[0].user.EName)) limit = meeting.roomMeeting.empLimit if len(user) > limit: raise Exception(_(u'已超过会议室的最大容量(%s)') % limit) meetngE = MeetingEmp.objects.filter(meetingID=meeting) if len(meetngE) + len(user) > limit: raise Exception(_(u'已超过会议室的最大容量(%s)') % limit) st = meeting.startTime et = meeting.endTime me_f = list( MeetingEntity.objects.filter(startTime__year=et.year, startTime__month=et.month, startTime__day=et.day, startTime__lt=et, endTime__gt=st)) me_s = list( MeetingEntity.objects.filter(startTime__year=et.year, startTime__month=et.month, startTime__day=et.day, startTime__gt=st, endTime__lt=et)) emp_have = MeetingEmp.objects.filter(meetingID__in=list(me_f + me_s)) empHave = [] for emp in emp_have: e = Employee.objects.get(PIN__iexact=emp.PIN) empHave.append(e.PIN) for emp in user: e = Employee.objects.get(pk__iexact=emp.pk) if e.PIN in empHave: raise Exception( _(u"%s 在这个会议时间段已参加其他会议,无法参加此次会议") % emp) ck = MeetingEmp() ck.user = emp ck.PIN = emp.PIN ck.EName = emp.EName ck.meetingID = meeting ck.save()
class StatisticsMeeting(CachingModel): id = models.AutoField(db_column="id", primary_key=True) meetingID = MeetingForeignKey(verbose_name=_(u'会议')) dueMeetingEmpCount = models.IntegerField(verbose_name=_(u'应到人数'),null=True,blank=True) arrivalMeetingEmpCount = models.IntegerField(verbose_name=_(u'实到人数'),null=True,blank=True) nonArrivalMeetingEmpCount = models.IntegerField(verbose_name=_(u'未到人数'),null=True,blank=True) vacateMeetingEmpCount = models.IntegerField(verbose_name=_(u'请假人数'),null=True,blank=True) absentMeetingEmpCount = models.IntegerField(verbose_name=_(u'缺席人数'),null=True,blank=True) lateEmpCount = models.IntegerField(verbose_name=_(u'迟到人数'),null=True,blank=True) leaveEarlyEmpCount = models.IntegerField(verbose_name=_(u'早退人数'),null=True,blank=True) unCheckInCount = models.IntegerField(verbose_name=_(u'未签到人数'),null=True,blank=True) unCheckOutCount = models.IntegerField(verbose_name=_(u'未签退人数'),null=True,blank=True) def __unicode__(self): return '%s %s' %(self.meetingID.nameMeeting,self.dueMeetingEmpCount) class Admin(CachingModel.Admin): visible=False default_give_perms=["contenttypes.can_MeetingCalculate"] sort_fields = ['meetingID.numberMeeting','dueMeetingEmpCount','arrivalMeetingEmpCount'] list_display = ['meetingID.numberMeeting','meetingID.nameMeeting','dueMeetingEmpCount','arrivalMeetingEmpCount','nonArrivalMeetingEmpCount','vacateMeetingEmpCount','absentMeetingEmpCount', 'lateEmpCount','leaveEarlyEmpCount','unCheckInCount','unCheckOutCount'] app_menu="meeting" menu_group = 'meeting' menu_index=7 class Meta: app_label='meeting' verbose_name = _(u"会议统计汇总表") verbose_name_plural = verbose_name
class getOriginalData(ModelOperation): visible = False help_text = _(u"获取会议原始记录") verbose_name = _(u"获取数据") params = (('meetingIds', MeetingForeignKey(verbose_name=_(u'会议'))), ) def action(self, meetingIds): from mysite.meeting.statistics import getPrimitiveMeetingData # print 'meetingIDS(Original):%s' % meetingIds try: getPrimitiveMeetingData(meetingIds) except: raise Exception(_(u"导入数据出错"))
class OpAddMeetingLeave(ModelOperation): help_text = _(u"新增会议请假") verbose_name = _(u"新增请假") params = ( ('meetingID', MeetingForeignKey(verbose_name=_(u'会议'))), ('userLeave', Emp_MeetingMultFK(verbose_name=_(u'人员'), blank=True)), ('reason', models.CharField(verbose_name=_(u'请假原因'), max_length=100, null=True, blank=True)), ) # def action(self,meetingId,userLeave,reason): # print "len(userLeave)",len(userLeave) # if len(userLeave) < 1 : # raise Exception(_(u"请选择人员")) # # for emp in userLeave: # mm = MeetingEmp.objects.filter(meetingID=meetingId,user=emp) # # ce=Leave.objects.filter(employee=emp,meetingID=meetingId) # if len(ce)>=1: # raise Exception(_(u'%s 请假重复') % emp) # # ck=Leave(employee=emp,meetingID=meetingId,reason=reason) # ck.save() def action(self, **args): from mysite.iclock.iutils import get_dept_from_all, get_max_in emps = args.pop('userLeave') if not emps: raise Exception(_(u"请选择人员")) for emp in emps: mm = MeetingEmp.objects.filter(meetingID=args['meetingID'], user=emp) ce = Leave.objects.filter(employee=emp, meetingID=args['meetingID']) if len(ce) >= 1: raise Exception(_(u'%s 请假重复') % emp) t_now = datetime.datetime.now() ck = Leave(employee=emp, apply=t_now, meetingID=args['meetingID'], reason=args['reason']) ck.save()
class OriginalRecord(CachingModel): id = models.AutoField(db_column="id", primary_key=True) user = EmpForeignKey(verbose_name=_(u"人员"), db_column='userid') meetingID = MeetingForeignKey(verbose_name=_(u'会议'), blank=True) checkTime = models.DateTimeField(_(u'考勤时间'), null=False, blank=True) checkType = models.CharField(_(u'考勤状态'), max_length=5, default='I', choices=ATTSTATES) verifyCode = models.IntegerField(_(u'验证方式'), default=0, choices=VERIFYS) sn = DeviceForeignKey(verbose_name=_(u'设备'), null=True, blank=True) sensorid = models.CharField(verbose_name=u'Sensor ID', null=True, blank=True, max_length=5, editable=False) workCode = models.CharField(_(u'工作号码'), max_length=20, null=True, blank=True) nameSN = models.CharField(_(u'序列号'), max_length=40, null=True, blank=True) reserved = models.CharField(_(u'保留字段一'), max_length=20, null=True, blank=True) def __unicode__(self): return '%s' % (self.pk) def limit_originalrecord_to(self, queryset, user): from base.middleware.threadlocals import get_current_request request = get_current_request() from mysite.iclock.iutils import get_dept_from_all, get_max_in deptids = request.GET.get('UserID__DeptID__in', "").split(',') meetingids = request.GET.get('meetingID__in', "").split(',') typeids = request.GET.get('checkType__in', "").split(',') users = request.GET.get('user__in', "") if users == "": users = None list_user = list(str(users).split(',')) user_list = [] if request: if len(deptids) > 0: dept_id = deptids checked_child = request.GET.get('deptIDschecked_child', None) if checked_child == "on" and dept_id: #包含部门下级 depts = get_dept_from_all(dept_id, request) if len(meetingids) > 0: meetingid = meetingids if meetingid[0] != "": if len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = get_max_in( OriginalRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( OriginalRecord.objects.filter( meetingID__in=meetingid), depts, "user__DeptID__in") elif len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = get_max_in( OriginalRecord.objects.filter( checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( OriginalRecord.objects.filter(), dept_id, "user__DeptID__in") elif typeids[0] != "": typeid = typeids user_list = get_max_in( OriginalRecord.objects.filter( checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( OriginalRecord.objects.all(), depts, "user__DeptID__in") else: user_list = get_max_in( OriginalRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid), depts, "user__DeptID__in") if dept_id[0] == "": if len(meetingids) > 0: meetingid = meetingids if meetingid[0] != "": if len(typeids) > 0: typeid = typeids if typeid[0] != "": if users != None: user_list = OriginalRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) else: user_list = OriginalRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid) else: user_list = OriginalRecord.objects.filter( meetingID__in=meetingid) if users != None: if len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = OriginalRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) else: user_list = OriginalRecord.objects.filter( meetingID__in=meetingid, user__in=list_user) else: if len(typeids) > 0 and users != None: typeid = typeids if typeid[0] != "": user_list = OriginalRecord.objects.filter( checkType__in=typeid, user__in=list_user) else: user_list = OriginalRecord.objects.filter( user__in=list_user) else: user_list = OriginalRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) return user_list def delete(self): super(OriginalRecord, self).delete() def save(self): super(OriginalRecord, self).save() def _delete(ModelOperation): visible = False help_text = _(u'删除') verbose_name = _(u'删除') def action(self): pass class _change(Operation): visible = False help_text = _(u"修改选定记录") verbose_name = _(u"修改") def action(self): pass class _add(ModelOperation): visible = False help_text = _(u'新增') verbose_name = _(u'新增') def action(self): pass class getOriginalData(ModelOperation): visible = False help_text = _(u"获取会议原始记录") verbose_name = _(u"获取数据") params = (('meetingIds', MeetingForeignKey(verbose_name=_(u'会议'))), ) def action(self, meetingIds): from mysite.meeting.statistics import getPrimitiveMeetingData # print 'meetingIDS(Original):%s' % meetingIds try: getPrimitiveMeetingData(meetingIds) except: raise Exception(_(u"导入数据出错")) def get_dept_name(self): u'''从缓存中得到部门的Name''' from mysite.personnel.models import Department dept_name = "" try: dept_obj = Department.objects.get(id=self.user.DeptID_id) dept_name = dept_obj.name except: pass return dept_name def get_device_name(self): u'''设备名称''' from mysite.iclock.models import Device if self.nameSN: dev = Device.objects.get(sn=self.nameSN) if dev: return dev.alias else: return "" def get_checkType(self): u'''考勤状态''' if self.checkType == 'I' or self.checkType == '1': self.checkType = '1' return u"会议签到" else: self.checkType = '2' return u"会议签退" class Admin(CachingModel.Admin): visible = False # read_only=True default_give_perms = ["contenttypes.can_MeetingCalculate"] sort_fields = [ "meetingID.numberMeeting", "user.DeptID", "user.PIN", "-checkTime" ] app_menu = "meeting" menu_group = 'meeting' list_filter = ('empMeeting', 'checkTime', 'checkType', 'sn') query_fields = [ 'meetingID.numberMeeting', 'meetingID.nameMeeting', 'checkTime' ] list_display = ('meetingID.numberMeeting', 'meetingID.nameMeeting', 'user.PIN', 'user.EName', 'user.DeptID', 'checkTime', 'get_checkType', 'get_device_name', 'nameSN') newadded_column = { "user.DeptID": "get_dept_name", } search_fields = ('checkTime', ) tstart_end_search = { "checkTime": [_(u"起始考勤时间"), _(u"结束考勤时间")] } #配置时间字段(TimeField,DatetimeField,DateField)可以有起始和结束查找 menu_index = 6 class Meta: app_label = 'meeting' unique_together = (("user", "checkTime"), ) verbose_name = _(u"原始记录") verbose_name_plural = verbose_name
class MeetingEmp(CachingModel): id = models.AutoField(db_column="id", primary_key=True, editable=False) meetingID = MeetingForeignKey(verbose_name=_(u'会议'), blank=True, null=True) user = EmpForeignKey(verbose_name=_(u'人员'), db_column='userid', null=True, blank=True, editable=True) PIN = models.CharField(verbose_name=_(u'人员编号'), db_column="badgenumber", blank=True, null=True, max_length=20, editable=False) EName = models.CharField(verbose_name=_(u'姓名'), db_column="name", null=True, blank=True, max_length=24, editable=False) empRank = models.IntegerField(verbose_name=_(u'出席身份'), max_length=20, choices=IDENTITY, default=3, editable=False) def __unicode__(self): return u"%s %s" % (self.meetingID, self.EName) def save(self): from meeting_leave import Leave from meeting_exact import MeetingExact if self.user == None: raise Exception(_(u'请选择人员')) if self.id: me = MeetingEmp.objects.get(id=self.id) if me.meetingID != self.meetingID: raise Exception(_(u'会议不可更改')) if me.user != self.user: try: lEmp = Leave.objects.get(employee=me.user, meetingID=me.meetingID) lEmp.delete() except: pass try: mExact = MeetingExact.objects.get(user=me.user, meetingID=me.meetingID) mExact.delete() except: pass super(MeetingEmp, self).save() detailMeeting = DetailMeeting() detailMeeting.user = self.user detailMeeting.meetingID = self.meetingID detailMeeting.save() def get_dept_name(self): u'''从缓存中得到部门的Name''' from mysite.personnel.models import Department dept_name = "" try: dept_obj = Department.objects.get(id=self.user.DeptID_id) dept_name = dept_obj.name except: pass return dept_name def delete(self): from meeting_exact import MeetingExact from meeting_leave import Leave try: mEx = MeetingExact.objects.get(meetingID=self.meetingID, user=self.user) mEx.delete() except: pass try: leave = Leave.objects.get(meetingID=self.meetingID, employee=self.user) leave.delete() except: pass try: detail = DetailMeeting.objects.get(meetingID=self.meetingID, user=self.user) detail.delete() sm = StatisticsMeeting.objects.get(meetingID=self.meetingID) sm.dueMeetingEmpCount = None sm.arrivalMeetingEmpCount = None sm.nonArrivalMeetingEmpCount = None sm.vacateMeetingEmpCount = None sm.absentMeetingEmpCount = None sm.lateEmpCount = None sm.leaveEarlyEmpCount = None sm.unCheckInCount = None sm.unCheckOutCount = None sm.save() except: pass super(MeetingEmp, self).delete() class _add(ModelOperation): visible = False help_text = _(u"新增记录") #新增记录 verbose_name = _(u"新增") def action(self): pass class _change(ModelOperation): visible = False def action(self): pass class OpAddMeetingEmp(ModelOperation): visible = True verbose_name = _(u"添加会议人员") help_text = _(u"新增会议人员") params = ( ('meeting', MeetingForeignKey(verbose_name=_(u'会议'))), ('user', EmpMultForeignKey(verbose_name=_(u'人员'), blank=True)), ) def action(self, user, meeting): # print "len(user)",len(user) if len(user) < 1: raise Exception(_(u'请选择人员')) if self.request: ce = MeetingEmp.objects.filter(user__in=user, meetingID=meeting) if ce.count() > 0: raise Exception( _(u'%s %s 已经添加到该会议') % (ce[0].user.PIN, ce[0].user.EName)) limit = meeting.roomMeeting.empLimit if len(user) > limit: raise Exception(_(u'已超过会议室的最大容量(%s)') % limit) meetngE = MeetingEmp.objects.filter(meetingID=meeting) if len(meetngE) + len(user) > limit: raise Exception(_(u'已超过会议室的最大容量(%s)') % limit) st = meeting.startTime et = meeting.endTime me_f = list( MeetingEntity.objects.filter(startTime__year=et.year, startTime__month=et.month, startTime__day=et.day, startTime__lt=et, endTime__gt=st)) me_s = list( MeetingEntity.objects.filter(startTime__year=et.year, startTime__month=et.month, startTime__day=et.day, startTime__gt=st, endTime__lt=et)) emp_have = MeetingEmp.objects.filter(meetingID__in=list(me_f + me_s)) empHave = [] for emp in emp_have: e = Employee.objects.get(PIN__iexact=emp.PIN) empHave.append(e.PIN) for emp in user: e = Employee.objects.get(pk__iexact=emp.pk) if e.PIN in empHave: raise Exception( _(u"%s 在这个会议时间段已参加其他会议,无法参加此次会议") % emp) ck = MeetingEmp() ck.user = emp ck.PIN = emp.PIN ck.EName = emp.EName ck.meetingID = meeting ck.save() class ImportMeetingEmp(ModelOperation): """ 导入的人员信息必须为人事中的人员信息 """ visible = True help_text = _(u"""1、批量导入会议人员,导入的会议人员信息应该为人事中的部分或全部人员信息<br/> 2、按确定后开始保存,出错后请按取消返回会议人员主界面进行查询导入结果""") verbose_name = u"导入会议人员" params = ( ('meeting', MeetingForeignKey(verbose_name=_(u'会议'))), ('upload_data', models.FileField(verbose_name=_(u'选择导入名单文件'), upload_to='file', blank=True, null=True)), ) def action(self, meeting, upload_data): from django.conf import settings from django.core.files.storage import default_storage from django.db import connection import datetime import xlrd errorMsg = [] #不存在人员信息列表 existexistMsg = [] #已存在人员信息列表 filePath = settings.ADDITION_FILE_ROOT + 'importMeetingEmpData.xls' if self.request.FILES: f = self.request.FILES['upload_data'] # meeting = self.request.get("meeting",None) f_format = str(f).split('.') format_list = ['xls'] try: format_list.index(str(f_format[1])) except: raise Exception(_(u"文件格式无效,请选择 .xls文件!")) if self.request.method == 'POST': destination = open(filePath, 'wb+') for chunk in f.chunks(): destination.write(chunk) destination.close() try: excel = xlrd.open_workbook(filePath) except: raise Exception(_(u"文件上传失败!")) sheet = excel.sheet_by_index(0) #第一个工作单元 # headLine = sheet.row_values(0) if meeting == None: raise Exception(_(u"请选择会议")) isExistexistMeetingEntity = meeting limit = meeting.roomMeeting.empLimit #改会议最多人数限 #查询出该会议已经存在的人员数 #select count(*)from meeting_MeetingEntity m join meeting_room r on m.roomMeeting_id = r.idjoin meeting_MeetingEmp me on m.id = me. meetingID_id where numberMeeting ='0321' sql_count = u''' select count(*)from meeting_MeetingEntity m join meeting_room r on m.roomMeeting_id = r.id join meeting_MeetingEmp me on m.id = me. meetingID_id where numberMeeting ='%s' ''' % (meeting.numberMeeting) cursor = connection.cursor() cursor.execute(sql_count) ret_data = cursor.fetchall() connection._commit() number = int(ret_data[0][0]) #改会议已有的人员数 needImport = int(sheet.nrows) - 1 if number: if number + needImport > limit: raise Exception( _(u'现已有人数(%s)导入人数(%s)超过会议室的最大容量(%s)') % (number, needImport, limit)) if needImport > limit: raise Exception( _(u'导入人数(%s)超过会议室的最大容量(%s)') % (needImport, limit)) #判断会议是否存在 sql = [] sqlDetail = [] SQLSERVER_INSERT = u'''INSERT INTO meeting_meetingemp(status,meetingID_id,userid,badgenumber,name,empRank) VALUES(0,'%(meetingId)s','%(user)s','%(pin)s','%(name)s',2)''' SQLSERVER_INSERT_Detail = u'''INSERT INTO meeting_detailmeeting(status,meetingID_id,userid) VALUES(0,'%(meetingId)s','%(user)s')''' for rowId in range(1, sheet.nrows, 1): #从第5行开始读取数据 empPin = format_pin(int(sheet.row_values(rowId)[2])) meetingName = sheet.row_values(rowId)[1] meetingCode = sheet.row_values(rowId)[0] empName = sheet.row_values(rowId)[3] meetingE = MeetingEntity.objects.get( numberMeeting=meetingCode) #判断人员是否存在MeetingEmp #isExistexistEmp = list(Employee.objects.filter(PIN=empPin,EName = empName)) isExistexistEmp = list( MeetingEmp.objects.filter(PIN=empPin, meetingID=meetingE.id)) if len(isExistexistEmp) != 0: errorMsg.append((empPin, empName)) # raise Exception (_(u"请检查 %s %s 人员信息是否存在") % (empPin,empName)) #meetingEmp = MeetingEmp(meetingID=isExistexistMeetingEntity[0],user=isExistexistEmp[0],PIN=empPin,EName=empName) else: # print 'isHave-----------------------------' # isHave = MeetingEmp.objects.filter(meetingID=isExistexistMeetingEntity,user=isExistexistEmp[0]) # if len(isHave) >0: # print 'len(isHave)=======',len(isHave) # existexistMsg.append((empPin,empName)) # else: e = Employee.objects.get(PIN=empPin) sql.append( SQLSERVER_INSERT % { "meetingId": isExistexistMeetingEntity.id, "user": e.id, "pin": empPin, "name": empName, }) sqlDetail.append( SQLSERVER_INSERT_Detail % { "meetingId": isExistexistMeetingEntity.id, "user": e.id, }) cursor = connection.cursor() for record in sql: try: cursor.execute(record) except Exception, e: raise Exception(_(u"保存到数据库出错,请检查数据合法性")) for detailSQL in sqlDetail: try: cursor.execute(detailSQL) except Exception, e: raise Exception(_(u"出错")) connection._commit() f.close() errorMsgCount = len(errorMsg) # exiCount = len(existexistMsg) # print '=-=========',errorMsgCount,exiCount if errorMsgCount > 0: msg1 = "" msg2 = "" for i in range(errorMsgCount): #msg1 += _(u"(%s,%s)" %(errorMsg[i][0],errorMsg[i][1])) #msg1 += "("+str(errorMsg[i][0])+","+str(errorMsg[i][1])+")," msg1 += "(" + errorMsg[i][0] + "," + errorMsg[i][ 1] + ")," if i % 5 == 0: msg1 += "<br/>" # for i in range(exiCount): # #msg2 += _(u"(%s,%s)" %(existexistMsg[i][0],existexistMsg[i][1])) # print 'existexistMsg[i][0]-----',existexistMsg[i][0],existexistMsg[i][1] # msg2 += "("+existexistMsg[i][0]+","+existexistMsg[i][1]+")," # if i % 5 == 0: # msg2 += "<br/>" #raise Exception(_(u"请检查[%s]人员信息是否存在 ,<br/>其中[%s]数据已经存在,其余(%s条)数据已成功保存") % (msg1,msg1,(needImport-errorMsgCount))) raise Exception( _(u"人员[%s]数据已经存在该会议中,<br/>其余(%s条)数据已成功保存") % (msg1, (needImport - errorMsgCount)))
class ImportMeetingEmp(ModelOperation): """ 导入的人员信息必须为人事中的人员信息 """ visible = True help_text = _(u"""1、批量导入会议人员,导入的会议人员信息应该为人事中的部分或全部人员信息<br/> 2、按确定后开始保存,出错后请按取消返回会议人员主界面进行查询导入结果""") verbose_name = u"导入会议人员" params = ( ('meeting', MeetingForeignKey(verbose_name=_(u'会议'))), ('upload_data', models.FileField(verbose_name=_(u'选择导入名单文件'), upload_to='file', blank=True, null=True)), ) def action(self, meeting, upload_data): from django.conf import settings from django.core.files.storage import default_storage from django.db import connection import datetime import xlrd errorMsg = [] #不存在人员信息列表 existexistMsg = [] #已存在人员信息列表 filePath = settings.ADDITION_FILE_ROOT + 'importMeetingEmpData.xls' if self.request.FILES: f = self.request.FILES['upload_data'] # meeting = self.request.get("meeting",None) f_format = str(f).split('.') format_list = ['xls'] try: format_list.index(str(f_format[1])) except: raise Exception(_(u"文件格式无效,请选择 .xls文件!")) if self.request.method == 'POST': destination = open(filePath, 'wb+') for chunk in f.chunks(): destination.write(chunk) destination.close() try: excel = xlrd.open_workbook(filePath) except: raise Exception(_(u"文件上传失败!")) sheet = excel.sheet_by_index(0) #第一个工作单元 # headLine = sheet.row_values(0) if meeting == None: raise Exception(_(u"请选择会议")) isExistexistMeetingEntity = meeting limit = meeting.roomMeeting.empLimit #改会议最多人数限 #查询出该会议已经存在的人员数 #select count(*)from meeting_MeetingEntity m join meeting_room r on m.roomMeeting_id = r.idjoin meeting_MeetingEmp me on m.id = me. meetingID_id where numberMeeting ='0321' sql_count = u''' select count(*)from meeting_MeetingEntity m join meeting_room r on m.roomMeeting_id = r.id join meeting_MeetingEmp me on m.id = me. meetingID_id where numberMeeting ='%s' ''' % (meeting.numberMeeting) cursor = connection.cursor() cursor.execute(sql_count) ret_data = cursor.fetchall() connection._commit() number = int(ret_data[0][0]) #改会议已有的人员数 needImport = int(sheet.nrows) - 1 if number: if number + needImport > limit: raise Exception( _(u'现已有人数(%s)导入人数(%s)超过会议室的最大容量(%s)') % (number, needImport, limit)) if needImport > limit: raise Exception( _(u'导入人数(%s)超过会议室的最大容量(%s)') % (needImport, limit)) #判断会议是否存在 sql = [] sqlDetail = [] SQLSERVER_INSERT = u'''INSERT INTO meeting_meetingemp(status,meetingID_id,userid,badgenumber,name,empRank) VALUES(0,'%(meetingId)s','%(user)s','%(pin)s','%(name)s',2)''' SQLSERVER_INSERT_Detail = u'''INSERT INTO meeting_detailmeeting(status,meetingID_id,userid) VALUES(0,'%(meetingId)s','%(user)s')''' for rowId in range(1, sheet.nrows, 1): #从第5行开始读取数据 empPin = format_pin(int(sheet.row_values(rowId)[2])) meetingName = sheet.row_values(rowId)[1] meetingCode = sheet.row_values(rowId)[0] empName = sheet.row_values(rowId)[3] meetingE = MeetingEntity.objects.get( numberMeeting=meetingCode) #判断人员是否存在MeetingEmp #isExistexistEmp = list(Employee.objects.filter(PIN=empPin,EName = empName)) isExistexistEmp = list( MeetingEmp.objects.filter(PIN=empPin, meetingID=meetingE.id)) if len(isExistexistEmp) != 0: errorMsg.append((empPin, empName)) # raise Exception (_(u"请检查 %s %s 人员信息是否存在") % (empPin,empName)) #meetingEmp = MeetingEmp(meetingID=isExistexistMeetingEntity[0],user=isExistexistEmp[0],PIN=empPin,EName=empName) else: # print 'isHave-----------------------------' # isHave = MeetingEmp.objects.filter(meetingID=isExistexistMeetingEntity,user=isExistexistEmp[0]) # if len(isHave) >0: # print 'len(isHave)=======',len(isHave) # existexistMsg.append((empPin,empName)) # else: e = Employee.objects.get(PIN=empPin) sql.append( SQLSERVER_INSERT % { "meetingId": isExistexistMeetingEntity.id, "user": e.id, "pin": empPin, "name": empName, }) sqlDetail.append( SQLSERVER_INSERT_Detail % { "meetingId": isExistexistMeetingEntity.id, "user": e.id, }) cursor = connection.cursor() for record in sql: try: cursor.execute(record) except Exception, e: raise Exception(_(u"保存到数据库出错,请检查数据合法性")) for detailSQL in sqlDetail: try: cursor.execute(detailSQL) except Exception, e: raise Exception(_(u"出错")) connection._commit() f.close() errorMsgCount = len(errorMsg) # exiCount = len(existexistMsg) # print '=-=========',errorMsgCount,exiCount if errorMsgCount > 0: msg1 = "" msg2 = "" for i in range(errorMsgCount): #msg1 += _(u"(%s,%s)" %(errorMsg[i][0],errorMsg[i][1])) #msg1 += "("+str(errorMsg[i][0])+","+str(errorMsg[i][1])+")," msg1 += "(" + errorMsg[i][0] + "," + errorMsg[i][ 1] + ")," if i % 5 == 0: msg1 += "<br/>" # for i in range(exiCount): # #msg2 += _(u"(%s,%s)" %(existexistMsg[i][0],existexistMsg[i][1])) # print 'existexistMsg[i][0]-----',existexistMsg[i][0],existexistMsg[i][1] # msg2 += "("+existexistMsg[i][0]+","+existexistMsg[i][1]+")," # if i % 5 == 0: # msg2 += "<br/>" #raise Exception(_(u"请检查[%s]人员信息是否存在 ,<br/>其中[%s]数据已经存在,其余(%s条)数据已成功保存") % (msg1,msg1,(needImport-errorMsgCount))) raise Exception( _(u"人员[%s]数据已经存在该会议中,<br/>其余(%s条)数据已成功保存") % (msg1, (needImport - errorMsgCount)))
class ValidRecord(models.Model, OperationBase): id = models.AutoField(db_column="id", primary_key=True) user = EmpForeignKey(verbose_name=_(u"人员"), db_column='userid') meetingID = MeetingForeignKey(verbose_name=_(u'会议'), blank=True) checkTime = models.DateTimeField(_(u'考勤时间'), null=False, blank=True) checkType = models.IntegerField(_(u'考勤状态'), default=1, choices=ATTSTATES) verifyType = models.IntegerField(_(u'验证方式'), default=0, choices=VERIFYS) def __unicode__(self): return '(%s-%s-%s)' % (self.user.EName, self.meetingID.nameMeeting, self.checkTime) def limit_validrecord_to(self, queryset, user): from base.middleware.threadlocals import get_current_request request = get_current_request() from mysite.iclock.iutils import get_dept_from_all, get_max_in deptids = request.GET.get('UserID__DeptID__in', "").split(',') meetingids = request.GET.get('meetingID__in', "").split(',') typeids = request.GET.get('checkType__in', "").split(',') users = request.GET.get('user__in', "") if users == "": users = None list_user = list(str(users).split(',')) user_list = [] if request: if len(deptids) > 0: dept_id = deptids checked_child = request.GET.get('deptIDschecked_child', None) if checked_child == "on" and dept_id: #包含部门下级 depts = get_dept_from_all(dept_id, request) if len(meetingids) > 0: meetingid = meetingids if meetingid[0] != "": if len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = get_max_in( ValidRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( ValidRecord.objects.filter( meetingID__in=meetingid), depts, "user__DeptID__in") elif len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = get_max_in( ValidRecord.objects.filter( checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( ValidRecord.objects.filter(), dept_id, "user__DeptID__in") elif typeids[0] != "": typeid = typeids user_list = get_max_in( ValidRecord.objects.filter( checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in(ValidRecord.objects.all(), depts, "user__DeptID__in") else: user_list = get_max_in( ValidRecord.objects.filter(meetingID__in=meetingid, checkType__in=typeid), depts, "user__DeptID__in") # if dept_id[0] == "": if len(meetingids) > 0: meetingid = meetingids if meetingid[0] != "": if len(typeids) > 0: typeid = typeids if typeid[0] != "": if users != None: user_list = ValidRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) else: user_list = ValidRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid) else: user_list = ValidRecord.objects.filter( meetingID__in=meetingid) if users != None: if len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = ValidRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) else: user_list = ValidRecord.objects.filter( meetingID__in=meetingid, user__in=list_user) else: if len(typeids) > 0 and users != None: typeid = typeids if typeid[0] != "": user_list = ValidRecord.objects.filter( checkType__in=typeid, user__in=list_user) else: user_list = ValidRecord.objects.filter( user__in=list_user) else: user_list = ValidRecord.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) return user_list def save(self): super(ValidRecord, self).save() def get_dept_name(self): u'''从缓存中得到部门的Name''' from mysite.personnel.models import Department dept_name = "" try: dept_obj = Department.objects.get(id=self.user.DeptID_id) dept_name = dept_obj.name except: pass return dept_name class Meta: app_label = 'meeting' # unique_together = (("user", "checkTime"),) verbose_name = _(u"会议考勤明细") verbose_name_plural = verbose_name class Admin: #会议有效记录,会议统计汇总以此为依据 visible = False app_menu = "meeting" menu_group = 'meeting' default_give_perms = ["contenttypes.can_MeetingCalculate"] sort_fields = [ "meetingID.numberMeeting", "user.DeptID", "user.PIN", "-checkTime" ] list_filter = ('empMeeting', 'checkTime', 'checkType') list_display = ( 'meetingID.numberMeeting', 'meetingID.nameMeeting', 'user.PIN', 'user.EName', 'user.DeptID', 'checkTime', 'checkType', ) newadded_column = { "user.DeptID": "get_dept_name", }
class Leave(CachingModel): id = models.AutoField(db_column="id", primary_key=True, editable=False) # employee = MeetingEmpForeignKey(verbose_name=_(u'人员'), editable=True) employee = EmpForeignKey(verbose_name=_(u'人员'), null=True, blank=True, editable=True) meetingID = MeetingForeignKey(verbose_name=_(u'会议')) reason = models.CharField(verbose_name=_(u'请假原因'), max_length=100, null=True, blank=True) apply = models.DateTimeField(verbose_name=_(u'填写时间'), null=True, editable=False) def __unicode__(self): return '%s %s' % (self.meetingID, self.employee) def save(self): if self.employee == None: raise Exception(_(u"请选择人员")) mm = MeetingEmp.objects.filter(meetingID=self.meetingID, user=self.employee) if len(mm) < 1: raise Exception(_(u"%s 没有参加该会议,无须请假") % self.employee.EName) super(Leave, self).save() class _add(ModelOperation): visible = False help_text = _(u"新增记录") #新增记录 verbose_name = _(u"新增") def action(self): pass class OpAddMeetingLeave(ModelOperation): help_text = _(u"新增会议请假") verbose_name = _(u"新增请假") params = ( ('meetingID', MeetingForeignKey(verbose_name=_(u'会议'))), ('userLeave', Emp_MeetingMultFK(verbose_name=_(u'人员'), blank=True)), ('reason', models.CharField(verbose_name=_(u'请假原因'), max_length=100, null=True, blank=True)), ) # def action(self,meetingId,userLeave,reason): # print "len(userLeave)",len(userLeave) # if len(userLeave) < 1 : # raise Exception(_(u"请选择人员")) # # for emp in userLeave: # mm = MeetingEmp.objects.filter(meetingID=meetingId,user=emp) # # ce=Leave.objects.filter(employee=emp,meetingID=meetingId) # if len(ce)>=1: # raise Exception(_(u'%s 请假重复') % emp) # # ck=Leave(employee=emp,meetingID=meetingId,reason=reason) # ck.save() def action(self, **args): from mysite.iclock.iutils import get_dept_from_all, get_max_in emps = args.pop('userLeave') if not emps: raise Exception(_(u"请选择人员")) for emp in emps: mm = MeetingEmp.objects.filter(meetingID=args['meetingID'], user=emp) ce = Leave.objects.filter(employee=emp, meetingID=args['meetingID']) if len(ce) >= 1: raise Exception(_(u'%s 请假重复') % emp) t_now = datetime.datetime.now() ck = Leave(employee=emp, apply=t_now, meetingID=args['meetingID'], reason=args['reason']) ck.save() def get_dept_name(self): u'''从缓存中得到部门的Name''' from mysite.personnel.models import Department dept_name = "" try: dept_obj = Department.objects.get(id=self.employee.DeptID_id) dept_name = dept_obj.name except: pass return dept_name class Admin(CachingModel.Admin): menu_group = 'meeting' menu_index = 5 query_fields = [ 'meetingID.numberMeeting', 'meetingID.nameMeeting', 'employee.PIN', 'employee.EName', 'employee.DeptID' ] sort_fields = [ 'meetingID.numberMeeting', 'employee.DeptID', 'employee.PIN', '-apply' ] list_display = [ 'meetingID.numberMeeting', 'meetingID.nameMeeting', 'employee.PIN', 'employee.EName', 'employee.DeptID', 'reason', 'apply' ] newadded_column = { 'employee.DeptID': 'get_dept_name', } class Meta: verbose_name = _(u'会议请假') verbose_name_plural = verbose_name app_label = 'meeting'
class DetailMeeting(CachingModel): id = models.AutoField(db_column="id", primary_key=True) user = EmpForeignKey(verbose_name=_(u"人员"), db_column='userid') meetingID = MeetingForeignKey(verbose_name=_(u'会议')) checkInTime = models.DateTimeField(verbose_name=_(u'会议签到'), null=True, blank=True) checkOutTime = models.DateTimeField(verbose_name=_(u'会议签退'), null=True, blank=True) checkType = models.IntegerField(verbose_name=_(u'考勤状态'), choices=ATTSTATES, null=True, blank=True) lateTime = models.IntegerField(verbose_name=_(u'迟到时长(分钟)'), null=True, blank=True) leaveEarlyTime = models.IntegerField(verbose_name=_(u'早退时长(分钟)'), null=True, blank=True) def __unicode__(self): return '%s %s' % (self.meetingID.nameMeeting, self.user.EName) def limit_detailmeeting_to(self, queryset, user): from base.middleware.threadlocals import get_current_request request = get_current_request() from mysite.iclock.iutils import get_dept_from_all, get_max_in deptids = request.GET.get('UserID__DeptID__in', "").split(',') meetingids = request.GET.get('meetingID__in', "").split(',') typeids = request.GET.get('checkType__in', "").split(',') users = request.GET.get('user__in', "") if users == "": users = None list_user = list(str(users).split(',')) user_list = [] if request: if len(deptids) > 0: dept_id = deptids checked_child = request.GET.get('deptIDschecked_child', None) if checked_child == "on" and dept_id: #包含部门下级 depts = get_dept_from_all(dept_id, request) if len(meetingids) > 0: meetingid = meetingids if meetingid[0] != "": if len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = get_max_in( DetailMeeting.objects.filter( meetingID__in=meetingid, checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( DetailMeeting.objects.filter( meetingID__in=meetingid), depts, "user__DeptID__in") elif len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = get_max_in( DetailMeeting.objects.filter( checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in( DetailMeeting.objects.filter(), dept_id, "user__DeptID__in") elif typeids[0] != "": typeid = typeids user_list = get_max_in( DetailMeeting.objects.filter( checkType__in=typeid), depts, "user__DeptID__in") else: user_list = get_max_in(DetailMeeting.objects.all(), depts, "user__DeptID__in") else: user_list = get_max_in( DetailMeeting.objects.filter( meetingID__in=meetingid, checkType__in=typeid), depts, "user__DeptID__in") if dept_id[0] == "": if len(meetingids) > 0: meetingid = meetingids if meetingid[0] != "": if len(typeids) > 0: typeid = typeids if typeid[0] != "": if users != None: user_list = DetailMeeting.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) else: user_list = DetailMeeting.objects.filter( meetingID__in=meetingid, checkType__in=typeid) else: user_list = DetailMeeting.objects.filter( meetingID__in=meetingid) if users != None: if len(typeids) > 0: typeid = typeids if typeid[0] != "": user_list = DetailMeeting.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) else: user_list = DetailMeeting.objects.filter( meetingID__in=meetingid, user__in=list_user) else: if len(typeids) > 0 and users != None: typeid = typeids if typeid[0] != "": user_list = DetailMeeting.objects.filter( checkType__in=typeid, user__in=list_user) else: user_list = DetailMeeting.objects.filter( user__in=list_user) else: user_list = DetailMeeting.objects.filter( meetingID__in=meetingid, checkType__in=typeid, user__in=list_user) return user_list class Admin(CachingModel.Admin): visible = False default_give_perms = ["contenttypes.can_MeetingCalculate"] sort_fields = [ "meetingID.numberMeeting", "user.PIN", "-checkInTime", "checkType" ] list_display = [ 'meetingID.numberMeeting', 'meetingID.nameMeeting', 'user.PIN', 'user.EName', 'checkInTime', 'checkOutTime', 'checkType', 'lateTime', 'leaveEarlyTime', ] app_menu = "meeting" menu_group = 'meeting' menu_index = 6 class Meta: app_label = 'meeting' verbose_name = _(u"会议统计详情") verbose_name_plural = verbose_name