Exemplo n.º 1
0
    def action(self, get_records, sd_file):
        if self.object.device_type == DEVICE_ACCESS_CONTROL_PANEL:
            if not self.object.enabled:
                raise Exception(_(u'设备已被禁用!'))

            from mysite.iaccess.devcomm import TDevComm
            from mysite.iaccess.dev_comm_center import process_event_log
            #获取事件记录时先检查数据中心是否开启
            d_server = start_dict_server()
            if not d_server.get_from_dict("CENTER_RUNING"):
                ret = -1003
                raise Exception(_(u"获取事件记录失败,错误码:%s") % ret)
            d_server.close()
            if get_records == "1":
                ret = self.object.upload_acclog(True)
            elif get_records == "2":
                if not self.request.FILES.has_key('sd_file'):
                    raise Exception(_(u"请选择目标文件"))
                file = self.request.FILES['sd_file']
                if not file:
                    raise Exception(_(u"目标文件不存在"))


#                   try:
#                       if not file.name.endswith(".dat"):
#                           raise Exception(_(u"目标文件格式错误"))
#                   except:
#                       raise Exception(_(u"目标文件格式错误"))
                file_buffer = file.read()
                tdev = TDevComm({})
                result = tdev.get_transaction("SD", file_buffer, file.size)
                ret = result["result"]
                sn = result["data"][0].split(',')[0]
                if sn != self.object.sn:
                    raise Exception(_(u"当前文件里的记录不属于该设备!"))
                #result["data"].pop(0)
                process_event_log(self.object, result)
            else:
                ret = self.object.upload_acclog(False)
            if ret >= 0:
                raise Exception(
                    _(u"<font color='blue'>获取事件记录成功,共 %d 条</font>") % ret)
            else:
                raise Exception(_(u"获取事件记录失败,错误码:%s") % ret)
Exemplo n.º 2
0
def get_data(request):
    fun_mode = request.REQUEST.get("func", "")

    #获取已有的权限组
    if fun_mode == "level":
        key = request.REQUEST.get("key", 0)#当前的人id(only one)
        qs = AccLevelSet.limit_acclevelset_to(AccLevelSet(), AccLevelSet.objects.all(),request.user)#根据用户权限中的区域和部门过滤
        #print '---qs=',qs
        objs = qs.exclude(emp=int(key)).order_by('id').values_list('id','level_name')
        #print '--------objs=',objs
        return getJSResponse(smart_str(dumps([obj for obj in objs])))

    #特定人所属的权限组
    if fun_mode == "selected_level":
        key = request.REQUEST.get("key", "")#单个对象操作时才会默认已选择的权限组(多个getlist)
        #objs = AccLevelSet.objects.filter(emp = key).values('id')
        objs = AccLevelSet.objects.filter(emp__PIN = key).values('id')
        return getJSResponse(smart_str(dumps([item["id"] for item in objs])))

    #特定权限组或者多卡开门人员组已经选中的人
    if fun_mode == "selected_emp":
        type = request.REQUEST.get("type", "")
        key = request.REQUEST.get("key", "")#单个对象操作时才会默认已选择的人(多个getlist)
        if type == "acclevelset":
            objs = Employee.objects.filter(acclevelset=key)
        elif type == "accmorecardempgroup":
            objs = Employee.objects.filter(morecard_group=key)
        objs = objs.values_list('id', 'PIN', 'EName', 'DeptID', 'Gender', 'Title')
        results = []
        for obj in objs:
            dept = unicode(Department.objects.get(pk = obj[3])) #获取的数据中置换掉部门id
            list_obj = list(obj)
            list_obj.append(dept)
            results.append(tuple(list_obj))
        return getJSResponse(smart_str(dumps([result for result in results])))

    #获取多卡开门人员组列表
    if fun_mode == "morecardempgroup":
        user = request.user
        da = user.deptadmin_set.all()
        limit_empgroups = []#所有有效的多卡开门人员组(即有效人所属的组)
        empgroups_all = AccMoreCardEmpGroup.objects.all()#所有多卡开 门人员组
        if not user.is_superuser and da:#非超级用户如果a不为空则默认全部区域
            d_limit = [int(d.dept_id) for d in da]
            emps = Employee.objects.filter(DeptID__in=d_limit)#范围内的人
            for emp in emps:
                group = emp.morecard_group
                if group:
                    limit_empgroups.append(group)
            null_empgroups = empgroups_all.filter(employee__isnull=True)
            for ne in null_empgroups:
                limit_empgroups.append(ne)
            limit_empgroups = empgroups_all.filter(pk__in=[e.pk for e in limit_empgroups])
                
            #d_limit = [int(d.dept_id) for d in da]
            #emps = Employee.objects.exclude(DeptID__in=d_limit)
            #print '-----emps=',emps
            #limit_empgroups = limit_empgroups.exclude(employee__in=emps)
        if not limit_empgroups:#超级用户
            limit_empgroups = empgroups_all
        
        empgroup_objs = limit_empgroups.order_by('id').values_list("id","group_name")
        key = request.GET.get("key", 0)#key=0表示新增(新增时返回组名称,number均为0),key!=0表示编辑
        
        selected_morecardgroup = AccMoreCardGroup.objects.filter(comb=key)
        
        #print selected_morecardgroup

        list_group =  [s.group_id for s in selected_morecardgroup]
        list_number = [s.opener_number for s in selected_morecardgroup]

        results = []
        for obj in empgroup_objs:
            list_obj = list(obj)
            #加入用户设置的人数
            if list_obj[0] in list_group:#如果是编辑,那么对应组的人数返回
                list_obj.append(list_number[list_group.index(list_obj[0])])
            else:#否则添加0
                list_obj.append(0)
            #加入当前组内的实际人数
            cur_obj = AccMoreCardEmpGroup.objects.filter(pk=list_obj[0])
            list_obj.append(cur_obj and cur_obj[0].employee_set.count() or 0)
            results.append(tuple(list_obj))
        return getJSResponse(smart_str(dumps([obj for obj in results])))

    #获取人事表中已经分配多卡开门人员组的人的id
    if fun_mode == "emps_have_morecardgroup":
        emps = Employee.objects.filter(morecard_group__in = [group.id for group in AccMoreCardEmpGroup.objects.all()])
        return HttpResponse(smart_str({'emps_id_list': [emp.id for emp in emps]}))

    #获取数据库中当前所有的门
    if fun_mode == "doors":
        type = request.GET.get("type", "")
        u = request.user
        aa = u.areaadmin_set.all()
        a_limit = aa and [int(a.area_id) for a in aa] or [int(area.pk) for area in Area.objects.all()]#非超级管理员且没有配置有效区域(默认全部)的有效区域id列表(即用户手动配置过用户区域的)
        
        if type == 'all':
            areas = Area.objects.filter(pk__in=a_limit).order_by('id').values_list('id', 'areaname')
            devices = Device.objects.filter(area__pk__in=a_limit).filter(device_type=2).order_by('id').values_list('id', 'alias')
            doors = AccDoor.objects.filter(device__area__pk__in=a_limit).order_by('id').values_list('id', 'device__alias', 'door_no', 'door_name')
            
            #print 'doors=',doors
            doors = [door for door in doors]
            #print 'doors=',doors
            return getJSResponse(smart_str(simplejson.dumps({ 'type': 'all', 'doors': doors, 'areas': [area for area in areas], 'devices': [device for device in devices] })))
        
        if type == 'area':
            area_id = int(request.GET.get("area_id", 0))
            #print 'area_id=',area_id

            if area_id:
                area_ids = [area_id] + [a.id for a in Area.objects.get(id=area_id).area_set.all()]#处理区域的上下级
                area_ids = [ai for ai in area_ids if ai in a_limit]#权限过滤
                dev_list = Device.objects.filter(area__in=area_ids)
                devs = dev_list.order_by('id').values_list('id', 'alias')
                dev_list_id = [d.id for d in dev_list]
                doors_objs = dev_list and AccDoor.objects.filter(device__in=dev_list_id) or []
            else:#0,取权限范围内全部的
                devs = Device.objects.filter(area__pk__in=a_limit).filter(device_type=2).order_by('id').values_list('id', 'alias')
                doors_objs = AccDoor.objects.filter(device__area__pk__in=a_limit)

            #print 'doors_objs=',doors_objs
            doors = doors_objs and doors_objs.order_by('id').values_list('id', 'device__alias', 'door_no', 'door_name') or []
            #print 'doors=',doors
            return getJSResponse(smart_str(simplejson.dumps({ 'type': 'area', 'doors': [door for door in doors], 'areas': '', 'devices': [dev for dev in devs] })))            

        if type == 'device':
            device_id = request.GET.get("device_id", 0)
            doors_objs = device_id and AccDoor.objects.filter(device__area__pk__in=a_limit).filter(device=int(device_id)) or AccDoor.objects.filter(device__area__pk__in=a_limit)
            doors = doors_objs.order_by('id').values_list('id', 'device__alias', 'door_no', 'door_name')
            return getJSResponse(smart_str(simplejson.dumps({ 'type': 'device', 'doors': [door for door in doors], 'areas': '', 'devices': '' })))            

        if type == 'door':
            door_id = request.GET.get("door_id", 0)
            doors_objs = door_id and AccDoor.objects.filter(device__area__pk__in=a_limit).filter(id=int(door_id)) or AccDoor.objects.filter(device__area__pk__in=a_limit)
            doors = doors_objs.order_by('id').values_list('id', 'device__alias', 'door_no', 'door_name')
            return getJSResponse(smart_str(simplejson.dumps({ 'type': 'door', 'doors': [door for door in doors], 'areas': '', 'devices': '' })))            

