示例#1
0
class EmpChange(CachingModel):
        '''调动表'''
        changeno=models.AutoField(verbose_name=_(u'调动单号'),db_column='changeno',primary_key=True,editable=False)
        UserID=EmpPoPForeignKey(verbose_name=_(u"人员"),editable=True)
        changedate=models.DateTimeField(verbose_name=_(u'调动时间'),null=True,blank=True,editable=True,default=datetime.datetime.now())
        changepostion=models.IntegerField(verbose_name=_(u'调动栏位'),choices=POSTION,editable=True,null=True,blank=True,)        
        oldvalue=models.CharField(verbose_name=_(u'调动前'),max_length=100,editable=True,null=True,blank=True)
        newvalue=models.CharField(verbose_name=_(u'调动后'),max_length=100,editable=True,null=True,blank=True)
        changereason=models.CharField(max_length=200,verbose_name=_(u'调动原因'),null=True,blank=True,editable=True)
        isvalid=models.BooleanField(verbose_name=_(u'是否生效'),choices=YESORNO,editable=True,default=0)
        approvalstatus=models.IntegerField(verbose_name=_(u'审核状态'),choices=APPROVAL,editable=False,default=2)
        remark=models.CharField(verbose_name=_(u'备注'),editable=True,null=True,blank=True,max_length=200)
        def __unicode__(self):
                       return self.UserID.PIN+(self.UserID.EName and " %s"%self.UserID.EName or "")

        def save(self):
            #ContentType.objects.get_for_model(obj)
            #print "self.changepostion:%s"%self.changepostion
            try:
                if self.changepostion and int(self.changepostion) in [1,2,3,4]:  #同步人员信息表,并原还页面上有可能修改原始数据
                    cmp = [_(u'请选择调整后的部门'),_(u'请选择调整后的职务'),_(u'请选择调整后的雇佣类型'),_(u'请选择调整后的区域')]
                    if not self.newvalue:
                        raise Exception(cmp[int(self.changepostion)-1])
                    where={}
                    if self.changepostion==1:
                        self.oldvalue=self.UserID.DeptID.pk
                        where['id__exact']=int(self.newvalue)
                        self.UserID.DeptID=Department.objects.filter(Q(**where))[0]
                        
                    elif self.changepostion==2:
                        self.oldvalue=self.UserID.Title
                        try:
                            where['id__exact']=int(self.newvalue)
                            t=BaseCode.objects.filter(Q(**where))
                            if t:
                                self.UserID.Title=t[0]
                            else:
                                self.UserID.Title=""
                        except:
                            self.UserID.Title=self.newvalue
                        
                    else:
                        self.oldvalue=self.UserID.emptype
                        self.UserID.emptype=int(self.newvalue)
                        
                    self.UserID.save()
                
                super(EmpChange,self).save()
            except Exception, e:
                import traceback; traceback.print_exc();
                raise e
                return self
示例#2
0
class LeaveLog(CachingModel):
        """
        离职操作
        """
        UserID=EmpPoPForeignKey(verbose_name=_(u"人员"),null=False,editable=True)
        leavedate=models.DateField(verbose_name=_(u'离职日期'),editable=True)
        leavetype=models.IntegerField(verbose_name=_(u'离职类型'),choices=LEAVETYPE,editable=True)
        reason=models.CharField(verbose_name=_(u'离职原因'),max_length=200,null=True,blank=True,editable=True)        
        isReturnTools =models.BooleanField(verbose_name=_(u'是否归还工具'),choices=YESORNO, null=False,default=True,  editable=True)
        isReturnClothes=models.BooleanField(verbose_name=_(u'是否归还工衣'),choices=YESORNO, null=False,default=True,  editable=True)
        isReturnCard=models.BooleanField(verbose_name=_(u'是否归还卡'),choices=YESORNO, null=False,default=True, editable=True)
        isClassAtt=models.BooleanField(verbose_name=_(u'立即关闭考勤'),choices=YESORNO, null=False,default=0, editable=False)
        isClassAccess=models.BooleanField(verbose_name=_(u'立即关闭门禁'),choices=YESORNO, null=False,default=0, editable=False)
        is_close_pos=models.BooleanField(verbose_name=_(u'立即关闭消费'),choices=YESORNO, null=False,default=0, editable=False)
        
        def __unicode__(self):
                from mysite.personnel.models import Employee
                emp=""
                try:
                    Employee.can_restore=True
                    emp=Employee.objects.get(pk=self.UserID_id)
                    Employee.can_restore=False
                except:
                    return ""
                
                return emp.PIN +"  "+ (emp.EName and u" %s"%emp.EName or "")
        def save(self):
                try:    
#                    from mysite.personnel.models.model_issuecard import IssueCard,CARD_VALID,CARD_STOP
#                    iscard = IssueCard.objects.filter(UserID=self.UserID,cardstatus = CARD_VALID)
#                    if get_option("POS"):#zkeco+pos
#                        if iscard and self.is_close_pos:#立即关闭消费
#                            iscard[0].cardstatus = CARD_STOP
#                            iscard[0].save(force_update=True)
#                            if get_option("POS_IC") and iscard[0].sys_card_no:
#                                from mysite.iclock.models.dev_comm_operate import update_pos_device_info
#                                from mysite.iclock.models.model_device import Device,DEVICE_POS_SERVER
#                                dev = Device.objects.filter(device_type = DEVICE_POS_SERVER)
#                                update_pos_device_info(dev,[iscard[0]],"USERINFO")
                            
                    super(LeaveLog,self).save()
                    if self.UserID.status==0:            
                        self.UserID.status=STATUS_LEAVE
                        self.UserID.save()
                    
                except Exception,e:
                        raise Exception(e)
                        import traceback;traceback.print_exc()
                        pass
示例#3
0
class USER_OF_RUN(CachingModel):
    UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), db_column='UserID')
    StartDate = models.DateField(_(u'开始日期'),
                                 null=False,
                                 default=datetime.datetime.now(),
                                 blank=True)
    EndDate = models.DateField(_(u'结束日期'),
                               null=False,
                               default='2099-12-31',
                               blank=True)
    NUM_OF_RUN_ID = models.ForeignKey(NUM_RUN,
                                      verbose_name=_(u'班次'),
                                      db_column='NUM_OF_RUN_ID',
                                      null=False,
                                      blank=False)
    ISNOTOF_RUN = models.IntegerField(null=True,
                                      default=0,
                                      blank=True,
                                      editable=False)
    ORDER_RUN = models.IntegerField(null=True, blank=True, editable=False)

    #    def save(self):
    #        self.EndDate=datetime.datetime(self.EndDate.year,self.EndDate.month,self.EndDate.day,23,59,59)
    #        return models.Model.save(self)
    def get_all_Shift_Name(self):
        datas = NUM_RUN.objects.all()
        s = []
        for row in datas:
            s.append(row["Name"])
        return s

    def __unicode__(self):
        return u"%s" % self.UserID.EName

    #return u"%s(%s--%s)"%(self.UserID.PIN,self.StartDate.strftime("%Y-%m-%d"),self,EndDate.strftime("%Y-%m-%d"))

    class OpAddUserOfRun(ModelOperation):
        help_text = _(u"""新增员工排班""")
        verbose_name = _(u"新增排班")
        params = (
            ('UserID',
             EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)),
            ('StartDate',
             models.DateField(
                 _(u'开始日期'),
                 default=datetime.datetime.now().strftime("%Y-%m-01"))),
            ('EndDate',
             models.DateField(
                 _(u'结束日期'),
                 default=(datetime.datetime.now() +
                          datetime.timedelta(days=31)).strftime("%Y-%m") +
                 "-01")),
        )

        def action(self, UserID, StartDate, EndDate):
            #            from mysite.personnel.models.model_emp import Employee
            #            deptIDs=self.request.POST.getlist('deptIDs')
            #            UserIDs=self.request.POST.getlist('UserID')
            #            dept_all=self.request.POST.get('dept_all','')
            #            if len(UserIDs)>0:
            #                users=Employee.objects.filter(id__in=UserIDs)
            #            else:
            #                if dept_all:
            #                   users=Employee.objects.filter(DeptID__in=deptIDs)
            #                else:
            #                    users=[]
            users = UserID
            #            print users
            if not users:
                raise Exception(_(u'请选择人员'))
            if len(users) > 1000:
                raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!'))
            sAssigned_shifts = self.request.POST.get('sAssigned_shifts', '')
            #print "sAssigned_shifts:%s"%sAssigned_shifts
            if not sAssigned_shifts:
                raise Exception(_(u'请选择班次'))
            if StartDate > EndDate:
                raise Exception(_(u'结束日期不能小于开始日期!'))

            sAssigned_shifts = eval(sAssigned_shifts)
            print sAssigned_shifts[0]
            num_run = NUM_RUN.objects.get(pk=int(sAssigned_shifts[0]['SchId']))
            for u in users:
                USER_OF_RUN.objects.filter(UserID=u,
                                           StartDate=StartDate,
                                           EndDate=EndDate,
                                           NUM_OF_RUN_ID=num_run).delete()
                t = USER_OF_RUN()
                t.UserID = u
                t.StartDate = StartDate
                t.EndDate = EndDate
                t.NUM_OF_RUN_ID = num_run
                t.save()
                from mysite.att.models.__init__ import get_autocalculate_time as gct
                from model_waitforprocessdata import WaitForProcessData as wfpd
                import datetime
                gct_time = gct()
                gct_date = datetime.date(gct_time.year, gct_time.month,
                                         gct_time.day)

                if StartDate < gct_date or EndDate <= gct_date:
                    wtmp = wfpd()
                    st = datetime.datetime(StartDate.year, StartDate.month,
                                           StartDate.day, 0, 0, 0)
                    et = datetime.datetime(EndDate.year, EndDate.month,
                                           EndDate.day, 23, 59, 59)
                    wtmp.UserID = u
                    wtmp.starttime = st
                    wtmp.endtime = et
                    #wtmp.customer=self.customer
                    wtmp.save()

