diff options
Diffstat (limited to 'Mailman')
| -rw-r--r-- | Mailman/Message.py | 6 | ||||
| -rw-r--r-- | Mailman/database/model/address.py | 14 | ||||
| -rw-r--r-- | Mailman/database/model/member.py | 9 | ||||
| -rw-r--r-- | Mailman/database/model/preferences.py | 1 | ||||
| -rw-r--r-- | Mailman/database/model/roster.py | 12 | ||||
| -rw-r--r-- | Mailman/database/model/user.py | 2 | ||||
| -rw-r--r-- | Mailman/database/types.py | 26 | ||||
| -rw-r--r-- | Mailman/database/usermanager.py | 5 | ||||
| -rw-r--r-- | Mailman/docs/acknowledge.txt | 63 | ||||
| -rw-r--r-- | Mailman/tests/test_documentation.py | 4 |
10 files changed, 72 insertions, 70 deletions
diff --git a/Mailman/Message.py b/Mailman/Message.py index 7b1f22d8c..5e05892b6 100644 --- a/Mailman/Message.py +++ b/Mailman/Message.py @@ -45,6 +45,12 @@ class Message(email.message.Message): self.__version__ = VERSION email.message.Message.__init__(self) + def __getitem__(self, key): + value = email.message.Message.__getitem__(self, key) + if isinstance(value, str): + return unicode(value, 'ascii') + return value + # BAW: For debugging w/ bin/dumpdb. Apparently pprint uses repr. def __repr__(self): return self.__str__() diff --git a/Mailman/database/model/address.py b/Mailman/database/model/address.py index 022bbce36..b8e2f0f31 100644 --- a/Mailman/database/model/address.py +++ b/Mailman/database/model/address.py @@ -20,6 +20,7 @@ from storm.locals import * from zope.interface import implements from Mailman import Errors +from Mailman.configuration import config from Mailman.database import Model from Mailman.interfaces import IAddress @@ -36,9 +37,9 @@ class Address(Model): registered_on = DateTime() user_id = Int() - user = Reference(user_id, 'User') + user = Reference(user_id, 'User.id') preferences_id = Int() - preferences = Reference(preferences_id, 'Preferences') + preferences = Reference(preferences_id, 'Preferences.id') def __init__(self, address, real_name): super(Address, self).__init__() @@ -65,9 +66,11 @@ class Address(Model): from Mailman.database.model import Member from Mailman.database.model import Preferences # This member has no preferences by default. - member = Member.get_by(role=role, - mailing_list=mailing_list.fqdn_listname, - address=self) + member = config.db.store.find( + Member, + Member.role == role, + Member.mailing_list == mailing_list.fqdn_listname, + Member.address == self).one() if member: raise Errors.AlreadySubscribedError( mailing_list.fqdn_listname, self.address, role) @@ -75,6 +78,7 @@ class Address(Model): mailing_list=mailing_list.fqdn_listname, address=self) member.preferences = Preferences() + config.db.store.add(member) return member @property diff --git a/Mailman/database/model/member.py b/Mailman/database/model/member.py index 70a823a75..0a852f991 100644 --- a/Mailman/database/model/member.py +++ b/Mailman/database/model/member.py @@ -34,9 +34,14 @@ class Member(Model): mailing_list = Unicode() address_id = Int() - address = Reference(address_id, 'Address') + address = Reference(address_id, 'Address.id') preferences_id = Int() - preferences = Reference(preferences_id, 'Preferences') + preferences = Reference(preferences_id, 'Preferences.id') + + def __init__(self, role, mailing_list, address): + self.role = role + self.mailing_list = mailing_list + self.address = address def __repr__(self): return '<Member: %s on %s as %s>' % ( diff --git a/Mailman/database/model/preferences.py b/Mailman/database/model/preferences.py index 085e33e06..65d909bd0 100644 --- a/Mailman/database/model/preferences.py +++ b/Mailman/database/model/preferences.py @@ -15,7 +15,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. -from email.utils import formataddr from storm.locals import * from zope.interface import implements diff --git a/Mailman/database/model/roster.py b/Mailman/database/model/roster.py index 5a01e7c7b..ab228d762 100644 --- a/Mailman/database/model/roster.py +++ b/Mailman/database/model/roster.py @@ -24,6 +24,7 @@ moderator, and administrator roster filters. from zope.interface import implements +from Mailman.configuration import config from Mailman.constants import SystemDefaultPreferences from Mailman.database.model import Address, Member from Mailman.interfaces import DeliveryMode, IRoster, MemberRole @@ -72,11 +73,12 @@ class AbstractRoster(object): yield member.address def get_member(self, address): - results = Member.query.filter( - and_(Member.c.mailing_list == self._mlist.fqdn_listname, - Member.c.role == self.role, - Address.c.address == address, - Member.c.address_id == Address.c.id)) + results = config.db.store.find( + Member, + Member.mailing_list == self._mlist.fqdn_listname, + Member.role == self.role, + Address.address == address, + Member.address_id == Address.id) if results.count() == 0: return None elif results.count() == 1: diff --git a/Mailman/database/model/user.py b/Mailman/database/model/user.py index 1ba5ba10e..7be54c3c4 100644 --- a/Mailman/database/model/user.py +++ b/Mailman/database/model/user.py @@ -36,7 +36,7 @@ class User(Model): addresses = ReferenceSet(id, 'Address.user_id') preferences_id = Int() - preferences = Reference(preferences_id, 'Preferences') + preferences = Reference(preferences_id, 'Preferences.id') def __repr__(self): return '<User "%s" at %#x>' % (self.real_name, id(self)) diff --git a/Mailman/database/types.py b/Mailman/database/types.py index ae71129cc..ec886699d 100644 --- a/Mailman/database/types.py +++ b/Mailman/database/types.py @@ -33,25 +33,25 @@ class _EnumVariable(Variable): def parse_set(self, value, from_db): if value is None: return None - if from_db: - path, intvalue = value.rsplit(':', 1) - modulename, classname = path.rsplit('.', 1) - __import__(modulename) - cls = getattr(sys.modules[modulename], classname) - return cls[int(intvalue)] - return value + if not from_db: + return value + path, intvalue = value.rsplit(':', 1) + modulename, classname = path.rsplit('.', 1) + __import__(modulename) + cls = getattr(sys.modules[modulename], classname) + return cls[int(intvalue)] def parse_get(self, value, to_db): if value is None: return None - if to_db: - return '%s.%s:%d' % (value.enumclass.__module__, - value.enumclass.__name__, - int(value)) - return value + if not to_db: + return value + return '%s.%s:%d' % (value.enumclass.__module__, + value.enumclass.__name__, + int(value)) class Enum(SimpleProperty): """Custom munepy.Enum type for Storm.""" - variable_class = UnicodeVariable + variable_class = _EnumVariable diff --git a/Mailman/database/usermanager.py b/Mailman/database/usermanager.py index 794b1cda1..6fecfcc8b 100644 --- a/Mailman/database/usermanager.py +++ b/Mailman/database/usermanager.py @@ -33,13 +33,16 @@ class UserManager(object): implements(IUserManager) def create_user(self, address=None, real_name=None): + # Avoid circular imports. + from Mailman.database.model import Address, Preferences, User user = User() - user.real_name = ('' if real_name is None else real_name) + user.real_name = (u'' if real_name is None else real_name) if address: addrobj = Address(address, user.real_name) addrobj.preferences = Preferences() user.link(addrobj) user.preferences = Preferences() + config.db.store.add(user) return user def delete_user(self, user): diff --git a/Mailman/docs/acknowledge.txt b/Mailman/docs/acknowledge.txt index c1280095a..f57ed62a3 100644 --- a/Mailman/docs/acknowledge.txt +++ b/Mailman/docs/acknowledge.txt @@ -5,18 +5,13 @@ When a user posts a message to a mailing list, and that user has chosen to receive acknowledgments of their postings, Mailman will sent them such an acknowledgment. - >>> from email import message_from_string - >>> from Mailman.Message import Message >>> from Mailman.Handlers.Acknowledge import process - >>> from Mailman.configuration import config - >>> from Mailman.database import flush - >>> mlist = config.db.list_manager.create('_xtest@example.com') - >>> mlist.real_name = 'XTest' - >>> mlist.preferred_language = 'en' + >>> mlist = config.db.list_manager.create(u'_xtest@example.com') + >>> mlist.real_name = u'XTest' + >>> mlist.preferred_language = u'en' >>> # XXX This will almost certainly change once we've worked out the web >>> # space layout for mailing lists now. - >>> mlist.web_page_url = 'http://lists.example.com/' - >>> flush() + >>> mlist.web_page_url = u'http://lists.example.com/' >>> # Ensure that the virgin queue is empty, since we'll be checking this >>> # for new auto-response messages. @@ -29,11 +24,10 @@ Subscribe a user to the mailing list. >>> usermgr = config.db.user_manager >>> from Mailman.interfaces import MemberRole - >>> user_1 = usermgr.create_user('aperson@example.com') + >>> user_1 = usermgr.create_user(u'aperson@example.com') >>> address_1 = list(user_1.addresses)[0] >>> address_1.subscribe(mlist, MemberRole.member) <Member: aperson@example.com on _xtest@example.com as MemberRole.member> - >>> flush() Non-member posts @@ -41,10 +35,10 @@ Non-member posts Non-members can't get acknowledgments of their posts to the mailing list. - >>> msg = message_from_string("""\ + >>> msg = message_from_string(u"""\ ... From: bperson@example.com ... - ... """, Message) + ... """) >>> process(mlist, msg, {}) >>> virginq.files [] @@ -55,8 +49,8 @@ person is also not a member, no acknowledgment will be sent either. >>> msg = message_from_string("""\ ... From: bperson@example.com ... - ... """, Message) - >>> process(mlist, msg, dict(original_sender='cperson@example.com')) + ... """) + >>> process(mlist, msg, dict(original_sender=u'cperson@example.com')) >>> virginq.files [] @@ -69,7 +63,7 @@ Unless the user has requested acknowledgments, they will not get one. >>> msg = message_from_string("""\ ... From: aperson@example.com ... - ... """, Message) + ... """) >>> process(mlist, msg, {}) >>> virginq.files [] @@ -78,13 +72,12 @@ Similarly if the original sender is specified in the message metadata, and that sender is a member but not one who has requested acknowledgments, none will be sent. - >>> user_2 = usermgr.create_user('dperson@example.com') + >>> user_2 = usermgr.create_user(u'dperson@example.com') >>> address_2 = list(user_2.addresses)[0] >>> address_2.subscribe(mlist, MemberRole.member) <Member: dperson@example.com on _xtest@example.com as MemberRole.member> - >>> flush() - >>> process(mlist, msg, dict(original_sender='dperson@example.com')) + >>> process(mlist, msg, dict(original_sender=u'dperson@example.com')) >>> virginq.files [] @@ -96,7 +89,6 @@ If the member requests acknowledgments, Mailman will send them one when they post to the mailing list. >>> user_1.preferences.acknowledge_posts = True - >>> flush() The receipt will include the original message's subject in the response body, @@ -104,27 +96,23 @@ The receipt will include the original message's subject in the response body, ... From: aperson@example.com ... Subject: Something witty and insightful ... - ... """, Message) + ... """) >>> process(mlist, msg, {}) >>> len(virginq.files) 1 >>> qmsg, qdata = virginq.dequeue(virginq.files[0]) >>> virginq.files [] - >>> # Print only some of the meta data. The rest is uninteresting. - >>> qdata['listname'] - '_xtest@example.com' - >>> qdata['recips'] - ['aperson@example.com'] + >>> sorted(qdata.items()) + [..., ('recips', [u'aperson@example.com']), ...] >>> print qmsg.as_string() + ... MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - Content-Transfer-Encoding: 7bit + ... Subject: XTest post acknowledgment From: _xtest-bounces@example.com To: aperson@example.com - Message-ID: ... - Date: ... + ... Precedence: bulk <BLANKLINE> Your message entitled @@ -142,27 +130,22 @@ If there is no subject, then the receipt will use a generic message. >>> msg = message_from_string("""\ ... From: aperson@example.com ... - ... """, Message) + ... """) >>> process(mlist, msg, {}) >>> len(virginq.files) 1 >>> qmsg, qdata = virginq.dequeue(virginq.files[0]) >>> virginq.files [] - >>> # Print only some of the meta data. The rest is uninteresting. - >>> qdata['listname'] - '_xtest@example.com' - >>> qdata['recips'] - ['aperson@example.com'] + >>> sorted(qdata.items()) + [..., ('recips', [u'aperson@example.com']), ...] >>> print qmsg.as_string() MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - Content-Transfer-Encoding: 7bit + ... Subject: XTest post acknowledgment From: _xtest-bounces@example.com To: aperson@example.com - Message-ID: ... - Date: ... + ... Precedence: bulk <BLANKLINE> Your message entitled diff --git a/Mailman/tests/test_documentation.py b/Mailman/tests/test_documentation.py index c6ba0a1d6..9de74e109 100644 --- a/Mailman/tests/test_documentation.py +++ b/Mailman/tests/test_documentation.py @@ -36,8 +36,8 @@ COMMASPACE = ', ' -def specialized_message_from_string(string): - return message_from_string(string, Message) +def specialized_message_from_string(text): + return message_from_string(text, Message) def setup(testobj): |
