예제 #1
0
def setup_schema():
    """For each model, install a marshmallow schema generator as
    `model.__schema__()`, and add an entry to the `schema`
    module.

    """
    for class_ in _Base._decl_class_registry.values():
        if hasattr(class_, '__tablename__'):
            if class_.__name__.endswith('Schema'):
                raise _ModelConversionError(
                    "For safety, setup_schema can not be used when a"
                    "Model class ends with 'Schema'")

            def add_schema(schema_class_name, exclude=[], add_to_model=False):
                """Add schema to module namespace, and, optionally, to model object.

                Parameters
                ----------
                schema_class_name : str
                    Name of schema.
                exclude : list of str, optional
                    List of model attributes to exclude from schema. Defaults to `[]`.
                add_to_model : bool, optional
                    Boolean indicating whether to install this schema generator
                    on the model as `model.__schema__`. Defaults to `False`.
                """
                schema_class_meta = type(
                    f'{schema_class_name}_meta',
                    (),
                    {
                        'model': class_,
                        'sqla_session': _DBSession,
                        'ordered': True,
                        'exclude': [],
                        'include_fk': True,
                        'include_relationships': False,
                    },
                )
                for exclude_attr in exclude:
                    if (hasattr(class_, exclude_attr)
                            and getattr(class_, exclude_attr) is not None):
                        schema_class_meta.exclude.append(exclude_attr)

                schema_class = type(schema_class_name, (_ModelSchema, ),
                                    {'Meta': schema_class_meta})

                if add_to_model:
                    setattr(class_, '__schema__', schema_class)

                setattr(sys.modules[__name__], schema_class_name,
                        schema_class())

            schema_class_name = class_.__name__
            add_schema(schema_class_name,
                       exclude=['created_at', 'modified'],
                       add_to_model=True)
            add_schema(
                f'{schema_class_name}NoID',
                exclude=['created_at', 'id', 'modified', 'single_user_group'],
            )
예제 #2
0
파일: schema.py 프로젝트: stefanv/skyportal
def setup_schema():
    """For each model, install a marshmallow schema generator as
    `model.__schema__()`, and add an entry to the `schema`
    module.

    """
    for class_ in _Base._decl_class_registry.values():
        if hasattr(class_, '__tablename__'):
            if class_.__name__.endswith('Schema'):
                raise _ModelConversionError(
                    "For safety, setup_schema can not be used when a"
                    "Model class ends with 'Schema'")

            class Meta(object):
                model = class_
                sqla_session = _DBSession

            schema_class_name = '%s' % class_.__name__

            schema_class = type(schema_class_name, (_ModelSchema, ),
                                {'Meta': Meta})

            setattr(class_, '__schema__', schema_class)
            setattr(sys.modules[__name__], class_.__name__, schema_class())