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}
+
+ 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()
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/671399
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Iff43d0711f7845eaded3008829d3ff36c61349ca
Gerrit-Change-Number: 671399
Gerrit-PatchSet: 13
Gerrit-Owner: Huji <huji.huji(a)gmail.com>
Gerrit-Reviewer: DannyS712 <dannys712.wiki(a)gmail.com>
Gerrit-Reviewer: Ebrahim <ebrahim(a)gnu.org>
Gerrit-Reviewer: Huji <huji.huji(a)gmail.com>
Gerrit-Reviewer: Matěj Suchánek <matejsuchanek97(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged