Пример #1
0
def process_user_info(key, user_id):
    """根据token获取/编辑用户信息"""
    message = {"message": "success"}
    if key == "get":
        host_url = request.host_url
        message = User.get_info_dict_by_id(user_id)
        if message['message'] == "success":
            message['data']['head_img_url'] = host_url + str(message['data']['head_img_url'])
        logger.info("function={},args={}".format(sys._getframe().f_code.co_name, str(sys._getframe().f_locals)))
    elif key == "edit" or key == "update":
        """编辑用户信息"""
        args = get_args(request)
        try:
            if "auth_token" in args:
                args.pop("auth_token")
            else:
                args.pop("token")
        except KeyError:
            pass
        try:
            args.pop("_id")
        except KeyError:
            pass
        filter_dict = {"_id": user_id}
        user = User.find_by_id(user_id)
        result = user.find_one_and_update(filter_dict=filter_dict, update=args)
        if result is None:
            """插入失败"""
            message = pack_message(message, 6001, args=args, user_id=user_id)
    else:
        message = pack_message(message, 3003, key=key)
    return json.dumps(message)
Пример #2
0
def process_online_surplus_func(user_id):
    """在线时长的接口"""
    mes = {"message": "success"}
    """上传在线时常.单位:分钟"""
    online_time = get_arg(request, "duration", None)
    if online_time is None:
        """获取在线时间"""
        f = {"_id": user_id}
        r = User.find_one_plus(filter_dict=f, projection=['online_time'], instance=False)
        if r is None:
            mes['data'] = 0
        else:
            mes['data'] = 0 if r.get("online_time") is None else r['online_time']
    else:
        """上传在线时间"""
        try:
            online_time = float(online_time)
        except ValueError as e:
            print(e)
            logger.exception("错误的在线时长:{}".format(online_time))
            mes = pack_message(mes, 3001, duration=online_time)
        finally:
            if isinstance(online_time, float):
                f = {"_id": user_id}
                u = {"$set": {"online_time": online_time}}
                User.find_one_and_update_plus(filter_dict=f, update_dict=u)
            else:
                mes = pack_message(mes, 5000, duration=online_time)
    return json.dumps(mes)
Пример #3
0
def sensor_push(user_id):
    """接收设备的传感器发来的信息"""
    args = get_args(request)
    message = {"message": "success"}
    token = ''
    try:
        token = args.pop('auth_token')
    except KeyError as e:
        pass
    finally:
        pass
    # calculated_user_id = AppLoginToken.get_id_by_token(token)
    if str(user_id) == args.get('user_id'):
        sensor = item_module.Sensor(**args)
        try:
            result = sensor.insert()
            if isinstance(result, ObjectId):
                pass
            else:
                message = error_module.pack_message(message, 3004, **args)
        except ValueError as e:
            logger.exception("Error:")
            message = error_module.pack_message(message, 6001, **args)
            error_col, error_val = e.args[0].split(" ")[-1].split(":")
            message['message'] = "{}的值 {} 重复".format(error_col, error_val)
        finally:
            return json.dumps(message)
    else:
        message = pack_message(message,
                               3009,
                               token=token,
                               user_id=args.get('user_id'))
        return json.dumps(message)
Пример #4
0
def sensor_push_async(user_id):
    """接收设备的传感器发来的信息 异步队列模式"""
    message = {"message": "success"}
    args = get_args(request)
    if args is not None:
        """检查用户身份"""
        token = ''
        try:
            token = args.pop('auth_token')
        except KeyError as e:
            pass
            print(e)
        finally:
            pass
        # calculated_user_id = AppLoginToken.get_id_by_token(token)
        if str(user_id) == args.get('user_id'):
            result = celery_module.save_gps.delay(**args)
            if result is not None and result.status == "SUCCESS":
                if result.info['message'] == "success":
                    pass
                else:
                    message = error_module.pack_message(message, 6001, **args)
            else:
                message = error_module.pack_message(message, 6000, **args)
        else:
            message = pack_message(message,
                                   3009,
                                   token=token,
                                   user_id=args.get('user_id'))
    else:
        message = error_module.pack_message(message, 3000, args=args)
    return json.dumps(message)
Пример #5
0
 def decorated_function(*args, **kwargs):
     req_args = get_args(request)
     headers = request.headers
     api_url = request.path
     auth_token = request.headers.get("auth_token", None)
     token = request.headers.get("token", None)
     check = token if auth_token is None or auth_token == "" else auth_token
     ms = "api={}, args={}, auth_token={}, token={}, headers={}".format(api_url, req_args, auth_token, token, headers)
     recode(ms)
     if check is None or check == "":
         # 会话检测失败
         logger.exception("app token 获取失败: {}".format(ms))
         message = pack_message({"message": "success"}, 3009, token=token)
         return json.dumps(message)
     else:
         key = "token_{}".format(check)
         user_id = cache.get(key)
         if user_id is None:
             user_id = AppLoginToken.get_id_by_token(token=check).get("user_id", None)
             if user_id is None:
                 # token验证失败
                 logger.exception("app token验证失败: {}".format(ms))
                 message = pack_message({"message": "success"}, 3008, token=token)
                 return json.dumps(message)
             else:
                 kwargs['user_id'] = user_id  # 把user_id作为地一个参数传递给视图函数
                 cache.set(key, user_id, timeout=1200)  # 缓存20分钟
         else:
             kwargs['user_id'] = user_id  # 把user_id作为地一个参数传递给视图函数
     return f(*args, **kwargs)
