Mark Sapiro pushed to branch master at GNU Mailman / Mailman Core
Commits:
81e76fe1 by Mark Sapiro at 2021-05-01T15:36:52-07:00
mlist.administrators.get_member() returns owner if target is owner and
moderator.
- - - - -
732e97a3 by Mark Sapiro at 2021-05-01T23:05:39+00:00
Merge branch 'who' into 'master'
mlist.administrators.get_member() returns owner if target is owner and
moderator.
Closes #888
See merge request mailman/mailman!850
- - - - -
4 changed files:
- src/mailman/docs/NEWS.rst
- src/mailman/interfaces/roster.py
- src/mailman/model/roster.py
- src/mailman/model/tests/test_roster.py
Changes:
=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -54,6 +54,8 @@ Bugs
(Closes #859)
* The ``mailinglist`` table ``info`` column is changed to Text. (Closes #840
and #886)
+* The mailing list administrators roster ``get_member()`` method now returns
+ the owner if the target is both an owner and moderator. (Closes #888)
Command line
------------
=====================================
src/mailman/interfaces/roster.py
=====================================
@@ -57,6 +57,9 @@ class IRoster(Interface):
indirectly through a user's preferred address. In this case,
this API always returns the explicit address. Use
``get_memberships()`` to return them all.
+ Likewise, an email can be a member of the administrators roster,
+ both as an owner and as a moderator. In this case, this API will
+ return the owner.
:param email: The email address to search for.
:type email: string
=====================================
src/mailman/model/roster.py
=====================================
@@ -166,7 +166,7 @@ class OwnerRoster(AbstractRoster):
@public
class ModeratorRoster(AbstractRoster):
- """Return all the owners of a list."""
+ """Return all the moderators of a list."""
name = 'moderator'
role = MemberRole.moderator
@@ -188,12 +188,19 @@ class AdministratorRoster(AbstractRoster):
@dbconnection
def get_member(self, store, email):
"""See `IRoster`."""
- return store.query(Member).filter(
+ members = store.query(Member).filter(
Member.list_id == self._mlist.list_id,
or_(Member.role == MemberRole.moderator,
Member.role == MemberRole.owner),
Address.email == email,
- Member.address_id == Address.id).one_or_none()
+ Member.address_id == Address.id).all()
+ if len(members) == 0:
+ return None
+ for member in members:
+ if member.role == MemberRole.owner:
+ return member
+ assert len(members) == 1, 'mlist.administrators has too many members'
+ return members[0]
@public
=====================================
src/mailman/model/tests/test_roster.py
=====================================
@@ -120,6 +120,26 @@ class TestMailingListRoster(unittest.TestCase):
self.assertEqual(self._mlist.digest_members.member_count, 1)
self.assertEqual(self._mlist.subscribers.member_count, 4)
+ def test_various_administrator_returns(self):
+ # Anne is an owner, Bart is a moderator and Cris is neither.
+ self._mlist.subscribe(self._anne, role=MemberRole.owner)
+ self._mlist.subscribe(self._bart, role=MemberRole.moderator)
+ owner = self._mlist.administrators.get_member(self._anne.email)
+ moderator = self._mlist.administrators.get_member(self._bart.email)
+ nobody = self._mlist.administrators.get_member(self._cris.email)
+ self.assertEqual(owner.role, MemberRole.owner)
+ self.assertEqual(moderator.role, MemberRole.moderator)
+ self.assertIsNone(nobody)
+
+ def test_address_is_both_owner_and_moderator(self):
+ # Anne is both owner and moderator. The administrators.get_member()
+ # method returns the owner.
+ self._mlist.subscribe(self._anne, role=MemberRole.owner)
+ self._mlist.subscribe(self._anne, role=MemberRole.moderator)
+ self.assertEqual(self._mlist.administrators.member_count, 2)
+ admin = self._mlist.administrators.get_member(self._anne.email)
+ self.assertEqual(admin.role, MemberRole.owner)
+
class TestMembershipsRoster(unittest.TestCase):
"""Test the memberships roster."""
View it on GitLab:
https://gitlab.com/mailman/mailman/-/compare/72ceb26d094dbbfb716939b5c2a3a3f66514078c...732e97a3da9b6b3b27d152ea3458794f2c68f724
--
View it on GitLab:
https://gitlab.com/mailman/mailman/-/compare/72ceb26d094dbbfb716939b5c2a3a3f66514078c...732e97a3da9b6b3b27d152ea3458794f2c68f724
You're receiving this email because of your account on gitlab.com.
_______________________________________________
Mailman-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/mailman-checkins.python.org/
Member address: [email protected]