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 -- mailman-checkins@python.org To unsubscribe send an email to mailman-checkins-le...@python.org https://mail.python.org/mailman3/lists/mailman-checkins.python.org/ Member address: arch...@jab.org