Пример #6
0
def gps_push(user_id):
    """接收设备发来的实时gps信息"""
    args = get_args(request)
    log_type = "data_view.gps_push"
    info_dict = args.copy()
    message = {"message": "success"}
    token = ''
    try:
        token = args.pop('auth_token')
    except KeyError as e:
        pass
    finally:
        pass
    # calculated_user_id = AppLoginToken.get_id_by_token(token)
    if user_id:
        args['user_id'] = DBRef(collection="user_info",
                                database="platform_db",
                                id=user_id)
        info_dict = args.copy()
        info_dict['result'] = 'before begin'
        info_dict['result'] = 'unknown error'
        """发送给socketio服务器"""
        celery_module.send_last_pio_celery.delay(to_flat_dict(args))
        try:
            args['real_time'] = 1
            result = item_module.GPS.insert_queue(args)
            if result:
                info_dict['result'] = 'success'
            else:
                message = error_module.pack_message(message, 3004, **args)
        except ValueError as e:
            logger.exception("Error: ")
            error_col, error_val = e.args[0].split(" ")[-1].split(":")
            message = error_module.pack_message(message, 6001, **args)
            message['message'] = "{}的值 {} 重复".format(error_col, error_val)
            info_dict['result'] = message['message']
        except Exception as e:
            logger.exception("Error: {}".format(e),
                             exc_info=True,
                             stack_info=True)
            print(e)
            message = error_module.pack_message(message, 5000, **args)
            info_dict['result'] = str(e)
        finally:
            return json.dumps(message)
    else:
        message = pack_message(message,
                               3009,
                               auth_token=token,
                               user_id=args.get('user_id'))
        info_dict['result'] = message['message']
        return json.dumps(message)
Пример #7
0
def app_user_login():
    """app端用户登录"""
    message = {"message": "success"}
    user_name = get_arg(request, 'username')
    user_password = get_arg(request, 'password')
    phone_num = get_arg(request, 'phone_num')
    """为了兼容老系统做的修改"""
    phone_num = user_name if phone_num == '' else phone_num
    random_code = get_arg(request, 'tel_verify_code', 0)   # 短信验证码
    login_type = get_arg(request, 'login_type', '')   # 登录类型
    """有多种登录类型:
    TY_PHONE:以手机登录
    """
    if login_type.upper() == "TY_PHONE":
        try:
            random_code = int(random_code)
            """先检查是不是物联网卡,不是的话,走普通通道,是的话,走特殊通道"""
            if check_iot_phone(phone_num):
                """是物联网卡"""
                result = User.iot_user_login(phone_num=phone_num)
                if result is None:
                    message = pack_message(message, 3001, phone_num=phone_num, random_code=random_code)
                else:
                    message.update(result)
            else:
                """普通手机卡"""
                validate_result = sms.validate_sms(phone_num, random_code)
                if validate_result['message'] != "success":
                    """短信验证失败"""
                    message = pack_message(message, 3002, phone_num=phone_num, random_code=random_code)
                else:
                    """根据手机号码查询用户"""
                    result = User.find_one(phone_num=phone_num)
                    if isinstance(result, User):
                        """登录验证码依然有效,直至超时"""
                        # sms.clear_sms_code(phone_num)  # 清除短信
                        message['data'] = result.to_flat_dict()
                        token = AppLoginToken.create_token(result.get_id())
                        message['token'] = token
                    else:
                        """还未注册"""
                        message = pack_message(message, 3004, phone_num=phone_num, random_code=random_code)
        except ValueError:
            """参数类型错误"""
            message = pack_message(message, 3001, phone_num=phone_num, random_code=random_code)
        finally:
            pass
    else:
        """未识别的参数"""
        message = pack_message(message, 3002, phone_num=phone_num, random_code=random_code)
    logger.info("function={},args={}".format(sys._getframe().f_code.co_name, str(sys._getframe().f_locals)))
    return json.dumps(message)
Пример #8
0
 def get_id_by_token(cls, token, force=False):
     """通过token获取用户id,返回包含ObjectId的字典对象
     参数force的意思是指是否过期也返回user_id
     """
     message = {"message": "success"}
     result = cls.find_one(token=token)
     if result is None:
         message = pack_message(message, 3006, token=token)
     else:
         if result.end_date < datetime.datetime.now() and not force:
             message = pack_message(message, 3005, token=token)
         else:
             message['user_id'] = result.user_id
     return message
Пример #9
0
def get_daily_info_func(user_id) -> str:
    """
    获取每日报告扼要
    用户获取最后一次安全报告中的简要信息
    :return: json化的字典
    """
    message = {"message": "success"}
    prefix = Company.get_prefix_by_user_id(user_id)
    prefix = "sf" if prefix is None else prefix
    try:
        user_id = '5a3b3cd5db122cd9fbc21c40'
        report = security_module.SecurityReport.query_report2(prefix=prefix, user_id=user_id)
        archive = dict()
        if len(report) == 0:
            pass
        else:
            """把报告内容附加到档案中"""
            _source = report[0]['_source']
            archive['_id'] = _source['id']  # id
            archive['td_miles'] = int(float(_source['drive_distance'].rstrip("km")))  # 总里程    公里, 注意,这是个str
            archive['td_fuels'] = _source['oil_cost']  # 油耗     升/百公里
            archive['synt'] = _source['drive_score']  # 驾驶得分
            archive['td_rank'] = _source['drive_rank']  # 排名
        message['data'] = archive
    except Exception as e:
        print(e)
        logger.exception("get_daily_info_func Error:")
        message = pack_message(message, 3010, user_id=user_id)
    finally:
        return json.dumps(message)
