@@ -232,26 +232,26 @@ def getMemberOption(self, member, flag):
232232 return not not (option & flag )
233233
234234 def getMemberName (self , member ):
235- """Get the real name of a member .
236-
235+ """Get the member's real name.
236+
237237 Args:
238238 member: The member's email address
239-
239+
240240 Returns:
241- str: The member's real name, or None if not set
241+ The member's real name, or None if not found
242242 """
243- self .__assertIsMember (member )
244- name = self .__mlist .usernames .get (member .lower ())
245- if name is None :
243+ try :
244+ fullname = self .__mlist .usernames [member ]
245+ if isinstance (fullname , bytes ):
246+ try :
247+ # Try Latin-1 first since that's what we're seeing in the data
248+ fullname = fullname .decode ('latin-1' , 'replace' )
249+ except UnicodeDecodeError :
250+ # Fall back to UTF-8 if Latin-1 fails
251+ fullname = fullname .decode ('utf-8' , 'replace' )
252+ return fullname
253+ except KeyError :
246254 return None
247- if isinstance (name , bytes ):
248- try :
249- # Try Latin-1 first since that's what we're seeing in the data
250- name = name .decode ('latin-1' , 'replace' )
251- except UnicodeDecodeError :
252- # Fall back to UTF-8 if Latin-1 fails
253- name = name .decode ('utf-8' , 'replace' )
254- return str (name )
255255
256256 def getMemberTopics (self , member ):
257257 self .__assertIsMember (member )
@@ -588,3 +588,11 @@ def ProcessConfirmation(self, cookie, msg):
588588 Pending .remove (cookie )
589589
590590 return action , data
591+
592+ @property
593+ def digestable (self ):
594+ """Return whether the list supports digest mode.
595+
596+ This is the inverse of nondigestable.
597+ """
598+ return not self .__mlist .nondigestable
0 commit comments