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 <[email protected]>
Gerrit-Reviewer: DannyS712 <[email protected]>
Gerrit-Reviewer: Ebrahim <[email protected]>
Gerrit-Reviewer: Huji <[email protected]>
Gerrit-Reviewer: Matěj Suchánek <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
_______________________________________________
Pywikibot-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-commits

Reply via email to