summaryrefslogtreecommitdiff
path: root/Mailman
diff options
context:
space:
mode:
Diffstat (limited to 'Mailman')
-rw-r--r--Mailman/Message.py6
-rw-r--r--Mailman/database/model/address.py14
-rw-r--r--Mailman/database/model/member.py9
-rw-r--r--Mailman/database/model/preferences.py1
-rw-r--r--Mailman/database/model/roster.py12
-rw-r--r--Mailman/database/model/user.py2
-rw-r--r--Mailman/database/types.py26
-rw-r--r--Mailman/database/usermanager.py5
-rw-r--r--Mailman/docs/acknowledge.txt63
-rw-r--r--Mailman/tests/test_documentation.py4
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):