Beispiel #1
0
    def post(self):
        """Clear the cookie and set defend."""
        try:
            data = DotDict(json_decode(self.request.body))
            iosid = data.get("iosid", "")
            logging.info("[UWEB] logout request: %s, uid: %s",
                         data, self.current_user.uid)
        except:
            self.write_ret(ErrorCode.ILLEGAL_DATA_FORMAT)
            logging.error("[UWEB] illegal format, body:%s", self.request.body)
        else:
            # 1: if there are tids, set defend
            for tid in data.tids:
                update_mannual_status(
                    self.db, self.redis, tid, UWEB.DEFEND_STATUS.YES)

            # 2: remove ios from push_list
            ios_push_list_key = get_ios_push_list_key(self.current_user.uid)
            ios_push_list = self.redis.getvalue(ios_push_list_key)
            ios_push_list = ios_push_list if ios_push_list else []
            if iosid in ios_push_list:
                ios_push_list.remove(iosid)
                self.redis.set(ios_push_list_key, ios_push_list)
            ios_badge_key = get_ios_badge_key(iosid)
            self.redis.delete(ios_badge_key)
            logging.info("[UWEB] uid:%s, ios_push_lst: %s", 
                         self.current_user.uid, ios_push_list)
        finally:
            # 3: clear cookie
            self.clear_cookie(self.app_name)
            self.write_ret(ErrorCode.SUCCESS)
Beispiel #2
0
    def notify_to_parents(self, alias, location, mobile, region_id=None):
        """Push information to clinet through push.

        PUSH 1.0
        """
        flag = self.check_timestamp(int(location['timestamp']))
        if not flag: 
            return

        category = location.category
        dev_id = location.dev_id

        if not location['pbat']:
            terminal = QueryHelper.get_terminal_info(dev_id, self.db, self.redis) 
            location['pbat'] = terminal['pbat'] if terminal['pbat'] is not None else 0 

        if mobile:
            # 1: push to android
            android_push_list_key = get_android_push_list_key(mobile) 
            android_push_list = self.redis.getvalue(android_push_list_key) 
            if android_push_list: 
                for push_id in android_push_list: 
                    push_key = NotifyHelper.get_push_key(push_id, self.redis) 
                    NotifyHelper.push_to_android(category, dev_id, alias, location, push_id, push_key, region_id)
            # 2: push  to ios 
            ios_push_list_key = get_ios_push_list_key(mobile) 
            ios_push_list = self.redis.getvalue(ios_push_list_key) 
            if ios_push_list: 
                for ios_id in ios_push_list: 
                    ios_badge = NotifyHelper.get_iosbadge(ios_id, self.redis) 
                    NotifyHelper.push_to_ios(category, dev_id, alias, location, ios_id, ios_badge, region_id)
