jenkins-bot has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1317588?usp=email )

Change subject: FlaggedRevs: Add BasePage.review and BasePage.unreview
......................................................................

FlaggedRevs: Add BasePage.review and BasePage.unreview

Both methods call the corresponding Site.review_revision()
which provides the interface to the Extension.

Also add tests for these methods.

Bug: T408389
Change-Id: Ia294e1f3dbba8f0527b9d149d119ff7812fafaa0
---
M pywikibot/page/_basepage.py
M tests/flaggedrevs_tests.py
2 files changed, 232 insertions(+), 3 deletions(-)

Approvals:
  Xqt: Looks good to me, approved
  jenkins-bot: Verified




diff --git a/pywikibot/page/_basepage.py b/pywikibot/page/_basepage.py
index a4f6fdd..b11cced 100644
--- a/pywikibot/page/_basepage.py
+++ b/pywikibot/page/_basepage.py
@@ -23,6 +23,7 @@
 from pywikibot.cosmetic_changes import CANCEL, CosmeticChangesToolkit
 from pywikibot.exceptions import (
     Error,
+    InconsistentTitleError,
     InvalidPageError,
     IsNotRedirectPageError,
     IsRedirectPageError,
@@ -458,11 +459,21 @@
         """Return an old revision of this page.

         .. version-added:: 9.6
+        .. version-changed:: 11.7
+           Validate the *oldid* parameter.

         :param oldid: The revid of the revision desired.
-        :param content: If True, retrieve the content of the revision
-            (default False)
+        :param force:  If ``True``, reload revision information from the
+            live site.
+        :param content: If ``True``, retrieve the content of the
+            revision.
+        :raises ValueError: Invalid revision id *oldid*.
+        :raises InconsistentTitleError: The *oldid* does not belong to
+            the current :class:`BasePage`.
         """
+        if type(oldid) is not int or oldid <= 0:
+            raise ValueError(f'Invalid revision id {oldid!r}')
+
         if force or oldid not in self._revisions \
            or (content and self._revisions[oldid].text is None):
             self.site.loadrevisions(self, content=content, revids=oldid)
@@ -622,6 +633,108 @@

         return None

+    def _check_revision(self, revid: int, refresh: bool) -> None:
+        """Check whether the *revid* is valid and belongs to this page."""
+        try:
+            self.get_revision(revid, force=refresh)
+        except InconsistentTitleError as e:
+            raise ValueError(
+                f'Revision {revid} does not belong to {self}'
+            ) from e
+
+    def review(
+        self,
+        *,
+        summary: str | None = None,
+        revid: int | None = None,
+        flag: int | None = None,
+        refresh: bool = False,
+    ) -> None:
+        """Review a revision of this page.
+
+        .. version-added:: 11.7
+
+        .. seealso::
+           - :meth:`unreview`
+           - :attr:`stable_revision_id`
+           - :attr:`latest_revision_id`
+           - :attr:`APISite.review_revision
+             <pywikibot.site._extensions.FlaggedRevsMixin.review_revision>`
+
+        :param summary: Optional review comment.
+        :param revid: Revision ID to review. If None, review the latest
+            revision.
+        :param flag: Set the review flag value.
+        :param refresh: If ``True``, reload revision information from
+            the live site.
+        :raises APIError: On API failure.
+        :raises UnexpectedAPIDataError: Unexpected API data.
+        :raises UnknownExtensionError: FlaggedRevs not available.
+        :raises UserRightsError: User has insufficient rights.
+        :raises ValueError: Invalid *revid* or unsupported *flag* parameter.
+        """
+        if revid is None:
+            if refresh:
+                del self.latest_revision_id
+            revid = self.latest_revision_id
+        else:
+            self._check_revision(revid, refresh)
+
+        self.site.review_revision(
+            revid,
+            summary=summary,
+            flag=flag,
+        )
+
+        # The stable revision may have changed.
+        del self.stable_revision_id
+
+    def unreview(
+        self,
+        *,
+        summary: str | None = None,
+        revid: int | None = None,
+        refresh: bool = False,
+    ) -> None:
+        """Unreview a revision of this page.
+
+        .. version-added:: 11.7
+
+        .. seealso::
+           - :meth:`review`
+           - :attr:`stable_revision_id`
+           - :attr:`APISite.review_revision
+             <pywikibot.site._extensions.FlaggedRevsMixin.review_revision>`
+
+        :param summary: Optional review comment.
+        :param revid: Revision ID to unreview. If None, unreview the
+            latest **stable** revision.
+        :param refresh: If ``True``, reload revision information from
+            the live site.
+        :raises APIError: On API failure.
+        :raises UnexpectedAPIDataError: Unexpected API data.
+        :raises UnknownExtensionError: FlaggedRevs not available.
+        :raises UserRightsError: User has insufficient rights.
+        :raises ValueError: Invalid *revid* parameter.
+        """
+        if revid is None:
+            if refresh:
+                del self.stable_revision_id
+            revid = self.stable_revision_id
+            if revid is None:
+                return
+        else:
+            self._check_revision(revid, refresh)
+
+        self.site.review_revision(
+            revid,
+            summary=summary,
+            unapprove=True,
+        )
+
+        # The stable revision may have changed.
+        del self.stable_revision_id
+
     @property
     def text(self) -> str:
         """Return the current (edited) wikitext, loading it if necessary.
diff --git a/tests/flaggedrevs_tests.py b/tests/flaggedrevs_tests.py
index 08527df..c69e285 100644
--- a/tests/flaggedrevs_tests.py
+++ b/tests/flaggedrevs_tests.py
@@ -11,7 +11,11 @@
 from unittest.mock import MagicMock, patch

 import pywikibot
-from pywikibot.exceptions import APIError, UnknownExtensionError
+from pywikibot.exceptions import (
+    APIError,
+    UnknownExtensionError,
+    UserRightsError,
+)
 from pywikibot.page import Revision
 from tests.aspects import PatchingTestCase, TestCase

@@ -278,6 +282,118 @@
         )


+class TestBasePageReview(TestCase):
+
+    """Test review and unreview methods."""
+
+    family = 'wikipedia'
+    code = 'test2'
+    cache = True
+
+    @classmethod
+    def setUpClass(cls) -> None:
+        """Set up test class."""
+        super().setUpClass()
+        cls.flagged = pywikibot.Page(cls.site, 'BTP')
+        cls.unflagged = pywikibot.Page(cls.site, 'UBTP')
+
+    def test_revision_ids(self):
+        """Test revision ids."""
+        self.assertEqual(self.flagged.stable_revision_id,
+                         self.flagged.latest_revision_id)
+        self.assertIsNotNone(self.unflagged.latest_revision_id)
+        self.assertIsNone(self.unflagged.stable_revision_id)
+
+    def test_review_check_revisions(self):
+        """Test exceptions."""
+        with self.assertRaisesRegex(
+            ValueError,
+            r'Revision 4711 does not belong to \[\[test2:BTP\]\]'
+        ):
+            self.flagged.review(revid=4711)
+        with self.assertRaisesRegex(ValueError, "Invalid revision id '0815'"):
+            self.flagged.review(revid='0815')
+        with self.assertRaisesRegex(ValueError, 'Invalid revision id True'):
+            self.flagged.review(revid=True)
+        with self.assertRaisesRegex(ValueError, 'Invalid revision id 3.14159'):
+            self.flagged.review(revid=3.14159)
+        with self.assertRaisesRegex(ValueError, 'Invalid revision id -273'):
+            self.flagged.review(revid=-273)
+
+    def test_review(self):
+        """Test review calls without site.review_revision."""
+        with self.assertRaisesRegex(
+            UserRightsError,
+            r'User ".+" does not have required user right "review" on site'
+        ):
+            self.flagged.review()
+        self.assertNotHasAttr(self.flagged, '_stable_revision_id')
+
+        with self.assertRaisesRegex(
+            UserRightsError,
+            r'User ".+" does not have required user right "review" on site'
+        ):
+            self.unflagged.review()
+        self.assertNotHasAttr(self.flagged, '_stable_revision_id')
+
+    def test_unreview(self):
+        """Test unreview calls without site.review_revision."""
+        self.assertIsNone(self.unflagged.unreview())
+        self.assertHasAttr(self.unflagged, '_stable_revision_id')
+        self.assertIsNone(self.unflagged.unreview(refresh=True))
+        self.assertHasAttr(self.unflagged, '_stable_revision_id')
+
+        with self.assertRaisesRegex(
+            UserRightsError,
+            r'User ".+" does not have required user right "review" on site'
+        ):
+            self.flagged.unreview()
+        self.assertHasAttr(self.flagged, '_stable_revision_id')
+
+        with self.assertRaisesRegex(
+            UserRightsError,
+            r'User ".+" does not have required user right "review" on site'
+        ):
+            self.flagged.unreview(refresh=True)
+        self.assertHasAttr(self.flagged, '_stable_revision_id')
+
+    def test_review_calls_site(self):
+        """Test review calls site.review_revision."""
+        revid = self.unflagged.latest_revision_id
+
+        with patch.object(
+            self.site,
+            'review_revision',
+            return_value=None,
+        ) as review_revision:
+            self.unflagged.review()
+
+        review_revision.assert_called_once_with(
+            revid,
+            summary=None,
+            flag=None,
+        )
+        self.assertNotHasAttr(self.unflagged, '_stable_revision_id')
+
+    def test_unreview_calls_site(self):
+        """Test unreview calls site.review_revision."""
+        revid = self.flagged.stable_revision_id
+
+        with patch.object(
+            self.site,
+            'review_revision',
+            return_value=None,
+        ) as review_revision:
+            self.flagged.unreview()
+
+        review_revision.assert_called_once_with(
+            revid,
+            summary=None,
+            unapprove=True,
+        )
+        self.assertNotHasAttr(self.flagged, '_stable_revision_id')
+
+
 if __name__ == '__main__':
     with suppress(SystemExit):
         unittest.main()

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1317588?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.wikimedia.org/r/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ia294e1f3dbba8f0527b9d149d119ff7812fafaa0
Gerrit-Change-Number: 1317588
Gerrit-PatchSet: 10
Gerrit-Owner: Xqt <[email protected]>
Gerrit-Reviewer: Tacsipacsi <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: Zache-tool <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to