#            if self.request:
#                FetchSchPlan(self.request)

    class OpAddTempShifts(ModelOperation):
        from mysite.att.models.user_temp_sch import USER_TEMP_SCH
        help_text = _(u"""新增员工临时排班""")
        verbose_name = _(u"新增临时排班")
        params = (
            ('UserID',
             EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)),
            ('StartDate',
             models.DateField(
                 _(u'开始日期'),
                 default=datetime.datetime.now().strftime("%Y-%m-%d"))),
            ('EndDate',
             models.DateField(
                 _(u'结束日期'),
                 default=(datetime.datetime.now() +
                          datetime.timedelta(days=1)).strftime("%Y-%m-%d"))),
            ('WorkType', USER_TEMP_SCH._meta.get_field('WorkType')),
        )

        def action(self, UserID, StartDate, EndDate, WorkType):
            from mysite.personnel.models.model_emp import Employee
            from mysite.att.models.schclass import SchClass
            from mysite.att.models.user_temp_sch import USER_TEMP_SCH
            import datetime
            from mysite.personnel.models import Department
            if self.request:

                #addTemparyShifts(self.request)
                st = self.request.POST.get('StartDate', "")
                et = self.request.POST.get('EndDate', "")
                start = st.replace("/", "-")
                endt = et.replace("/", "-")
                chklbSchClass = self.request.POST.getlist("sTimeTbl")
                chklbDates = self.request.POST.getlist("sDates")
                OverTime = self.request.POST.get('OverTime', '')
                users = UserID

                flag = self.request.POST.get('Flag', '1')
                #print 'flag:%s'%flag
                is_OT = self.request.POST.get('is_OT', '')
                is_OT = (str(is_OT) == 'on')

                #                #获取用户
                #                if len(UserIDs)>0:
                #                    users=Employee.objects.filter(id__in=UserIDs)
                #                else:
                #                    if dept_all:
                #                       users=Employee.objects.filter(DeptID__in=deptIDs)
                #                    else:
                #                        users=[]

                if not users:
                    raise Exception(_(u'请选择人员'))
                if len(users) > 1000:
                    raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!'))
                if not chklbDates:
                    raise Exception(_(u'请选择日期'))
                if not chklbSchClass:
                    raise Exception(_(u'请选择时段'))
                #获取时间段
                schs = SchClass.objects.filter(pk__in=chklbSchClass)
                #                for sch in schs:
                #                    st=datetime.strptime(start+' '+ sch.StartTime.strftime('%H:%M:%S'),"%Y-%m-%d %H:%M:%S")
                #                    et=datetime.strptime(endt+' '+ sch.EndTime.strftime('%H:%M:%S'),"%Y-%m-%d %H:%M:%S")
                #
                #                    for u in users:
                #
                #                        sql="delete from %s where UserID=%s and SchClassID=%s and ComeTime>='%s' and LeaveTime<='%s'"%( USER_TEMP_SCH._meta.db_table,
                #                                                                      u.pk,sch.pk,st.strftime("%Y-%m-%d %H:%M:%S"),et.strftime("%Y-%m-%d %H:%M:%S"))
                #                        print "sql:%s"%sql
                #                        customSql(sql)
                #
                #循环保存临时排班
                for day in chklbDates:
                    day = day.replace("/", "-")

                    for sch in schs:

                        #格式化时间
                        st = datetime.datetime.strptime(
                            day + ' ' + sch.StartTime.strftime('%H:%M:%S'),
                            '%Y-%m-%d %H:%M:%S')
                        et = datetime.datetime.strptime(
                            day + ' ' + sch.EndTime.strftime('%H:%M:%S'),
                            '%Y-%m-%d %H:%M:%S')

                        if et < st:  #判断时间段是否跨天
                            et = et + datetime.timedelta(days=1)

                        #清除已经排过的临时排班
                        #USER_TEMP_SCH.objects.filter(UserID__in=users,SchclassID__exact=sch.pk,ComeTime__exact=st,LeaveTime__exact=et).delete()

                        #保存
                        for u in users:
                            USER_TEMP_SCH.objects.filter(
                                UserID__exact=u,
                                SchclassID__exact=sch.pk,
                                ComeTime__exact=st,
                                LeaveTime__exact=et).delete()
                            t = USER_TEMP_SCH()
                            t.UserID = u
                            t.ComeTime = st
                            t.LeaveTime = et
                            t.WorkType = WorkType
                            t.Flag = flag
                            if is_OT:
                                t.OverTime = OverTime
                            t.SchclassID = sch.pk
                            t.save()

    class OpDeleteShift(Operation):
        help_text = _(u"""删除排班记录""")
        verbose_name = _(u"删除排班记录")

        def action(self):
            self.object.delete()

    class OpClearShift(ModelOperation):
        help_text = _(u"""清空排班记录""")
        verbose_name = _(u"清空排班记录")
        tips_text = _(u"确认要清空所有排班记录")

        def action(self):
            filterdata_by_user(self.model.objects.all(),
                               self.request.user).delete()
#            self.model.objects.all().delete()

    class OpClearEmpShift(ModelOperation):
        help_text = _(u"""清空临时排班记录""")
        verbose_name = _(u"清空临时排班记录")
        tips_text = _(u"确认要清空所有临时排班记录")

        def action(self):
            from mysite.att.models.user_temp_sch import USER_TEMP_SCH
            filterdata_by_user(USER_TEMP_SCH.objects.all(),
                               self.request.user).delete()

    class Admin(CachingModel.Admin):
        default_give_perms = ["contenttypes.can_AttUserOfRun"]
        sort_fields = ["UserID.PIN"]
        default_widgets = {'UserID': ZMulEmpChoiceWidget}
        list_filter = (
            'UserID',
            'NUM_OF_RUN_ID',
            'StartDate',
            'EndDate',
        )
        search_fields = ['UserID', 'NUM_OF_RUN_ID']
        api_fields = [
            'UserID.PIN', 'UserID.EName', 'NUM_OF_RUN_ID.Name', 'StartDate',
            'EndDate'
        ]
        list_display = [
            'UserID_id', 'UserID.PIN', 'UserID.EName', 'NUM_OF_RUN_ID_id',
            'NUM_OF_RUN_ID.Name', 'StartDate', 'EndDate', 'create_time'
        ]

        log = True
        visible = False

    class Meta:
        app_label = 'att'
        db_table = 'user_of_run'
        verbose_name = _(u'员工排班')
        verbose_name_plural = verbose_name
        unique_together = (("UserID", "NUM_OF_RUN_ID", "StartDate",
                            "EndDate"), )
示例#4
0
class LeaveLog(CachingModel):
    """
        离职操作
        """
    UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, editable=True)
    leavedate = models.DateField(verbose_name=_(u'离职日期'), editable=True)
    leavetype = models.IntegerField(verbose_name=_(u'离职类型'),
                                    choices=LEAVETYPE,
                                    editable=True)
    reason = models.CharField(verbose_name=_(u'离职原因'),
                              max_length=200,
                              null=True,
                              blank=True,
                              editable=True)
    isReturnTools = models.BooleanField(verbose_name=_(u'是否归还工具'),
                                        choices=YESORNO,
                                        null=False,
                                        default=True,
                                        editable=True)
    isReturnClothes = models.BooleanField(verbose_name=_(u'是否归还工衣'),
                                          choices=YESORNO,
                                          null=False,
                                          default=True,
                                          editable=True)
    isReturnCard = models.BooleanField(verbose_name=_(u'是否归还卡'),
                                       choices=YESORNO,
                                       null=False,
                                       default=True,
                                       editable=True)
    isClassAtt = models.BooleanField(verbose_name=_(u'立即关闭考勤'),
                                     choices=YESORNO,
                                     null=False,
                                     default=0,
                                     editable=False)
    isClassAccess = models.BooleanField(verbose_name=_(u'立即关闭门禁'),
                                        choices=YESORNO,
                                        null=False,
                                        default=0,
                                        editable=False)

    def __unicode__(self):
        return self.UserID.PIN + "  " + (self.UserID.EName
                                         and u" %s" % self.UserID.EName or "")

    def save(self):
        try:

            super(LeaveLog, self).save()
            if self.UserID.status == 0:
                self.UserID.status = STATUS_LEAVE
                self.UserID.save()
        except:
            import traceback
            traceback.print_exc()
            pass

    class _delete(Operation):
        help_text = _(u"删除选定记录")  #删除选定的记录
        verbose_name = _(u"删除")
        visible = False

        def action(self):
            self.object.delete()

    class OpRestoreEmpLeave(Operation):
        help_text = _(u'恢复离职人员')
        verbose_name = _(u'离职恢复')

        def action(self):
            import datetime
            emp = self.object.UserID
            if emp.isblacklist == 1:
                raise Exception(_(u'黑名单不能处理离职恢复!'))
            emp.__class__.can_restore = True
            emp.isblacklist = None
            emp.status = STATUS_OK
            emp.Hiredday = datetime.datetime.now().strftime("%Y-%m-%d")
            emp.save()
            emp.__class__.can_restore = False
            #下载到设备
            newObj = self.object.UserID
            from mysite.iclock.models.model_cmmdata import adj_user_cmmdata
            #sync_set_user(newObj.search_device_byuser(), [newObj])
            adj_user_cmmdata(newObj, [], newObj.attarea.all())
            self.object.delete()

    class OpCloseAtt(Operation):
        help_text = _(u'关闭考勤')
        verbose_name = _(u'关闭考勤')

        def action(self):
            oldObj = self.object.UserID
            if self.object.isClassAtt == 1:
                raise Exception(_(u"考勤已经关闭!"))
            self.object.isClassAtt = 1
            self.object.save()

            devs = oldObj.search_device_byuser()
            sync_delete_user(devs, [oldObj])

    class _change(ModelOperation):
        visible = False

        def action(self):
            pass

    class OpCloseAccess(Operation):
        help_text = _(u'关闭门禁')
        verbose_name = _(u'关闭门禁')

        def action(self):
            oldObj = self.object.UserID
            if oldObj.check_accprivilege():
                devs = oldObj.search_accdev_byuser()
                sync_delete_user(devs, [oldObj])
                sync_delete_user_privilege(devs, [oldObj])
            if self.object.isClassAccess == 1:
                raise Exception(_(u"门禁已经关闭!"))
            self.object.isClassAccess = 1
            self.object.save()

    class Admin(CachingModel.Admin):
        sort_fields = ["UserID.PIN", "leavedate"]
        app_menu = "personnel"
        menu_index = 4
        visible = "mysite.att" in settings.INSTALLED_APPS  #暂只有考勤使用
        list_filter = ('UserID', 'leavedate', 'leavetype', 'isReturnTools',
                       'isReturnCard', 'isReturnClothes')
        query_fields = [
            'UserID__PIN', 'UserID__EName', 'leavedate', 'leavetype', 'reason'
        ]
        list_display = [
            'UserID.PIN', 'UserID.EName', 'UserID.DeptID',
            'UserID.isblacklist', 'leavedate', 'leavetype', 'isClassAtt',
            'reason'
        ] + acc
        disabled_perms = [
            'change_leavelog', 'dataimport_leavelog', 'delete_leavelog'
        ] + init_settings
        help_text = _(u"加入黑名单的人员,将不能离职恢复")

    class Meta:
        verbose_name = _(u'人员离职')
        verbose_name_plural = verbose_name
        app_label = 'personnel'