Пример #10
0
def validate_sms(phone_num, validate_code):
    """验证用户输入的短信验证码是否正确"""
    message = {"message": "success"}
    key = "sms_{}".format(phone_num)
    raw_code = cache.get(key)
    if raw_code is None:
        # message['message'] = "验证码不能为None"
        message = pack_message(message,
                               error_code=3000,
                               tel_verify_code=raw_code)
    elif int(validate_code) != raw_code:
        # message['message'] = "验证码错误"
        message = pack_message(message,
                               error_code=3002,
                               tel_verify_code=raw_code)
    else:
        pass
    return message
Пример #11
0
def process_alert_message_func(user_id, key):
    """app端查询推送的消息,示范接口,具体细节未落实"""
    mes = dict({"message": "success"})
    if key == "get":
        """
        查询推送的消息
        data = {
            "ticker": "demo滚动消息",                                # 收到消息的时候,通知栏的一次滚动消息
            "title": "推动消息demo标题",                              # 标题
            "detail": "推送消息demo的详细内容",                        # 内容
            "url": "http://pltf.safeogo.rg/api/alert_message"       # 详情页面
        }
        """
        now = datetime.datetime.now()
        filter_dict = {
            "effective_time": {"$gte": now}
        }
        alert = Message.find_one_plus(filter_dict=filter_dict, instance=True)
        if isinstance(alert, Message):
            mes_id = alert.get_id()
            data = alert.to_flat_dict()
            """标记已读"""
            filter_dict = {"_id": mes_id}
            update_dict = {"$set": {"effective_time": datetime.datetime.now()}}
            Message.find_one_and_update_plus(filter_dict=filter_dict, update_dict=update_dict)
        else:
            data = dict()
        mes['data'] = data
    elif key == "add":
        args = get_args(request)
        if "title" in args and "detail" in args:
            try:
                alert = Message(**args)
                alert.save()
            except Exception as e:
                print(e)
                logger.exception("process_alert_message_func Error:", exc_info=True, stack_info=True)
                mes = pack_message(mes, 6001, **args)
            finally:
                pass
    else:
        mes = pack_message(mes, 3003, key=key)
    return json.dumps(mes)
Пример #12
0
def __send_sms(phone_num):
    """发送手机短信"""
    message = {"message": "success"}
    validate_code = random.randint(1111, 9999)
    sms_client = SmsApp()
    result = sms_client.sms(phone_num, validate_code)
    status_code = result.split(",")[0]
    if status_code == "1":
        key = "sms_{}".format(phone_num)
        cache.set(key, validate_code, timeout=60 * 30)
    elif status_code == "20":
        # message['message'] = "余额不足"
        message = pack_message(message, error_code=5002)
    else:
        # message['message'] = "短信发送失败:错误代码{}".format(status_code)
        message = pack_message(message,
                               error_code=7002,
                               status_code=status_code)
    return message
Пример #13
0
def send_sms(phone_num):
    """发送短信并检查短信发送的请求是否合法,用户发送短信时请调用次方法"""
    """一天最多允许发送10次短信"""
    max_time = 10  # 24小时内的最大短信发送次数
    interval = 60  # 短信发送间隔
    message = {"message": "success"}
    key = "sms_send_time_{}".format(phone_num)  # 用于计数的key的前缀
    recode_list = list()
    for i in range(max_time):
        sub_key = "{}_{}".format(key, str(i))
        val = cache.get(sub_key)
        if val is None:
            break
        else:
            recode_list.append(val)
    if len(recode_list) == 0:
        message = __send_sms(phone_num)
        if message['message'] == "success":
            """计数"""
            temp_key = "{}_{}".format(key, str(len(recode_list)))
            cache.set(temp_key, datetime.datetime.now(), timeout=60 * 24)
    elif 0 < len(recode_list) < max_time:
        now = datetime.datetime.now()
        prev = recode_list[-1]
        seconds = (now - prev).total_seconds()
        """检查发送间隔"""
        if seconds < interval:
            # message['message'] = "短信发送频繁,请等待{}秒后再试".format(int(interval - seconds))
            message = pack_message(message,
                                   error_code=4190,
                                   delay_seconds=int(interval - seconds))
        else:
            message = __send_sms(phone_num)
            if message['message'] == "success":
                """计数"""
                temp_key = "{}_{}".format(key, str(len(recode_list)))
                cache.set(temp_key, datetime.datetime.now(), timeout=60 * 24)
    else:
        # message['message'] = "已超本日短信最大发送次数"
        message = pack_message(message,
                               error_code=4014,
                               count=len(recode_list))
    return message
