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

Reply via email to