示例#5
0
class CarCashSZ(CachingModel):
    user = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, editable=True)
    card = models.CharField(_(u'卡号'),
                            max_length=20,
                            null=False,
                            blank=True,
                            editable=True,
                            default='')
    sys_card_no = models.IntegerField(verbose_name=_(u"卡账号"),
                                      null=True,
                                      blank=True,
                                      editable=True)
    #    dept_id = models.IntegerField(_(u'部门id'),max_length=10, null=True, blank=True,editable=False)
    dept = DeptForeignKey(verbose_name=_(u'部门'), editable=True, null=True)
    sn_name = models.CharField(_(u'设备序列号'),
                               max_length=40,
                               null=True,
                               blank=True)
    cardserial = models.IntegerField(_(u'卡流水号'),
                                     max_length=20,
                                     null=True,
                                     blank=True)
    serialnum = models.IntegerField(_(u'设备流水号'),
                                    max_length=20,
                                    null=True,
                                    blank=True)
    checktime = models.DateTimeField(verbose_name=_(u'操作时间'),
                                     default=datetime.datetime.now(),
                                     blank=True,
                                     editable=True,
                                     null=True)
    type = CashTypeForeignKey(verbose_name=_(u'类型'),
                              null=False,
                              blank=False,
                              editable=True)
    money = models.DecimalField(max_digits=19,
                                decimal_places=2,
                                verbose_name=_(u'金额(元)'),
                                null=False,
                                blank=False,
                                editable=True)
    discount = models.SmallIntegerField(verbose_name=_(u"折扣"),
                                        default=0,
                                        max_length=3,
                                        null=True,
                                        blank=True,
                                        editable=False)  #Integer
    hide_column = models.SmallIntegerField(_(u'类型名称'),
                                           max_length=10,
                                           null=True,
                                           blank=True,
                                           choices=CASHTYPE)
    dining = models.ForeignKey(Dininghall,
                               verbose_name=_(u'餐厅'),
                               editable=True,
                               blank=True,
                               null=True)
    #    dining = models.CharField(_(u'餐厅'),max_length=20,null=True,blank=True,editable=False)
    blance = models.DecimalField(verbose_name=_(u'余额'),
                                 max_digits=20,
                                 null=True,
                                 blank=True,
                                 decimal_places=2,
                                 editable=True)

    convey_time = models.DateTimeField(verbose_name=_(u'上传时间'),
                                       blank=True,
                                       editable=True,
                                       null=True)
    allow_type = models.SmallIntegerField(_(u'补贴类型'),
                                          max_length=10,
                                          null=True,
                                          blank=True,
                                          choices=AllOW_TYPE)
    allow_batch = models.SmallIntegerField(_(u'补贴批次'),
                                           max_length=10,
                                           null=True,
                                           blank=True)
    allow_base_batch = models.SmallIntegerField(_(u'补贴基次'),
                                                max_length=10,
                                                null=True,
                                                blank=True)
    log_flag = models.SmallIntegerField(_(u'记录类型'),
                                        null=True,
                                        default=2,
                                        blank=True,
                                        editable=False,
                                        choices=LOGFLAG)

    def __unicode__(self):
        return ""
#        return u"%s"%self.user

    def get_montype(self):
        u"得到卡类型get具有缓存"
        type = ""
        if not self.type_id:
            return type
        try:
            type = CarCashType.objects.get(id=self.type_id)
            if type.type == 2:
                type = u"%s" % _(u'支出')
            else:
                type = u"%s" % _(u'支入')
        except:
            import traceback
            traceback.print_exc()
            pass
        return type

        if self.type.type == 2:
            return u"%s" % _(u'支出')
        elif self.type.type == 1:
            return u"%s" % _(u"收入")

    def save(self, *args, **kwargs):
        try:
            if get_option("POS_ID"):
                if self.serialnum and self.sn_name:
                    iskey = "CarCashSZ_%s%s" % (self.serialnum, self.sn_name)
                    cache.set(iskey, self, TIMEOUT)
                op = threadlocals.get_current_user()
                self.create_operator = op.username
                serino = get_cardserial_from_cache(self.card)
                self.cardserial = serino
                models.Model.save(self, args)
            else:
                super(CarCashSZ, self).save()
        except:
            import traceback
            traceback.print_exc()
#    def delete(self):
#        raise Exception(_(u'该人员的消费记录不允许删除'))

    def get_pin(self):
        emp_pin = ""
        try:
            Employee.can_restore = True
            emp_obj = Employee.objects.get(id=self.user_id)
            Employee.can_restore = False
            emp_pin = emp_obj.PIN
        except:
            pass
        return emp_pin

    def get_ename(self):
        emp_name = ""
        try:
            Employee.can_restore = True
            emp_obj = Employee.objects.get(id=self.user_id)
            Employee.can_restore = False
            emp_name = emp_obj.EName
        except:
            pass
        return emp_name

    def get_dept_name(self):
        u'''从缓存中得到部门的Name'''
        from mysite.personnel.models.model_emp import get_dept
        dept_name = ""
        try:
            dept_obj = get_dept(self.user_id)
            dept_name = dept_obj.name
        except:
            pass
        return dept_name

    def get_type_name(self):
        u"得到卡类型get具有缓存"
        name = ""
        if not self.type_id:
            return name
        try:
            name = CarCashType.objects.get(id=self.type_id)
            name = u"%s" % name.name
        except:
            pass
        return name

    class Admin(CachingModel.Admin):
        sort_fields = [
            "-checktime", "money", "serialnum", "cardserial", "checktime"
        ]
        app_menu = "pos"
        menu_group = 'pos'
        menu_index = 5
        cache = 3600
        visible = True
        if get_option("POS_ID"):
            query_fields = [
                'user.PIN',
                'card',
                'hide_column',
                'checktime',
            ]
            adv_fields = [
                'card',
                'type.type',
                'money',
                'blance',
                'discount',
                'checktime',
                'create_operator',
                'sn_name',
                'serialnum',
                'cardserial',
            ]
            list_display = [
                'user.PIN',
                'user.EName',
                'user.DeptID',
                'card',
                'hide_column',
                'type.type',
                'money',
                'blance',
                'discount',
                'checktime',
                'create_operator',
                'sn_name',
                'serialnum',
                'cardserial',
            ]
        else:
            query_fields = [
                'user.PIN',
                'hide_column',
                'sn_name',
                'checktime',
            ]
            adv_fields = [
                'card', 'sys_card_no', 'type', 'serialnum', 'money', 'blance',
                'create_operator', 'checktime', 'log_flag'
            ]
            list_display = [
                'user.PIN', 'user.EName', 'user.DeptID', 'card', 'sys_card_no',
                'cardserial', 'hide_column', 'type.type', 'allow_type',
                'money', 'blance', 'convey_time', 'checktime', 'sn_name',
                'serialnum', 'create_operator', 'log_flag'
            ]

        search_fields = ['checktime']
        newadded_column = {
            "user.PIN": "get_pin",
            "user.EName": "get_ename",
            "type.type": "get_montype",
            "user.DeptID": "get_dept_name"
        }
        tstart_end_search = {
            "checktime": [_(u"起始时间"), _(u"结束时间")]
        }  #配置时间字段(TimeField,DatetimeField,DateField)可以有起始和结束查找
        disabled_perms = ['change_carcashsz', 'add_carcashsz']

    class _delete(Operation):
        help_text = _(u"删除选定记录")  #删除选定的记录
        verbose_name = _(u"删除")
        visible = False

        def action(self):
            raise Exception(_(u'该人员的消费记录不允许删除'))

    class _change(ModelOperation):
        visible = False

        def action(self):
            pass

    class _add(ModelOperation):
        visible = False

        def action(self):
            pass

    class Meta:
        app_label = 'pos'
        verbose_name = _(u'卡现金收支')
        verbose_name_plural = verbose_name
        if get_option("POS_IC"):
            unique_together = (("sn_name", "hide_column", "sys_card_no",
                                "money", "checktime"), )