Пример #14
0
def process_vio_query_generator(user_id, key):
    """创建一个违章查询器,token是身份检查装饰器传来的值"""
    message = {"message": "success"}
    raw_args = get_args(request)
    args = raw_args.copy()
    if args is None:
        message = pack_message(message, 3000, args=raw_args)
    else:
        try:
            if "auth_token" in args:
                args.pop("auth_token")
            else:
                args.pop("token")
        except KeyError:
            pass
        args['user_id'] = user_id
        if key == "add":
            """添加查询器"""
            if "car_type" not in args or args['car_type'] == "":
                args['car_type'] = "02"
            try:
                generator = violation_module.VioQueryGenerator.create(**args)
                generator_id = generator.insert()
                message['data'] = str(generator_id)
            except KeyError:
                logger.exception("args: {}".format(str(raw_args)))
                message = pack_message(message, 3000, **raw_args)
            except RepeatError:
                logger.exception("args: {}".format(str(raw_args)))
                message = pack_message(message, 3007, **raw_args)
        elif key == "delete":
            """删除查询器"""
            try:
                object_id = args['_id']
                message = violation_module.VioQueryGenerator.delete_one(object_id=object_id, user_id=user_id)
            except KeyError as e:
                print(e)
                logger.error("参数错误", exc_info=True, stack_info=True)
                message = pack_message(message, 3000, _id=None)
        else:
            message = pack_message(message, 3012, **raw_args)
    return json.dumps(message)
Пример #15
0
def query_geo_coordinate_func():
    """根据城市和地址查询经纬度"""
    city = get_arg(request, "city", None)
    address = get_arg(request, "address", None)
    message = {"message": "success"}
    if city is None or address is None:
        message = pack_message(message, 3000, city=city, address=address)
    else:
        data = Position.query(city, address)
        message['data'] = data
    return json.dumps(message)
Пример #16
0
def get_vio_query_shortcuts(user_id):
    """查询当前用户的所有的查询器"""
    message = {"message": "success"}

    try:
        data = violation_module.VioQueryGenerator.generator_list(user_id)
        message['data'] = data
    except Exception as e:
        print(e)
        message = pack_message(message, 3010, user_id=user_id)
    finally:
        return json.dumps(message)
Пример #17
0
def api_send_sms():
    """用户发送短信"""
    message = {"message": "success"}
    phone_num = get_arg(request, "phone_num")
    if phone_num == "":
        phone_num = get_arg(request, "username")
    if check_phone(phone_num):
        message = sms.send_sms(phone_num)
    else:
        message = pack_message(message, 3013, phone_num=phone_num)
    logger.info("function={},args={}".format(sys._getframe().f_code.co_name, str(sys._getframe().f_locals)))
    return json.dumps(message)
Пример #18
0
def process_license_info(user_id, key):
    """
    查询/编辑驾驶证信息
    :param user_id: 用户id,ObjectId类型
    :param key:     操作类型,比如update/get 之类的动词
    :return:        json序列化的字典.
    """
    message = {"message": "success"}
    args = get_args(request)
    args = dict() if args is None else args
    """净化参数"""
    if "auth_token" in args:
        args.pop("auth_token")
    if "token" in args:
        args.pop("token")

    if key == "get":
        """查询驾驶证信息"""
        res = User.find_driving_license(user_id)
        if res is None:  # 错误的用户id
            ms = "process_license_info Error: 用户id错误, user_id={}".format(user_id)
            logger.exception(ms)
            message = pack_message(message, 3004, user_id=user_id, key=key)
        else:
            if 'image_url' in res:
                res['image_url'] = request.host_url + res['image_url']
            message['data'] = res
    elif key == "update":
        """更新驾驶证信息"""
        args['user_id'] = user_id
        res = User.set_driving_license(**args)
        if res['message'] == "success":
            pass
        else:
            message = pack_message(message, 6001, **args)
    else:
        message = pack_message(message, 3003, key=key)
    return json.dumps(message)
Пример #19
0
 def get_info_dict_by_id(cls, user_id):
     """
     通过token获取用户信息,
     :param user_id: user_id
     :return: 字典
     """
     id = mongo_db.get_obj_id(user_id)
     message = {"message": "success"}
     obj = cls.find_by_id(id)
     if obj is None:
         message = pack_message(message, 3004, user_id=user_id)
     else:
         message['data'] = obj.to_flat_dict()
     return message
