Ejemplo n.º 1
0
    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")
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
    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()})
Ejemplo n.º 5
0
    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")
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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())
Ejemplo n.º 8
0
    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")
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
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()
Ejemplo n.º 11
0
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()
Ejemplo n.º 12
0
 def require_authorization():
     _ = get_param(request.args, '_', required=True, convert_to=float)
     auth = request.headers.get('Authorization')
     if not settings.DEBUG:
         check_authorization(_, auth)