示例#6
0
class Allowance(CachingModel):
    user = EmpPoPForeignKey(verbose_name=_(u"人员"),
                            null=False,
                            blank=False,
                            editable=True)
    #    pin = models.CharField(_(u'人员编号'), db_column="badgenumber", null=False, max_length=20)
    #    ename = models.CharField(_(u'姓名'), db_column="name", null=True, max_length=24, blank=True, default="")
    #    cardno = models.CharField(_(u'卡号'), max_length=20, null=False, blank=True, editable=True, default='')
    money = models.DecimalField(max_digits=8,
                                decimal_places=2,
                                verbose_name=_(u"补贴金额"))
    receive_money = models.DecimalField(max_digits=8,
                                        decimal_places=2,
                                        verbose_name=_(u"领取金额"),
                                        null=True,
                                        blank=True,
                                        editable=False)
    is_pass = models.IntegerField(verbose_name=_(u"是否通过审核"),
                                  editable=True,
                                  default=0,
                                  choices=YESORNO,
                                  blank=True,
                                  null=False)
    pass_name = models.CharField(max_length=100,
                                 verbose_name=_(u"审核通过人员"),
                                 blank=True,
                                 null=True,
                                 editable=False)
    valid_date = models.DateField(verbose_name=_(u"补贴有效日期"),
                                  blank=True,
                                  null=True,
                                  editable=True)
    receive_date = models.DateTimeField(verbose_name=_(u"补贴领取时间"),
                                        blank=True,
                                        null=True,
                                        editable=False)
    date = models.DateTimeField(verbose_name=_(u"补贴时间"),
                                blank=False,
                                null=False,
                                editable=False)
    remark = models.CharField(max_length=200,
                              verbose_name=_(u"备注"),
                              blank=True,
                              null=True)
    batch = models.CharField(max_length=20,
                             verbose_name=_(u"补贴批次"),
                             blank=True,
                             null=True,
                             editable=True)
    base_batch = models.CharField(max_length=20,
                                  verbose_name=_(u"补贴基次"),
                                  blank=True,
                                  null=True,
                                  editable=False)
    is_ok = models.IntegerField(verbose_name=_(u"是否领取"),
                                editable=True,
                                default=0,
                                choices=YESORNO,
                                blank=True,
                                null=True)
    is_transfer = models.IntegerField(verbose_name=_(u"是否下发"),
                                      editable=False,
                                      default=0,
                                      choices=YESORNO,
                                      blank=True,
                                      null=True)
    sys_card_no = models.IntegerField(verbose_name=_(u"卡账号"),
                                      null=True,
                                      blank=True,
                                      editable=False)

    def __unicode__(self):
        return u"%s" % self.user

    def data_valid(self, sendtype):
        if self.is_pass == 1:
            raise Exception(_(u'该数据已经审核通过,不能修改'))

    def save(self, *args, **kwargs):
        try:
            self.date = datetime.datetime.now()
            if get_option("POS_IC") and self.pk is not None:
                now = datetime.datetime.now().date()
                if self.valid_date is None:
                    raise Exception(_(u"补贴有效日期不能为空"))
                if now > self.valid_date:
                    raise Exception(_(u"有效日期必须大于当前日期"))

            if get_option("POS_IC") and self.pk is None:
                from mysite.personnel.models.model_issuecard import IssueCard, CARD_VALID, CARD_OVERDUE
                now_time = datetime.datetime.now()
                if ONLINE_ALLOWANCE:  #在线补贴模式
                    self.batch = ((now_time.year - 2000) * 12 +
                                  now_time.month) * 31 + now_time.day
                else:
                    self.batch = now_time.strftime("%Y%m")[2:]
                objcard = IssueCard.objects.get(
                    UserID=self.user,
                    cardstatus__in=[CARD_OVERDUE, CARD_VALID])
                if objcard:
                    self.sys_card_no = objcard.sys_card_no
                else:
                    raise Exception(_(u"编号%s人员没有发卡") % self.user)
            super(Allowance, self).save()
        except IntegrityError:
            raise Exception(_(u"所选补贴人员中编号%s人员当月补贴已经登记!") % self.user)

    class OpReloadAllowance(Operation):
        help_text = _(u"重新下发审核通过,但未能领取的补贴到补贴设备")
        verbose_name = _(u"重新下发补贴")
        visible = get_option("POS_IC") and not ONLINE_ALLOWANCE

        def action(self):
            if self.object.is_pass == 0:
                raise Exception(_(u"编号%s人员补贴没有通过审核,操作失败") % self.object.user)
            if self.object.is_ok == 1:
                raise Exception(_(u"编号%s人员补贴已被领取,操作失败") % self.object.user)
            from mysite.iclock.models.model_device import Device, DEVICE_POS_SERVER
            from mysite.iclock.models.dev_comm_operate import update_pos_device_info
            dev = Device.objects.filter(device_type=DEVICE_POS_SERVER,
                                        device_use_type=2)  #查找补贴机
            if dev:
                update_pos_device_info(dev, [self.object], "SUBSIDYLOG")
            else:
                raise Exception(_(u"当前系统,没有补贴设备,操作失败"))

    class dataimport(ModelOperation):
        if get_option("POS_IC"):
            help_text = _(
                u"导入补贴数据:1.导入的人员必须是登记过卡帐号的人员,并且该人员的卡帐号必须是有效的卡。员工每月只支持一次补贴!2.卡状态为挂失,停用,过期的人员不能进行补贴登记,系统自动过滤!3.补贴导入成功后系统会自动下发设备指令,(直接审核通过)不可以再做修改!"
            )  #导入
        else:
            help_text = _(
                u"导入补贴数据:1.卡状态为挂失,停用,过期的人员不能进行补贴登记,系统自动过滤!2.补贴导入成功后系统会直接审核通过,不可以再做修改!"
            )  #导入
        verbose_name = _(u"导入")
        visible = True

        def action(self):
            from mysite.iclock.models.model_device import Device, DEVICE_POS_SERVER
            if get_option("POS_IC"):
                devlist = Device.objects.filter(device_type=DEVICE_POS_SERVER,
                                                device_use_type=2)  #查找补贴机
                if not devlist:
                    raise Exception(_(u"当前系统,没有补贴设备,操作失败"))
            if get_option("POS_IC"):
                from mysite.pos.ic_allowance_import import ICImportAllowData
                obj_import = ICImportAllowData(req=self.request,
                                               input_name="import_data")
            else:
                from mysite.pos.id_allowance_import import IDImportAllowData
                obj_import = IDImportAllowData(req=self.request,
                                               input_name="import_data")
            obj_import.exe_import_data()
            ret_error = obj_import.error_info
            if ret_error:
                import traceback
                traceback.extract_stack()
                raise Exception(u"%(ret)s" % {"ret": ";".join(ret_error)})

    class OpAudit(Operation):
        if get_option("POS_ID"):
            help_text = _(u"审核通过时系统会在卡现金收支表中增加一条补贴记录,审核通过的记录不允许再修改")
        else:
            help_text = _(u"审核通过时系统会自动下发指令,审核通过的记录不允许再修改")
        verbose_name = _(u"审核补贴")

        @transaction.commit_on_success
        def action(self):
            if self.object.is_pass == 0:
                from mysite.personnel.models.model_issuecard import IssueCard, CARD_VALID, CARD_OVERDUE
                from mysite.iclock.models.model_device import Device, DEVICE_POS_SERVER
                try:
                    if get_option("POS_ID"):
                        key = "IssueCard_%s" % self.object.user.Card
                        iscarobj = get_issuecard(key, IssueCard)
#                        iscarobj = IssueCard.objects.get(cardno=self.object.user.Card,cardstatus__in = [CARD_OVERDUE,CARD_VALID])
                    else:
                        from mysite.personnel.models.model_issuecard import IssueCard, CARD_VALID, CARD_OVERDUE
                        iscarobj = IssueCard.objects.get(
                            sys_card_no=self.object.sys_card_no,
                            cardstatus__in=[CARD_OVERDUE, CARD_VALID])
                except:
                    iscarobj = None
                try:
                    if iscarobj:
                        now = datetime.datetime.now().date()
                        dev = []
                        valid_date = self.object.valid_date
                        if get_option("POS_IC"):
                            batch = self.object.batch
                            allowance_list = Allowance.objects.filter(
                                sys_card_no=self.object.sys_card_no,
                                batch__lt=batch,
                                is_pass=0)  #获取小余当前记录的批次的没有审核的补贴记录
                            if allowance_list:
                                raise Exception(
                                    _(u"编号%s人员存在小于当前补贴批次号的未审核的补贴记录,请先审核小批次的记录!"
                                      ) % self.object.user)
                        if get_option("POS_IC") and now > valid_date:
                            raise Exception(
                                _(u"编号%s人员补贴记录已超过补贴有效期") % self.object.user)
                        if iscarobj.cardstatus != CARD_VALID:
                            raise Exception(
                                _(u"编号%s卡已挂失或过期,无法补贴") % self.object.user)
                        if get_option("POS_IC"):
                            dev = Device.objects.filter(
                                device_type=DEVICE_POS_SERVER,
                                device_use_type=2)  #查找补贴机
                            if not dev:
                                raise Exception(_(u"当前系统,没有补贴设备,操作失败"))
                        newblan = iscarobj.blance + self.object.money
                        if iscarobj.type is not None:
                            from mysite.personnel.models.model_iccard import ICcard
                            iccardobj = ICcard.objects.get(pk=iscarobj.type_id)
                            lessmoney = iccardobj.less_money  #卡类最小余额
                            maxmoney = iccardobj.max_money  #卡类最大余额
                            if lessmoney > newblan and lessmoney > 0:
                                raise Exception(
                                    _(u"人员编号%s超出卡类最小余额") % self.object.user)
                            if newblan > maxmoney and maxmoney > 0:
                                raise Exception(
                                    _(u"人员编号%s超出卡类最大余额") % self.object.user)
                            if maxmoney == 0 and newblan > 10000:
                                raise Exception(
                                    _(u"人员编号%s超出系统允许最大余额") % self.object.user)

                        self.object.is_pass = 1
                        self.object.pass_name = unicode(self.request.user)
                        self.object.save()
                        if get_option("POS_ID"):
                            from mysite.pos.models.model_carcashsz import CarCashSZ
                            from mysite.pos.models.model_carcashtype import CarCashType
                            newblan = iscarobj.blance + self.object.money
                            CarCashSZ(
                                user=self.object.user,
                                card=iscarobj.cardno,
                                checktime=datetime.datetime.now(),
                                type=CarCashType.objects.get(id=2),  #消费类型
                                money=self.object.money,
                                hide_column=2,
                                blance=newblan,
                            ).save()
                            iscarobj.blance = newblan
                            iscarobj.save()
                        else:
                            from mysite.iclock.models.dev_comm_operate import update_pos_device_info
                            if dev:
                                update_pos_device_info(dev, [self.object],
                                                       "SUBSIDYLOG")
                    else:
                        raise Exception(_(u"编号%s人员没有有效的卡号") % self.object.user)
                except Exception, e:
                    #                    raise Exception(_(u"审核失败"))
                    import traceback
                    traceback.print_exc()
                    raise e
            else:
