summaryrefslogtreecommitdiff
path: root/Mailman/docs/avoid-duplicates.txt
diff options
context:
space:
mode:
authorBarry Warsaw2007-11-18 16:38:59 -0500
committerBarry Warsaw2007-11-18 16:38:59 -0500
commiteff07b15bedb17e51271a75f849447100b201734 (patch)
treec429a9e854007a64ad8373f97295f66a1ac190c7 /Mailman/docs/avoid-duplicates.txt
parent2b7304d722e9ca628d6550dbb024dfa78322e91f (diff)
parent8a7be9204a9170f9d9b0eb79c2726df0c7a1b4a9 (diff)
downloadmailman-eff07b15bedb17e51271a75f849447100b201734.tar.gz
mailman-eff07b15bedb17e51271a75f849447100b201734.tar.zst
mailman-eff07b15bedb17e51271a75f849447100b201734.zip
Convert to the Storm Python ORM <storm.canonical.com>. There were several
reasons for this, but most importantly, the changes from SQLAlchemy/Elixir 0.3 to 0.4 were substantial and caused a lot of work. This work unfortunately did not result in a working branch due to very strange and inconsistent behavior with Unicode columns. Sometimes such columns would return Unicode, sometimes 8-bit strings, with no rhyme or reason. I gave up debugging this after many hours of head scratching. Oh yeah, no more flush! Storm enforces Unicode columns, which is very nice, though requires us to add lots of 'u's in places we didn't have them before. Ultimately, this is a good thing so that the core of Mailman will be Unicode consistent. One thing I still want to clean up after this, is the function-scoped imports in the model code. Part of the reason for the separate model classes was to avoid this, but for now, we'll live with it. Storm's architecture requires us to maintain a database-table-class registry for simple clearing after tests in Database._reset(). This is made fairly simple by Storm allowing us to use our own metaclass for model classes. Storm does require that we write our own SQL files, which is a downside, but I think our schema will be easy enough that this won't be a huge burden. Plus we have a head-start <wink>. Another cool thing about Storm is the explicit use of stores for objects. This should eventually allow me to flesh out my idea of storage pillars for 1) lists, 2) users, 3) messages. Some other changes: - pylint and pyflakes cleanups - SQLALCHEMY_ENGINE_URL -> DEFAULT_DATABASE_URL - Don't import-* from Version in Defaults.py - Add interface method to Mailman.Message.Message so that __getitem__() and get_all() always return Unicode headers, even when the underlying objects are strings. This should generally be safe as headers are required by RFC to be within the ASCII range. - Fix bin/arch.py to use proper initialization.
Diffstat (limited to 'Mailman/docs/avoid-duplicates.txt')
-rw-r--r--Mailman/docs/avoid-duplicates.txt40
1 files changed, 17 insertions, 23 deletions
diff --git a/Mailman/docs/avoid-duplicates.txt b/Mailman/docs/avoid-duplicates.txt
index b14bdb5bf..6a1b46f77 100644
--- a/Mailman/docs/avoid-duplicates.txt
+++ b/Mailman/docs/avoid-duplicates.txt
@@ -6,27 +6,22 @@ reduce the reception of duplicate messages. It does this by removing certain
recipients from the list of recipients that earlier handler modules
(e.g. CalcRecips) calculates.
- >>> from email import message_from_string
- >>> from Mailman.Message import Message
>>> from Mailman.Handlers.AvoidDuplicates import process
>>> from Mailman.configuration import config
- >>> from Mailman.database import flush
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
- >>> flush()
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
Create some members we're going to use.
>>> from Mailman.interfaces import MemberRole
>>> address_a = config.db.user_manager.create_address(
- ... 'aperson@example.com')
+ ... u'aperson@example.com')
>>> address_b = config.db.user_manager.create_address(
- ... 'bperson@example.com')
+ ... u'bperson@example.com')
>>> member_a = address_a.subscribe(mlist, MemberRole.member)
>>> member_b = address_b.subscribe(mlist, MemberRole.member)
- >>> flush()
>>> # This is the message metadata dictionary as it would be produced by
>>> # the CalcRecips handler.
- >>> recips = dict(recips=['aperson@example.com', 'bperson@example.com'])
+ >>> recips = dict(recips=[u'aperson@example.com', u'bperson@example.com'])
Short circuiting
@@ -39,7 +34,7 @@ The module short-circuits if there are no recipients.
... Subject: A message of great import
...
... Something
- ... """, Message)
+ ... """)
>>> msgdata = {}
>>> process(mlist, msg, msgdata)
>>> msgdata
@@ -62,16 +57,15 @@ one of the recipient headers (i.e. To, CC, Resent-To, or Resent-CC), then they
will get a list copy.
>>> member_a.preferences.receive_list_copy = False
- >>> flush()
>>> msg = message_from_string("""\
... From: Claire Person <cperson@example.com>
...
... Something of great import.
- ... """, Message)
+ ... """)
>>> msgdata = recips.copy()
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
- ['aperson@example.com', 'bperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com']
>>> print msg.as_string()
From: Claire Person <cperson@example.com>
<BLANKLINE>
@@ -85,11 +79,11 @@ If they're mentioned on the CC line, they won't get a list copy.
... CC: aperson@example.com
...
... Something of great import.
- ... """, Message)
+ ... """)
>>> msgdata = recips.copy()
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
- ['bperson@example.com']
+ [u'bperson@example.com']
>>> print msg.as_string()
From: Claire Person <cperson@example.com>
CC: aperson@example.com
@@ -105,11 +99,11 @@ But if they're mentioned on the CC line and have receive_list_copy set to True
... CC: bperson@example.com
...
... Something of great import.
- ... """, Message)
+ ... """)
>>> msgdata = recips.copy()
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
- ['aperson@example.com', 'bperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com']
>>> print msg.as_string()
From: Claire Person <cperson@example.com>
CC: bperson@example.com
@@ -124,11 +118,11 @@ Other headers checked for recipients include the To...
... To: aperson@example.com
...
... Something of great import.
- ... """, Message)
+ ... """)
>>> msgdata = recips.copy()
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
- ['bperson@example.com']
+ [u'bperson@example.com']
>>> print msg.as_string()
From: Claire Person <cperson@example.com>
To: aperson@example.com
@@ -143,11 +137,11 @@ Other headers checked for recipients include the To...
... Resent-To: aperson@example.com
...
... Something of great import.
- ... """, Message)
+ ... """)
>>> msgdata = recips.copy()
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
- ['bperson@example.com']
+ [u'bperson@example.com']
>>> print msg.as_string()
From: Claire Person <cperson@example.com>
Resent-To: aperson@example.com
@@ -162,11 +156,11 @@ Other headers checked for recipients include the To...
... Resent-Cc: aperson@example.com
...
... Something of great import.
- ... """, Message)
+ ... """)
>>> msgdata = recips.copy()
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
- ['bperson@example.com']
+ [u'bperson@example.com']
>>> print msg.as_string()
From: Claire Person <cperson@example.com>
Resent-Cc: aperson@example.com