Пример #20
0
def app_user_reg():
    """app端用户注册"""
    message = {"message": "success"}
    user_name = get_arg(request, 'username')
    user_password = get_arg(request, 'password')
    phone_num = get_arg(request, 'phone_num')
    random_code = get_arg(request, 'tel_verify_code')   # 短信验证码
    invite_code = get_arg(request, 'invite_code')   # 邀请码
    phone_num = user_name if phone_num == "" else phone_num
    validate_result = sms.validate_sms(phone_num, random_code)
    if validate_result['message'] != "success":
        """短信验证失败"""
        message = validate_result
    else:
        """组装添加客户的数据"""
        user_password = hashlib.md5(phone_num[5:].encode()).hexdigest() if user_password == "" else user_password
        create_date = datetime.datetime.now()
        """先记录注册信息"""
        ip = get_real_ip(request)
        RegRecord.insert_one(reg_date=create_date, ip=ip, phone_num=phone_num)
        args = {"user_name": user_name, "user_password": user_password, "phone_num": phone_num,
                "create_date": create_date, "invite_code": invite_code}
        try:
            result = User.register(**args)
            if isinstance(result, BaseDoc):
                """注册验证码依然有效,直至超时"""
                # sms.clear_sms_code(phone_num)  # 清除短信
                pass
            else:
                message = pack_message(message, 3007, **args)
        except ValueError as e:
            logger.exception(sys._getframe().f_code.co_name)
            error_col, error_val = e.args[0].split(" ")[-1].split(":")
            name_dict = {"phone_num": "手机号码", "user_name": "用户名"}
            if error_col in name_dict:
                col_name = name_dict[error_col]
                if col_name == "手机号码":
                    message['message'] = "{}已注册,请直接登录".format(col_name)
                elif col_name == "用户名":
                    message['message'] = "{} {} 已被占用,请使用其他用户名".format(col_name, error_val)
            else:
                message['message'] = "{} {} 重复".format(error_col, error_val)
        except Exception as e:
            print(e)
            logger.exception("app_user_reg Error: {}".format(e))
        finally:
            pass
    logger.info("function={},args={}".format(sys._getframe().f_code.co_name, str(sys._getframe().f_locals)))
    return json.dumps(message)
Пример #21
0
 def get_info_dict_by_token(cls, token):
     """
     通过token获取用户信息,
     :param token: 用户token
     :return: 字典
     """
     message = {"message": "success"}
     result = AppLoginToken.get_id_by_token(token)
     if result['message'] != "success":
         message = result
     else:
         obj = cls.find_one(_id=result['user_id'])
         if obj is None:
             message = pack_message(message, 3004, token=token)
         else:
             message['data'] = obj.to_flat_dict()
     return message
Пример #22
0
def query_violation(user_id):
    """查询违章记录"""
    message = {"message": "success"}
    """记录违章查询参数"""
    generator_id = get_arg(request, "_id", "")  # 查询器id
    if isinstance(generator_id, str) and len(generator_id) == 24:
        generator_id = ObjectId(generator_id)
    else:
        generator_id = None
    try:
        message = violation_module.VioQueryGenerator.get_prev_query_result(user_id, generator_id)
    except Exception as e:
        message = pack_message(None, 5000, **{"user_id": user_id, "generator_id": generator_id})
        ms = "Server Error: args:user_id={},generator_id={}".format(user_id, generator_id)
        logger.exception(ms, exc_info=True, stack_info=True)
        print(e)
    finally:
        ms = "违章查询的结果是:{}".format(message)
        logger.info(ms)
        print(ms)
        if "args" in message:
            message['args'] = {k: str(v) for k, v in message['args'].items()}
        return json.dumps(message)
Пример #23
0
def query_all_violations(user_id):
    """获取账户下所有已处理/未处理违章信息"""
    the_type = get_arg(request, "type", None)
    mes = {"message": "success"}
    year = get_arg(request, "year", None)
    year = datetime.datetime.now().year if year is None else year
    begin = mongo_db.get_datetime_from_str("{}-01-01 0:0:0".format(year))
    end = mongo_db.get_datetime_from_str("{}-01-01 0:0:0".format(year + 1))
    end = end - datetime.timedelta(seconds=0.000001)
    if isinstance(the_type, (int, str)):
        if isinstance(the_type, str) and the_type.isdigit():
            the_type = int(the_type)
        else:
            pass
        if the_type in [0, 1]:
            the_type = 3 if the_type == 0 else 1
            """先从互联网查一下,更新数据,注意,这个逻辑不是那么合理,将来要优化的"""
            violation_module.VioQueryGenerator.get_prev_query_result(user_id, None)
            """查询历史数据"""
            f = {"user_id": user_id, "process_status": the_type, "time": {"$lte": end, "$gte": begin}}
            s = {"update_time": -1}
            r = violation_module.ViolationRecode.find_plus(filter_dict=f, sort_dict=s, to_dict=True, can_json=False)
            data = {"token": str(user_id)}
            last_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            total_fine = 0.0  # 总罚款
            amount = 0  # 未处理违章总扣分
            untreated = 0  # 未处理违章条数
            violations = list()
            if len(r) > 0:
                """统计数据"""
                real_last = None
                for x in r:
                    violations.append(mongo_db.to_flat_dict(x))
                    update_time = x.get('update_time')
                    if real_last is None and isinstance(update_time, datetime.datetime):
                        real_last = update_time.strftime("%Y-%m-%d %H:%M:%S")
                    else:
                        pass
                    if x['process_status'] == 1:
                        untreated += 1
                        point = x['point']   # 扣分
                        if isinstance(point, int):
                            pass
                        elif isinstance(point, str) and point.isdigit():
                            point = int(point)
                        else:
                            point = 0
                        amount += point
                        fine = x['fine']  # 罚款
                        if isinstance(fine, float):
                            pass
                        elif isinstance(fine, int):
                            fine = float(fine)
                        elif isinstance(fine, str) and fine.isdigit():
                            fine = float(fine)
                        else:
                            fine = 0.0
                        total_fine += fine
                    else:
                        pass
                if real_last is not None:
                    last_date = real_last
            else:
                pass
            data['create_date'] = last_date
            data['plate_number'] = ""
            data['amount'] = amount
            data['untreated'] = untreated
            data['total_fine'] = total_fine
            data['violations'] = violations
            mes['data'] = data
        else:
            mes = pack_message(message_dict=mes, error_code=3001, type=the_type)
    else:
        mes = pack_message(message_dict=mes, error_code=3000, type=the_type)
    return json.dumps(mes)