示例#7
0
class OverTime(CachingModel):
    emp = EmpPoPForeignKey(verbose_name=_(u'人员'), null=False, blank=False)
    starttime = models.DateTimeField(_(u'开始时间'), null=False, blank=False)
    endtime = models.DateTimeField(_(u'结束时间'), null=False, blank=False)
    remark = models.CharField(_(u'加班描述'),
                              null=True,
                              blank=True,
                              max_length=200)
    audit_status = models.IntegerField(_(u'审核状态'),
                                       null=False,
                                       blank=False,
                                       default=APPLICATION,
                                       choices=APPLICATION_STATUS,
                                       editable=False)
    auditreason = models.CharField(_(u'审核原因'),
                                   null=True,
                                   blank=True,
                                   max_length=100,
                                   editable=False)

    def __unicode__(self):
        return u"%s" % (self.emp)

    def save(self):
        #验证
        obj_tmp = OverTime.objects.filter(emp=self.emp,
                                          starttime__lte=self.endtime,
                                          endtime__gte=self.starttime)
        if obj_tmp and obj_tmp[0].pk != self.pk:
            raise Exception(_(u'加班记录重复'))
        if self.endtime <= self.starttime:
            raise Exception(_(u'结束时间不能小于等于开始时间'))

        req = get_current_request()
        if self.pk:  #编辑
            tmp = OverTime.objects.get(pk=self.pk)
            if req.session.has_key("employee"):  #员工自助用户申请或者重新申请
                if tmp.audit_status == REFUSE:
                    self.audit_status = APPLICATION_AGAIN
                if tmp.audit_status == AUDIT_SUCCESS:
                    raise Exception(_(u'该记录已审核'))
        elif (not req.session.has_key("employee")):  #管理员,新增,默认就是审核通过
            self.audit_status = AUDIT_SUCCESS

        super(OverTime, self).save()
        #        from mysite.att.calculate.global_cache import JBD_DATA
        #        if JBD_DATA.has_key(self.emp.id):
        #            del JBD_DATA[self.emp.id]
        if self.audit_status == AUDIT_SUCCESS:
            from mysite.att.models.__init__ import get_autocalculate_time as gct
            from model_waitforprocessdata import WaitForProcessData as wfpd

            gct_time = gct()
            if self.starttime < gct_time or self.endtime <= gct_time:
                wtmp = wfpd()
                st = datetime.datetime(self.starttime.year,
                                       self.starttime.month,
                                       self.starttime.day, 0, 0, 0)
                et = datetime.datetime(self.endtime.year, self.endtime.month,
                                       self.endtime.day, 23, 59, 59)
                wtmp.UserID = self.emp
                wtmp.starttime = st
                wtmp.endtime = et
                wtmp.save()

    def delete(self):
        u"删除加班单"
        req = get_current_request()
        if req.session.has_key("employee"):
            if self.audit_status == AUDIT_SUCCESS:
                raise Exception(_(u'审核通过的记录不能被删除'))
        if self.audit_status == AUDIT_SUCCESS:
            from model_waitforprocessdata import WaitForProcessData as wfpd
            wtmp = wfpd()
            st = datetime.datetime(self.starttime.year, self.starttime.month,
                                   self.starttime.day, 0, 0, 0)
            et = datetime.datetime(self.endtime.year, self.endtime.month,
                                   self.endtime.day, 23, 59, 59)
            wtmp.UserID = self.emp
            wtmp.starttime = st
            wtmp.endtime = et
            wtmp.save()

        super(OverTime, self).delete()
#        from mysite.att.calculate.global_cache import JBD_DATA
#        if JBD_DATA.has_key(self.emp.id):
#            del JBD_DATA[self.emp.id]

    @staticmethod
    def clear():
        OverTime.objects.all().delete()

    class OpAuditManyEmployee(Operation):
        u"批量审核"
        verbose_name = _(u'审批')
        help_text = _(u'加班单审批')
        params = (
            ('stat',
             models.IntegerField(_(u'审核状态'),
                                 null=False,
                                 blank=False,
                                 default=AUDIT_SUCCESS,
                                 choices=AUDIT_STATUS)),
            ('reason',
             models.CharField(_(u'审核原因'),
                              null=True,
                              blank=True,
                              max_length=100)),
        )

        def action(self, stat, reason):
            if self.object.audit_status == AUDIT_SUCCESS:
                raise Exception(
                    _(u"%(emp)s,%(st)s,%(et)s,%(rm)s 已审核") % {
                        "emp": self.object.emp,
                        "st": self.object.starttime,
                        "et": self.object.endtime,
                        "rm": self.object.remark
                    })
            self.object.audit_status = stat
            self.object.auditreason = reason
            self.object.save()

    class _add(ModelOperation):
        visible = False
        help_text = _(u"新增记录")  #新增记录
        verbose_name = _(u"新增")

        def action(self):
            pass

    class OpAddManyOvertime(ModelOperation):
        help_text = _(u'''新增''')
        verbose_name = _(u"新增加班单")
        params = (
            ('UserID',
             EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)),
            ('starttime',
             models.DateTimeField(_(u'开始时间'), null=False, blank=False)),
            ('endtime',
             models.DateTimeField(_(u'结束时间'), null=False, blank=False)),
            ('remark',
             models.CharField(_(u'加班描述'),
                              null=True,
                              blank=True,
                              max_length=200)),
        )

        def action(self, **args):
            emps = args.pop('UserID')
            if args['starttime'] >= args['endtime']:
                raise Exception(_(u'结束时间不能小于等于开始时间'))
            if not emps:
                raise Exception(_(u'请选择人员'))
            if len(emps) > 1000:
                raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!'))
            for emp in emps:
                OverTime(emp=emp, **args).save()

    class Admin(CachingModel.Admin):
        menu_index = 6
        query_fields = [
            'emp.PIN', 'emp.EName', 'remark', 'audit_status', 'auditreason'
        ]
        list_display = [
            'emp', 'starttime', 'endtime', 'remark',
            'audit_status|audit_filter', 'auditreason'
        ]

    class Meta:
        app_label = 'att'
        verbose_name = _(u'加班单')
        unique_together = (("emp", "starttime", "endtime"), )
示例#8
0
class Notice(CachingModel):
    id = models.AutoField(verbose_name=_(u'编号'),
                          primary_key=True,
                          null=False,
                          editable=False)
    context = models.TextField(verbose_name=_(u'短消息内容'), max_length=320)
    starttime = models.DateTimeField(_(u'开始时间'), null=True)
    lasttime = models.IntegerField(verbose_name=_(u'短消息持续时间(分)'),
                                   max_length=20,
                                   default=60)
    device = DevicePoPForeignKey(verbose_name=_(u'设备'),
                                 db_column='DeviceID',
                                 null=True,
                                 blank=True,
                                 editable=False)
    user = EmpPoPForeignKey(verbose_name=_(u'人员'),
                            db_column='UserID',
                            null=True,
                            blank=True,
                            editable=False)
    isset = models.IntegerField(_(u'是否下发'),
                                choices=YESORNO,
                                default=0,
                                editable=False)

    def __unicode__(self):
        return u"短消息(ID:%s)" % self.id

    def save(self, **args):
        self.context = self.context.replace('\r',
                                            '').replace('\n',
                                                        '').replace('\t', '')
        clen = len(self.context.encode('ascii', 'ignore'))
        tlen = clen + (len(self.context) - clen) * 2
        if tlen > 320:
            raise Exception(_(u'短消息内容不能超过320个字符'))

        super(Notice, self).save(**args)

    def delete(self, **args):
        sync_del_notice(self.id, user=self.user, device=self.device)
        super(Notice, self).delete()

    class _add(ModelOperation):
        visible = False
        help_text = _(u"新增记录")  #新增记录
        verbose_name = _(u"新增")

        def action(self):
            pass


#    class OpAddUserMsg(ModelOperation):
#        help_text=_(u'''新增对私信息''')
#        verbose_name=_(u"新增对私公告")
#        params=(
##            ('device' , DeviceMultForeignKey(verbose_name=_(u'设备'),db_column='DeviceID',null=False, blank=False)),
#            ('user' , EmpMultForeignKey(verbose_name=_(u'人员'), db_column='UserID',null=True, blank=True)),
#            ('context', models.TextField(verbose_name=_(u'公告内容'),max_length=320)),
#            ('starttime', models.DateTimeField(_(u'开始时间'),null=True)),
#            ('lasttime', models.IntegerField(verbose_name=_(u'公告持续时间(分)'), max_length=20,default=60)),
#        )
#        def action(self, **args):
#            users=args.pop('user')
#            if self.request:
#                   if not users:
#                       depts=self.request.POST.getlist('deptIDs')
#                       users=Employee.objects.filter(DeptID__in=depts)
#            if not users:
#                raise Exception(_(u'请选择人员'))
#            for user in users:
#                Notice(user=user, **args).save()

    class AddCmd(Operation):
        help_text = _(u"""把信息下发到设备中去""")
        verbose_name = _(u'短消息下发')

        def action(self):
            starttime = self.object.starttime.strftime("%Y-%m-%d %H:%M:%S")
            users = self.object.user
            devices = self.object.device
            if users:
                sync_set_notice(self.object.id,
                                self.object.context,
                                starttime,
                                self.object.lasttime,
                                user=users)
            if devices:
                sync_set_notice(self.object.id,
                                self.object.context,
                                starttime,
                                self.object.lasttime,
                                device=devices)
            aa = self.object
            aa.isset = 1
            aa.save()

    def get_area(self):
        return u",".join([a.areaname for a in self.area.all()])

    def get_user(self):

        return u",".join([u.EName for u in self.user.all()])

    class Admin(CachingModel.Admin):  #管理该模型
        sort_fields = ['id', 'starttime']  #需要排序的字段,放在列表中
        menu_group = 'personnel'  #在哪个app应用下
        menu_index = 5  #菜单的摆放的位置
        list_display = [
            'starttime', 'lasttime', 'isset', 'context', 'user.PIN'
        ]

        query_fields = ['device__sn', 'user__PIN', 'user__EName']  #需要查找的字段
        adv_fields = list_display
        visible = get_option("NOTICE_VISIBLE")

    class Meta:
        verbose_name = _(u'设备短消息')  #名字
        verbose_name_plural = verbose_name
        app_label = 'iclock'  #属于哪个app
