Abhilash Raj pushed to branch master at GNU Mailman / Mailman Core
Commits:
5688fc46 by Abhilash Raj at 2018-04-28T17:58:05Z
Add description attribute to IStyle, expose it in REST.
- - - - -
c0fd6dc6 by Abhilash Raj at 2018-04-28T17:58:05Z
Merge branch 'J08nY/mailman-list-style-descriptions' into
'master'
Add description attribute to IStyle, expose it in REST.
See merge request mailman/mailman!371
- - - - -
9 changed files:
- src/mailman/docs/NEWS.rst
- src/mailman/interfaces/styles.py
- src/mailman/rest/docs/lists.rst
- src/mailman/rest/lists.py
- src/mailman/rest/tests/test_lists.py
- src/mailman/runners/tests/test_bounce.py
- src/mailman/styles/default.py
- src/mailman/styles/docs/styles.rst
- src/mailman/styles/tests/test_styles.py
Changes:
=====================================
src/mailman/docs/NEWS.rst
=====================================
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -129,6 +129,9 @@ REST
``DELETE`` on the list's ``config/acceptable_aliases`` resource.
(Closes #394)
* Allow setting ``max_message_size`` for a mailing list. (Closes #417)
+* Added new attribute in ``lists/styles`` resource ``styles`` that contains the
+ list of all the styles in Core along with their description. ``style_names``
+ attribute is now deprecated and will be removed in future versions.
3.1.0 -- "Between The Wheels"
=====================================
src/mailman/interfaces/styles.py
=====================================
--- a/src/mailman/interfaces/styles.py
+++ b/src/mailman/interfaces/styles.py
@@ -34,6 +34,9 @@ class IStyle(Interface):
name = Attribute(
"""The name of this style. Must be unique.""")
+ description = Attribute(
+ """A short description of this list style.""")
+
def apply(mailing_list):
"""Apply the style to the mailing list.
=====================================
src/mailman/rest/docs/lists.rst
=====================================
--- a/src/mailman/rest/docs/lists.rst
+++ b/src/mailman/rest/docs/lists.rst
@@ -191,10 +191,13 @@ Apply a style at list creation time
of a particular type, e.g. discussion lists. We can see which styles are
available, and which is the default style.
- >>> dump_json('http://localhost:9001/3.0/lists/styles')
- default: legacy-default
- http_etag: "..."
- style_names: ['legacy-announce', 'legacy-default']
+ >>> json = call_http('http://localhost:9001/3.0/lists/styles')
+ >>> json['default']
+ 'legacy-default'
+ >>> for style in json['styles']:
+ ... print('{}: {}'.format(style['name'], style['description']))
+ legacy-announce: Announce only mailing list style.
+ legacy-default: Ordinary discussion mailing list style.
When creating a list, if we don't specify a style to apply, the default style
is used. However, we can provide a style name in the POST data to choose a
=====================================
src/mailman/rest/lists.py
=====================================
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -414,9 +414,14 @@ class Styles:
def __init__(self):
manager = getUtility(IStyleManager)
+ styles = [dict(name=style.name, description=style.description)
+ for style in manager.styles]
style_names = sorted(style.name for style in manager.styles)
self._resource = dict(
+ # TODO (maxking): style_name is meant for backwards compatibility
+ # and should be removed in 3.3 release.
style_names=style_names,
+ styles=styles,
default=config.styles.default)
def on_get(self, request, response):
=====================================
src/mailman/rest/tests/test_lists.py
=====================================
--- a/src/mailman/rest/tests/test_lists.py
+++ b/src/mailman/rest/tests/test_lists.py
@@ -347,6 +347,28 @@ class TestLists(unittest.TestCase):
self.assertEqual(cm.exception.reason, 'Missing parameters: emails')
+class TestListStyles(unittest.TestCase):
+ """Test /lists/styles."""
+
+ layer = RESTLayer
+
+ def test_styles(self):
+ json, response = call_api('http://localhost:9001/3.0/lists/styles')
+ self.assertEqual(response.status_code, 200)
+ # Remove the variable data.
+ json.pop('http_etag')
+ self.assertEqual(json, {
+ 'style_names': ['legacy-announce', 'legacy-default'],
+ 'styles': [
+ {'name': 'legacy-announce',
+ 'description': 'Announce only mailing list style.'},
+ {'name': 'legacy-default',
+ 'description': 'Ordinary discussion mailing list style.'}
+ ],
+ 'default': 'legacy-default'
+ })
+
+
class TestListArchivers(unittest.TestCase):
"""Test corner cases for list archivers."""
=====================================
src/mailman/runners/tests/test_bounce.py
=====================================
--- a/src/mailman/runners/tests/test_bounce.py
+++ b/src/mailman/runners/tests/test_bounce.py
@@ -227,6 +227,7 @@ class TestStyle:
"""See `IStyle`."""
name = 'test'
+ description = 'A test style.'
def apply(self, mailing_list):
"""See `IStyle`."""
=====================================
src/mailman/styles/default.py
=====================================
--- a/src/mailman/styles/default.py
+++ b/src/mailman/styles/default.py
@@ -17,6 +17,7 @@
"""Application of list styles to new and existing lists."""
+from mailman.core.i18n import _
from mailman.interfaces.styles import IStyle
from mailman.styles.base import (
Announcement, BasicOperation, Bounces, Discussion, Identity, Moderation,
@@ -33,6 +34,7 @@ class LegacyDefaultStyle(
"""The legacy default style."""
name = 'legacy-default'
+ description = _('Ordinary discussion mailing list style.')
def apply(self, mailing_list):
"""See `IStyle`."""
@@ -52,6 +54,7 @@ class LegacyAnnounceOnly(
"""Similar to the legacy-default style, but for announce-only lists."""
name = 'legacy-announce'
+ description = _('Announce only mailing list style.')
def apply(self, mailing_list):
"""See `IStyle`."""
=====================================
src/mailman/styles/docs/styles.rst
=====================================
--- a/src/mailman/styles/docs/styles.rst
+++ b/src/mailman/styles/docs/styles.rst
@@ -49,6 +49,7 @@ New styles must implement the ``IStyle`` interface.
>>> @implementer(IStyle)
... class TestStyle:
... name = 'a-test-style'
+ ... description = 'Testing mailing list style.'
... def apply(self, mailing_list):
... # Just does something very simple.
... mailing_list.display_name = 'TEST STYLE LIST'
@@ -115,6 +116,7 @@ If no style name is provided when creating the list, the
system default style
>>> @implementer(IStyle)
... class AnotherStyle:
... name = 'another-style'
+ ... description = 'Another testing mailing list style.'
... def apply(self, mailing_list):
... # Just does something very simple.
... mailing_list.display_name = 'ANOTHER STYLE LIST'
=====================================
src/mailman/styles/tests/test_styles.py
=====================================
--- a/src/mailman/styles/tests/test_styles.py
+++ b/src/mailman/styles/tests/test_styles.py
@@ -31,14 +31,11 @@ from zope.interface.exceptions import DoesNotImplement
class DummyStyle:
name = 'dummy'
- priority = 1
+ description = 'A dummy style.'
def apply(self, mlist):
pass
- def match(self, mlist, styles):
- styles.append(self)
-
class TestStyle(unittest.TestCase):
"""Test styles."""
View it on GitLab:
https://gitlab.com/mailman/mailman/compare/565b2771985c6b1a470884eb65bd49457b0c452e...c0fd6dc6e628ee3b58b6b54f0f743f6c3fe0bb98
---
View it on GitLab:
https://gitlab.com/mailman/mailman/compare/565b2771985c6b1a470884eb65bd49457b0c452e...c0fd6dc6e628ee3b58b6b54f0f743f6c3fe0bb98
You're receiving this email because of your account on gitlab.com.
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org