def post(self): if not self.is_seller_logged_in(): self.response_permission_denied('User is not logged in') return location_name = self.get_region_location_name() region_id = Region.generate_id_by_location_name(location_name) region_key = Region.build_key_by_id(region_id) region = region_key.get() phone_number = self.get_phone_number() seller_id = Seller.generate_id_by_phone_number(phone_number) seller_key = Seller.build_key_by_id(seller_id) seller = seller_key.get() price = int(get_param(self.request, 'price')) fish_common_name = get_param(self.request, 'fish_name') caught_date = get_param(self.request, 'caught_date') caught_date = datetime.strptime(caught_date, '%Y-%m-%d') submitted_date = date.today() fish = self.get_fish_by_common_name(region, fish_common_name) record = Record(id=Record.generate_id(), seller=seller, region=region, fish=fish, caught_date=caught_date, submitted_date=submitted_date, price=price) record.put() self.response_success("Success")
def list_tasks(): """ @api {GET} /api/v1/tasks/list 查看任务列表 @apiVersion 1.0.0 @apiGroup User-Task @apiDescription 查看某一格用户的任务列表 @apiParam (URL Params) {String} task_id 任务 id @apiParam (GET Params) {Number} _ 时间戳,utc 时间秒数 @apiParam (GET Params) {String} username 提交者用户名,非必填,不过不填之后就找不到该用户了 @apiParam (GET Params) {Number} [page=1] 需要获取的页数,可选,默认第一页 @apiParam (GET Params) {Number} [per_page=10] 每一页的数量,可选,默认 10 @apiSuccess {Number} id user_task id,没什么用 @apiSuccess {Number} func_id 对应函数的 id,没什么用 @apiSuccess {String} username 用户名 @apiSuccess {String} args 非命名参数 @apiSuccess {String} kwargs 命名参数 @apiSuccess {String} desc 描述信息 @apiSuccess {String="PENDING","STARTED","RETRY","FAILURE","SUCCESS"} status 任务状态 @apiSuccess {String} task_id 任务 id,真正有用的 id 是这个 @apiSuccess {String} create_date 任务创建时间,`%a, %d %b %Y %H:%M:%S GMT` @apiSuccessExample {json} Success-Response: HTTP/1.1 200 OK { "code": 0, "msg": "OK", "data": { "args": "[\"aa bb cc dd\"]", "create_date": "Sat, 05 May 2018 08:25:32 GMT", "desc": null, "func_id": 1, "id": 1, "kwargs": "{}", "task_id": "325a0a70-abe5-4908-b3e3-f77266306a05", "username": "******" } } """ username = get_param(request.args, 'username', required=True) page = max(1, get_param(request.args, 'page', convert_to=int) or 1) per_page = max(1, get_param(request.args, 'per_page', convert_to=int) or 10) q = PGSession.query(UserTask).filter( UserTask.username == username).order_by(desc(UserTask.create_date)) start_idx = (page - 1) * per_page end_idx = start_idx + per_page qs = q.slice(start_idx, end_idx) rs = [] for user_task in qs: r = user_task.as_dict() result = celery_app.AsyncResult(user_task.task_id) r['status'] = result.status rs.append(r) return make_json_resp(rs)
def list_mlpm_task_funcs(): """ @api {GET} /api/v1/task_funcs/list 查看任务函数列表 @apiVersion 1.0.0 @apiGroup Task-Func @apiDescription 列出已存在的任务函数 @apiParam (URL Params) {String} task_id 任务 id @apiParam (GET Params) {Number} _ 时间戳,utc 时间秒数 @apiParam (GET Params) {Number} [page=1] 需要获取的页数,可选,默认第一页 @apiParam (GET Params) {Number} [per_page=10] 每一页的数量,可选,默认 10 @apiSuccess {Number} id user_task id,没什么用 @apiSuccess {Number} func_id 对应函数的 id,没什么用 @apiSuccess {String} username 用户名 @apiSuccess {String} args 非命名参数 @apiSuccess {String} kwargs 命名参数 @apiSuccess {String} desc 描述信息 @apiSuccess {String="PENDING","STARTED","RETRY","FAILURE","SUCCESS"} status 任务状态 @apiSuccess {String} task_id 任务 id,真正有用的 id 是这个 @apiSuccess {String} create_date 任务创建时间,`%a, %d %b %Y %H:%M:%S GMT` @apiSuccessExample {json} Success-Response: HTTP/1.1 200 OK { "code": 0, "msg": "OK", "data": { "args": "[\"aa bb cc dd\"]", "create_date": "Sat, 05 May 2018 08:25:32 GMT", "desc": null, "func_id": 1, "id": 1, "kwargs": "{}", "task_id": "325a0a70-abe5-4908-b3e3-f77266306a05", "username": "******" } } """ page = max(1, get_param(request.args, 'page', convert_to=int) or 1) per_page = max(1, get_param(request.args, 'per_page', convert_to=int) or 10) q = PGSession.query(MLPMTaskFunc).order_by(desc(MLPMTaskFunc.pub_date)) start_idx = (page - 1) * per_page end_idx = start_idx + per_page qs = q.slice(start_idx, end_idx) rs = [] for func in qs: rs.append(func.as_dict()) return make_json_resp(rs)
def post(self): name = get_param(self.request, 'name') location = get_param(self.request, 'location') phone_number = get_param(self.request, 'phone_number') password = get_param(self.request, 'password') seller = Seller(id=Seller.generate_id_by_phone_number(phone_number), name=name, location=location, phone_number=phone_number, password=password) seller.put() self.log_in(name, phone_number, location) self.response_success("Success", data={'user': seller.to_dict()})
def post(self): if not self.is_seller_logged_in(): self.response_permission_denied('User is not logged in') return seller_phone = self.get_phone_number() seller_id = Seller.generate_id_by_phone_number(seller_phone) seller_key = Seller.build_key_by_id(seller_id) set_sms_notification = bool(get_param(self.request, 'notification_on')) seller = seller_key.get() seller.sms_notification = set_sms_notification seller.put() # todo comment out if set_sms_notification: logging.info('Sending sms to %s', seller.phone_number) sms_sent = send_sms(seller.phone_number, 'Thank you for your interest. You will receive news from us.') if sms_sent: logging.info('SMS was sent successfully') else: logging.info('Failed to send SMS') self.response_success("SMS notification setting is successful")
def get(self): if not self.is_seller_logged_in(): self.response_permission_denied('User is not logged in') return common_name = get_param(self.request, 'fish_name') location_name = self.get_region_location_name() scientific_name = self.fetch_scientific_name(location_name, common_name) last_month = date.today() - timedelta(days=30) qs = Record.query(ndb.AND(Record.fish.scientific_name == scientific_name, Record.submitted_date >= last_month)) qs = qs.fetch() region_lat_lng = {} region_price_list = {} for record in qs: if region_price_list.get(record.region.location_name): region_price_list[record.region.location_name].append(record.price) else: region_lat_lng[record.region.location_name] = {'lat': record.region.lat, 'lng': record.region.lng} region_price_list[record.region.location_name] = [record.price] region_avg_price = {} for avg_mapping in region_price_list: region_avg_price[avg_mapping] = \ {'average': sum(region_price_list[avg_mapping]) / float(len(region_price_list[avg_mapping])), 'lat': region_lat_lng[avg_mapping]['lat'], 'lng': region_lat_lng[avg_mapping]['lng'] } self.response_success("Success", data=region_avg_price)
def get(self): if not self.is_seller_logged_in(): self.response_permission_denied('User is not logged in') return id = get_param(self.request, 'id') record_key = Record.build_key_by_id(id) record = record_key.get() self.response_success("Success", data=record.to_dict())
def post(self): phone_number = get_param(self.request, 'phone_number') password = get_param(self.request, 'password') seller_id = Seller.generate_id_by_phone_number(phone_number) seller_key = Seller.build_key_by_id(seller_id) seller = seller_key.get() if seller: if seller.password == password: self.log_in(seller.name, seller.phone_number, seller.location) self.response_success("Success", data={'user':seller.to_dict()}) else: self.response_failure("Password incorrect") else: self.response_permission_denied("Phone number doesn't exist")
def get(self): if not self.is_seller_logged_in(): self.response_permission_denied('User is not logged in') return fish_name = get_param(self.request, 'fish_name') location_name = self.get_region_location_name() if fish_name: q = Record.query(ndb.AND(Record.region.location_name == location_name, Record.fish.common_name == fish_name)) else: q = Record.query(Record.region.location_name == location_name) qs = q.fetch() records = [record.to_dict() for record in qs] self.response_success("Success", data=records)
def upload_file(): print('get request') rs = {} alg = 'SVM' if request.method == 'POST': print('request method is post') func_kwargs = get_param(request.form, 'kwargs') func_args = get_param(request.form, 'args') username = get_param(request.form, 'username', required=False) func_name = get_param(request.form, 'name') print(func_name) func_desc = get_param(request.form, 'desc', required=False) func_id = PGSession.query( MLPMTaskFunc.id).filter(MLPMTaskFunc.name == func_name).scalar() if not func_id: raise MLPMJobException(MLPMJobErrorEnum.FUNC_NOT_FOUND) try: args = json.loads(func_args) alg = args[0] if not isinstance(args, typing.Iterable): raise MLPMJobException(MLPMJobErrorEnum.BAD_FUNC_PARAM, '`args` 必须是合法的可迭代对象。') kwargs = json.loads(func_kwargs) if not isinstance(kwargs, typing.Dict): raise MLPMJobException(MLPMJobErrorEnum.BAD_FUNC_PARAM, '`kwargs` 必须是合法的字典对象。') except JSONDecodeError: current_app.logger.warning( f'<User: {username}> submit a task with bad arguments: ({func_args}, {func_kwargs})' ) raise MLPMJobException(MLPMJobErrorEnum.BAD_ARGUMENTS, '您提供的函数参数不是可解析的 JSON 字符串!') func = import_object(func_name) if not isinstance(func, MLPMAsyncTask): raise MLPMJobException(MLPMJobErrorEnum.ILLEGAL_FUNC, '你选择的函数不是合法的 MLPM 异步函数') if 'file' not in request.files: raise MLPMJobException(MLPMJobErrorEnum.NO_FILE, '你没有上传文件!') session = PGSession() file = request.files['file'] if file and allow_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(MEDIA_DIR, filename)) rs['status'] = 'ok' rs['kwargs'] = func_kwargs rs['args'] = func_args try: alg = args[0] params = args[1] label = args[2] features = args[3] r = func.delay(alg, os.path.join(MEDIA_DIR, filename), params, label, features) user_task = UserTask(username=username, func_id=func_id, task_id=r.id, args=func_args, kwargs=func_kwargs, desc=func_desc) session.add(user_task) session.commit() return make_json_resp(user_task.as_dict()) except Exception: current_app.logger.exception('Unknown error occurs:') session.rollback() raise MLPMJobException(MLPMJobErrorEnum.UNKNOWN_ERROR) finally: session.close()
def submit_task(): """ @api {post} /api/v1/tasks/submit 提交任务 @apiVersion 1.0.0 @apiGroup User-Task @apiDescription 提交一个任务 @apiParam (URL Params) {String} task_id 任务 id @apiParam (GET Params) {Number} _ 时间戳,utc 时间秒数 @apiParam (POST Params) {String} [username] 提交者用户名,非必填,不过不填之后就找不到该用户了 @apiParam (POST Params) {String} name 函数名,`module:name` 的形式 @apiParam (POST Params) {String} args 非命名参数,`["a", 1, ["a", 1]]` 的形式,必须可被 json 解析为列表 @apiParam (POST Params) {String} kwargs 命名参数,`{"a": 1}` 的形式,必须可被 json 解析为 dict @apiParam (POST Params) {String} [desc] 任务描述信息 @apiSuccess {Number} id 用户任务 id,没什么用 @apiSuccess {Number} func_id 对应函数的 id,没什么用 @apiSuccess {String} username 用户名 @apiSuccess {String} args 非命名参数 @apiSuccess {String} kwargs 命名参数 @apiSuccess {String} desc 描述信息 @apiSuccess {String} task_id 任务 id,真正有用的 id 是这个 @apiSuccess {String} create_date 任务创建时间,`%a, %d %b %Y %H:%M:%S GMT` @apiSuccessExample {json} Success-Response: HTTP/1.1 200 OK { "code": 0, "msg": "OK", "data": { "args": "[\"aa bb cc dd\"]", "create_date": "Sat, 05 May 2018 08:25:32 GMT", "desc": null, "func_id": 1, "id": 1, "kwargs": "{}", "task_id": "325a0a70-abe5-4908-b3e3-f77266306a05", "username": "******" } } """ username = get_param(request.form, 'username', required=False) func_name = get_param(request.form, 'name') func_args = get_param(request.form, 'args') func_kwargs = get_param(request.form, 'kwargs') func_desc = get_param(request.form, 'desc', required=False) func_id = PGSession.query( MLPMTaskFunc.id).filter(MLPMTaskFunc.name == func_name).scalar() if not func_id: raise MLPMJobException(MLPMJobErrorEnum.FUNC_NOT_FOUND) args = json.loads(func_args) if not isinstance(args, typing.Iterable): raise MLPMJobException(MLPMJobErrorEnum.BAD_FUNC_PARAM, '`args` 必须是合法的可迭代对象。') kwargs = json.loads(func_kwargs) if not isinstance(kwargs, typing.Dict): raise MLPMJobException(MLPMJobErrorEnum.BAD_FUNC_PARAM, '`kwargs` 必须是合法的字典对象。') func = import_object(func_name) if not isinstance(func, MLPMAsyncTask): raise MLPMJobException(MLPMJobErrorEnum.ILLEGAL_FUNC, '你选择的函数不是合法的 MLPM 异步函数') session = PGSession() try: r = func.delay(*args, **kwargs) user_task = UserTask(username=username, func_id=func_id, task_id=r.id, args=func_args, kwargs=func_kwargs, desc=func_desc) session.add(user_task) session.commit() return make_json_resp(user_task.as_dict()) except JSONDecodeError: current_app.logger.warning( f'<User: {username}> submit a task with bad arguments: ({func_args}, {func_kwargs})' ) raise MLPMJobException(MLPMJobErrorEnum.BAD_ARGUMENTS, '您提供的函数参数不是可解析的 JSON 字符串!') except Exception: current_app.logger.exception('Unknown error occurs:') session.rollback() raise MLPMJobException(MLPMJobErrorEnum.UNKNOWN_ERROR) finally: session.close()
def require_authorization(): _ = get_param(request.args, '_', required=True, convert_to=float) auth = request.headers.get('Authorization') if not settings.DEBUG: check_authorization(_, auth)