예제 #1
0
        async def check(data, records):
            for column, fkvalues_lst in data.items():
                for fkvalues in fkvalues_lst:
                    # got nothing, skip
                    if not records:
                        continue

                    pks = []
                    all_ni = True

                    for i in records:
                        val = i.get(column, NotImplemented)
                        if val != NotImplemented:
                            all_ni = False
                        pks.append(val)

                    if all_ni:
                        logger.debug(
                            "load foreign key failed, do you have read permission to the column %r?"
                            % column)
                        continue

                    # 3. query foreign keys
                    vcls = self.app.tables[fkvalues['table']]
                    v = vcls(self.app, self._request)  # fake view
                    await v._prepare()
                    info2 = SQLQueryInfo()
                    info2.set_select(ALL_COLUMNS)
                    info2.add_condition(PRIMARY_KEY, SQL_OP.IN, pks)
                    info2.bind(v)

                    # ability = vcls.permission.request_role(self.current_user, fkvalues['role'])
                    # info2.check_query_permission_full(self.current_user, fktable, ability)

                    try:
                        fk_records, count = await v._sql.select_page(info2,
                                                                     size=-1)
                    except RecordNotFound:
                        # 外键没有找到值,也许全部都是null,这很常见
                        continue

                    if not fk_records: continue
                    fk_records = list(fk_records)
                    await v.check_records_permission(info2, fk_records)

                    fk_dict = {}
                    for i in fk_records:
                        # 主键: 数据
                        fk_dict[i[vcls.primary_key]] = i

                    column_to_set = fkvalues.get('as', column) or column
                    for _, record in enumerate(records):
                        k = record.get(column, NotImplemented)
                        if k in fk_dict:
                            record[column_to_set] = fk_dict[k]

                    if fkvalues['loadfk']:
                        await check(fkvalues['loadfk'], fk_records)
async def test_pg_array_contains_ok2():
    view = ATestView(app)
    sqi = SQLQueryInfo()
    sqi.add_condition('name', SQL_OP.CONTAINS, [b'aa', b'bb'])
    sqi.bind(view)
async def test_pg_array_contains_bad_type3():
    view = ATestView(app)
    sqi = SQLQueryInfo()
    with pytest.raises(InvalidParams):
        sqi.add_condition('name', SQL_OP.CONTAINS, [b'aa', 11])
        sqi.bind(view)