def sync_custom_profile_fields_from_ldap(self, user_profile: UserProfile, ldap_user: _LDAPUser) -> None: values_by_var_name = {} # type: Dict[str, Union[int, str, List[int]]] for attr, ldap_attr in settings.AUTH_LDAP_USER_ATTR_MAP.items(): if not attr.startswith('custom_profile_field__'): continue var_name = attr.split('custom_profile_field__')[1] try: value = ldap_user.attrs[ldap_attr][0] except KeyError: # If this user doesn't have this field set then ignore this # field and continue syncing other fields. `django-auth-ldap` # automatically logs error about missing field. continue values_by_var_name[var_name] = value fields_by_var_name = {} # type: Dict[str, CustomProfileField] custom_profile_fields = custom_profile_fields_for_realm( user_profile.realm.id) for field in custom_profile_fields: var_name = '_'.join(field.name.lower().split(' ')) fields_by_var_name[var_name] = field existing_values = {} for data in user_profile.profile_data: var_name = '_'.join(data['name'].lower().split( ' ')) # type: ignore # data field values can also be int existing_values[var_name] = data['value'] profile_data = [] # type: List[Dict[str, Union[int, str, List[int]]]] for var_name, value in values_by_var_name.items(): try: field = fields_by_var_name[var_name] except KeyError: raise ZulipLDAPException( 'Custom profile field with name %s not found.' % (var_name, )) if existing_values.get(var_name) == value: continue result = validate_user_custom_profile_field( user_profile.realm.id, field, value) if result is not None: raise ZulipLDAPException('Invalid data for %s field: %s' % (var_name, result)) profile_data.append({ 'id': field.id, 'value': value, }) do_update_user_custom_profile_data(user_profile, profile_data)
def sync_custom_profile_fields_from_ldap(self, user_profile: UserProfile, ldap_user: _LDAPUser) -> None: values_by_var_name = {} # type: Dict[str, Union[int, str, List[int]]] for attr, ldap_attr in settings.AUTH_LDAP_USER_ATTR_MAP.items(): if not attr.startswith('custom_profile_field__'): continue var_name = attr.split('custom_profile_field__')[1] try: value = ldap_user.attrs[ldap_attr][0] except KeyError: # If this user doesn't have this field set then ignore this # field and continue syncing other fields. `django-auth-ldap` # automatically logs error about missing field. continue values_by_var_name[var_name] = value fields_by_var_name = {} # type: Dict[str, CustomProfileField] custom_profile_fields = custom_profile_fields_for_realm(user_profile.realm.id) for field in custom_profile_fields: var_name = '_'.join(field.name.lower().split(' ')) fields_by_var_name[var_name] = field existing_values = {} for data in user_profile.profile_data: var_name = '_'.join(data['name'].lower().split(' ')) # type: ignore # data field values can also be int existing_values[var_name] = data['value'] profile_data = [] # type: List[Dict[str, Union[int, str, List[int]]]] for var_name, value in values_by_var_name.items(): try: field = fields_by_var_name[var_name] except KeyError: raise ZulipLDAPException('Custom profile field with name %s not found.' % (var_name,)) if existing_values.get(var_name) == value: continue result = validate_user_custom_profile_field(user_profile.realm.id, field, value) if result is not None: raise ZulipLDAPException('Invalid data for %s field: %s' % (var_name, result)) profile_data.append({ 'id': field.id, 'value': value, }) do_update_user_custom_profile_data(user_profile, profile_data)