1from graphene.utils.get_unbound_function import get_unbound_function
2
3
4def get_custom_resolver(obj_type, orm_field_name):
5    """
6    Since `graphene` will call `resolve_<field_name>` on a field only if it
7    does not have a `resolver`, we need to re-implement that logic here so
8    users are able to override the default resolvers that we provide.
9    """
10    resolver = getattr(obj_type, 'resolve_{}'.format(orm_field_name), None)
11    if resolver:
12        return get_unbound_function(resolver)
13
14    return None
15
16
17def get_attr_resolver(obj_type, model_attr):
18    """
19    In order to support field renaming via `ORMField.model_attr`,
20    we need to define resolver functions for each field.
21
22    :param SQLAlchemyObjectType obj_type:
23    :param str model_attr: the name of the SQLAlchemy attribute
24    :rtype: Callable
25    """
26    return lambda root, _info: getattr(root, model_attr, None)
27