jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/671399 )
Change subject: Add support for revision delete ......................................................................
Add support for revision delete
Bug: T276726 Change-Id: Iff43d0711f7845eaded3008829d3ff36c61349ca --- M pywikibot/page/_revision.py M pywikibot/site/_apisite.py M tests/site_tests.py 3 files changed, 173 insertions(+), 0 deletions(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/page/_revision.py b/pywikibot/page/_revision.py index 9e8eb51..efd8cef 100644 --- a/pywikibot/page/_revision.py +++ b/pywikibot/page/_revision.py @@ -40,6 +40,7 @@ map_.update(anon='anon' in map_) map_.update(minor='minor' in map_) map_.update(userhidden='userhidden' in map_) + map_.update(commenthidden='commenthidden' in map_)
map_.setdefault('comment', '') map_.setdefault('user', '') diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py index 04c66ea..157f07a 100644 --- a/pywikibot/site/_apisite.py +++ b/pywikibot/site/_apisite.py @@ -3072,6 +3072,72 @@ total=total, parameters=parameters)
+ @need_right('deleterevision') + def deleterevs(self, targettype: str, ids, *, + hide=None, show=None, reason='', target=None): + """Delete or undelete specified page revisions, file versions or logs. + + @see: U{https://www.mediawiki.org/wiki/API:Revisiondelete%7D + + If more than one target id is provided, the same action is taken for + all of them. + + @param targettype: Type of target. One of "archive", "filearchive", + "logging", "oldimage", "revision". + @param ids: Identifiers for the revision, log, file version or archive. + @type ids: int, str, or list of int or str + @param hide: What to delete. Can be "comment", "content", "user" or a + combination of them in pipe-separate form such as "comment|user". + @type hide: str or list of str + @param show: What to undelete. Can be "comment", "content", "user" or + a combination of them in pipe-separate form such as "comment|user". + @type show: str or list of str + @param reason: Deletion reason. + @param target: Page object or page title, if required for the type. + """ + if isinstance(target, pywikibot.Page): + page = target + target = page.title() + elif target: + page = pywikibot.Page(self, target) + + token = self.tokens['delete'] + params = { + 'action': 'revisiondelete', + 'token': token, + 'type': targettype, + 'ids': ids, + 'hide': hide, + 'show': show, + 'target': target, + 'reason': reason} + + req = self._simple_request(**params) + + if target: + self.lock_page(page) + + try: + req.submit() + except api.APIError as err: + errdata = { + 'site': self, + 'title': target, + 'user': self.user(), + } + if err.code in self._dl_errors: + raise Error(self._dl_errors[err.code] % errdata) + pywikibot.debug("revdelete: Unexpected error code '%s' received." + % err.code, + _logger) + raise + else: + if target: + page.clear_cache() + finally: + if target: + self.unlock_page(page) + def users(self, usernames): """Iterate info about a list of users by name or IP.
diff --git a/tests/site_tests.py b/tests/site_tests.py index 2e6c595..b6c42eb 100644 --- a/tests/site_tests.py +++ b/tests/site_tests.py @@ -2162,6 +2162,112 @@ revs = list(p.revisions()) self.assertGreater(len(revs), 2)
+ def test_revdel_page(self): + """Test deleting and undeleting page revisions.""" + site = self.get_site() + # Verify state + site.deleterevs('revision', ids=[219993, 219994], hide='', + show='content|comment|user', + reason='pywikibot unit tests') + + # Single revision + site.deleterevs('revision', '219994', hide='user', + reason='pywikibot unit tests') + + p1 = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') + revs = list(p1.revisions()) + for rev in revs: + if rev['revid'] != 219994: + continue + self.assertTrue(rev['userhidden']) + + # Multiple revisions + site.deleterevs('revision', '219993|219994', hide='comment', + reason='pywikibot unit tests') + + p2 = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') + revs = list(p2.revisions()) + for rev in revs: + if rev['revid'] != 219994: + continue + self.assertTrue(rev['userhidden']) + self.assertTrue(rev['commenthidden']) + + # Concurrently show and hide + site.deleterevs('revision', ['219993', '219994'], hide='user|content', + show='comment', reason='pywikibot unit tests') + + p3 = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') + revs = list(p3.revisions()) + for rev in revs: + if rev['revid'] == 219993: + self.assertTrue(rev['userhidden']) + elif rev['revid'] == 219994: + self.assertFalse(rev['commenthidden']) + + # Cleanup + site.deleterevs('revision', [219993, 219994], + show='content|comment|user', + reason='pywikibot unit tests') + + def test_revdel_file(self): + """Test deleting and undeleting file revisions.""" + site = pywikibot.Site('test') + + # Verify state + site.deleterevs('oldimage', [20210314184415, 20210314184430], + show='content|comment|user', + reason='pywikibot unit tests', + target='File:T276726.png') + + # Single revision + site.deleterevs('oldimage', '20210314184415', hide='user', show='', + reason='pywikibot unit tests', + target='File:T276726.png') + + fp1 = pywikibot.FilePage(site, 'File:T276726.png') + site.loadimageinfo(fp1, history=True) + for idx, v in fp1._file_revisions.items(): + if v['timestamp'] == pywikibot.Timestamp(2021, 3, 14, 18, 43, 57): + self.assertTrue(hasattr(v, 'userhidden')) + + # Multiple revisions + site.deleterevs('oldimage', '20210314184415|20210314184430', + hide='comment', reason='pywikibot unit tests', + target='File:T276726.png') + + fp2 = pywikibot.FilePage(site, 'File:T276726.png') + site.loadimageinfo(fp2, history=True) + for idx, v in fp2._file_revisions.items(): + if v['timestamp'] == pywikibot.Timestamp(2021, 3, 14, 18, 43, 57): + self.assertTrue(hasattr(v, 'commenthidden')) + if v['timestamp'] == pywikibot.Timestamp(2021, 3, 14, 18, 44, 17): + self.assertTrue(hasattr(v, 'commenthidden')) + + # Concurrently show and hide + site.deleterevs('oldimage', ['20210314184415', '20210314184430'], + hide='user|content', show='comment', + reason='pywikibot unit tests', + target='File:T276726.png') + + fp3 = pywikibot.FilePage(site, 'File:T276726.png') + site.loadimageinfo(fp3, history=True) + for idx, v in fp3._file_revisions.items(): + if v['timestamp'] == pywikibot.Timestamp(2021, 3, 14, 18, 43, 57): + self.assertFalse(hasattr(v, 'commenthidden')) + self.assertFalse(hasattr(v, 'userhidden')) + self.assertFalse(hasattr(v, 'filehidden')) + if v['timestamp'] == pywikibot.Timestamp(2021, 3, 14, 18, 44, 17): + self.assertFalse(hasattr(v, 'commenthidden')) + self.assertFalse(hasattr(v, 'userhidden')) + self.assertFalse(hasattr(v, 'filehidden')) + + # Cleanup + site.deleterevs('oldimage', [20210314184415, 20210314184430], + show='content|comment|user', + reason='pywikibot unit tests', + target='File:T276726.png') + def test_delete_oldimage(self): """Test deleting and undeleting specific versions of files.""" site = self.get_site()
pywikibot-commits@lists.wikimedia.org