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]