Пример #24
0
def process_vehicle_info(user_id, key):
    """获取/编辑行车证信息"""
    message = {"message": "success"}
    args = get_args(request)
    args = dict() if args is None else args
    """净化参数"""
    if "auth_token" in args:
        args.pop("auth_token")
    if "token" in args:
        args.pop("token")

    _id = args.get("_id")  # 获取请求的行车证信息的id
    ms = "process_vehicle_info func key:{}, user_id:{}, args:{}".format(key, str(user_id), json.dumps(args))
    print(ms)
    logger.info(ms)
    args['user_id'] = user_id
    if key == "get":
        """获取行车证信息"""
        host_url = request.host_url
        if _id is None:
            """返回行车证信息的列表"""
            obj_list = User.get_usable_license(user_id=user_id)
            for obj in obj_list:
                """按照app段需求整理转换字段名"""
                if 'permit_image_url' in obj:
                    obj['permit_image_url'] = host_url + obj['permit_image_url']
            message['data'] = obj_list
        else:
            """返回单个行车证信息"""
            obj = CarLicense.find_by_id(_id, can_json=True)
            if obj is None:
                pass
            else:
                """按照app段需求整理转换字段名"""
                if 'permit_image_url' in obj:
                    obj['permit_image_url'] = host_url + obj['permit_image_url']
                else:
                    pass
                message['data'] = obj
    elif key == "edit":
        """编辑行车证信息"""
        if _id is None:
            message = pack_message(message, 3000, _id=_id)
        else:
            args.pop("_id")
            filter_dict = {"_id": _id}
            update = args
            args['user_id'] = DBRef(database=mongo_db.db_name, collection=User.get_table_name(), id=user_id)
            print("filter_dict={}".format(str(filter_dict)))
            print("update={}".format(str(update)))
            result = CarLicense.find_alone_and_update(filter_dict=filter_dict, update=update)
            if result is None:
                message = pack_message(message, 6001, filter_dict=filter_dict, update=update)
            else:
                pass
    elif key == "delete":
        """删除行车证信息"""
        l_id = get_arg(request, "_id")
        user = User.find_by_id(user_id)
        if isinstance(user, User):
            res = None
            try:
                res = user.delete_car_license(l_id=l_id)
            except Exception as e:
                # 删除失败
                ms = "删除行车证失败,l_id:{},错误原因:{}".format(l_id, e)
                logger.exception(ms)
                filter_dict = dict()
                filter_dict['l_id'] = l_id
                filter_dict['error_cause'] = str(e)
                message = pack_message(message, 5000, **filter_dict)
            finally:
                if not res:
                    error_cause = "没有返回正确的结果,请查询系统日志"
                    logger.exception(error_cause)
                    message = pack_message(message, 5000, error_cause=error_cause)
        else:
            e = "错误的用户id:{}".format_map(user_id)
            message = pack_message(message, 3000, error_cause=e)
    else:
        message = pack_message(message, 3012, key=key)
    print(message)
    return json.dumps(message)
Пример #25
0
def get_security_rank_list_func(user_id) -> str:
    """
        根据用户id查询安全等级排名
        :param user_id: 用户id,由login_required_app装饰器返回.
        :return:
        成功:{"message": "success", “data”:[dict, dict,]}
        失败:{“message": "错误原因", "error_code":"错误代码", "args": "相关参数"}
    """
    """字典说明:
        public int rank; 排名
        public int scr_synt; 驾驶综合分数
        public String driver_name; 司机姓名
        public String url_avatar; 司机头像地址
    example:
    {
    'rank': '441', 
    'url_avatar': 'http://127.0.0.1:5000/static/image/head_img/default_01.png', 
    'scr_synt': '70', 
    'driver_name': '李四'
    }
    """
    message = {"message": "success"}
    # user_id = ObjectId('5ab0ad831315e00e3cb61c62')  # 新振兴李侠
    prefix = Company.get_prefix_by_user_id(user_id)
    host_url = request.host_url
    try:
        begin_date = datetime.datetime.now().strftime("%F")
        """个人排名数据"""
        my_report = security_module.SecurityReport.query_report2(prefix=prefix, user_id=user_id, report_type="rank", size=1)
        """精简个人排名数据"""
        mes = security_module.SecurityReport.query_report2(prefix=prefix, report_type="rank", size=15, begin_date=begin_date)
        """团队排名数据"""
        res = list()
        my_rank = dict()
        if len(mes) == 0:
            pass
        else:
            """查询头像地址"""
            ids = [ObjectId(x['_source']["id"]) for x in mes]
            if user_id not in ids:
                ids.append(user_id)
            imgs = User.find_plus(filter_dict={"_id": {"$in": ids}}, projection=['head_img_url'], to_dict=True,
                                  can_json=True)
            imgs = {x["_id"]: x["head_img_url"] for x in imgs}

            if len(my_report) == 0:
                pass
            else:
                my_report = my_report[0]['_source']
                my_rank['rank'] = my_report['drive_rank']
                my_rank['scr_synt'] = my_report['drive_score']
                my_rank['driver_name'] = my_report['username'] if my_report.get('real_name') is None else \
                    my_report.get('real_name')
                my_rank['url_avatar'] = "{}{}".format(host_url, imgs[my_report['id']])
            for x in mes:
                s = x['_source']
                t = dict()
                t['rank'] = s['drive_rank']
                t['scr_synt'] = s['drive_score']
                t['driver_name'] = s['username'] if s.get('real_name') is None else s.get('real_name')
                t['url_avatar'] = "{}{}".format(host_url, imgs[s['id']])
                res.append(t)
        message['data'] = res       # top10
        message['myself'] = my_rank  # 个人排名数据
    except Exception as e:
        logger.exception(e)
        message = pack_message(message, 5000, user_id=user_id)
    return json.dumps(message)
