------------------------------------------------------------
revno: 6567
committer: Barry Warsaw <[EMAIL PROTECTED]>
branch nick: 3.0
timestamp: Wed 2007-10-10 00:16:12 -0400
message:
Remove the action.py module, move this to Mailman/interfaces/__init__.py.
Convert IMailingList.personalize to a enum.
Change all non-obsolete occurances of GetListEmail() to posting_address.
removed:
Mailman/interfaces/action.py
modified:
Mailman/Commands/cmd_info.py
Mailman/Handlers/CookHeaders.py
Mailman/Handlers/SMTPDirect.py
Mailman/Handlers/ToOutgoing.py
Mailman/MailList.py
Mailman/app/styles.py
Mailman/bin/gate_news.py
Mailman/bin/withlist.py
Mailman/database/model/mailinglist.py
Mailman/docs/cook-headers.txt
Mailman/docs/news-runner.txt
Mailman/docs/outgoing.txt
Mailman/interfaces/__init__.py
Mailman/interfaces/mailinglist.py
Mailman/queue/news.py
=== removed file 'Mailman/interfaces/action.py'
--- a/Mailman/interfaces/action.py 2007-10-10 02:18:14 +0000
+++ b/Mailman/interfaces/action.py 1970-01-01 00:00:00 +0000
@@ -1,31 +0,0 @@
-# Copyright (C) 2006-2007 by the Free Software Foundation, Inc.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-# USA.
-
-__all__ = [
- 'Action',
- ]
-
-from munepy import Enum
-
-
-
-class Action(Enum):
- hold = 0
- reject = 1
- discard = 2
- accept = 3
- defer = 4
=== modified file 'Mailman/Commands/cmd_info.py'
--- a/Mailman/Commands/cmd_info.py 2007-01-19 04:38:06 +0000
+++ b/Mailman/Commands/cmd_info.py 2007-10-10 04:16:12 +0000
@@ -37,10 +37,10 @@
return STOP
listname = mlist.real_name
description = mlist.description or _('n/a')
- postaddr = mlist.GetListEmail()
- requestaddr = mlist.GetRequestEmail()
- owneraddr = mlist.GetOwnerEmail()
- listurl = mlist.GetScriptURL('listinfo', absolute=1)
+ postaddr = mlist.posting_address
+ requestaddr = mlist.request_address
+ owneraddr = mlist.owner_address
+ listurl = mlist.script_url('listinfo')
res.results.append(_('List name: %(listname)s'))
res.results.append(_('Description: %(description)s'))
res.results.append(_('Postings to: %(postaddr)s'))
=== modified file 'Mailman/Handlers/CookHeaders.py'
--- a/Mailman/Handlers/CookHeaders.py 2007-10-10 02:18:14 +0000
+++ b/Mailman/Handlers/CookHeaders.py 2007-10-10 04:16:12 +0000
@@ -29,7 +29,7 @@
from Mailman.app.archiving import get_base_archive_url
from Mailman.configuration import config
from Mailman.i18n import _
-from Mailman.interfaces import ReplyToMunging
+from Mailman.interfaces import Personalization, ReplyToMunging
CONTINUATION = ',\n\t'
COMMASPACE = ', '
@@ -148,7 +148,7 @@
# above code?
# Also skip Cc if this is an anonymous list as list posting address
# is already in From and Reply-To in this case.
- if (mlist.personalize == 2 and
+ if (mlist.personalize == Personalization.full and
mlist.reply_goes_to_list <> ReplyToMunging.point_to_list and
not mlist.anonymous_list):
# Watch out for existing Cc headers, merge, and remove dups. Note
@@ -158,7 +158,7 @@
for pair in getaddresses(msg.get_all('cc', [])):
add(pair)
i18ndesc = uheader(mlist, mlist.description, 'Cc')
- add((str(i18ndesc), mlist.GetListEmail()))
+ add((str(i18ndesc), mlist.posting_address))
del msg['Cc']
msg['Cc'] = COMMASPACE.join([formataddr(pair) for pair in new])
# Add list-specific headers as defined in RFC 2369 and RFC 2919, but only
=== modified file 'Mailman/Handlers/SMTPDirect.py'
--- a/Mailman/Handlers/SMTPDirect.py 2007-01-19 04:38:06 +0000
+++ b/Mailman/Handlers/SMTPDirect.py 2007-10-10 04:16:12 +0000
@@ -42,6 +42,7 @@
from Mailman.Handlers import Decorate
from Mailman.SafeDict import MsgSafeDict
from Mailman.configuration import config
+from Mailman.interfaces import Personalization
DOT = '.'
@@ -114,7 +115,7 @@
# recipients they'll swallow in a single transaction.
deliveryfunc = None
if (not msgdata.has_key('personalize') or msgdata['personalize']) and (
- msgdata.get('verp') or mlist.personalize):
+ msgdata.get('verp') or mlist.personalize <> Personalization.none):
chunks = [[recip] for recip in recips]
msgdata['personalize'] = 1
deliveryfunc = verpdeliver
@@ -301,7 +302,7 @@
'host' : DOT.join(rdomain),
}
envsender = '[EMAIL PROTECTED]' % ((config.VERP_FORMAT % d),
DOT.join(bdomain))
- if mlist.personalize == 2:
+ if mlist.personalize == Personalization.full:
# When fully personalizing, we want the To address to point to the
# recipient, not to the mailing list
del msgcopy['to']
=== modified file 'Mailman/Handlers/ToOutgoing.py'
--- a/Mailman/Handlers/ToOutgoing.py 2007-09-29 18:55:25 +0000
+++ b/Mailman/Handlers/ToOutgoing.py 2007-10-10 04:16:12 +0000
@@ -23,6 +23,7 @@
"""
from Mailman.configuration import config
+from Mailman.interfaces import Personalization
from Mailman.queue import Switchboard
@@ -39,7 +40,7 @@
# VERP_PASSWORD_REMINDERS. Preserve any existing verp flag.
if 'verp' in msgdata:
pass
- elif mlist.personalize:
+ elif mlist.personalize <> Personalization.none:
if config.VERP_PERSONALIZED_DELIVERIES:
msgdata['verp'] = True
elif interval == 0:
=== modified file 'Mailman/MailList.py'
--- a/Mailman/MailList.py 2007-09-28 02:15:00 +0000
+++ b/Mailman/MailList.py 2007-10-10 04:16:12 +0000
@@ -184,9 +184,6 @@
else:
return 'confirm ' + cookie
- def GetListEmail(self):
- return self.getListAddress()
-
def GetMemberAdminEmail(self, member):
"""Usually the member addr, but modified for umbrella lists.
=== modified file 'Mailman/app/styles.py'
--- a/Mailman/app/styles.py 2007-10-10 02:18:14 +0000
+++ b/Mailman/app/styles.py 2007-10-10 04:16:12 +0000
@@ -17,6 +17,12 @@
"""Application of list styles to new and existing lists."""
+__metaclass__ = type
+__all__ = [
+ 'DefaultStyle',
+ 'style_manager',
+ ]
+
import datetime
from operator import attrgetter
@@ -27,14 +33,8 @@
from Mailman.Errors import DuplicateStyleError
from Mailman.app.plugins import get_plugins
from Mailman.configuration import config
-from Mailman.interfaces import Action, IStyle, IStyleManager
-
-
-__metaclass__ = type
-__all__ = [
- 'DefaultStyle',
- 'style_manager',
- ]
+from Mailman.interfaces import (
+ Action, IStyle, IStyleManager, NewsModeration, Personalization)
@@ -109,7 +109,7 @@
mlist.digest_members = {}
mlist.next_digest_number = 1
mlist.nondigestable = config.DEFAULT_NONDIGESTABLE
- mlist.personalize = False
+ mlist.personalize = Personalization.none
# New sender-centric moderation (privacy) options
mlist.default_member_moderation = (
config.DEFAULT_DEFAULT_MEMBER_MODERATION)
@@ -126,7 +126,8 @@
mlist.reject_these_nonmembers = []
mlist.discard_these_nonmembers = []
mlist.forward_auto_discards = config.DEFAULT_FORWARD_AUTO_DISCARDS
- mlist.generic_nonmember_action =
config.DEFAULT_GENERIC_NONMEMBER_ACTION
+ mlist.generic_nonmember_action = (
+ config.DEFAULT_GENERIC_NONMEMBER_ACTION)
mlist.nonmember_rejection_notice = ''
# Ban lists
mlist.ban_list = []
@@ -192,7 +193,7 @@
mlist.news_prefix_subject_too = True
# In patch #401270, this was called newsgroup_is_moderated, but the
# semantics weren't quite the same.
- mlist.news_moderation = False
+ mlist.news_moderation = NewsModeration.none
# Topics
#
# `topics' is a list of 4-tuples of the following form:
=== modified file 'Mailman/bin/gate_news.py'
--- a/Mailman/bin/gate_news.py 2007-09-29 18:55:25 +0000
+++ b/Mailman/bin/gate_news.py 2007-10-10 04:16:12 +0000
@@ -117,7 +117,7 @@
found_to = True
if value <> 'x-beenthere':
continue
- if header[i:] == ': %s' % mlist.GetListEmail():
+ if header[i:] == ': %s' % mlist.posting_address:
beenthere = True
break
if not beenthere:
@@ -146,7 +146,7 @@
del msg['X-Originally-To']
msg['X-Originally-To'] = msg['To']
del msg['To']
- msg['To'] = mlist.GetListEmail()
+ msg['To'] = mlist.posting_address
# Post the message to the locked list
inq = Switchboard(config.INQUEUE_DIR)
inq.enqueue(msg,
=== modified file 'Mailman/bin/withlist.py'
--- a/Mailman/bin/withlist.py 2007-09-29 15:09:14 +0000
+++ b/Mailman/bin/withlist.py 2007-10-10 04:16:12 +0000
@@ -98,10 +98,10 @@
two functions:
def listaddr(mlist):
- print mlist.GetListEmail()
+ print mlist.posting_address
def requestaddr(mlist):
- print mlist.GetRequestEmail()
+ print mlist.request_address
Now, from the command line you can print the list's posting address by running
the following from the command line:
=== modified file 'Mailman/database/model/mailinglist.py'
--- a/Mailman/database/model/mailinglist.py 2007-10-06 19:09:34 +0000
+++ b/Mailman/database/model/mailinglist.py 2007-10-10 04:16:12 +0000
@@ -23,7 +23,7 @@
from Mailman.Utils import fqdn_listname, makedirs, split_listname
from Mailman.configuration import config
-from Mailman.interfaces import IMailingList
+from Mailman.interfaces import IMailingList, Personalization
from Mailman.database.types import EnumType, TimeDeltaType
SPACE = ' '
@@ -124,7 +124,7 @@
has_field('msg_footer', Unicode),
has_field('msg_header', Unicode),
has_field('new_member_options', Integer),
- has_field('news_moderation', Boolean),
+ has_field('news_moderation', EnumType),
has_field('news_prefix_subject_too', Boolean),
has_field('nntp_host', Unicode),
has_field('nondigestable', Boolean),
@@ -132,7 +132,7 @@
has_field('obscure_addresses', Boolean),
has_field('pass_filename_extensions', PickleType),
has_field('pass_mime_types', PickleType),
- has_field('personalize', Integer),
+ has_field('personalize', EnumType),
has_field('post_id', Integer),
has_field('preferred_language', Unicode),
has_field('private_roster', Boolean),
@@ -174,7 +174,9 @@
# autoresponses sent on that date.
self.hold_and_cmd_autoresponses = {}
self.full_path = os.path.join(config.LIST_DATA_DIR, fqdn_listname)
- self.real_name =
string.capwords(SPACE.join(listname.split(UNDERSCORE)))
+ self.personalization = Personalization.none
+ self.real_name = string.capwords(
+ SPACE.join(listname.split(UNDERSCORE)))
makedirs(self.full_path)
# XXX FIXME
=== modified file 'Mailman/docs/cook-headers.txt'
--- a/Mailman/docs/cook-headers.txt 2007-09-21 12:51:38 +0000
+++ b/Mailman/docs/cook-headers.txt 2007-10-10 04:16:12 +0000
@@ -292,3 +292,37 @@
List-Unsubscribe: <http://lists.example.com/listinfo/[EMAIL PROTECTED]>,
<mailto:[EMAIL PROTECTED]>
---end---
+
+
+Personalization
+---------------
+
+The To field normally contains the list posting address. However when
+messages are fully personalized, that header will get overwritten with the
+address of the recipient. The list's posting address will be added to one of
+the recipient headers so that users will be able to reply back to the list.
+
+ >>> from Mailman.interfaces import Personalization, ReplyToMunging
+ >>> mlist.personalize = Personalization.full
+ >>> mlist.reply_goes_to_list = ReplyToMunging.no_munging
+ >>> flush()
+ >>> msg = message_from_string("""\
+ ... From: [EMAIL PROTECTED]
+ ...
+ ... """, Message)
+ >>> process(mlist, msg, {})
+ >>> print msg.as_string()
+ From: [EMAIL PROTECTED]
+ X-BeenThere: [EMAIL PROTECTED]
+ X-Mailman-Version: ...
+ Precedence: list
+ Cc: My test mailing list <[EMAIL PROTECTED]>
+ List-Id: My test mailing list <_xtest.example.com>
+ List-Unsubscribe: <http://lists.example.com/listinfo/[EMAIL PROTECTED]>,
+ <mailto:[EMAIL PROTECTED]>
+ List-Post: <mailto:[EMAIL PROTECTED]>
+ List-Help: <mailto:[EMAIL PROTECTED]>
+ List-Subscribe: <http://lists.example.com/listinfo/[EMAIL PROTECTED]>,
+ <mailto:[EMAIL PROTECTED]>
+ <BLANKLINE>
+ <BLANKLINE>
=== modified file 'Mailman/docs/news-runner.txt'
--- a/Mailman/docs/news-runner.txt 2007-09-29 18:55:25 +0000
+++ b/Mailman/docs/news-runner.txt 2007-10-10 04:16:12 +0000
@@ -116,4 +116,50 @@
<BLANKLINE>
+Newsgroup moderation
+--------------------
+
+When the newsgroup is moderated, an Approved: header with the list's posting
+address is added for the benefit of the Usenet system.
+
+ >>> from Mailman.interfaces import NewsModeration
+ >>> mlist.news_moderation = NewsModeration.open_moderated
+ >>> flush()
+ >>> msg = message_from_string("""\
+ ... From: [EMAIL PROTECTED]
+ ... To: [EMAIL PROTECTED]
+ ... Approved: this gets deleted
+ ...
+ ... """)
+ >>> prepare_message(mlist, msg, {})
+ >>> msg['approved']
+ '[EMAIL PROTECTED]'
+
+ >>> mlist.news_moderation = NewsModeration.moderated
+ >>> flush()
+ >>> msg = message_from_string("""\
+ ... From: [EMAIL PROTECTED]
+ ... To: [EMAIL PROTECTED]
+ ... Approved: this gets deleted
+ ...
+ ... """)
+ >>> prepare_message(mlist, msg, {})
+ >>> msg['approved']
+ '[EMAIL PROTECTED]'
+
+But if the newsgroup is not moderated, the Approved: header is not chnaged.
+
+ >>> mlist.news_moderation = NewsModeration.none
+ >>> flush()
+ >>> msg = message_from_string("""\
+ ... From: [EMAIL PROTECTED]
+ ... To: [EMAIL PROTECTED]
+ ... Approved: this doesn't get deleted
+ ...
+ ... """)
+ >>> prepare_message(mlist, msg, {})
+ >>> msg['approved']
+ "this doesn't get deleted"
+
+
XXX More of the NewsRunner should be tested.
=== modified file 'Mailman/docs/outgoing.txt'
--- a/Mailman/docs/outgoing.txt 2007-09-29 18:55:25 +0000
+++ b/Mailman/docs/outgoing.txt 2007-10-10 04:16:12 +0000
@@ -70,7 +70,8 @@
option to VERP personalized deliveries is set, then the message will be
VERP'd.
- >>> mlist.personalize = True
+ >>> from Mailman.interfaces import Personalization
+ >>> mlist.personalize = Personalization.individual
>>> flush()
>>> config.VERP_PERSONALIZED_DELIVERIES = True
>>> msgdata = dict(foo=1, bar=2)
@@ -96,7 +97,7 @@
Mailman how often to VERP even non-personalized mailing lists. It can be set
to zero, which means non-personalized messages will never be VERP'd.
- >>> mlist.personalize = False
+ >>> mlist.personalize = Personalization.none
>>> flush()
>>> config.VERP_DELIVERY_INTERVAL = 0
>>> msgdata = dict(foo=1, bar=2)
=== modified file 'Mailman/interfaces/__init__.py'
--- a/Mailman/interfaces/__init__.py 2007-08-08 04:24:13 +0000
+++ b/Mailman/interfaces/__init__.py 2007-10-10 04:16:12 +0000
@@ -22,7 +22,10 @@
from zope.interface import implementedBy
from zope.interface.interfaces import IInterface
-__all__ = []
+__all__ = [
+ 'Action',
+ 'NewsModeration',
+ ]
@@ -49,3 +52,22 @@
_populate()
+
+
+
+class Action(Enum):
+ hold = 0
+ reject = 1
+ discard = 2
+ accept = 3
+ defer = 4
+
+
+
+class NewsModeration(Enum):
+ # The newsgroup is not moderated
+ none = 0
+ # The newsgroup is moderated, but allows for an open posting policy.
+ open_moderated = 1
+ # The newsgroup is moderated
+ moderated = 2
=== modified file 'Mailman/interfaces/mailinglist.py'
--- a/Mailman/interfaces/mailinglist.py 2007-10-10 02:18:14 +0000
+++ b/Mailman/interfaces/mailinglist.py 2007-10-10 04:16:12 +0000
@@ -19,6 +19,7 @@
__all__ = [
'IMailingList',
+ 'Personalization',
'ReplyToMunging',
]
@@ -27,6 +28,17 @@
+class Personalization(Enum):
+ none = 0
+ # Everyone gets a unique copy of the message, and there are a few more
+ # substitution variables, but no headers are modified.
+ individual = 1
+ # All of the 'individual' personalization plus recipient header
+ # modification.
+ full = 2
+
+
+
class ReplyToMunging(Enum):
# The Reply-To header is passed through untouched
no_munging = 0
=== modified file 'Mailman/queue/news.py'
--- a/Mailman/queue/news.py 2007-09-29 18:55:25 +0000
+++ b/Mailman/queue/news.py 2007-10-10 04:16:12 +0000
@@ -30,6 +30,7 @@
from Mailman import Utils
from Mailman.configuration import config
+from Mailman.interfaces import NewsModeration
from Mailman.queue import Runner
log = logging.getLogger('mailman.error')
@@ -92,9 +93,10 @@
# software to accept the posting, and not forward it on to the n.g.'s
# moderation address. The posting would not have gotten here if it hadn't
# already been approved. 1 == open list, mod n.g., 2 == moderated
- if mlist.news_moderation in (1, 2):
+ if mlist.news_moderation in (NewsModeration.open_moderated,
+ NewsModeration.moderated):
del msg['approved']
- msg['Approved'] = mlist.GetListEmail()
+ msg['Approved'] = mlist.posting_address
# Should we restore the original, non-prefixed subject for gatewayed
# messages? TK: We use stripped_subject (prefix stripped) which was
# crafted in CookHeaders.py to ensure prefix was stripped from the subject
--
https://code.launchpad.net/~mailman-coders/mailman/3.0
You are receiving this branch notification because you are subscribed to it.
To unsubscribe from this branch go to
https://code.launchpad.net/~mailman-coders/mailman/3.0/+subscription/mailman-checkins.
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
http://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org