示例#9
0
class CheckExact(CachingModel):
    '''
    补签表模型
    '''
    UserID = EmpPoPForeignKey(verbose_name=_(u'人员'),db_column='UserID',  editable=True)    
    CHECKTIME = models.DateTimeField(_(u'签卡时间'),null=False, blank=False)
    CHECKTYPE=models.CharField(_(u'考勤状态'),max_length=5, default=0,choices=ATTSTATES)
    ISADD=models.SmallIntegerField(null=True, blank=True,editable=False)
    YUYIN=models.CharField(_(u'签卡原因'),max_length=100, null=True, blank=True)
    ISMODIFY=models.SmallIntegerField(null=True, default=0,blank=True,editable=False)
    ISDELETE=models.SmallIntegerField(null=True,default=0, blank=True,editable=False)
    INCOUNT=models.SmallIntegerField(null=True,default=0, blank=True,editable=False)
    ISCOUNT=models.SmallIntegerField(null=True, default=0,editable=False)
    MODIFYBY = models.CharField(_(u'修改'),max_length=20,null=True, blank=True,editable=False)
    DATE=models.DateTimeField(_(u'员工考勤修改日志日期'),null=True, blank=True,editable=False)
    def save(self,**args):
        
        ce=CheckExact.objects.filter(UserID=self.UserID,CHECKTIME=self.CHECKTIME)
        if ce and ce[0].id!=self.id:
                   raise Exception(_(u'补签记录输入重复'))
        if self.pk!=None:
            ce=CheckExact.objects.get(pk=self.pk)
        old=""
        if ce:
            old=Transaction.objects.filter(UserID=self.UserID,TTime=ce.CHECKTIME)
       
        super(CheckExact,self).save(**args)
        if old:
            t=old[0]
        else:            
            t=Transaction()
        t.UserID=self.UserID
        t.TTime=self.CHECKTIME
        t.State=self.CHECKTYPE
        t.Verify=5
        t.save()    #---添加到签卡原始数据表
        from mysite.att.models.__init__ import get_autocalculate_time as gct
        from model_waitforprocessdata import WaitForProcessData as wfpd
        import datetime
        gct_time=gct()
        if self.CHECKTIME<gct_time:
            wtmp=wfpd()                
            st=datetime.datetime(self.CHECKTIME.year,self.CHECKTIME.month,self.CHECKTIME.day,0,0,0)
            et=datetime.datetime(self.CHECKTIME.year,self.CHECKTIME.month,self.CHECKTIME.day,23,59,59)
            wtmp.UserID=self.UserID
            wtmp.starttime=st
            wtmp.endtime=et
            #wtmp.customer=self.customer
            wtmp.save() #---添加考勤计算任务计划
        
    class _add(ModelOperation):
        visible=False
        verbose_name=_(u'新增')
        def action(self):
            pass
    def delete(self):
        Transaction.objects.filter(UserID=self.UserID,TTime=self.CHECKTIME).delete()
        super(CheckExact,self).delete()
        
    def __unicode__(self):
        return u"%s"%self.UserID
    class OpAddManyCheckExact(ModelOperation):
        verbose_name=_(u"新增补签卡")
        help_text=_(u'新增补签卡同时会在原始记录表中增加一条相同记录,修改时会同时修改原始记录表中的相同记录')
        params=(
            ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'),blank=True,null=True)),            
            ('checktime',models.DateTimeField(_(u'签卡时间'))),
            ('checktype',models.CharField(_(u'考勤状态'), choices=ATTSTATES)),
            ('reason',models.CharField(_(u'签卡原因'),blank=True,null=True,max_length=100)),
        )
        def action(self,UserID,checktime,checktype,reason):
            if self.request:
                if  UserID==0:
                    depts=self.request.POST.getlist('deptIDs')
                    UserID=Employee.objects.filter(DeptID__in=depts) 
                if not UserID:
                    raise Exception(_(u'请选择人员'))
                ce=CheckExact.objects.filter(UserID__in=UserID,CHECKTIME=checktime)
                if ce.count()>0:
                    raise Exception(_(u'补签记录输入重复'))
                
                for emp in UserID:
                    ck=CheckExact()
                    ck.UserID=emp
                    ck.CHECKTIME=checktime
                    ck.YUYIN=reason
                    ck.CHECKTYPE=checktype
                    ck.save()

    class Admin(CachingModel.Admin):
        default_give_perms=["contenttypes.can_AttCalculate",]
        sort_fields=["UserID.PIN","CHECKTIME"]
        menu_index=2
        app_menu="att"
        api_fields=('UserID.PIN','UserID.EName','CHECKTIME','CHECKTYPE','YUYIN')
        list_display=('UserID_id','UserID.PIN','UserID.EName','CHECKTIME','CHECKTYPE','YUYIN',)
        list_filter =('UserID','CHECKTIME','CHECKTYPE','YUYIN')
        query_fields=('UserID__PIN','UserID__EName','CHECKTIME','CHECKTYPE','YUYIN')
        hide_fields=('UserID_id',)
        disabled_perms=["add_checkexact",'dataimport_checkexact']
        #default_widgets={'UserID': ZMulEmpChoiceWidget}
    class Meta:
        app_label='att'
        db_table = 'checkexact'
        verbose_name=_(u'补签卡')
        verbose_name_plural=verbose_name
示例#10
0
class EmpSpecDay(CachingModel):
    '''
    请假原始表模型
    '''
    emp = EmpPoPForeignKey(verbose_name=_(u'人员'),
                           db_column='UserID',
                           null=False,
                           blank=False)
    start = models.DateTimeField(_(u'开始时间'),
                                 db_column='StartSpecDay',
                                 null=False,
                                 default=nextDay(),
                                 blank=False)
    end = models.DateTimeField(_(u'结束时间'),
                               db_column='EndSpecDay',
                               null=True,
                               default=endOfDay(nextDay()),
                               blank=False)
    leaveclass = models.ForeignKey(LeaveClass,
                                   verbose_name=_(u'假类'),
                                   db_column='DateID',
                                   null=False,
                                   blank=False,
                                   default=1)
    reson = models.CharField(_(u'请假原因'),
                             db_column='YUANYING',
                             max_length=100,
                             null=True,
                             blank=True)
    apply = models.DateTimeField(_(u'填写时间'),
                                 db_column='Date',
                                 null=True,
                                 default=datetime.datetime.now(),
                                 blank=True)
    state = models.CharField(_(u'申请状态'),
                             max_length=2,
                             null=True,
                             db_column="State",
                             default=2,
                             blank=True,
                             choices=AUDIT_STATES,
                             editable=False)

    def save(self, *args, **kwargs):
        if self.start >= self.end:
            raise Exception(_(u'结束时间不能小于开始时间'))

        tt = EmpSpecDay.objects.filter(emp=self.emp,
                                       start__lte=self.end,
                                       end__gte=self.start)
        if tt and tt[0].id != self.id:
            raise Exception(_(u'请假时间重复'))
#        tmp=EmpSpecDay.objects.filter(Q(emp=self.emp,start__lte=self.start,end__gte=self.end)| Q(emp=self.emp,start__gte=self.start,end__lte=self.end)).exclude(pk=1)
#        if tmp and tmp[0].pk !=self.pk :
#            raise Exception(_(u'已存在相同请假记录!'))

        super(EmpSpecDay, self).save()
        from mysite.att.models.__init__ import get_autocalculate_time as gct
        from model_waitforprocessdata import WaitForProcessData as wfpd
        import datetime
        gct_time = gct()
        if self.start < gct_time or self.end <= gct_time:
            wtmp = wfpd()
            st = self.start
            et = self.end
            wtmp.UserID = self.emp
            wtmp.starttime = st
            wtmp.endtime = et
            #wtmp.customer=self.customer
            wtmp.save()

    def __unicode__(self):
        return u"%s: %s, %s" % (self.emp,
                                self.start and self.start.strftime("%m-%d")
                                or "", self.leaveclass)
        #return u"%s: %s, %s"%(self.emp, self.start and self.start.strftime("%m-%d") or "", self.leaveclass)出错
    class _add(ModelOperation):
        visible = False
        help_text = _(u"新增记录")  #新增记录
        verbose_name = _(u"新增")

        def action(self):
            pass

    class OpAddManyUserID(ModelOperation):
        help_text = _(u'''新增''')
        verbose_name = _(u"新增请假")
        params = (
            ('UserID',
             EmpMultForeignKey(verbose_name=_(u'人员'), blank=False,
                               null=False)),
            ('start', models.DateTimeField(_(u'开始时间'))),
            ('end', models.DateTimeField(_(u'结束时间'))),
            ('leaveclass', models.ForeignKey(LeaveClass,
                                             verbose_name=_(u'假类'))),
            ('reson',
             models.CharField(_(u'请假原因'),
                              blank=True,
                              null=True,
                              max_length=100)),
            ('apply',
             models.DateTimeField(_(u'填写时间'),
                                  default=datetime.datetime.now(),
                                  blank=True)),
        )

        def action(self, **args):
            emps = args.pop('UserID')
            if self.request:
                if not emps:
                    depts = self.request.POST.getlist('deptIDs')
                    emps = Employee.objects.filter(DeptID__in=depts)
            if args['start'] >= args['end']:
                raise Exception(_(u'结束时间不能小于开始时间'))
            if not emps:
                raise Exception(_(u'请选择人员'))

            for emp in emps:
                EmpSpecDay(emp=emp, **args).save()

    class Admin(CachingModel.Admin):
        from mysite.personnel.models.empwidget import ZMulPopEmpChoiceWidget
        sort_fields = ["emp.PIN", "start", "end"]
        disabled_perms = ['add_empspecday', 'dataimport_empspecday']
        #default_widgets={"emp":ZMulPopEmpChoiceWidget}
        list_filter = ['emp', 'reson', 'state', 'leaveclass']
        query_fields = ['emp__PIN', 'emp__EName', 'reson', 'state']
        list_display = [
            'emp.PIN', 'emp.EName', 'start', 'end', 'reson', 'leaveclass'
        ]

        menu_index = 1

    class Meta:
        app_label = 'att'
        db_table = 'user_speday'
        verbose_name = _(u'请假')
        verbose_name_plural = verbose_name
        unique_together = (("emp", "start", "leaveclass"), )