Пример #26
0
def update_image(user_id, key):
    """
    用户上传文件
    注意!!!!
    其他路由都不能以upload_开头了,这是个历史问题
    """
    if request.method.lower() == "post":
        message = {"message": "success"}
        upload_files = request.files
        """sys._getframe().f_code.co_name 当前运行函数的名称"""
        ms = "{} 上传文件,key={},files={}, user_id={}".format(sys._getframe().f_code.co_name, key, upload_files, user_id)
        logger.info(ms)
        try:
            if key not in upload_files:
                """请求中没有包含图片"""
                message = pack_message(message, 3018, key=key)
                ms = "上传图片的请求中没有包含图片,path:{}".format(request.path)
                logger.exception(ms)
                print(ms)
            else:
                file = upload_files[key]
                raw_file_name = file.filename.lower()
                suffix = raw_file_name.split(".")[-1]
                if suffix in ALLOWED_EXTENSIONS:
                    """允许的文件类型"""
                    file_name = "{}.{}".format(uuid4().hex, suffix)
                    img_dir_path = get_img_dir_path(key)
                    full_path = os.path.join(img_dir_path, file_name)
                    file.save(full_path)
                    update_dict = None
                    result = None
                    if key == "avatar":
                        """用户上传头像"""
                        part_url = "static/image/{}/{}".format(key, file_name)
                        img_url = request.host_url + part_url
                        message['data'] = img_url
                        user = User.find_by_id(user_id)
                        filter_dict = {"_id": user_id}
                        update_dict = {"$set": {"head_img_url": part_url}}
                        print("------------")
                        print(filter_dict)
                        print(update_dict)
                        print("---------")
                        result = user.find_one_and_update(filter_dict=filter_dict, update=update_dict)
                        print(result)
                    elif key == "permit_image":
                        """如果是行车证照片的话,需要创建/修改一个对应的行车证信息"""
                        part_url = "static/image/{}/{}".format(key, file_name)
                        img_url = request.host_url + part_url
                        message['data'] = img_url
                        result = "Ok"  # 仅仅为了下面的if不报错而已
                        _id = get_arg(request, "_id")  # 获取请求的行车证信息的id
                        _id = _id.strip() if isinstance(_id, str) else _id
                        """创建一个行车证信息"""
                        if _id is None or _id == "":
                            """这是上传图片添加行车证的情况"""
                            permit_image_url = request.host_url + part_url
                            car_license_kwargs = {"permit_image_url": part_url,
                                                  "user_id": user_id}
                            print("new permit_image args: {}".format(_id))
                            r = CarLicense.instance(**car_license_kwargs)  # 插入一个行车证信息
                            if r is not None:
                                _id = r.get_id()
                                res = dict()
                                res['_id'] = str(_id)
                                res['permit_image_url'] = permit_image_url
                                message['data'] = res
                            else:
                                ms = "CarLicense.instance函数没有正确的返回,参数:{}".format(car_license_kwargs)
                                logger.exception(ms)
                                print(ms)
                                message = pack_message(message, 5000, **car_license_kwargs)
                        else:
                            """这是修改一个行车证图片的情况"""
                            print("修改行车证图片,_id={}".format(_id))
                            if not isinstance(_id, ObjectId):
                                _id = ObjectId(_id)
                            filter_dict = {"_id": _id}
                            permit_image_url = request.host_url + part_url
                            update = {"$set": {"permit_image_url": part_url}}
                            r = CarLicense.find_one_and_update_plus(filter_dict=filter_dict, update_dict=update, upsert=False)
                            if r is not None:
                                res = dict()
                                res['_id'] = str(_id)
                                res['permit_image_url'] = permit_image_url
                                message['data'] = res
                            else:
                                ms = "CarLicense.find_one_and_update_plus函数没有正确的返回,参数:{} {}".format(filter_dict, update)
                                logger.exception(ms)
                                print(ms)
                                message = pack_message(message, 3004, _id=_id, error_cause=ms, permit_image_url=permit_image_url)
                    elif key == "license_image":
                        """上传驾驶证照片信息,驾驶证的照片地址是User的直接属性"""
                        part_url = "static/image/{}/{}".format(key, file_name)
                        img_url = request.host_url + part_url
                        message['data'] = img_url
                        result = "Ok"  # 仅仅为了下面的if不报错而已
                        user = User.find_by_id(user_id)
                        if isinstance(user, User):
                            res = user.update_driving_license(image_url=part_url)
                            if res['message'] == "success":
                                image_url = img_url  # 返回驾驶证图片的绝对地址
                                _id = str(user_id)
                                data = {"_id": _id, "image_url": image_url}
                                message['data'] = data
                            else:
                                ms = "update_image func Error: key={},img_url={}".format(key, img_url)
                                logger.exception(ms)
                        else:
                            message = pack_message(message, 3004, user_id=str(user_id))
                    else:
                        """不是用户上传头像,行车证和驾驶证照片"""
                        part_url = "static/image/{}/{}".format(key, file_name)
                        img_url = request.host_url + part_url
                        message['data'] = img_url
                        result = "Ok"  # 仅仅为了下面的if不报错而已
                        print(result)

                    if result is None:
                        message = pack_message(message, 6001, user_id=user_id, update_dict=update_dict)
                else:
                    message = pack_message(message, 3001, file_name=raw_file_name, allow_file_suffix=ALLOWED_EXTENSIONS)
        except KeyError as e:
            print(e)
            logger.exception("Error! case: {}".format(e))
            message = pack_message(message, 3000, avatar=str(None))
        except Exception as e:
            print(e)
            logger.exception("Error! case: {}".format(e))
            message = pack_message(message, 5000, avatar=str(None))
        finally:
            print("update_image function : ", end="")
            print(message)
            return json.dumps(message)
    else:
        return abort(405)