#    #检查当前控制器下属们的数量及门编号、门名称
#    if fun_mode == "device_doors_info":
#        device_id = int(request.GET.get("device_id", 0))#肯定不为0
#        dev_obj = Device.objects.filter(pk=device_id)
#        #if dev_obj:
#        doors_count = dev_obj[0].acpanel_type
#        doors_name = dev_obj[0].accdoor_set.order_by('id').values_list('door_no','door_name')
#        return HttpResponse(smart_str(simplejson.dumps({'doors_name': list(doors_name), 'doors_count': int(doors_count)})))#因acpanel-type null=true所以一定不为None

    #返回设备参数表中的信息(需已连接的设备才有,否则返回0)联动设置时调用 检查当前控制器下属们的数量及门编号、门名称
    if fun_mode == "machine_args":
        device_id = request.GET.get("device_id", 0)
        dev = Device.objects.filter(id=int(device_id))
        #dev = device and device[0] or None
        doors_name = dev[0].accdoor_set.order_by('id').values_list('door_no','door_name')

        try:
            count = dev[0].accdevice.door_count
            door_count = count and int(count) or 0 #如果没有连接成功过为0or obj.acpanel_type
            r_count = dev[0].accdevice.reader_count
            reader_count = r_count and int(r_count) or 0
            inc = dev[0].accdevice.aux_in_count
            in_count = inc and int(inc) or 0 #默认为4,0说明设备没有连接成功过
            outc = dev[0].accdevice.aux_out_count
            out_count = outc and int(outc) or 0 #注释同上
            m_type = dev[0].accdevice.machine_type
            machine_type = m_type and int(m_type) or 0 
        except:#因为异常导致设备参数表没有生成dev.accdevice
            door_count = -1
            reader_count = -1
            in_count = -1
            out_count = -1

        return HttpResponse(smart_str(simplejson.dumps({'doors_name': list(doors_name), 'door_count': door_count, 'reader_count': reader_count, 'in_count': in_count, 'out_count': out_count, 'machine_type': machine_type})))
    
    #用于新增门禁控制器时与设备连接获取机器的options
    if fun_mode == "connect_dev":
        comm_type = int(request.GET.get("comm_type", "0"))
        comm_pwd = request.GET.get("comm_pwd", "")#最多16位字符串  未加密
        device_sn = request.GET.get("device_sn", "")
        ip = request.GET.get("ip", "")
        ip_port = int(request.GET.get("ip_port", '4370'))
        com_address = int(request.GET.get("com_address", '1'))
        com_port = int(request.GET.get("com_port", '1'))
        baudrate = request.GET.get("baudrate", "38400")
        acpanel_type = int(request.GET.get("acpanel_type", '0'))#1 2 4
        four_to_two = request.GET.get("four_to_two", "")
        comminfo = {
            'sn': device_sn,
            'comm_type': comm_type,
            'ipaddress': ip,
            'ip_port': ip_port,
            'com_port': "COM" + str(com_port),
            'com_address': com_address,
            'baudrate': baudrate,
            'password': comm_pwd,
        }     
        #print comminfo   
        devcom = TDevComm(comminfo)
        if comm_type == COMMU_MODE_PULL_RS485:
            tmp_dev = Device.objects.filter(com_port=com_port, com_address=com_address)
            if tmp_dev:#该串口已存在相同485地址的设备
                return HttpResponse(smart_str({"result": '485repeat', "data": ""}))    
                       
            from dev_comm_center import wait_com_pause
            if wait_com_pause(com_port, 60) == False: #等待后台停止进程
                return HttpResponse(smart_str({"result": '485busy', "data": ""}))
            
        try:
            cret = devcom.connect()
        except:
            if comm_type == COMMU_MODE_PULL_RS485:
                from dev_comm_center import set_comm_run
                set_comm_run(com_port) #后台进程继续
                return #以下不执行,前端直接显示-615错误
            
        #print cret
        if cret["result"] > 0:#连接成功
            ret = {}
            if acpanel_type == ACPANEL_4_DOOR:#仅限前端显示了四门控制器之后
                switch = int(devcom.get_options("Door4ToDoor2")['data'].split("=")[1])
                if four_to_two == 'true':#切换为两门双向
                    if switch == 0:
                        ret = devcom.set_options("Door4ToDoor2=1")
                        ret = devcom.reboot()#大概需要10-15s
                        time.sleep(12)
                        devcom.disconnect()
                        cret = devcom.connect()#重连

                else:#不切换,如果是两门双向则改回四门单向
                    if switch == 1:
                        ret = devcom.set_options("Door4ToDoor2=0")
                        ret = devcom.reboot()
                        time.sleep(12)
                        devcom.disconnect()
                        cret = devcom.connect()
  
            #print '---ret=',ret
            
            if (ret and ret["result"] >= 0) or not ret: # or not ret:#four_to_two设置成功或者未设置four_to_two
                qret = devcom.get_options("~SerialNumber,FirmVer,~DeviceName,LockCount,ReaderCount,AuxInCount,AuxOutCount,MachineType,~IsOnlyRFMachine,~MaxUserCount,~MaxAttLogCount,~MaxUserFingerCount,~ZKFPVersion")
                if qret["result"] >= 0:
                    try:
                        datdic = {}
                        optlist = qret["data"].split(',')
                        for opt in optlist:
                            opt1 = opt.split('=')
                            datdic[opt1[0]] = opt1[1]
                        #print "dic=", datdic
                    except:
                        print_exc()
                        
            devcom.disconnect()
            if comm_type == COMMU_MODE_PULL_RS485:
                from dev_comm_center import set_comm_run
                set_comm_run(com_port) #后台进程继续
                
            return HttpResponse(smart_str({"result": cret["result"], "data": datdic}))#返回获取的控制器参数,用于前端判断
        else:#连接失败
            from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
            try:
#                if cret["result"] == 0:
#                    cret["result"] = -99#未知错误
                reason = unicode(dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
            except:
                print_exc()
                reason = ""
            if comm_type == COMMU_MODE_PULL_RS485:
                from dev_comm_center import set_comm_run
                set_comm_run(com_port) #后台进程继续
            return HttpResponse(smart_str(simplejson.dumps({"result": cret["result"], "reason": reason, "data": ""})))

    #首卡开门、多卡开门等获取当前门名称
    if fun_mode == "get_doorname":
        door_id = request.GET.get("door_id", 0)
        #print '----door_id=',door_id
        door_name = AccDoor.objects.filter(id=int(door_id))[0].door_name

        #return getJSResponse(door_name) simplejson.dumps
        return getJSResponse(smart_str(simplejson.dumps(door_name)))
        #return getJSResponse(smart_str({ 'name':door_name })) 

    #获取当前数据库中存在的ip地址和序列号。用于搜索控制器时用ip地址以及显示已经新增过的设备做判断
    if fun_mode == "get_all_ip_sn":
        devs = Device.objects.all()
        return HttpResponse(smart_str(simplejson.dumps({ 'ipaddress': [d.ipaddress for d in devs if d.ipaddress], 'sn': [d.sn for d in devs if d.sn]})))

    #获取当前AccLinkageIO中的输入输出信息的选项,避免之前前端也需要维护该信息情况出现
    if fun_mode == "linkageio_info":
        from models.acclinkageio import INADDRESS_CHOICES, OUTADDRESS_CHOICES, DISABLED_TRIGGEROPT_CHOICES
        from models.accmonitorlog import EVENT_CHOICES
        in_info = dict(INADDRESS_CHOICES)
        out_info = dict(OUTADDRESS_CHOICES)
        event_info = dict(EVENT_CHOICES)

        for ini in in_info.keys():
            in_info[ini] = unicode(in_info[ini])
        for outi in out_info.keys():
            out_info[outi] = unicode(out_info[outi])
        for eventi in event_info.keys():
            if eventi not in DISABLED_TRIGGEROPT_CHOICES:
                event_info[eventi] = unicode(event_info[eventi])
            else:
                event_info.pop(eventi)
        return HttpResponse(smart_str(simplejson.dumps({'in_info': in_info, 'out_info': out_info, 'event_info': event_info})))
    
    #获取设备的辅助输出点信息(用于关闭辅助输出点)
    if fun_mode == "get_device_auxout":
        dev_id = int(request.REQUEST.get("dev_id", 0))
        devs = Device.objects.filter(pk=dev_id)
        
        if devs:           
            from models.acclinkageio import get_device_auxout            
            return HttpResponse(smart_str(simplejson.dumps({"auxout_info": get_device_auxout(devs[0])})))        #else 如果不存在前端执行error
        
    if fun_mode == 'get_doors_tree':#just like acclevelset
        from dbapp.widgets import queryset_render_multiple
        u = request.user
        aa = u.areaadmin_set.all()
        if u.is_superuser or not aa:#为超级管理员或者没有配置区域(默认全部区域)
           doors = AccDoor.objects.all()
        else:
           areas = [a.area for a in aa]
           doors = AccDoor.objects.filter(device__area__in=areas)

        tree_html = queryset_render_multiple(doors, 'door', "class='wZBaseZManyToManyField' name='door' id='id_door'", None, 'id_door', parent=None)
        return HttpResponse(tree_html)
Exemplo n.º 3
0
def search_acpanel(request):
    fun_mode = request.GET.get("func", '')

    #搜索门禁控制器
    #result为返回的条数(即设备数量)    
    if fun_mode == "search_tcpip":
        devcomm = TDevComm(None)
        #{'data': 'MAC=00:17:62:01:36:F7,IPAddress=192.168.1.226\r\n', 'result'
        ret = devcomm.SearchDevice()
        #print 'ret=',ret
        devs = ret['data'].split('\r\n', ret['result'])
        datas = []
        for dev in devs:
            data = {}
            if dev:
                arg = dev.split(',')
                #print arg
                for s in arg:
                    #print 's=',s
                    record = s.split('=')
                    #print 'record=',record
                    data[record[0]] = record[1] or ''
                datas.append(data)
        #print datas      
        #{'datas': [{'MAC': '00:17:62:01:36:F7', 'IPAddress': '192.168.1.226'}, {'MAC': '00:17:62:01:36:F7', 'IPAddress': '192.168.1.226'}, {'MAC': '(null)', 'IPAddress': '192.168.1.2052.168.1.226'}, {'MAC': '(null)', 'IPAddress': '192.168.1.2052.168.1.226'}]}
        return HttpResponse(smart_str({'datas': datas}))   
    
    #将控制器添加到设备表时检查该ip地址和sn是否已经存在
    if fun_mode == "check_and_save":
        ip = request.GET.get("ip", '')
        sn = request.GET.get("sn", '')
        alias = request.GET.get("alias", '')
        
        #先检测ip,后检测序列号,_existed 为1表示存在 0表示不存在
        ip_existed = 0
        sn_existed = 0
        if ip and ip in [d.ipaddress for d in [dev for dev in Device.objects.all()]]:
            ip_existed = 1#ip地址已存在
        #搜索上来的序列号不为空,故sn不为空,数据库中当前可能存在多个sn为空的记录
        if sn and sn in [d.sn for d in [dev for dev in Device.objects.all()]]:
            sn_existed = 1
            
        if not ip_existed and not sn_existed:#均不存在 可以保存
            #需先连接设备获取设备的参数
            comminfo = {
                'sn': sn,
                'comm_type': 1, #int(comm_type),1为tcp/ip 2为rs485
                'ipaddress': ip,
                'ip_port': 4370,
                'password': '',
            }     
            #print "comminfo====",comminfo   
            devcom = TDevComm(comminfo)
            cret = devcom.connect()
            if cret["result"] > 0:#连接成功
                qret = devcom.get_options("~SerialNumber,FirmVer,~DeviceName,LockCount,ReaderCount,AuxInCount,AuxOutCount,MachineType,~IsOnlyRFMachine,~MaxUserCount,~MaxAttLogCount,~MaxUserFingerCount,MThreshold,~ZKFPVersion")               
                devcom.disconnect()
                if qret["result"] >= 0:#有数据返回
                    datdic = {}
                    optlist = qret["data"].split(',')
                    for opt in optlist:
                        opt1 = opt.split('=')
                        #print "opt1===",opt1
                        #datdic[opt1[0]] = opt1[1] and int(opt1[1]) or None
                        datdic[opt1[0]] = opt1[1] #or 0#None
                    #print "dic=",datdic
                    try:
                        dev_obj = Device()
                        dev_obj.alias = alias#ip.split(".")[-1]#默认以ip地址一部分为alias
                        dev_obj.sn = datdic['~SerialNumber'] #or ''
                        dev_obj.Fpversion = datdic['~ZKFPVersion']
                        dev_obj.fw_version = datdic['FirmVer'] #or ''
                        dev_obj.device_name = datdic['~DeviceName'] #or ''
                        dev_obj.device_type = 2
                        dev_obj.ipaddress = ip
                        dev_obj.ip_port = 4370
                        dev_obj.comm_type = 1
                        dev_obj.comm_pwd = ""#默认通讯密码为空
                        dev_obj.acpanel_type = int(datdic['LockCount'])
                        #新增获取三个容量参数--add by darcy 20101122                        dev_obj.max_user_count = datdic.has_key("~MaxUserCount") and int(datdic["~MaxUserCount"])*100 or 0                        dev_obj.max_attlog_count = datdic.has_key("~MaxAttLogCount") and int(datdic["~MaxAttLogCount"])*10000 or 0                        dev_obj.max_finger_count = datdic.has_key("~MaxUserFingerCount") and int(datdic["~MaxUserFingerCount"]) or 0                        dev_obj.fp_mthreshold = datdic.has_key("MThreshold") and int(datdic["MThreshold"]) or 0                                                dev_obj.data_valid(SAVETYPE_NEW)#验证业务逻辑
                        aa = request.user.areaadmin_set.all()
                        if aa:#给用户设置过授权区域
                            dev_obj.area = aa[0].area
                        else:#没设置的话默认全部区域
                            dev_obj.area = Area.objects.get(pk=1)
                        dev_obj.save(force_insert=True)
                        from mysite.iclock.models.dev_comm_operate import sync_set_all_data
                        dev_obj.delete_transaction()
                        sync_set_all_data(dev_obj)
                    except Exception, e:
                        print_exc()
                        return HttpResponse(smart_str(simplejson.dumps({ "ret": -1, "reason": unicode(e) })))#添加设备失败
                    
                    try:
                        from mysite.iaccess.dev_comm_center import OPERAT_ADD    
                        dev_obj.add_comm_center(None, OPERAT_ADD)
                    except:
                        print_exc()
                        return HttpResponse(smart_str({ "ret": -5 }))#添加设备异常
                        
                    try:
                        #dev_obj.accdevice.machine_type = int(datdic['ACPanelFunOn'])
                        dev_obj.accdevice.door_count = int(datdic['LockCount'])
                        dev_obj.accdevice.reader_count = int(datdic['ReaderCount'])
                        dev_obj.accdevice.aux_in_count = int(datdic['AuxInCount'])
                        dev_obj.accdevice.aux_out_count = int(datdic['AuxOutCount'])
                        dev_obj.accdevice.machine_type = int(datdic['MachineType'])
                        dev_obj.accdevice.IsOnlyRFMachine = int(datdic['~IsOnlyRFMachine'])
                        dev_obj.accdevice.save(force_update=True)

                        return HttpResponse(smart_str({ "ret": 1, "result": qret["result"], "data": datdic }))#返回的字节数qret["result"]大于等于0
                    except:
                        print_exc()
                        return HttpResponse(smart_str({ "ret": -2, "result": qret["result"]}))#设备表保存成功,但是设备参数表保存失败,下次连接成功时将写入----是否存在??
                else:#0
                    return HttpResponse(smart_str({ "ret": -3, "result": qret["result"]}))#无数据返回
               
            else:#连接失败
                from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
                try:
                    reason = unicode(dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
                except:
                    print_exc()
                    reason = ""
                return HttpResponse(smart_str(simplejson.dumps({ "ret": -4, "result": cret["result"], "reason": reason, "data": ""})))
        else:
              return HttpResponse(smart_str({'ret': 0, 'ip_existed':ip_existed, 'sn_existed':sn_existed }))#sn已存在
Exemplo n.º 4
0
    def action(self, firmware_file):
        if self.object.device_type == DEVICE_ACCESS_CONTROL_PANEL:  #门禁
            if not self.object.enabled:
                raise Exception(_(u'设备已被禁用!'))

            if not self.request.FILES.has_key('firmware_file'):
                raise Exception(_(u"目标文件不存在"))

            file = self.request.FILES['firmware_file']
            if not file:
                raise Exception(_(u"目标文件不存在"))
            if file.name != "emfw.cfg":
                raise Exception(_(u"目标文件名错误"))
            #for chunk in file.chunks():
            #buffer.write(chunk)
            buffer = file.read()
            from mysite.iaccess.devcomm import TDevComm
            devcomm = TDevComm(self.object.getcomminfo())
            d_server = None
            service_running = True  #门禁后台服务

            from mysite.iaccess.dev_comm_center import check_service_commcenter
            d_server = start_dict_server()
            #print '--------before wait_com_pause'
            service_running = check_service_commcenter(d_server)
            if service_running:
                if self.object.comm_type == COMMU_MODE_PULL_RS485:  #485通讯
                    from mysite.iaccess.dev_comm_center import wait_com_pause
                    if wait_com_pause(d_server, self.object.com_port,
                                      60) == False:  #等待后台停止进程
                        #print '------wait_com_pause failed'
                        d_server.close()
                        raise Exception(_(u"升级固件失败,原因:后台串口进程忙"))
                    else:
                        os.system("taskkill /im plrscagent.* /f")
                elif self.object.comm_type == COMMU_MODE_PULL_TCPIP:
                    from mysite.iaccess.dev_comm_center import wait_thread_pause
                    if wait_thread_pause(d_server, self.object.id,
                                         60) == False:  #等待后台停止进程
                        #print '------wait_com_pause failed'
                        d_server.close()
                        raise Exception(_(u"升级固件失败,原因:后台设备线程忙"))

            cret = devcomm.connect()
            #print '----cret = ',cret
            #print '------after connect the device cret=',cret

            if cret['result'] > 0:
                #print '----before upgrade_firmware'
                ret = devcomm.upgrade_firmware(file.name, buffer, file.size)
                #print '---after upgrade firmware'
                #无论成功与否,先让后台进程继续
                if self.object.comm_type == COMMU_MODE_PULL_RS485 and service_running:
                    from mysite.iaccess.dev_comm_center import set_comm_run
                    #print '-set_comm_run-=',set_comm_run
                    set_comm_run(d_server, self.object.com_port)  #后台进程继续
                elif self.object.comm_type == COMMU_MODE_PULL_TCPIP and service_running:
                    from mysite.iaccess.dev_comm_center import set_thread_run
                    #print '---set_thread_run time=',datetime.datetime.now()
                    set_thread_run(d_server, self.object.id)  #后台线程继续
                d_server.close()

                if ret['result'] >= 0:  #
                    devcomm.reboot()
                    devcomm.disconnect()
                    raise Exception(_(u"<font color='blue'>操作成功</font>"))
                else:
                    devcomm.disconnect()
                    raise Exception(_(u"升级固件失败,错误码:%d") % ret['result'])
            else:

                from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
                #print '----connect failed'
                try:
                    reason = unicode(
                        dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
                    raise Exception(_(u"连接设备失败(原因:%s),无法升级固件。") % reason)
                except:
                    raise Exception(
                        _(u"设备连接失败(错误码:%d),无法升级固件。") % cret['result'])
Exemplo n.º 5
0
def get_data(request):
    fun_mode = request.REQUEST.get("func", "")

    #获取已有的权限组
    if fun_mode == "level":
        key = request.REQUEST.get("key", 0)  #当前的人id(only one)
        qs = AccLevelSet.limit_acclevelset_to(AccLevelSet(),
                                              AccLevelSet.objects.all(),
                                              request.user)  #根据用户权限中的区域和部门过滤
        #print '---qs=',qs
        objs = qs.exclude(emp=int(key)).order_by('id').values_list(
            'id', 'level_name')
        #print '--------objs=',objs
        return getJSResponse(smart_str(dumps([obj for obj in objs])))

    #特定人所属的权限组
    if fun_mode == "selected_level":
        key = request.REQUEST.get("key", "")  #单个对象操作时才会默认已选择的权限组(多个getlist)
        #objs = AccLevelSet.objects.filter(emp = key).values('id')
        objs = AccLevelSet.objects.filter(emp__PIN=key).values('id')
        return getJSResponse(smart_str(dumps([item["id"] for item in objs])))

    #特定权限组或者多卡开门人员组已经选中的人
    if fun_mode == "selected_emp":
        type = request.REQUEST.get("type", "")
        key = request.REQUEST.get("key", "")  #单个对象操作时才会默认已选择的人(多个getlist)
        if type == "acclevelset":
            objs = Employee.objects.filter(acclevelset=key)
        elif type == "accmorecardempgroup":
            objs = Employee.objects.filter(morecard_group=key)
        objs = objs.values_list('id', 'PIN', 'EName', 'DeptID', 'Gender',
                                'Title')
        results = []
        for obj in objs:
            dept = unicode(Department.objects.get(pk=obj[3]))  #获取的数据中置换掉部门id
            list_obj = list(obj)
            list_obj.append(dept)
            results.append(tuple(list_obj))
        return getJSResponse(smart_str(dumps([result for result in results])))

    #获取多卡开门人员组列表
    if fun_mode == "morecardempgroup":
        user = request.user
        da = user.deptadmin_set.all()
        limit_empgroups = []  #所有有效的多卡开门人员组(即有效人所属的组)
        empgroups_all = AccMoreCardEmpGroup.objects.all()  #所有多卡开 门人员组
        if not user.is_superuser and da:  #非超级用户如果a不为空则默认全部区域
            d_limit = [int(d.dept_id) for d in da]
            emps = Employee.objects.filter(DeptID__in=d_limit)  #范围内的人
            for emp in emps:
                group = emp.morecard_group
                if group:
                    limit_empgroups.append(group)
            null_empgroups = empgroups_all.filter(employee__isnull=True)
            for ne in null_empgroups:
                limit_empgroups.append(ne)
            limit_empgroups = empgroups_all.filter(
                pk__in=[e.pk for e in limit_empgroups])

            #d_limit = [int(d.dept_id) for d in da]
            #emps = Employee.objects.exclude(DeptID__in=d_limit)
            #print '-----emps=',emps
            #limit_empgroups = limit_empgroups.exclude(employee__in=emps)
        if not limit_empgroups:  #超级用户
            limit_empgroups = empgroups_all

        empgroup_objs = limit_empgroups.order_by('id').values_list(
            "id", "group_name")
        key = request.GET.get("key",
                              0)  #key=0表示新增(新增时返回组名称,number均为0),key!=0表示编辑

        selected_morecardgroup = AccMoreCardGroup.objects.filter(comb=key)

        #print selected_morecardgroup

        list_group = [s.group_id for s in selected_morecardgroup]
        list_number = [s.opener_number for s in selected_morecardgroup]

        results = []
        for obj in empgroup_objs:
            list_obj = list(obj)
            #加入用户设置的人数
            if list_obj[0] in list_group:  #如果是编辑,那么对应组的人数返回
                list_obj.append(list_number[list_group.index(list_obj[0])])
            else:  #否则添加0
                list_obj.append(0)
            #加入当前组内的实际人数
            cur_obj = AccMoreCardEmpGroup.objects.filter(pk=list_obj[0])
            list_obj.append(cur_obj and cur_obj[0].employee_set.count() or 0)
            results.append(tuple(list_obj))
        return getJSResponse(smart_str(dumps([obj for obj in results])))

    #获取人事表中已经分配多卡开门人员组的人的id
    if fun_mode == "emps_have_morecardgroup":
        emps = Employee.objects.filter(morecard_group__in=[
            group.id for group in AccMoreCardEmpGroup.objects.all()
        ])
        return HttpResponse(
            smart_str({'emps_id_list': [emp.id for emp in emps]}))

    #获取数据库中当前所有的门
    if fun_mode == "doors":
        type = request.GET.get("type", "")
        u = request.user
        aa = u.areaadmin_set.all()
        a_limit = aa and [int(a.area_id) for a in aa] or [
            int(area.pk) for area in Area.objects.all()
        ]  #非超级管理员且没有配置有效区域(默认全部)的有效区域id列表(即用户手动配置过用户区域的)

        if type == 'all':
            areas = Area.objects.filter(
                pk__in=a_limit).order_by('id').values_list('id', 'areaname')
            devices = Device.objects.filter(area__pk__in=a_limit).filter(
                device_type=2).order_by('id').values_list('id', 'alias')
            doors = AccDoor.objects.filter(
                device__area__pk__in=a_limit).order_by('id').values_list(
                    'id', 'device__alias', 'door_no', 'door_name')

            #print 'doors=',doors
            doors = [door for door in doors]
            #print 'doors=',doors
            return getJSResponse(
                smart_str(
                    simplejson.dumps({
                        'type': 'all',
                        'doors': doors,
                        'areas': [area for area in areas],
                        'devices': [device for device in devices]
                    })))

        if type == 'area':
            area_id = int(request.GET.get("area_id", 0))
            #print 'area_id=',area_id

            if area_id:
                area_ids = [area_id] + [
                    a.id for a in Area.objects.get(id=area_id).area_set.all()
                ]  #处理区域的上下级
                area_ids = [ai for ai in area_ids if ai in a_limit]  #权限过滤
                dev_list = Device.objects.filter(area__in=area_ids)
                devs = dev_list.order_by('id').values_list('id', 'alias')
                dev_list_id = [d.id for d in dev_list]
                doors_objs = dev_list and AccDoor.objects.filter(
                    device__in=dev_list_id) or []
            else:  #0,取权限范围内全部的
                devs = Device.objects.filter(area__pk__in=a_limit).filter(
                    device_type=2).order_by('id').values_list('id', 'alias')
                doors_objs = AccDoor.objects.filter(
                    device__area__pk__in=a_limit)

            #print 'doors_objs=',doors_objs
            doors = doors_objs and doors_objs.order_by('id').values_list(
                'id', 'device__alias', 'door_no', 'door_name') or []
            #print 'doors=',doors
            return getJSResponse(
                smart_str(
                    simplejson.dumps({
                        'type': 'area',
                        'doors': [door for door in doors],
                        'areas': '',
                        'devices': [dev for dev in devs]
                    })))

        if type == 'device':
            device_id = request.GET.get("device_id", 0)
            doors_objs = device_id and AccDoor.objects.filter(
                device__area__pk__in=a_limit).filter(
                    device=int(device_id)) or AccDoor.objects.filter(
                        device__area__pk__in=a_limit)
            doors = doors_objs.order_by('id').values_list(
                'id', 'device__alias', 'door_no', 'door_name')
            return getJSResponse(
                smart_str(
                    simplejson.dumps({
                        'type': 'device',
                        'doors': [door for door in doors],
                        'areas': '',
                        'devices': ''
                    })))

        if type == 'door':
            door_id = request.GET.get("door_id", 0)
            doors_objs = door_id and AccDoor.objects.filter(
                device__area__pk__in=a_limit).filter(
                    id=int(door_id)) or AccDoor.objects.filter(
                        device__area__pk__in=a_limit)
            doors = doors_objs.order_by('id').values_list(
                'id', 'device__alias', 'door_no', 'door_name')
            return getJSResponse(
                smart_str(
                    simplejson.dumps({
                        'type': 'door',
                        'doors': [door for door in doors],
                        'areas': '',
                        'devices': ''
                    })))

#    #检查当前控制器下属们的数量及门编号、门名称
#    if fun_mode == "device_doors_info":
#        device_id = int(request.GET.get("device_id", 0))#肯定不为0
#        dev_obj = Device.objects.filter(pk=device_id)
#        #if dev_obj:
#        doors_count = dev_obj[0].acpanel_type
#        doors_name = dev_obj[0].accdoor_set.order_by('id').values_list('door_no','door_name')
#        return HttpResponse(smart_str(simplejson.dumps({'doors_name': list(doors_name), 'doors_count': int(doors_count)})))#因acpanel-type null=true所以一定不为None

#返回设备参数表中的信息(需已连接的设备才有,否则返回0)联动设置时调用 检查当前控制器下属们的数量及门编号、门名称
    if fun_mode == "machine_args":
        device_id = request.GET.get("device_id", 0)
        dev = Device.objects.filter(id=int(device_id))
        #dev = device and device[0] or None
        doors_name = dev[0].accdoor_set.order_by('id').values_list(
            'door_no', 'door_name')

        try:
            count = dev[0].accdevice.door_count
            door_count = count and int(
                count) or 0  #如果没有连接成功过为0or obj.acpanel_type
            r_count = dev[0].accdevice.reader_count
            reader_count = r_count and int(r_count) or 0
            inc = dev[0].accdevice.aux_in_count
            in_count = inc and int(inc) or 0  #默认为4,0说明设备没有连接成功过
            outc = dev[0].accdevice.aux_out_count
            out_count = outc and int(outc) or 0  #注释同上
            m_type = dev[0].accdevice.machine_type
            machine_type = m_type and int(m_type) or 0
        except:  #因为异常导致设备参数表没有生成dev.accdevice
            door_count = -1
            reader_count = -1
            in_count = -1
            out_count = -1

        return HttpResponse(
            smart_str(
                simplejson.dumps({
                    'doors_name': list(doors_name),
                    'door_count': door_count,
                    'reader_count': reader_count,
                    'in_count': in_count,
                    'out_count': out_count,
                    'machine_type': machine_type
                })))

    #用于新增门禁控制器时与设备连接获取机器的options
    if fun_mode == "connect_dev":
        comm_type = int(request.GET.get("comm_type", "0"))
        comm_pwd = request.GET.get("comm_pwd", "")  #最多16位字符串  未加密
        device_sn = request.GET.get("device_sn", "")
        ip = request.GET.get("ip", "")
        ip_port = int(request.GET.get("ip_port", '4370'))
        com_address = int(request.GET.get("com_address", '1'))
        com_port = int(request.GET.get("com_port", '1'))
        baudrate = request.GET.get("baudrate", "38400")
        acpanel_type = int(request.GET.get("acpanel_type", '0'))  #1 2 4
        four_to_two = request.GET.get("four_to_two", "")
        comminfo = {
            'sn': device_sn,
            'comm_type': comm_type,
            'ipaddress': ip,
            'ip_port': ip_port,
            'com_port': "COM" + str(com_port),
            'com_address': com_address,
            'baudrate': baudrate,
            'password': comm_pwd,
        }
        #print comminfo
        devcom = TDevComm(comminfo)
        if comm_type == COMMU_MODE_PULL_RS485:
            tmp_dev = Device.objects.filter(com_port=com_port,
                                            com_address=com_address)
            if tmp_dev:  #该串口已存在相同485地址的设备
                return HttpResponse(
                    smart_str({
                        "result": '485repeat',
                        "data": ""
                    }))

            from dev_comm_center import wait_com_pause
            if wait_com_pause(com_port, 60) == False:  #等待后台停止进程
                return HttpResponse(
                    smart_str({
                        "result": '485busy',
                        "data": ""
                    }))

        try:
            cret = devcom.connect()
        except:
            if comm_type == COMMU_MODE_PULL_RS485:
                from dev_comm_center import set_comm_run
                set_comm_run(com_port)  #后台进程继续
                return  #以下不执行,前端直接显示-615错误

        #print cret
        if cret["result"] > 0:  #连接成功
            ret = {}
            if acpanel_type == ACPANEL_4_DOOR:  #仅限前端显示了四门控制器之后
                switch = int(
                    devcom.get_options("Door4ToDoor2")['data'].split("=")[1])
                if four_to_two == 'true':  #切换为两门双向
                    if switch == 0:
                        ret = devcom.set_options("Door4ToDoor2=1")
                        ret = devcom.reboot()  #大概需要10-15s
                        time.sleep(12)
                        devcom.disconnect()
                        cret = devcom.connect()  #重连

                else:  #不切换,如果是两门双向则改回四门单向
                    if switch == 1:
                        ret = devcom.set_options("Door4ToDoor2=0")
                        ret = devcom.reboot()
                        time.sleep(12)
                        devcom.disconnect()
                        cret = devcom.connect()

            #print '---ret=',ret

            if (ret and ret["result"] >= 0
                ) or not ret:  # or not ret:#four_to_two设置成功或者未设置four_to_two
                qret = devcom.get_options(
                    "~SerialNumber,FirmVer,~DeviceName,LockCount,ReaderCount,AuxInCount,AuxOutCount,MachineType,~IsOnlyRFMachine,~MaxUserCount,~MaxAttLogCount,~MaxUserFingerCount,~ZKFPVersion"
                )
                if qret["result"] >= 0:
                    try:
                        datdic = {}
                        optlist = qret["data"].split(',')
                        for opt in optlist:
                            opt1 = opt.split('=')
                            datdic[opt1[0]] = opt1[1]
                        #print "dic=", datdic
                    except:
                        print_exc()

            devcom.disconnect()
            if comm_type == COMMU_MODE_PULL_RS485:
                from dev_comm_center import set_comm_run
                set_comm_run(com_port)  #后台进程继续

            return HttpResponse(
                smart_str({
                    "result": cret["result"],
                    "data": datdic
                }))  #返回获取的控制器参数,用于前端判断
        else:  #连接失败
            from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
            try:
                #                if cret["result"] == 0:
                #                    cret["result"] = -99#未知错误
                reason = unicode(
                    dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
            except:
                print_exc()
                reason = ""
            if comm_type == COMMU_MODE_PULL_RS485:
                from dev_comm_center import set_comm_run
                set_comm_run(com_port)  #后台进程继续
            return HttpResponse(
                smart_str(
                    simplejson.dumps({
                        "result": cret["result"],
                        "reason": reason,
                        "data": ""
                    })))

    #首卡开门、多卡开门等获取当前门名称
    if fun_mode == "get_doorname":
        door_id = request.GET.get("door_id", 0)
        #print '----door_id=',door_id
        door_name = AccDoor.objects.filter(id=int(door_id))[0].door_name

        #return getJSResponse(door_name) simplejson.dumps
        return getJSResponse(smart_str(simplejson.dumps(door_name)))
        #return getJSResponse(smart_str({ 'name':door_name }))

    #获取当前数据库中存在的ip地址和序列号。用于搜索控制器时用ip地址以及显示已经新增过的设备做判断
    if fun_mode == "get_all_ip_sn":
        devs = Device.objects.all()
        return HttpResponse(
            smart_str(
                simplejson.dumps({
                    'ipaddress': [d.ipaddress for d in devs if d.ipaddress],
                    'sn': [d.sn for d in devs if d.sn]
                })))

    #获取当前AccLinkageIO中的输入输出信息的选项,避免之前前端也需要维护该信息情况出现
    if fun_mode == "linkageio_info":
        from models.acclinkageio import INADDRESS_CHOICES, OUTADDRESS_CHOICES, DISABLED_TRIGGEROPT_CHOICES
        from models.accmonitorlog import EVENT_CHOICES
        in_info = dict(INADDRESS_CHOICES)
        out_info = dict(OUTADDRESS_CHOICES)
        event_info = dict(EVENT_CHOICES)

        for ini in in_info.keys():
            in_info[ini] = unicode(in_info[ini])
        for outi in out_info.keys():
            out_info[outi] = unicode(out_info[outi])
        for eventi in event_info.keys():
            if eventi not in DISABLED_TRIGGEROPT_CHOICES:
                event_info[eventi] = unicode(event_info[eventi])
            else:
                event_info.pop(eventi)
        return HttpResponse(
            smart_str(
                simplejson.dumps({
                    'in_info': in_info,
                    'out_info': out_info,
                    'event_info': event_info
                })))

    #获取设备的辅助输出点信息(用于关闭辅助输出点)
    if fun_mode == "get_device_auxout":
        dev_id = int(request.REQUEST.get("dev_id", 0))
        devs = Device.objects.filter(pk=dev_id)

        if devs:
            from models.acclinkageio import get_device_auxout
            return HttpResponse(
                smart_str(
                    simplejson.dumps(
                        {"auxout_info":
                         get_device_auxout(devs[0])})))  #else 如果不存在前端执行error

    if fun_mode == 'get_doors_tree':  #just like acclevelset
        from dbapp.widgets import queryset_render_multiple
        u = request.user
        aa = u.areaadmin_set.all()
        if u.is_superuser or not aa:  #为超级管理员或者没有配置区域(默认全部区域)
            doors = AccDoor.objects.all()
        else:
            areas = [a.area for a in aa]
            doors = AccDoor.objects.filter(device__area__in=areas)

        tree_html = queryset_render_multiple(
            doors,
            'door',
            "class='wZBaseZManyToManyField' name='door' id='id_door'",
            None,
            'id_door',
            parent=None)
        return HttpResponse(tree_html)
Exemplo n.º 6
0
def search_acpanel(request):
    fun_mode = request.GET.get("func", '')

    #搜索门禁控制器
    #result为返回的条数(即设备数量)
    if fun_mode == "search_tcpip":
        devcomm = TDevComm(None)
        #{'data': 'MAC=00:17:62:01:36:F7,IPAddress=192.168.1.226\r\n', 'result'
        ret = devcomm.SearchDevice()
        #print 'ret=',ret
        devs = ret['data'].split('\r\n', ret['result'])
        datas = []
        for dev in devs:
            data = {}
            if dev:
                arg = dev.split(',')
                #print arg
                for s in arg:
                    #print 's=',s
                    record = s.split('=')
                    #print 'record=',record
                    data[record[0]] = record[1] or ''
                datas.append(data)
        #print datas
        #{'datas': [{'MAC': '00:17:62:01:36:F7', 'IPAddress': '192.168.1.226'}, {'MAC': '00:17:62:01:36:F7', 'IPAddress': '192.168.1.226'}, {'MAC': '(null)', 'IPAddress': '192.168.1.2052.168.1.226'}, {'MAC': '(null)', 'IPAddress': '192.168.1.2052.168.1.226'}]}
        return HttpResponse(smart_str({'datas': datas}))

    #将控制器添加到设备表时检查该ip地址和sn是否已经存在
    if fun_mode == "check_and_save":
        ip = request.GET.get("ip", '')
        sn = request.GET.get("sn", '')
        alias = request.GET.get("alias", '')

        #先检测ip,后检测序列号,_existed 为1表示存在 0表示不存在
        ip_existed = 0
        sn_existed = 0
        if ip and ip in [
                d.ipaddress for d in [dev for dev in Device.objects.all()]
        ]:
            ip_existed = 1  #ip地址已存在
        #搜索上来的序列号不为空,故sn不为空,数据库中当前可能存在多个sn为空的记录
        if sn and sn in [d.sn for d in [dev for dev in Device.objects.all()]]:
            sn_existed = 1

        if not ip_existed and not sn_existed:  #均不存在 可以保存
            #需先连接设备获取设备的参数
            comminfo = {
                'sn': sn,
                'comm_type': 1,  #int(comm_type),1为tcp/ip 2为rs485
                'ipaddress': ip,
                'ip_port': 4370,
                'password': '',
            }
            #print "comminfo====",comminfo
            devcom = TDevComm(comminfo)
            cret = devcom.connect()
            if cret["result"] > 0:  #连接成功
                qret = devcom.get_options(
                    "~SerialNumber,FirmVer,~DeviceName,LockCount,ReaderCount,AuxInCount,AuxOutCount,MachineType,~IsOnlyRFMachine,~MaxUserCount,~MaxAttLogCount,~MaxUserFingerCount,MThreshold,~ZKFPVersion"
                )
                devcom.disconnect()
                if qret["result"] >= 0:  #有数据返回
                    datdic = {}
                    optlist = qret["data"].split(',')
                    for opt in optlist:
                        opt1 = opt.split('=')
                        #print "opt1===",opt1
                        #datdic[opt1[0]] = opt1[1] and int(opt1[1]) or None
                        datdic[opt1[0]] = opt1[1]  #or 0#None
                    #print "dic=",datdic
                    try:
                        dev_obj = Device()
                        dev_obj.alias = alias  #ip.split(".")[-1]#默认以ip地址一部分为alias
                        dev_obj.sn = datdic['~SerialNumber']  #or ''
                        dev_obj.Fpversion = datdic['~ZKFPVersion']
                        dev_obj.fw_version = datdic['FirmVer']  #or ''
                        dev_obj.device_name = datdic['~DeviceName']  #or ''
                        dev_obj.device_type = 2
                        dev_obj.ipaddress = ip
                        dev_obj.ip_port = 4370
                        dev_obj.comm_type = 1
                        dev_obj.comm_pwd = ""  #默认通讯密码为空
                        dev_obj.acpanel_type = int(datdic['LockCount'])
                        #新增获取三个容量参数--add by darcy 20101122                        dev_obj.max_user_count = datdic.has_key("~MaxUserCount") and int(datdic["~MaxUserCount"])*100 or 0                        dev_obj.max_attlog_count = datdic.has_key("~MaxAttLogCount") and int(datdic["~MaxAttLogCount"])*10000 or 0                        dev_obj.max_finger_count = datdic.has_key("~MaxUserFingerCount") and int(datdic["~MaxUserFingerCount"]) or 0                        dev_obj.fp_mthreshold = datdic.has_key("MThreshold") and int(datdic["MThreshold"]) or 0                                                dev_obj.data_valid(SAVETYPE_NEW)#验证业务逻辑
                        aa = request.user.areaadmin_set.all()
                        if aa:  #给用户设置过授权区域
                            dev_obj.area = aa[0].area
                        else:  #没设置的话默认全部区域
                            dev_obj.area = Area.objects.get(pk=1)
                        dev_obj.save(force_insert=True)
                        from mysite.iclock.models.dev_comm_operate import sync_set_all_data
                        dev_obj.delete_transaction()
                        sync_set_all_data(dev_obj)
                    except Exception, e:
                        print_exc()
                        return HttpResponse(
                            smart_str(
                                simplejson.dumps({
                                    "ret": -1,
                                    "reason": unicode(e)
                                })))  #添加设备失败

                    try:
                        from mysite.iaccess.dev_comm_center import OPERAT_ADD
                        dev_obj.add_comm_center(None, OPERAT_ADD)
                    except:
                        print_exc()
                        return HttpResponse(smart_str({"ret": -5}))  #添加设备异常

                    try:
                        #dev_obj.accdevice.machine_type = int(datdic['ACPanelFunOn'])
                        dev_obj.accdevice.door_count = int(datdic['LockCount'])
                        dev_obj.accdevice.reader_count = int(
                            datdic['ReaderCount'])
                        dev_obj.accdevice.aux_in_count = int(
                            datdic['AuxInCount'])
                        dev_obj.accdevice.aux_out_count = int(
                            datdic['AuxOutCount'])
                        dev_obj.accdevice.machine_type = int(
                            datdic['MachineType'])
                        dev_obj.accdevice.IsOnlyRFMachine = int(
                            datdic['~IsOnlyRFMachine'])
                        dev_obj.accdevice.save(force_update=True)

                        return HttpResponse(
                            smart_str({
                                "ret": 1,
                                "result": qret["result"],
                                "data": datdic
                            }))  #返回的字节数qret["result"]大于等于0
                    except:
                        print_exc()
                        return HttpResponse(
                            smart_str({
                                "ret": -2,
                                "result": qret["result"]
                            }))  #设备表保存成功,但是设备参数表保存失败,下次连接成功时将写入----是否存在??
                else:  #0
                    return HttpResponse(
                        smart_str({
                            "ret": -3,
                            "result": qret["result"]
                        }))  #无数据返回

            else:  #连接失败
                from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
                try:
                    reason = unicode(
                        dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
                except:
                    print_exc()
                    reason = ""
                return HttpResponse(
                    smart_str(
                        simplejson.dumps({
                            "ret": -4,
                            "result": cret["result"],
                            "reason": reason,
                            "data": ""
                        })))
        else:
            return HttpResponse(
                smart_str({
                    'ret': 0,
                    'ip_existed': ip_existed,
                    'sn_existed': sn_existed
                }))  #sn已存在
Exemplo n.º 7
0
        else:
            return HttpResponse(
                smart_str({
                    'ret': 0,
                    'ip_existed': ip_existed,
                    'sn_existed': sn_existed
                }))  #sn已存在

    #搜索控制器时tcp/ip通讯方式下修改搜索出来的设备的ip地址
    if fun_mode == "change_ip":
        newip = request.GET.get("newip", '')
        gateway = request.GET.get("gateway", "")
        subnet_mask = request.GET.get("subnet_mask", "")
        mac = request.GET.get("mac", '')
        #调用修改ip地址的接口---广播方式
        devcomm = TDevComm(None)
        cret = devcomm.ModifyIPAddress(
            "MAC=%s,IPAddress=%s,GATEIPAddress=%s,NetMask=%s" %
            (mac, newip, gateway, subnet_mask))
        from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
        try:
            #  if cret["result"] == 0:
            # cret["result"] = -99#未知错误
            reason = unicode(dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
        except:
            print_exc()
            reason = ""

        return HttpResponse(
            smart_str(
                simplejson.dumps({