示例#11
0
class IssueCard(CachingModel):
    '''发卡表'''
    UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, editable=True)
    cardno = models.CharField(verbose_name=_(u'卡号'),
                              max_length=20,
                              null=False,
                              blank=True,
                              editable=True)
    effectivenessdate = models.DateField(verbose_name=_(u'有效日期'),
                                         null=True,
                                         blank=True,
                                         editable=False)
    isvalid = models.BooleanField(verbose_name=_(u'是否有效'),
                                  choices=YESORNO,
                                  editable=False,
                                  default=1)
    #cardtype=models.ForeignKey(CardType,verbose_name=_(u'卡类型'),editable=True,null=True,blank=True)
    cardpwd = models.CharField(verbose_name=_(u'卡密码'),
                               max_length=20,
                               null=True,
                               blank=True,
                               editable=False)
    #blance=models.DecimalField(verbose_name=_(u'卡上余额'),max_digits=8,null=True,blank=True,decimal_places=2,editable=True)
    failuredate = models.DateField(verbose_name=_(u'失效日期'),
                                   null=True,
                                   blank=True,
                                   editable=False)
    cardstatus = models.CharField(verbose_name=_(u'卡状态'),
                                  max_length=20,
                                  choices=CARDSTATUS,
                                  editable=False,
                                  default=1)
    issuedate = models.DateField(
        verbose_name=_(u'发卡日期'),
        null=True,
        blank=True,
        editable=False,
        default=datetime.datetime.now().strftime("%Y-%m-%d"))

    def __unicode__(self):
        return u"%s  %s" % (self.UserID, self.cardno)

    def data_valid(self, sendtype):
        from datetime import datetime
        from mysite.iclock.models.modelproc import get_normal_card
        print type(self.cardno)
        try:
            orgcard = str(self.cardno)
        except:
            raise Exception(_(u'卡号不正确'))
        import re
        tmp = re.compile('^[0-9]+$')
        if not tmp.search(orgcard):
            raise Exception(_(u'卡号不正确'))
        u = Employee.objects.filter(Card__exact=self.cardno)
        if u:
            raise Exception(_(u'卡号已使用'))
        if self.UserID.Card:
            raise Exception(_(u'该人员已发过卡'))
        self.issuedate = datetime.now().strftime("%Y-%m-%d")

    class _delete(Operation):
        visible = False
        verbose_name = _(u'删除')

        def action(self):
            pass

    def save(self):
        super(IssueCard, self).save()
        if self.UserID.Card != self.cardno:
            self.UserID.Card = self.cardno
            self.UserID.save()

            #同步卡号到门禁控制器
            from mysite import settings
            if "mysite.iaccess" in settings.INSTALLED_APPS:
                from mysite.iclock.models.dev_comm_operate import sync_set_user
                sync_set_user(self.UserID.search_accdev_byuser(),
                              [self.UserID])

    class OpBatchIssueCard(ModelOperation):
        verbose_name = _(u'批量发卡')
        help_text = _(u'已经发过卡的人员,将不会在生成人员列表时出现!')
        from mysite import settings

        params = (('pin_width',
                   models.IntegerField(null=True,
                                       blank=True,
                                       default=settings.PIN_WIDTH)), )

        def action(self, pin_width):
            if self.request:
                empids = self.request.POST.get("empids", "")
                cardnos = self.request.POST.get("cardnos", "")
                empids = [int(i) for i in empids.split(",")]
                #print empids
                cardnos = [str(i) for i in cardnos.split(",")]
                #print cardnos
                where = {'id__in': empids}
                emps = Employee.objects.filter(Q(**where))
                for i in range(len(empids)):
                    tcard = IssueCard()
                    tuser = emps.get(pk=empids[i])

                    tcard.cardno = cardnos[i]
                    tcard.UserID = tuser

                    tcard.save()
                    tuser.Card = cardnos[i]
                    tuser.save()

    class _change(Operation):
        visible = False
        verbose_name = _(u'修改')

        def action(self):
            pass
#        class OpLoseCard(Operation):
#                help_text=u'挂失卡'
#                verbose_name=u'挂失卡'
#                visible=False
#                def action(self):
#                        self.object.cardstatus=3
#                        self.object.save()
#        class OpRevertCard(Operation):
#                help_text=u'解挂卡'
#                verbose_name=u'解挂卡'
#                visible=False
#                def action(self):
#                        self.object.cardstatus=1
#                        self.object.save()
#        class OpExchangeCard(Operation):
#                help_text=u'员工换卡'
#                verbose_name=u'员工换卡'
#
#                def action(self):
#                        self.object.cardstatus=1
#                        self.object.save()

    class Admin(CachingModel.Admin):
        sort_fields = ["UserID.PIN", "issuedate"]
        app_menu = "personnel"
        list_filter = ('UserID', 'cardno', 'isvalid', 'cardstatus')
        query_fields = [
            'UserID__PIN', 'UserID__EName', 'cardno', 'cardstatus', 'isvalid'
        ]
        #list_display = ['UserID.PIN','UserID.EName','cardno','cardstatus','isvalid']
        list_display = ['UserID.PIN', 'UserID.EName', 'cardno', 'issuedate']
        disabled_perms = [
            'dataimport_issuecard', 'oprevertcard_issuecard',
            'oplosecard_issuecard'
        ]
        menu_index = 5
        disabled_perms = [
            "dataimport_issuecard", "change_issuecard", "oplosecard_issuecard",
            "oprevertcard_issuecard"
        ]
        help_text = _(u"目前支持手动输入卡号以及使用发卡器发卡!")

    class Meta:
        app_label = 'personnel'
        verbose_name = _(u'人员发卡')
        verbose_name_plural = verbose_name
示例#12
0
class EmpSpecDay(CachingModel):
    emp = EmpPoPForeignKey(verbose_name=_(u'人员'),
                           db_column='UserID',
                           editable=True)
    start = models.DateTimeField(_(u'开始时间'),
                                 db_column='StartSpecDay',
                                 null=False,
                                 default=nextDay(),
                                 blank=False)
    end = models.DateTimeField(_(u'结束时间'),
                               db_column='EndSpecDay',
                               null=True,
                               default=endOfDay(nextDay()),
                               blank=False)
    leaveclass = models.ForeignKey(LeaveClass,
                                   verbose_name=_(u'假类'),
                                   db_column='DateID',
                                   null=False,
                                   blank=False,
                                   default=1)
    reson = models.CharField(_(u'请假原因'),
                             db_column='YUANYING',
                             max_length=100,
                             null=True,
                             blank=True)
    apply = models.DateTimeField(_(u'填写时间'),
                                 db_column='Date',
                                 auto_now=True,
                                 null=True,
                                 default=datetime.datetime.now,
                                 blank=True)
    audit_status = models.SmallIntegerField(_(u'审核状态'),
                                            blank=True,
                                            null=True,
                                            default=APPLICATION,
                                            choices=ALL_STATUS,
                                            editable=False)
    audit_reason = models.CharField(_(u'审核原因'),
                                    max_length=100,
                                    null=True,
                                    blank=True,
                                    editable=False)
    state = models.CharField(_(u'申请状态'),
                             max_length=2,
                             null=True,
                             db_column="State",
                             default=APPLICATION,
                             blank=True,
                             choices=AUDIT_STATES,
                             editable=False)

    def save(self, *args, **kwargs):
        if not self.emp:
            raise Exception(_(u'必须选择人员'))
        if self.start >= self.end:
            raise Exception(_(u'结束时间不能小于或等于开始时间'))
        tt = EmpSpecDay.objects.filter(emp=self.emp,
                                       start__lte=self.end,
                                       end__gte=self.start)
        if tt and tt[0].id != self.id:
            raise Exception(_(u'请假时间重复'))
#        if tt and int(tt[0].audit_status)== AUDIT_SUCCESS:
        if self.id and tt and tt[0].audit_status == AUDIT_SUCCESS:
            raise Exception(_(u'审核通过的请假记录不能修改'))
#        tmp=EmpSpecDay.objects.filter(Q(emp=self.emp,start__lte=self.start,end__gte=self.end)| Q(emp=self.emp,start__gte=self.start,end__lte=self.end)).exclude(pk=1)
#        if tmp and tmp[0].pk !=self.pk :
#            raise Exception(_(u'已存在相同请假记录!'))

        req = get_current_request()
        if self.pk:
            tx = EmpSpecDay.objects.get(pk=self.pk)
            if req.session.has_key("employee"):
                if int(tx.audit_status) == AUDIT_SUCCESS:
                    raise Exception(_(u'该记录已审核'))
                if int(tx.state) == REFUSE:
                    self.audit_status = APPLICATION_AGAIN
        elif (not req.session.has_key("employee")):
            self.audit_status = AUDIT_SUCCESS

        super(EmpSpecDay, self).save()
        from mysite.att.models.__init__ import get_autocalculate_time as gct
        from model_waitforprocessdata import WaitForProcessData as wfpd
        import datetime
        gct_time = gct()
        if self.start < gct_time or self.end <= gct_time:
            wtmp = wfpd()
            st = self.start
            et = self.end
            wtmp.UserID = self.emp
            wtmp.starttime = st
            wtmp.endtime = et
            #wtmp.customer=self.customer
            wtmp.save()

    def delete(self):
        req = get_current_request()
        if req.session.has_key("employee"):
            if int(self.audit_status) == AUDIT_SUCCESS:
                raise Exception(_(u'审核通过的记录不能被删除'))
        if int(self.audit_status) == AUDIT_SUCCESS:
            from model_waitforprocessdata import WaitForProcessData as wfpd
            wtmp = wfpd()
            st = datetime.datetime(self.start.year, self.start.month,
                                   self.start.day, 0, 0, 0)
            et = datetime.datetime(self.end.year, self.end.month, self.end.day,
                                   23, 59, 59)

            wtmp.UserID = self.emp
            wtmp.starttime = st
            wtmp.endtime = et
            wtmp.save()

        super(EmpSpecDay, self).delete()

    def __unicode__(self):
        emp_obj = ""
        leavetype_name = ""
        try:
            emp_obj = Employee.objects.get(id=self.emp_id)
            leavetype_obj = LeaveClass.objects.get(LeaveID=self.leaveclass_id)
            leavetype_name = leavetype_obj.LeaveName
        except:
            pass
        return u"%s: %s, %s" % (emp_obj,
                                self.start and self.start.strftime("%m-%d")
                                or "", leavetype_name)
