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)
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)
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)
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)
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)
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)
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)
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
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)
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
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)
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
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
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)
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)
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)
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)
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)
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
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)
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
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)
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)
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)
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)
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)
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