def setMemberOption(self, member, flag, value):
     assert self.__mlist.Locked()
     self.__assertIsMember(member)
     memberkey = member.lower()
     # There's one extra gotcha we have to deal with.  If the user is
     # toggling the Digests flag, then we need to move their entry from
     # mlist.members to mlist.digest_members or vice versa.  Blarg.  Do
     # this before the flag setting below in case it fails.
     if flag == mm_cfg.Digests:
         if value:
             # Be sure the list supports digest delivery
             if not self.__mlist.digestable:
                 raise Errors.CantDigestError
             # The user is turning on digest mode
             if memberkey in self.__mlist.digest_members:
                 raise Errors.AlreadyReceivingDigests(member)
             cpuser = self.__mlist.members.get(memberkey)
             if cpuser is None:
                 raise Errors.NotAMemberError(member)
             del self.__mlist.members[memberkey]
             self.__mlist.digest_members[memberkey] = cpuser
             # If we recently turned off digest mode and are now
             # turning it back on, the member may be in one_last_digest.
             # If so, remove it so the member doesn't get a dup of the
             # next digest.
             if memberkey in self.__mlist.one_last_digest:
                 del self.__mlist.one_last_digest[memberkey]
         else:
             # Be sure the list supports regular delivery
             if not self.__mlist.nondigestable:
                 raise Errors.MustDigestError
             # The user is turning off digest mode
             if memberkey in self.__mlist.members:
                 raise Errors.AlreadyReceivingRegularDeliveries(member)
             cpuser = self.__mlist.digest_members.get(memberkey)
             if cpuser is None:
                 raise Errors.NotAMemberError(member)
             del self.__mlist.digest_members[memberkey]
             self.__mlist.members[memberkey] = cpuser
             # When toggling off digest delivery, we want to be sure to set
             # things up so that the user receives one last digest,
             # otherwise they may lose some email
             self.__mlist.one_last_digest[memberkey] = cpuser
         # We don't need to touch user_options because the digest state
         # isn't kept as a bitfield flag.
         return
     # This is a bit kludgey because the semantics are that if the user has
     # no options set (i.e. the value would be 0), then they have no entry
     # in the user_options dict.  We use setdefault() here, and then del
     # the entry below just to make things (questionably) cleaner.
     self.__mlist.user_options.setdefault(memberkey, 0)
     if value:
         self.__mlist.user_options[memberkey] |= flag
     else:
         self.__mlist.user_options[memberkey] &= ~flag
     if not self.__mlist.user_options[memberkey]:
         del self.__mlist.user_options[memberkey]
 def getMemberPassword(self, member):
     secret = self.__mlist.passwords.get(member.lower())
     if secret is None:
         raise Errors.NotAMemberError(member)
     return secret
 def getMemberCPAddress(self, member):
     cpaddr, where = self.__get_cp_member(member)
     if cpaddr is None:
         raise Errors.NotAMemberError(member)
     return cpaddr
 def getMemberKey(self, member):
     cpaddr, where = self.__get_cp_member(member)
     if cpaddr is None:
         raise Errors.NotAMemberError(member)
     return member.lower()
 def __assertIsMember(self, member):
     if not self.isMember(member):
         raise Errors.NotAMemberError(member)