| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
| |
- welcome.txt is no longer inserted into subscribeack.txt. This latter is
renamed to welcome.txt as the default welcome message.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
used in welcome and goodbye messages, and supports both language and
mailing list specifications. E.g. mailman:///test@example.com/it/welc.txt
* Schema changes:
- welcome_msg -> welcome_message_uri
- goodbye_msg -> goodbye_message_uri
- send_welcome_msg -> send_welcome_message
- send_goodbye_msg -> send_goodbye_message
* New `ITemplateLoader` utility.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
resources now accept a `held` path component. GETing this returns all held
messages for the mailing list. POSTing to a specific request id under this
url can dispose of the message using `Action` enums.
* `IRequests` interface is removed. Now just use adaptation from
`IListRequests` directly (which takes an `IMailingList` object).
* `handle_message()` now allows for `Action.hold` which is synonymous with
`Action.defer` (since the message is already being held).
* `IListRequests.get_request()` now takes an optional `request_type`
argument to narrow the search for the given request.
- also, print_function is now a standard __future__ import. The template has
been updated, but add this to modules as you edit them.
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
* Separate out the RFC 2369 header adding handler.
* Dynamically calculate the `List-Id` header instead of storing it in the
database. This means it cannot be changed.
* Be sure to clean out any digest .mmdf files when the world is reset.
|
| | |
|
| |
|
|
|
|
| |
deleted through the REST interface. Hierarchical, combined preferences for
members, and system preferences can be read through the REST interface.
(LP: #821438)
|
| |\
| |
| |
| | |
the REST API (LP: #833132). Given by Stephen A. Goss.
|
| | |
| |
| |
| | |
with tests
|
| |\ \
| | |
| | |
| | |
| | | |
all the mailing lists in a specific domain (LP: #829765). Given by
Stephen A. Goss.
|
| | |\| |
|
| | | | |
|
| | | | |
|
| |\ \ \
| |_|/
|/| |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
and exposed to the REST API as their integer equivalents. They are stored
in the database using Storm's UUID type.
- ISubscriptionService.get_member() now takes a UUID
- IUserManager.get_user_by_id() now takes a UUID
* Moderators and owners can be added via REST (LP: #834130). Given by
Stephen A. Goss.
- add_member() grows a `role` parameter.
- ISubscriptionService.join() grows a `role` parameter.
* InvalidEmailAddressError no longer repr()'s its value.
* `address` -> `email` for consistency
- delete_member()
- ISubscriptionService.leave()
* Fixed typo in app/subscriptions.py __all__
* AlreadySubscribedError: attributes are now public.
* More .txt -> .rst renames.
|
| |/ / |
|
| |/
|
|
| |
REST API. (LP: #831660)
|
| |
|
|
|
|
|
|
|
| |
* Use zope.events to signal when a mailing list has been created or deleted.
* Register a handler for the ListDeletedEvent which cleans up member
subscriptions.
* Relax the criteria for find_members(), both internally and in the REST API,
so that the subscriber is not required. E.g. you can now find all members
of a mailing list.
|
| | |
|
| | |
|
| |
|
|
|
|
| |
list. (LP: #825570)
Untested code is broken code.
|
| |
|
|
|
|
| |
member records. Arguments are `subscriber` (email address to search for -
required), `fqdn_listname` (optional), and `role` (i.e. MemberRole -
optional). (LP: #799612)
|
| |
|
|
|
| |
for consistency. This changes the REST API for mailing list
resources. (LP: #787599)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
the REST API. (LP: #643949)
* New resource path in REST API: /addresses/<email>/memberships gets all the
memberships for a given email address.
* In the REST API, PUTting or PATCHing a list configuration now returns a 204
(No Content) success code instead of a 200 success code with an empty body.
* When a user is subscribed with their preferred address, changing the
preferred address also changes all subscriptions.
* When a user is subscribed with a specific address, their subscription can be
changed to any verified address they control.
* Use a new naming scheme for doctests with multiple mailing lists.
|
| |
|
|
|
|
|
|
| |
* ISubscriptionService.join(): address -> subscriber. This is not backward
compatible with the previous API!
* Add get_user_by_id() to the IUserManager interface. It was already
implemented, but the interface was missing the definition.
* MissingUserError: new exception, purely for the REST API.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
path at the root of the resource tree (i.e. /members/X) and because when
members can be subscribed by their IUser record (for preferred address), their
canonical location cannot contain the address they are subscribed with. When
their preferred address changes (without otherwise touching their membership),
this address will change and that's not good for a canonical location.
Other changes:
* Added IMember.member_id attribute
* Added ISubscriptionService.get_member() so member records can be retrieve by
member id.
* We can now get individual members by id via the REST API.
* Extend the UniqueIDFactory so that it can take a 'context' (defaulting to
None). The context is only used in the testing infrastructure so that
separate files can be used for user ids and member ids. Otherwise, we'd
have gaps in those sequences.
* When *not* in testing mode, ensure that UIDs cannot be reused by keeping a
table of all UIDs ever handed out. We *should* never get collisions, but
this ensures it.
* Clean up mailman.sql
|
| | |
|
| |
|
|
|
|
|
| |
* Fix a case in a list's /members API where the listname is bogus.
* Catch NotAMemberError form delete_member() and return not_found.
* Refactor REST helpers so that call_api() can be used in unittests without
doing any prints to stdout.
|
| |
|
|
|
|
|
|
|
|
| |
appropriate.
Also:
* When an Address instance is created, set its registered_on attribute.
* Users may not have a password or real_name, so only include those attributes
in the REST API for Users if they are set.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Add a 'uid factory' which allows us to return predictable unique ids for
various testing purposes, e.g. user ids. This should work even in the case
of cross-subprocess uid generation.
* REST access to individual users, or the set of all users.
* User objects now have a created_on attribute.
* Users can be created through the web, but must have an email address.
* Add a [devmode] 'testing' variable for communicating to qrunner subprocesses
that we're running in testing mode. This allows us to coordinate factories
and such in the qrunner processes.
* layers.is_testing() for more consistent API.
* Give AddressError a .address attribute for better diagnostics.
|
| |\ |
|
| | |
| |
| |
| |
| | |
* Find users by user_id via the user manager.
* Extend the repr of users to include the user id.
|
| |/
|
|
| |
* Remove mmsitepass.py - there is no more site password.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Now, nonmembers are represented by a separate roster of IMembers, the latter
which has grown a `moderation_action` enum. When that action is `defer`, then
the normal processing rules apply. Anything else and the `moderation` chain
is jumped to for a shortcut to moderation (which may include immediate
acceptance).
TODO: handle unregistered nonmembers.
Details:
* The member-moderation rule is renamed to just moderation, and handles both
members and nonmembers (though the latter must currently be registered).
* The moderation rule is moved up in the builtin chain. It is now checked
after `approved`, `emergency`, and `loop`, but before the normal moderation
checks. This means that nonmember postings will be (by default) held much
earlier.
* IMember.is_moderated is removed.
* IMember.moderation_action is added.
* IMailingList.default_member_moderation is removed.
* IMailingList.default_member_action and
IMailingList.default_nonmember_action are added.
* MemberRole.nonmember is added.
|
| |
|
|
|
|
| |
* member_moderation_action exposed in IMailingList
* REST configuration test for member_moderation_action, send_welcome_msg, and
welcome_msg.
|
| |\
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
lp:~jimmy-sigint/mailman/restapi_additional_attributes
Ostensibly, this adds support for a few additional attributes through the REST
API:
* default_member_moderation
* generic_nonmember_action
* member_moderation_action
* reply_goes_to_list
* send_welcome_msg
* welcome_msg
However, I had never previously fleshed out the conversion of
default_member_moderation and member_moderation_action into the MM3 way of
things. That is now done. Non-member moderation still needs to be done.
Specific changes:
* mailman.chains.base.Chain no longer self registers
* The built-in chain gets a new link for checking 'member-moderation'. If
this rule matches, it jumps to the 'member-moderation' chain, which checks
member_moderation_action and returns a link that jumps to the appropriate
terminal chain.
* Chain initialization is done by the same auto-detection as rules, handlers,
etc. The one tricky thing is that abstract base classes such as Chain and
TerminalChainBase can't be instantiated. For now, there's an ugly special
case to skip these.
* default_member_moderation is now exposed in the IMailingList interface.
* Member.is_moderated gets set in the constructor from the mailing list's
default_member_moderation.
* The 'moderation' rule is renamed 'member-moderation'.
TODO:
* Work out non-member moderation
* Add member_moderation_action to IMailingList
* Double check tests for reply_goes_to_list, send_welcome_msg, and welcome_msg
|
| | |
| |
| |
| | |
member_moderation_action, default_member_moderation and generic_nonmember_action to the writable attributes in the REST service
|
| | |
| |
| |
| | |
JSON representation.
|
| |/
|
|
|
|
| |
ports are still hard coded.
Also, 'bin/mailman info' dumps the REST root url and credentials.
|
| |
|
|
| |
* Provide a better example of how to use basic auth in the rest api call
|
| |\
| |
| |
| | |
corrections by Barry.
|