Beispiel #3
0
    def post(self):
        username = self.get_argument("username")
        password = self.get_argument("password")
        iosid = self.get_argument("iosid", '')
        user_type = self.get_argument("user_type", UWEB.USER_TYPE.PERSON)
        biz_type = self.get_argument("biz_type", UWEB.BIZ_TYPE.YDWS)
        versionname = self.get_argument("versionname", "")
        version_type = int(self.get_argument("version_type", 0))
        logging.info("[UWEB] IOS login request, username: %s, password: %s, iosid: %s, user_type: %s",
                     username, password, iosid, user_type)
        # must check username and password avoid sql injection.
        if not (username.isalnum() and password.isalnum()):
            status = ErrorCode.ILLEGAL_LABEL
            self.write_ret(status)
            return

        # check the user, return uid, tid, sim and status
        cid, oid, uid, terminals, user_type, status = self.login_passwd_auth(
            username, password, user_type)
        logging.info("[UWEB] Login auth, cid:%s, oid:%s, uid:%s, user_type:%s", 
                     cid, oid, uid, user_type)
        if status == ErrorCode.SUCCESS:
            # keep the login log
            login_info = dict(uid=uid,
                              role=0,
                              method=2,
                              versionname=versionname)
            record_login_user(login_info, self.db)

            self.bookkeep(dict(cid=cid,
                               oid=oid,
                               uid=uid,
                               tid=terminals[0].tid,
                               sim=terminals[0].sim))
            user_info = QueryHelper.get_user_by_uid(uid, self.db)

            # NOTE: add cars_info, it's same as lastinfo
            cars_info = {}

            if user_type == UWEB.USER_TYPE.PERSON:
                terminals = QueryHelper.get_terminals_by_uid(uid, biz_type, self.db)
            elif user_type == UWEB.USER_TYPE.OPERATOR:
                terminals = QueryHelper.get_terminals_by_oid(oid, biz_type, self.db)
            elif user_type == UWEB.USER_TYPE.CORP:
                terminals = QueryHelper.get_terminals_by_cid(cid, biz_type, self.db)
            else:
                logging.error("[UWEB] Invalid user_type: %s", user_type)

            for terminal in terminals:
                # 1: get terminal
                tid = terminal.tid

                group_info = get_group_info_by_tid(self.db, tid)

                terminal_info_key = get_terminal_info_key(tid)
                terminal_cache = self.redis.getvalue(terminal_info_key)
                # NOTE: the latest gps, gsm, pbat kept in redis
                if terminal_cache:
                    terminal['gps'] = terminal_cache['gps']
                    terminal['gsm'] = terminal_cache['gsm']
                    terminal['pbat'] = terminal_cache['pbat']

                mobile = terminal['mobile']
                terminal['keys_num'] = 0
                if terminal['login'] == GATEWAY.TERMINAL_LOGIN.SLEEP:
                    terminal['login'] = GATEWAY.TERMINAL_LOGIN.ONLINE
                # NOTE: if alias is null, provide cnum or sim instead
                terminal['alias'] = QueryHelper.get_alias_by_tid(
                    tid, self.redis, self.db)
                fobs = self.db.query("SELECT fobid FROM T_FOB"
                                     "  WHERE tid = %s", tid)
                terminal['fob_list'] = [fob.fobid for fob in fobs]
                terminal['sim'] = terminal['mobile']

                # 2: get location
                location = QueryHelper.get_location_info(tid, self.db, self.redis)
                if location and not (location.clatitude or location.clongitude):
                    location_key = get_location_key(str(tid))
                    locations = [location, ]
                    locations = get_locations_with_clatlon(locations, self.db)
                    location = locations[0]
                    self.redis.setvalue(
                        location_key, location, EVENTER.LOCATION_EXPIRY)

                if location and location['name'] is None:
                    location['name'] = ''

                avatar_name, avatar_path, avatar_full_path, avatar_time = self.get_avatar_info(mobile)
                service_status = QueryHelper.get_service_status_by_tmobile(self.db, mobile)
                car_dct = {}

                if location and location['type'] == 1:  # cellid
                    location['locate_error'] = 500  # mile
                car_info = dict(defend_status=terminal['defend_status'] if terminal['defend_status'] is not None else 1,
                                service_status=service_status,
                                mannual_status=terminal['mannual_status'] if terminal['mannual_status'] is not None else 1,
                                fob_status=terminal['fob_status'] if terminal['fob_status'] is not None else 0,
                                timestamp=location['timestamp'] if location else 0,
                                speed=location.speed if location else 0,
                                # NOTE: degree's type is Decimal, float() it before json_encode
                                degree=float(location.degree) if location else 0.00,
                                locate_error=location.get('locate_error', 20) if location else 20,
                                bt_name=terminal['bt_name'] if terminal.get('bt_name', None) is not None else '',
                                bt_mac=terminal['bt_mac'] if terminal.get('bt_mac', None) is not None else '',
                                dev_type=terminal['dev_type'] if terminal.get('dev_type', None) is not None else 'A',
                                name=location.name if location else '',
                                type=location.type if location else 1,
                                latitude=location['latitude'] if location else 0,
                                longitude=location['longitude'] if location else 0,
                                clatitude=location['clatitude'] if location else 0,
                                clongitude=location['clongitude'] if location else 0,
                                login=terminal['login'] if terminal['login'] is not None else 0,
                                gps=terminal['gps'] if terminal['gps'] is not None else 0,
                                gsm=terminal['gsm'] if terminal['gsm'] is not None else 0,
                                pbat=terminal['pbat'] if terminal['pbat'] is not None else 0,
                                mobile=terminal['mobile'],
                                owner_mobile=terminal['owner_mobile'],
                                alias=terminal['alias'],
                                #keys_num=terminal['keys_num'] if terminal['keys_num'] is not None else 0,
                                keys_num=0,
                                group_id=group_info['group_id'],
                                group_name=group_info['group_name'],
                                icon_type=terminal['icon_type'],
                                avatar_path=avatar_path,
                                avatar_time=avatar_time,
                                fob_list=terminal['fob_list'] if terminal['fob_list'] else [])

                car_dct[tid] = car_info
                cars_info.update(car_dct)

            # uid --> iosid_push_list
            # check iosid whether exists in a old ios_push_list
            old_ios_push_list_key = self.redis.get(iosid)
            if old_ios_push_list_key:
                old_ios_push_list = self.redis.getvalue(old_ios_push_list_key)
                if not isinstance(old_ios_push_list, list):
                    self.redis.delete(old_ios_push_list_key)
                    old_ios_push_list = []
                if old_ios_push_list and (iosid in old_ios_push_list):
                    logging.info("[UWEB] iosid:%s has existed in a old_ios_push_list: %s, so remove iosid from the list.",
                                 iosid, old_ios_push_list)
                    old_ios_push_list.remove(iosid)
                    self.redis.set(old_ios_push_list_key, old_ios_push_list)

            ios_push_list_key = get_ios_push_list_key(uid)
            ios_push_list = self.redis.getvalue(ios_push_list_key)
            ios_push_list = ios_push_list if ios_push_list else []
            if iosid not in ios_push_list:
                ios_push_list.append(iosid)
            self.redis.set(ios_push_list_key, ios_push_list)
            self.redis.set(iosid, ios_push_list_key)
            ios_badge_key = get_ios_badge_key(iosid)
            self.redis.setvalue(ios_badge_key, 0, UWEB.IOS_ID_INTERVAL)
            logging.info("[UWEB] username %s, ios_push_lst: %s", username, ios_push_list)

            if user_info:
                self.login_sms_remind(uid, user_info.mobile, terminals, login="******")
            else:
                pass  # corp maybe no user_info

            push = dict(id='',
                        key='')
            json_data = WSPushHelper.register_wspush(uid, self.redis)
            if json_data:
                data = json_data['data']
                id = data.get('push_id', '')
                key = data.get('psd', '')
                push['id'] = id
                push['key'] = key

            if version_type >= 1:
                terminals = []
                for k, v in cars_info.iteritems():
                    v.update({'tid': k})
                    terminals.append(v)

                self.write_ret(status,
                               dict_=DotDict(wspush=push,
                                             name=user_info.name if user_info else username,
                                             user_type=user_type,
                                             terminals=terminals))
            else:
                self.write_ret(status,
                               dict_=DotDict(wspush=push,
                                             name=user_info.name if user_info else username,
                                             user_type=user_type,
                                             cars_info=cars_info,
                                             cars=terminals))
        else:
            logging.info("[UWEB] username: %s login failed, message: %s",
                         username, ErrorCode.ERROR_MESSAGE[status])
            self.write_ret(status)