'Update a user with a set of attributes and returns the updated user.
By default it uses a mapping defined in the settings constant
SAML_ATTRIBUTE_MAPPING. For each attribute, if the user object has
that field defined it will be set, otherwise it will try to set
it in the profile object.'

def update_user(self, user, attributes, attribute_mapping, force_save=False):

    if (not attribute_mapping):
        return user
    try:
        profile = user.get_profile()
    except ObjectDoesNotExist:
        profile = None
    except SiteProfileNotAvailable:
        profile = None
    except AttributeError:
        profile = user
    user_modified = False
    profile_modified = False
    for (saml_attr, django_attrs) in attribute_mapping.items():
        try:
            for attr in django_attrs:
                if hasattr(user, attr):
                    modified = self._set_attribute(user, attr, attributes[saml_attr][0])
                    user_modified = (user_modified or modified)
                elif ((profile is not None) and hasattr(profile, attr)):
                    modified = self._set_attribute(profile, attr, attributes[saml_attr][0])
                    profile_modified = (profile_modified or modified)
        except KeyError:
            pass
    logger.debug('Sending    the    pre_save    signal')
    signal_modified = any([response for (receiver, response) in pre_user_save.send_robust(sender=user, attributes=attributes, user_modified=user_modified)])
    if (user_modified or signal_modified or force_save):
        user.save()
    if ((profile is not None) and (profile_modified or signal_modified or force_save)):
        profile.save()
    return user
