Exemple #1
0
    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
Exemple #3
0
    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()
Exemple #5
0
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
Exemple #6
0
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)))
Exemple #7
0
    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'
Exemple #10
0
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