| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
| |
API. GetPreferredLanguage() -> getMemberLanguage()
|
| |
|
|
| |
API. getMemberTopics()
|
| | |
|
| |
|
|
| |
GetPreferredLanguage() -> getMemberLanguage()
|
| |
|
|
|
| |
SetPreferredLanguage() -> setMemberLanguage(); setMemberTopics();
getMemberTopics().
|
| |
|
|
|
|
|
|
|
|
|
|
| |
confirmations. :) Clicking on the emailed confirm url now brings up a
screen which requires the user to /then/ click on an explicit Confirm
button. They can also cancel their requested action.
So far, implemented subscription, unsubscription, and change of
address requests. Eventually this will include posting holds, etc.
Subscription confirmation screen allows them to override some values
they entered in the original request (but not, of course, the email
address!).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
GetPreferredLanguage() -> getMemberLanguage(). Note this isn't
finished yet since there are still some direct access to
mlist.members. :(
Use the UserDesc helper class.
membership_options(): When calculating the length of the realname
field, include the email addresses. Since this fits in the same
table cell, the text box should be the max of the email addresses
or realnames.
Also, always include the realname TextBox, even if there is no
realname for the user.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
member, er, isn't a member. :)
getMemberOption(), getMemberName(), removeMember(),
changeMemberAddress(), setMemberPassword(), setMemberLanguage(),
setMemberOption(), setMemberName(): Use __assertIsMember().
getMemberLanguage(): If the address isn't a member of the list, return
the list's default language instead of raising an exception.
getMemberTopics(): New API method which returns the list of topics the
member is interested in.
addNewMember(): Raise MMAlreadyAMember if the new member address is,
er, um, already a member. Also, don't use setMemberOption() to
set the mm_cfg.Digests flag because otherwise you'll get an
AlreadyReceivingDigests exception. Set the user_options dict
directly instead.
changeMemberAddress(): Grow a `nodelete' argument, defaulting to 0,
which inhibits the normal deletion of the oldaddress after the
change (used in bin/clone_members). Also, be sure to convert the
fullname from the oldaddress to the newaddress.
setMemberTopics(): New API method which sets the list of topics the
member is interested in.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
the list's default language instead of raising an exception.
getMemberTopics(): New API method which returns the list of topics the
member is interested in.
changeMemberAddress(): Grow a `nodelete' argument, defaulting to 0,
which inhibits the normal deletion of the oldaddress after the
change (used in bin/clone_members).
setMemberTopics(): New API method which sets the list of topics the
member is interested in.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
GetPreferredLanguage() -> getMemberLanguage()
ApprovedChangeMemberAddress(): When changing the addresses globally,
watch out for a list that has the newaddress already subscribed.
Skip it in that case (but there probably should be some way of
reporting this situation back to the caller).
ProcessConfirmation(): Optional argument userdesc_overrides,
defaulting to None, which allows the caller to override parts of
the subscription record. This is used in the confirm screen to,
e.g. override the real name supplied in the original listinfo
subscription request.
Also, use the UserDesc helper class.
When processing a CHANGE_OF_ADDRESS, return both the oldaddr and
the new addr.
SetPreferredLanguage(), GetPreferredLanguage(): Removed. Use the
MemberAdaptor API methods instead.
|
| |
|
|
|
|
|
|
| |
GetPreferredLanguage() -> getMemberLanguage()
ProcessSubscribeCmd(): Update for new AddMember() signature (requires
a UserDesc instance). This still needs to be fixed so that the
real name is extracted from the From: line.
|
| |
|
|
|
|
| |
getMemberLanguage() instead of GetPreferredLanguage().
__handlesubscription(): Use UserDesc convenience class.
|
| | |
|
| |
|
|
| |
GetPreferredLanguage() -> getMemberLanguage()
|
| |
|
|
| |
as the internal name.
|
| |
|
|
| |
ArchiveFileName().
|
| | |
|
| | |
|
| |
|
|
| |
there's a "version" key.
|
| | |
|
| |
|
|
|
| |
to add each language so that it looks the same here as in a user's
mm_cfg.py file. Add the French and Japanese entries.
|
| | |
|
| |
|
|
| |
attribute.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
private_archive_file_dir, or archive_directory. All three can be
calculated when needed, and doing it that way instead improves the
mobility of lists.
archive_dir(): Return the path previously kept in archive_directory,
by calculating it on the fly.
ArchiveFileName(): Use archive_dir() to calculate the path to the
actual .mbox file.
CheckHTMLArchiveDir(): use archive_dir() to calculate the link paths.
|
| |
|
|
|
|
|
|
|
|
|
| |
attribute to those that should be zapped:
public_archive_file_dir
private_archive_file_dir
archive_directory
All three can be calculated, and it makes moving a list much easier if
they are, instead of being kept as attributes in the list.
|
| |
|
|
| |
during the Load(), unlock the list and re-raise the exception.
|
| |
|
|
| |
_() string expects.
|
| | |
|
| |
|
|
| |
ProcessConfirmation(): Use the new ApprovedAddMember() interface.
|
| |
|
|
|
|
|
|
| |
form, and defaulting to mlist.preferred_language.
process_form(): Suck the fullname value out of the form, defaulting to
the empty string. Call AddMember() with the new and improved
interface.
|
| |
|
|
|
|
| |
form, and defaulting to mlist.preferred_language.
list_listinfo(): Add a replacement for the (new) fullname box.
|
| |
|
|
|
|
|
| |
called, be sure to catch MMNeedApproval, which can be raised if
subscriptions are confirm+approve.
(Yeah, I know this is eventually going to get rewritten...)
|
| |
|
|
| |
requests database automatically updates its schema now.
|
| |
|
|
|
|
|
| |
don't unquote the lines. Rewrite this function to not use
ApprovedAddMembers() -- which has been removed -- but instead to
loop over ApprovedAddMember(), keeping track of the results of
each individual addition.
|
| | |
|
| | |
|
| |
|
|
|
| |
changeMemberAddress(): If user_options doesn't have an entry for
memberkey, flags should default to 0, not None.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
__opendb(): Automatically update the schema based on the 'version'
entry (or lack thereof). Specifically, add a fullname field to
any held SUBSCRIPTION entries, and a msgdata dictionary to any
HELDMSG entries (but only if they don't have enough fields). This
update is currently keyed off the lack of 'version' entry; after
the update 'version' is set to REQUESTS_FILE_SCHEMA_VERSION.
__closedb(): Set the 'version' entry to REQUESTS_FILE_SCHEMA_VERSION
NumRequestsPending(): Subtract one from the length of the dictionary
to account for the internal bookkeeping 'version' entry.
__handlepost(): Remove the backwards compatibility hack for pre 2.0b3,
since __opendb() now does this.
HoldSubscription(): Accept a fullname field.
__handlesubscription(): Unpack the fullname field.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
do it now is to loop over ApprovedAddMember() -- which no longer
Save()'s after each addition! -- catching any exceptions that it
might raise. The whole API for ApprovedAddMembers() was gross.
AddMember(): Change the signature so that it takes only two arguments
(the cancerous growth of the parameters was becoming a
nightmare). The first argument is a "userdesc", essentially an
instance with some well defined public attributes, and the old
"remote" parameter.
Any parsing of strings into fullname, emailname should be done
before AddMember() is called. userdesc holds everything relevant
about this subscription request: the language, password, digest
flag, etc.
AddMember() still validates the email address, checks to see if
its already a member, and applies the list's subscription policy.
ApprovedAddMember(): This now does all the work of adding a new
member, and setting their digest flag. It also sends the
subscriber an acknowledgement, and the admin the subscribeack.
It assumes that the subscription request has passed list policy.
ProcessConfirmation(): Remove the backwards compatibility hack for
pre-2.1a3 entries in the requests.db. That database automatically
updates its schema now.
|
| |
|
|
|
|
| |
full names are shown along with the email address (if it is
known). Also, backwards compatibility with pre-2.1a3 pending
database records (before a3 they didn't include the fullname).
|
| | |
|
| |
|
|
| |
AttributeErrors, which can mask real bugs.
|
| |
|
|
| |
"getUserOption"). Found by Mentor Cana.
|
| |
|
|
| |
`mysterious' eval() call.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
to send it. Thanks to the beauty of optional arguments, this changed the
fullname into the password, and used the password as the 'digest' flag,
causing all new members to be considered digest members ;P
ProcessConfirmation(): Adjust to the fact that the subscription info now
carries the fullname too. Also change the error message so the printf
operator doesn't complain about 'not all arguments converted' when 'data' is
a sequence (which it is guaranteed to be.)
|
| |
|
|
| |
contained it.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
to further cull the recipients.
do_topic_filters(): For each recipient of the regular delivery
message, if there are no topic hits, check the
ReceiveNonmatchingTopics option to see whether this recipient should
get the message. If there are topic hits, remove the recipient unless
they've indicated an interest in this topic (or they haven't specified
any interests).
|
| | |
|