Пример #1
0
def all_rels_including_subclasses(model_cls):
    return remove_duplicates(
        class_mapper(model_cls).relationships.items() +
        flatten(
            [class_mapper(subcls).relationships.items()
             for subcls in all_subclasses(model_cls)]
        )
    )
Пример #2
0
    def all_subclasses_with_separate_tables(cls):
        subcls = []
        all_scs = [cls] + all_subclasses(cls)
        seen_tables = []

        for sc in all_scs:
            if sc.__tablename__ not in seen_tables:
                seen_tables.append(sc.__tablename__)
                subcls.append(sc)
        return subcls
Пример #3
0
    def all_subclasses_with_separate_tables(cls):
        subcls = []
        all_scs = [cls] + all_subclasses(cls)
        seen_tables = []

        for sc in all_scs:
            if sc.__tablename__ not in seen_tables:
                seen_tables.append(sc.__tablename__)
                subcls.append(sc)
        return subcls
Пример #4
0
def modify_query_and_get_filter_function(query, keyword, value, op):
    # print(
    #     "in modify_query_and_get_filter_function ",
    #     query, keyword, value, op)
    _query, model_class, attr_name = return_joined_query_model_class_and_attr_name(query, keyword)
    # print("in modify query, model_class ", model_class)
    # print("in modify query, attr_name ", attr_name)
    # print("in modify query, count ", _query.count())

    columns = getattr(
        getattr(model_class, '__mapper__'),
        'columns')
    column_type = None
    if attr_name in columns:
        column_type = type(
            columns[attr_name].type)
    if op == '~':
        value = "%{0}%".format(value)
    if op in ['=', '>', '<', '>=', '<=', '!', '!=']:
        if attr_name in columns:
            if value is not None and not isinstance(value, bool):
                # if value.lower() == 'none' or value.lower() == 'null' or value.strip() == '':
                #     value = None
                # else:
                value = type_coerce_value(column_type, value)
    elif op == 'in':
        value = [type_coerce_value(column_type, v) for v in value]

    # print("in modify_query, value ", value)

    if hasattr(model_class, attr_name):
        return (_query, getattr(
            getattr(model_class, attr_name), OPERATOR_FUNC[op])(value))
    else:
        subcls_filters = []
        for subcls in all_subclasses(model_class):
            if attr_name in subcls.column_keys():
                if '.' in keyword:
                    if not _query.is_joined_with(subcls):
                        _query = _query.join(subcls)
                subcls_filters.append(
                    getattr(
                        getattr(subcls, attr_name),
                        OPERATOR_FUNC[op]
                    )(value)
                )
            # print "adding filter to subcls filters ", subcls, attr_name, value
        if len(subcls_filters) > 0:
            return (_query, or_(*subcls_filters))
            # return _query.filter(or_(*subcls_filters))
        return (query, None)
Пример #5
0
def modify_query_and_get_filter_function(query, keyword, value, op):
    _query, model_class, attr_name = return_joined_query_model_class_and_attr_name(query, keyword)

    columns = getattr(
        getattr(model_class, '__mapper__'),
        'columns')
    column_type = None
    if attr_name in columns:
        column_type = type(
            columns[attr_name].type)
    if op == '~':
        value = "%{0}%".format(value)
    if op in ['=', '>', '<', '>=', '<=', '!', '!=']:
        if attr_name in columns:
            if value is not None and not isinstance(value, bool):
                # if value.lower() == 'none' or value.lower() == 'null' or value.strip() == '':
                #     value = None
                # else:
                value = type_coerce_value(column_type, value)
    elif op == 'in':
        value = map(lambda v: type_coerce_value(column_type, v), value)

    if hasattr(model_class, attr_name):
        return (_query, getattr(
            getattr(model_class, attr_name), OPERATOR_FUNC[op])(value))
    else:
        subcls_filters = []
        for subcls in all_subclasses(model_class):
            if attr_name in subcls.column_keys():
                if '.' in keyword:
                    if not _query.is_joined_with(subcls):
                        _query = _query.join(subcls)
                subcls_filters.append(
                    getattr(
                        getattr(subcls, attr_name),
                        OPERATOR_FUNC[op]
                    )(value)
                )
            # print "adding filter to subcls filters ", subcls, attr_name, value
        if len(subcls_filters) > 0:
            return (_query, or_(*subcls_filters))
            # return _query.filter(or_(*subcls_filters))
        return (query, None)