#        return u"%s: %s, %s"%(self.emp, self.start and self.start.strftime("%m-%d") or "", self.leaveclass)

    class _add(ModelOperation):
        visible = False
        help_text = _(u"新增记录")  #新增记录
        verbose_name = _(u"新增")

        def action(self):
            pass

    class OpAddManyUserID(ModelOperation):
        help_text = _(u'''新增''')
        verbose_name = _(u"新增请假")
        params = (
            ('UserID',
             EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)),
            ('start', models.DateTimeField(_(u'开始时间'))),
            ('end', models.DateTimeField(_(u'结束时间'))),
            ('leaveclass', models.ForeignKey(LeaveClass,
                                             verbose_name=_(u'假类'))),
            ('reson',
             models.CharField(_(u'请假原因'),
                              blank=True,
                              null=True,
                              max_length=100)),
            ('apply',
             models.DateTimeField(_(u'填写时间'),
                                  default=datetime.datetime.now,
                                  blank=True)),
        )

        def action(self, **args):
            from mysite.iclock.iutils import get_dept_from_all, get_max_in
            emps = args.pop('UserID')

            if args['start'] >= args['end']:
                raise Exception(_(u'结束时间不能小于开始时间'))
            if not emps:
                raise Exception(_(u'请选择人员'))
            if len(emps) > 1000:
                raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!'))
            for emp in emps:
                EmpSpecDay(emp=emp, **args).save()

    def get_emp_pin(self):
        u'''从缓存中得到人员PIN号'''
        emp_pin = ""
        try:
            emp_obj = Employee.objects.get(id=self.emp_id)
            emp_pin = emp_obj.PIN
        except:
            pass
        return emp_pin

    def get_emp_name(self):
        u'''从缓存中得到人员姓名'''
        emp_name = ""
        try:
            emp_obj = Employee.objects.get(id=self.emp_id)
            emp_name = emp_obj.EName
        except:
            pass
        return emp_name

    def get_leaveclass_name(self):
        leaveclass_name = ""
        try:
            leavetype_obj = LeaveClass.objects.get(LeaveID=self.leaveclass_id)
            leaveclass_name = leavetype_obj.LeaveName
        except:
            pass
        return leaveclass_name

    class OpSpecAudit(Operation):
        u"请假单审核"
        verbose_name = _(u'审批')
        help_text = _(u'请假审批')
        params = (
            ('stat',
             models.IntegerField(_(u'审核状态'),
                                 null=False,
                                 blank=False,
                                 default=AUDIT_SUCCESS,
                                 choices=AUDIT_STATUS)),
            ('reason',
             models.CharField(_(u'审核原因'),
                              null=True,
                              blank=True,
                              max_length=100)),
        )

        def action(self, stat, reason):
            if self.object.audit_status == AUDIT_SUCCESS:
                raise Exception(
                    _(u"%(emp)s,%(st)s,%(et)s,%(rm)s 已审核") % {
                        "emp": self.object.emp,
                        "st": self.object.start,
                        "et": self.object.end,
                        "rm": self.object.reson
                    })
            self.object.audit_status = stat
            self.object.audit_reason = reason
            self.object.save()

    class Admin(CachingModel.Admin):
        from mysite.personnel.models.empwidget import ZMulPopEmpChoiceWidget
        sort_fields = ["emp.PIN", "start", "end"]
        disabled_perms = ['add_empspecday', 'dataimport_empspecday']
        #default_widgets={"emp":ZMulPopEmpChoiceWidget}
        list_filter = ['emp', 'reson', 'state', 'leaveclass']
        query_fields = ['emp.PIN', 'emp.EName', 'reson', 'state']
        list_display = [
            'emp.PIN', 'emp.EName', 'start', 'end', 'reson', 'leaveclass',
            'apply', 'audit_status|audit_filter', 'audit_reason'
        ]
        newadded_column = {
            "leaveclass": "get_leaveclass_name",
        }

        report_fields = ['emp', 'start', 'end', 'reson', 'leaveclass']
        menu_index = 4

    class Meta:
        app_label = 'att'
        db_table = 'user_speday'
        verbose_name = _(u'请假')
        verbose_name_plural = verbose_name
        unique_together = (("emp", "start", "leaveclass"), )
示例#13
0
class Transaction(models.Model):
        UserID = EmpPoPForeignKey(db_column='userid', verbose_name=_(u"人员"))
        TTime = models.DateTimeField(_(u'考勤时间'), db_column='checktime')
        State = models.CharField(_(u'考勤状态'), db_column='checktype', max_length=5, default='I', choices=ATTSTATES)
        Verify = models.IntegerField(_(u'验证方式'), db_column='verifycode', default=0, choices=VERIFYS)    #---签卡类型
        SN = DeviceForeignKey(db_column='SN', verbose_name=_(u'设备'), null=True, blank=True)
        sensorid = models.CharField(db_column='sensorid', 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)
        Reserved = models.CharField(_(u'保留'), max_length=20, null=True, blank=True)
        sn_name = models.CharField(_(u'序列号'), max_length=40, null=True, blank=True)
        def limit_transaction_to(self,query_set,user): 
            from mysite.iclock.iutils import userDeptList,userAreaList
            deptids = userDeptList(user)
            if not deptids:
                return query_set
            deptids = [ int(dept.pk) for dept in deptids ]
            return query_set.filter(UserID__DeptID__in=deptids)
        def employee(self): #cached employee
                try:
                        return Employee.objByID(self.UserID_id)
                except:
                        return None
        def Time(self):
                if self.TTime.microsecond>500000:
                        self.TTime=self.TTime+datetime.timedelta(0,0,1000000-self.TTime.microsecond)
                return self.TTime
        def StrTime(self):
                return self.Time().strftime('%Y/%m%d/%H%M%S')
        @staticmethod        
        def delOld(): return ("TTime", 365)
        def Device(self):
                return get_device(self.sn_name)
        def get_img_url(self, default=None):
                device=self.Device()
                emp=self.employee()
                if device and emp:
                        try:
                                pin=int(emp.PIN)
                        except:
                                pin=emp.PIN
                        fname="%s.jpg"%(self.StrTime())
                        imgUrl=getUploadFileName(device.SN, pin, fname)
                        if os.path.exists(imgUrl):
                                return getUploadFileURL(device.SN, pin, fname)
                return default
        def get_thumbnail_url(self, default=None):
                device=self.Device()
                emp=self.employee()
                if device and emp:
                        try:
                                pin=int(emp.PIN)
                        except:
                                pin=emp.PIN
                        fname="%s.jpg"%(self.StrTime())
                        imgUrl=getUploadFileName("thumbnail/"+device.SN, pin, fname)
                        #print imgUrl
                        if not os.path.exists(imgUrl):
                                imgUrlOrg=getUploadFileName(device.SN, pin, fname)
                                if not os.path.exists(imgUrlOrg):
                                        #print imgUrlOrg, "is not exists"
                                        return default
                                if not createThumbnail(imgUrlOrg, imgUrl):
                                        #print imgUrl, "create fail."
                                        return default
                        return getUploadFileURL("thumbnail/"+device.SN, pin, fname)
                #print "device, emp", device, emp
                return default
        def __unicode__(self):
                return self.UserID.__unicode__()+', '+self.TTime.strftime("%y-%m-%d %H:%M:%S")
                
        @staticmethod
        def myData(user):
                if user.username=='employee': #employee user
                        return Transaction.objects.filter(UserID=request.employee)
                return Transaction.objects.filter(UserID__DeptID__in=userDeptList(user))
        
        def get_attpic(self):            
            from dbapp.file_handler import get_model_filename
            dt=self.TTime.strftime("%Y%m%d%H%M%S")
            pin=""
            pin= int(self.UserID.PIN)
            sn=self.sn_name

            t=get_model_filename(Transaction,            
            "%s/%s/%s" % (sn, dt[:4], dt[4:8])+"/"+ str(pin)+"_"+ dt[8:] + ".jpg",
            "picture")[1]
            return t
        
        def get_emppic(self):
            return self.UserID.photo            
        
        class dataexport(Operation):
                help_text=_(u"数据导出") #导出
                verbose_name=_(u"导出")
                visible=False
                def action(self):
                        pass
        
        class Meta:
                app_label='iclock'
                verbose_name = _(u"原始记录表")
                verbose_name_plural = verbose_name
                db_table = 'checkinout'
                unique_together = (("UserID", "TTime"),)
                permissions = (
                                ('clearObsoleteData_transaction','Clear Obsolete Data'),
                                )
        class Admin:
                default_give_perms=["contenttypes.can_AttCalculate"]
                sort_fields=["UserID.PIN","TTime"]
                app_menu="att"
                menu_group = 'att'
                visible = "mysite.att" in settings.INSTALLED_APPS#暂只有考勤使用
                read_only=True
                api_fields=('UserID.PIN','UserID.EName','TTime','State','sn_name')
                list_display=('UserID_id','UserID.PIN','UserID.EName','TTime','State','sn_name','get_attpic','get_emppic')
                photo_path_tran="get_attpic"
                photo_path="get_emppic"
                hide_fields=('UserID_id','get_attpic')
                list_filter = ('UserID','TTime','State','Verify','SN')
                query_fields=['UserID__PIN','UserID__EName','sn_name']
                search_fields=('TTime',)
                menu_index=4
                disabled_perms=["add_transaction",'change_transaction','delete_transaction','clearObsoleteData_transaction']
                layout_types=["table","photo"]
示例#14
0
class EmpChange(CachingModel):
    '''调动表'''
    changeno = models.AutoField(verbose_name=_(u'调动单号'),
                                db_column='changeno',
                                primary_key=True,
                                editable=False)
    UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), editable=True)
    changedate = models.DateTimeField(verbose_name=_(u'调动时间'),
                                      null=True,
                                      blank=True,
                                      editable=True,
                                      default=datetime.datetime.now())
    changepostion = models.IntegerField(
        verbose_name=_(u'调动栏位'),
        choices=POSTION,
        editable=True,
        null=True,
        blank=True,
    )
    oldvalue = models.TextField(verbose_name=_(u'调动前'),
                                editable=False,
                                null=True,
                                blank=True)
    newvalue = models.TextField(verbose_name=_(u'调动后'),
                                editable=True,
                                null=True,
                                blank=True)
    changereason = models.CharField(max_length=200,
                                    verbose_name=_(u'调动原因'),
                                    null=True,
                                    blank=True,
                                    editable=True)
    isvalid = models.BooleanField(verbose_name=_(u'是否生效'),
                                  choices=YESORNO,
                                  editable=True,
                                  default=0)
    approvalstatus = models.IntegerField(verbose_name=_(u'审核状态'),
                                         choices=APPROVAL,
                                         editable=False,
                                         default=2)
    remark = models.CharField(verbose_name=_(u'备注'),
                              editable=True,
                              null=True,
                              blank=True,
                              max_length=200)

    def __unicode__(self):
        return self.UserID.PIN + (self.UserID.EName
                                  and " %s" % self.UserID.EName or "")

    def save(self):
        #ContentType.objects.get_for_model(obj)
        #print "self.changepostion:%s"%self.changepostion
        try:
            if self.changepostion and int(
                    self.changepostion) in [1, 2, 3]:  #同步人员信息表,并原还页面上有可能修改原始数据
                where = {}
                if self.changepostion == 1:
                    self.oldvalue = get_pk(self.UserID.DeptID)
                    where['id__exact'] = int(self.newvalue)
                    self.UserID.DeptID = Department.objects.filter(
                        Q(**where))[0]

                elif self.changepostion == 2:
                    self.oldvalue = get_pk(self.UserID.position)
                    where['id__exact'] = int(self.newvalue)
                    obj = Position.objects.filter(Q(**where))[0]
                    self.UserID.position = obj
                    self.UserID.DeptID = obj.DeptID
                else:
                    self.oldvalue = self.UserID.emptype
                    self.UserID.emptype = int(self.newvalue)

                self.UserID.save()
            if not self.changedate:
                self.changedate = datetime.datetime.now()
            old_ = self.get_oldvalue()
            new_ = self.get_newvalue()
            self.oldvalue = old_
            self.newvalue = new_
            super(EmpChange, self).save()
        except Exception, e:
            import traceback
            traceback.print_exc()
            raise e
        return self