Пример #27
0
def get_report_detail_func(user_id) -> str:
    """
    根据安全报告id查询安全报告详细内容.
    :param user_id: 用户id,由login_required_app装饰器返回.用于和report配合确认身份.(防止查别人的报告详细)
    return:
       mes = {'message': 'success',                                # 返回状态标识, 字符串,
              'data':                                              # 安全报告详细内容
                      {
                      'begin_date': '2017-11-12',                  # 报告的开始日期,
                      'end_date': '2017-11-12',                    # 报告的结束日期,
                      'create_date': '2017-11-13 12:00:05.340',  # 报告的生成日期,
                      'sum_mile': 7406.0,                          # 行驶里程, float类型.单位:公里.
                      'sum_time': 688,                             # 行驶时间, float类型.单位:分钟.
                      'scr_synt': 72,                              # 综合分数, float类型,百分制
                      'idx_slep': 0,                               # 睡眠 0好 1坏
                      'idx_mood': 0,                               # 情绪 0好 1坏
                      'idx_heal': 0,                               # 健康 0好 1坏



                      'cnt_make_call': 1,                          # 打电话次数
                      'cnt_play_phon': 3,                          # 看手机
                      'cnt_fati_driv': 1,                          # 疲劳驾驶次数
                      'cnt_shar_turn': 1,                          # 急转弯次数. int类型.
                      'cnt_rapi_acce': 0,                          # 急加速次数. int类型.
                      'cnt_over_sped': 6,                          # 超速次数. int类型.
                      'cnt_sudd_brak': 6,                          # 急刹车次数. int类型.
                      'poly': [                                    # 本次报告相关的行车轨迹的数组.
                               {
                                'pr': '',                          # 字符串,坐标数据是来自gps还是lbs(基于位置的服务/基站)?默认空.
                                'tm': '2017-12-12 12:12:12',       # 时间,字符串格式,精确到毫秒级
                                'lo': 121.234522,                  # 经度,浮点.
                                'la': 31.345672,                   # 纬度,浮点.
                                'al': 0.0,                         # 高度/海拔,单位:米, 浮点,默认值0.0, 暂不提供.
                                'sp': 0.0,                         # 速度 ,单位:公里/小时,浮点,默认0.0,暂不提供.
                                'br': 0.0                          # 方位,浮点,默认0.0, 暂不提供.
                               },
                               ......
                                 ]
                      }
            }
    """
    message = {"message": "success"}
    begin = datetime.datetime.now()
    report_id = get_arg(request, "report_id", None)  # 报告id,必须参数.
    if report_id is None:
        pass
    data = security_module.SecurityReport.get_report_detail(report_id, user_id)
    """查询ai模块"""
    prefix = Company.get_prefix_by_user_id(user_id)
    prefix = "sf" if prefix is None else prefix
    try:
        user_id = '5a3b3cd5db122cd9fbc21c40'
        report = security_module.SecurityReport.query_report2(prefix=prefix, user_id=user_id, size=1)
        if len(report) == 0:
            pass
        else:
            """把报告内容附加到档案中"""
            report = report[0]['_source']
    except Exception as e:
        print(e)
        logger.exception("get_report_detail_func Error:")
        message = pack_message(message, 3010, user_id=user_id)
    finally:
        data['scr_synt'] = report['drive_score']  # 安全得分
    url_root = request.url_root
    url_poly = data['url_poly']
    url_poly = "{}static/image/poly_image/{}".format(url_root, url_poly)
    data['url_poly'] = url_poly
    poly = Track.get_tracks_list(user_id=user_id, for_app=True)
    data['poly'] = poly['track_list']
    message['data'] = data
    end = datetime.datetime.now()
    seconds = (end - begin).microseconds
    resp = json.dumps(message)
    ms = "get_report_detail func is running args: user_id={}, report_id={}, begin={}, end={}, seconds={}".\
        format(user_id, report_id, begin, end, seconds)
    print(ms)
    logger.info(ms)
    return resp