attribute_aggregator/user_profile: only set attributes from user model fields if get_attributes() did not return an equivalent value
This commit is contained in:
parent
203e7af73f
commit
97b819f4c6
|
@ -66,8 +66,8 @@ def get_attributes(user, definitions=None, source=None, auth_source=False, **kwa
|
|||
source.name)
|
||||
return None
|
||||
|
||||
data = {}
|
||||
if hasattr(user, 'get_attributes') and callable(user.get_attributes):
|
||||
data = {}
|
||||
attributes = user.get_attributes()
|
||||
if not definitions:
|
||||
definitions = []
|
||||
|
@ -88,56 +88,55 @@ def get_attributes(user, definitions=None, source=None, auth_source=False, **kwa
|
|||
new = reduce(__or__, new)
|
||||
old = data.get(definition, [])
|
||||
data[definition] = list(set(old) | set(new))
|
||||
else:
|
||||
attributes = dict()
|
||||
field_names = set()
|
||||
user_profile_fields = getattr(user, 'USER_PROFILE', [])
|
||||
if not user_profile_fields:
|
||||
user_profile_fields = user._meta.get_all_field_names()
|
||||
for field in user_profile_fields:
|
||||
if isinstance(field, (tuple, list)):
|
||||
field_names.add(field[0])
|
||||
else:
|
||||
field_names.add(field)
|
||||
fields = []
|
||||
if definitions:
|
||||
for definition in definitions:
|
||||
field_name = get_profile_field_name_from_definition(definition)
|
||||
if not field_name:
|
||||
#
|
||||
# Profile model may be extended without modifying the
|
||||
# mapping file if the attribute name is the same as the
|
||||
# definition
|
||||
#
|
||||
field_name = definition
|
||||
fields.append((field_name, definition))
|
||||
field_names = set()
|
||||
user_profile_fields = getattr(user, 'USER_PROFILE', [])
|
||||
if not user_profile_fields:
|
||||
user_profile_fields = user._meta.get_all_field_names()
|
||||
for field in user_profile_fields:
|
||||
if isinstance(field, (tuple, list)):
|
||||
field_names.add(field[0])
|
||||
else:
|
||||
fields = [(field_name, definition)
|
||||
for definition in get_definitions_from_profile_field_name(field_name)
|
||||
for field_name in field_names]
|
||||
logger.debug('retrieving fields %r from USER_PROFILE', fields)
|
||||
data = {}
|
||||
for field_name, definition in fields:
|
||||
try:
|
||||
value = attrgetter(field_name)(user)
|
||||
except AttributeError:
|
||||
logger.debug('field %r not found in USER_PROFILE', field_name)
|
||||
continue
|
||||
if value:
|
||||
if callable(value):
|
||||
value = value()
|
||||
if hasattr(value, 'all') and callable(value.all):
|
||||
value = value.all()
|
||||
logger.debug('field %r has value %r', field_name, value)
|
||||
old = data.get(definition, [])
|
||||
if not isinstance(value, basestring) and hasattr(value,
|
||||
'__iter__'):
|
||||
new = map(unicode, value)
|
||||
else:
|
||||
new = [unicode(value)]
|
||||
data[definition] = list(set(old) | set(new))
|
||||
field_names.add(field)
|
||||
fields = []
|
||||
if definitions:
|
||||
for definition in definitions:
|
||||
field_name = get_profile_field_name_from_definition(definition)
|
||||
if not field_name:
|
||||
#
|
||||
# Profile model may be extended without modifying the
|
||||
# mapping file if the attribute name is the same as the
|
||||
# definition
|
||||
#
|
||||
field_name = definition
|
||||
fields.append((field_name, definition))
|
||||
else:
|
||||
fields = [(field_name, definition)
|
||||
for definition in get_definitions_from_profile_field_name(field_name)
|
||||
for field_name in field_names]
|
||||
logger.debug('retrieving fields %r from USER_PROFILE', fields)
|
||||
data = {}
|
||||
for field_name, definition in fields:
|
||||
try:
|
||||
value = attrgetter(field_name)(user)
|
||||
except AttributeError:
|
||||
logger.debug('field %r not found in USER_PROFILE', field_name)
|
||||
continue
|
||||
if value:
|
||||
if callable(value):
|
||||
value = value()
|
||||
if hasattr(value, 'all') and callable(value.all):
|
||||
value = value.all()
|
||||
logger.debug('field %r has value %r', field_name, value)
|
||||
old = data.get(definition, [])
|
||||
if not isinstance(value, basestring) and hasattr(value,
|
||||
'__iter__'):
|
||||
new = map(unicode, value)
|
||||
else:
|
||||
logger.debug('get_attributes: no value found')
|
||||
new = [unicode(value)]
|
||||
if not old:
|
||||
data[definition] = new
|
||||
else:
|
||||
logger.debug('get_attributes: no value found')
|
||||
data = [{'definition': definition, 'values': values} for definition, values in
|
||||
data.items()]
|
||||
return {SOURCE_NAME: data}
|
||||
|
|
Loading…
Reference in New Issue