예제 #1
0
async def test_value_write_bind_with_empty():
    write = SQLValuesToWrite({'$num': 123})

    view: PeeweeView = await make_mocked_view_instance(app, ATestView, 'POST',
                                                       '/api/list/1')
    write.bind(view, None, None)
    assert len(write) == 0
예제 #2
0
    async def _base_insert(self, raw_values_lst, ignore_exists):
        with ErrorCatchContext(self):
            if isinstance(raw_values_lst, str):
                try:
                    values_lst = json.loads(raw_values_lst)
                    assert isinstance(values_lst, list)
                except (json.JSONDecodeError, AssertionError):
                    return self.finish(RETCODE.INVALID_POSTDATA,
                                       "`value_lst` is not validated")

            values_lst = [
                SQLValuesToWrite(x, self, A.CREATE) for x in raw_values_lst
            ]

            if logger.isEnabledFor(logging.DEBUG):
                logger.debug('insert record(s): %s' % values_lst)

            await self._call_handle(self.before_insert, values_lst)
            for values in values_lst:
                values.validate_before_execute_insert(self)

            records = await self._sql.insert(values_lst,
                                             returning=True,
                                             ignore_exists=ignore_exists)
            await self.check_records_permission(None, records)
            await self._call_handle(self.after_insert, values_lst, records)
            return records
예제 #3
0
    async def set(self):
        """
        更新数据接口
        查询规则参考 https://fy0.github.io/slim/#/quickstart/query_and_modify
        赋值规则参考 https://fy0.github.io/slim/#/quickstart/query_and_modify?id=修改新建
        """
        self.current_interface = InnerInterfaceName.SET
        with ErrorCatchContext(self):
            info = SQLQueryInfo(self.params, self)

            await self._call_handle(self.before_query, info)
            records, count = await self._sql.select_page(info,
                                                         size=self.bulk_num())

            if records:
                # 确保 before_update 时得到list
                records = list(records)
                values = SQLValuesToWrite(await self.post_data())
                values.bind(self, A.WRITE, records)
                await self._call_handle(self.before_update, values, records)

                # 如果 before_update 之后,不再有values,那么抛出invalid_postdata
                if len(values) == 0:
                    raise InvalidPostData("No value to set for table: %s" %
                                          self.table_name)

                if logger.isEnabledFor(logging.DEBUG):
                    logger.debug('update record(s): %s' % values)

                # 注:此处returning为true是因为后续要检查数据的权限,和前端要求无关
                new_records = await self._sql.update(records,
                                                     values,
                                                     returning=True)
                await self.check_records_permission(None, new_records)
                await self._call_handle(self.after_update, values, records,
                                        new_records)
                if await self.is_returning():
                    self.finish(RETCODE.SUCCESS, new_records)
                else:
                    self.finish(RETCODE.SUCCESS, len(new_records))
            else:
                self.finish(RETCODE.NOT_FOUND)
예제 #4
0
async def test_value_write_invalid():
    write = SQLValuesToWrite({'num1': 123, 'str1': {}})
    view: PeeweeView = await make_mocked_view_instance(app, ATestView, 'POST',
                                                       '/api/list/1')
    with pytest.raises(InvalidPostData) as e:
        write.bind(view, None, None)
예제 #5
0
async def test_value_write_normal2():
    write = SQLValuesToWrite({'num1': 123, 'str1': 456})
    view: PeeweeView = await make_mocked_view_instance(app, ATestView, 'POST',
                                                       '/api/list/1')
    write.bind(view, None, None)
    assert write['str1'] == '456'
예제 #6
0
async def test_value_write_normal():
    write = SQLValuesToWrite({'num1': 123, 'str1': 'whatever'})
    view: PeeweeView = await make_mocked_view_instance(app, ATestView, 'POST',
                                                       '/api/list/1')
    write.bind(view, None, None)