Пример #6
0
def all_rels_including_subclasses(model_cls):
    return remove_duplicates(
        list(class_mapper(model_cls).relationships.items()) + flatten([
            list(class_mapper(subcls).relationships.items())
            for subcls in all_subclasses(model_cls)
        ]))
    def generate_input_data_schema(model_cls,
                                   required=None,
                                   forbidden=None,
                                   post_processor=None):
        # if seen_classes is None:
        #     seen_classes = []
        if required is None:
            required = []
        if forbidden is None:
            forbidden = []
        # seen_classes.append(model_cls)

        schema = {"fields": {}}

        def allowing_callable_for_polymorphic_classes(polymorphic_attr,
                                                      polymorphic_identity):
            def _allowed(data, schema, context):
                return data.get(polymorphic_attr.key) == polymorphic_identity

            return _allowed

        cols_in_class = model_cls.__mapper__.columns.items()
        rels_in_class = model_cls.__mapper__.relationships.items()

        for col_name, col in cols_in_class:
            _set_fields_for_col(col_name, col, schema, forbidden, required)

        for rel_name, rel in rels_in_class:
            _set_fields_for_rel(rel_name, rel, schema, forbidden, required)
            # _set_fields_for_rel(
            #     rel_name, rel, schema, forbidden, required, seen_classes[0:])

        for assoc_proxy_name in model_cls.association_proxy_keys():
            schema['fields'][assoc_proxy_name] = {"allowed": True}

        polymorphic_attr = model_cls.__mapper__.polymorphic_on

        subclasses = filter(lambda sc: len(all_subclasses(sc)) == 0,
                            all_subclasses(model_cls))

        if polymorphic_attr is not None:
            schema['fields'][polymorphic_attr.name] = {'allowed': True}
            if len(subclasses) == 0:
                del schema['fields'][polymorphic_attr.key]
            else:
                schema["polymorphic_on"] = polymorphic_attr.key
                schema["additional_schema_for_polymorphs"] = {}
                schema['fields'][polymorphic_attr.key]['permitted_values'] = [
                    sc.__mapper_args__['polymorphic_identity']
                    for sc in subclasses
                ]

                for subcls in subclasses:
                    polymorphic_identity = subcls.__mapper_args__.get(
                        'polymorphic_identity')
                    schema["additional_schema_for_polymorphs"][
                        polymorphic_identity] = {
                            "fields": {}
                        }
                    cols_in_subcls = filter(
                        lambda col_item:
                        # col_item[1].table.name == subcls.__tablename__ and
                        # subcls.__tablename__ != model_cls.__tablename__ and
                        col_item[1].table.name != model_cls.__tablename__ and
                        not col_item[1].primary_key,
                        subcls.__mapper__.columns.items())
                    for col_name, col in cols_in_subcls:
                        _set_fields_for_col(
                            col_name, col,
                            schema["additional_schema_for_polymorphs"]
                            [polymorphic_identity], forbidden, required)
                    rels_in_subcls = filter(
                        lambda rel_item: not hasattr(model_cls, rel_item[0]),
                        subcls.__mapper__.relationships.items())
                    for rel_name, rel in rels_in_subcls:
                        _set_fields_for_rel(
                            rel_name, rel,
                            schema["additional_schema_for_polymorphs"]
                            [polymorphic_identity], forbidden, required)

                    for assoc_proxy_name in subcls.association_proxy_keys(
                            include_parent_classes=False):
                        schema["additional_schema_for_polymorphs"][
                            polymorphic_identity]['fields'][
                                assoc_proxy_name] = {
                                    "allowed": True
                                }

        if post_processor and callable(post_processor):
            post_processor(schema)
        return schema
    def generate_input_data_schema(model_cls, required=None,
                                   forbidden=None, post_processor=None):
        # if seen_classes is None:
        #     seen_classes = []
        if required is None:
            required = []
        if forbidden is None:
            forbidden = []
        # seen_classes.append(model_cls)

        schema = {
            "fields": {
            }
        }

        def allowing_callable_for_polymorphic_classes(
                polymorphic_attr, polymorphic_identity):
            def _allowed(data, schema, context):
                return data.get(polymorphic_attr.key) == polymorphic_identity
            return _allowed

        cols_in_class = model_cls.__mapper__.columns.items()
        rels_in_class = model_cls.__mapper__.relationships.items()

        for col_name, col in cols_in_class:
            _set_fields_for_col(col_name, col, schema, forbidden, required)

        for rel_name, rel in rels_in_class:
            _set_fields_for_rel(
                rel_name, rel, schema, forbidden, required)
            # _set_fields_for_rel(
            #     rel_name, rel, schema, forbidden, required, seen_classes[0:])

        for assoc_proxy_name in model_cls.association_proxy_keys():
            schema['fields'][assoc_proxy_name] = {
                "allowed": True
            }

        polymorphic_attr = model_cls.__mapper__.polymorphic_on

        subclasses = filter(
            lambda sc: len(all_subclasses(sc)) == 0,
            all_subclasses(model_cls))

        if polymorphic_attr is not None:
            schema['fields'][polymorphic_attr.name] = {
                'allowed': True
            }
            if len(subclasses) == 0:
                del schema['fields'][polymorphic_attr.key]
            else:
                schema["polymorphic_on"] = polymorphic_attr.key
                schema["additional_schema_for_polymorphs"] = {
                }
                schema['fields'][polymorphic_attr.key]['permitted_values'] = [
                    sc.__mapper_args__['polymorphic_identity']
                    for sc in subclasses]

                for subcls in subclasses:
                    polymorphic_identity = subcls.__mapper_args__.get(
                        'polymorphic_identity')
                    schema["additional_schema_for_polymorphs"][
                        polymorphic_identity] = {"fields": {}}
                    cols_in_subcls = filter(
                        lambda col_item:
                        # col_item[1].table.name == subcls.__tablename__ and
                        # subcls.__tablename__ != model_cls.__tablename__ and
                        col_item[1].table.name != model_cls.__tablename__ and
                        not col_item[1].primary_key,
                        subcls.__mapper__.columns.items())
                    for col_name, col in cols_in_subcls:
                        _set_fields_for_col(
                            col_name, col,
                            schema["additional_schema_for_polymorphs"][
                                polymorphic_identity],
                            forbidden, required)
                    rels_in_subcls = filter(
                        lambda rel_item: not hasattr(model_cls, rel_item[0]),
                        subcls.__mapper__.relationships.items())
                    for rel_name, rel in rels_in_subcls:
                        _set_fields_for_rel(
                            rel_name, rel,
                            schema["additional_schema_for_polymorphs"][
                                polymorphic_identity],
                            forbidden, required)

                    for assoc_proxy_name in subcls.association_proxy_keys(
                            include_parent_classes=False):
                        schema["additional_schema_for_polymorphs"][
                            polymorphic_identity]['fields'][
                                assoc_proxy_name] = {"allowed": True}

        if post_processor and callable(post_processor):
            post_processor(schema)
        return schema