jenkins-bot has submitted this change and it was merged.
Change subject: Implementing rollback in revertbot and rollbacktoken in revision class ......................................................................
Implementing rollback in revertbot and rollbacktoken in revision class
Added option of -rollback which allows rollbacking instead of simple reverting, This can be useful in cases like Wikidata or Flow boards.
In order to make this happen I had to add rollbacktoken as a property of revision
Change-Id: I78d4181878cce00fd65194f2a3b12f57cd096977 --- M pywikibot/data/api.py M pywikibot/page.py M pywikibot/site.py M scripts/revertbot.py 4 files changed, 44 insertions(+), 21 deletions(-)
Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py index 157a99b..e3b7872 100644 --- a/pywikibot/data/api.py +++ b/pywikibot/data/api.py @@ -1006,7 +1006,8 @@ anon='anon' in rev, comment=rev.get('comment', u''), minor='minor' in rev, - text=rev.get('*', None) + text=rev.get('*', None), + rollbacktoken=rev.get('rollbacktoken', None) ) page._revisions[revision.revid] = revision
diff --git a/pywikibot/page.py b/pywikibot/page.py index b19c09a..059cf1b 100644 --- a/pywikibot/page.py +++ b/pywikibot/page.py @@ -1268,22 +1268,24 @@ return result
def fullVersionHistory(self, reverseOrder=False, step=None, - total=None): + total=None, rollback=False): """Iterate previous versions including wikitext.
Takes same arguments as getVersionHistory.
+ @param rollback: Returns rollback token. @return: A generator that yields tuples consisting of revision ID, edit date/time, user name and content
""" self.site.loadrevisions(self, getText=True, rvdir=reverseOrder, - step=step, total=total) + step=step, total=total, rollback=rollback) return [(self._revisions[rev].revid, self._revisions[rev].timestamp, self._revisions[rev].user, - self._revisions[rev].text + self._revisions[rev].text, + self._revisions[rev].rollbacktoken ) for rev in sorted(self._revisions, reverse=not reverseOrder) ] @@ -3102,7 +3104,7 @@
"""A structure holding information about a single revision of a Page.""" def __init__(self, revid, timestamp, user, anon=False, comment=u"", - text=None, minor=False): + text=None, minor=False, rollbacktoken=None): """All parameters correspond to object attributes (e.g., revid parameter is stored as self.revid)
@@ -3129,6 +3131,7 @@ self.anon = anon self.comment = comment self.minor = minor + self.rollbacktoken = rollbacktoken
class Link(ComparableMixin): diff --git a/pywikibot/site.py b/pywikibot/site.py index 7e621a3..3a1f425 100644 --- a/pywikibot/site.py +++ b/pywikibot/site.py @@ -1807,7 +1807,7 @@ def loadrevisions(self, page, getText=False, revids=None, startid=None, endid=None, starttime=None, endtime=None, rvdir=None, user=None, excludeuser=None, - section=None, sysop=False, step=None, total=None): + section=None, sysop=False, step=None, total=None, rollback=False): """Retrieve and store revision information.
By default, retrieves the last (current) revision of the page, @@ -1880,7 +1880,9 @@ rvargs[u"rvprop"] = u"ids|flags|timestamp|user|comment|content" if section is not None: rvargs[u"rvsection"] = unicode(section) - + if rollback: + self.login(sysop=sysop) + rvargs[u"rvtoken"] = "rollback" if revids is None: rvtitle = page.title(withSection=False).encode(self.encoding()) rvargs[u"titles"] = rvtitle diff --git a/scripts/revertbot.py b/scripts/revertbot.py index 2d2caf3..345c72c 100644 --- a/scripts/revertbot.py +++ b/scripts/revertbot.py @@ -8,6 +8,9 @@ ¶ms;
-username Edits of which user need to be reverted. + +-rollback Rollback edits instead of reverting them. + Note that in rollback, no diff would be shown. """ # # (C) Bryan Tong Minh, 2008 @@ -32,17 +35,20 @@
class BaseRevertBot(object): - """ Base revert bot + + """Base revert bot.
Subclass this bot and override callback to get it to do something useful.
""" - def __init__(self, site, user=None, comment=None): + + def __init__(self, site, user=None, comment=None, rollback=False): self.site = site self.comment = comment self.user = user if not self.user: self.user = self.site.username() + self.rollback = rollback
def get_contributions(self, max=500, ns=None): count = 0 @@ -83,25 +89,33 @@ return 'top' in item
def revert(self, item): - if len(pywikibot.Page(pywikibot.Site(), item['title']).fullVersionHistory(total=2)) > 1: - rev = pywikibot.Page(pywikibot.Site(), item['title']).fullVersionHistory(total=2)[1] + history = pywikibot.Page(self.site, item['title']).fullVersionHistory( + total=2, rollback=self.rollback) + if len(history) > 1: + rev = history[1] else: return False - comment = i18n.twtranslate(pywikibot.Site(), 'revertbot-revert', {'revid': rev[0], 'author': rev[2], 'timestamp': rev[1]}) - if self.comment: comment += ': ' + self.comment - page = pywikibot.Page(self.site, item['title']) pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title(asLink=True, forceInterwiki=True, textlink=True)) - old = page.text - page.text = rev[3] - pywikibot.showDiff(old, page.text) - page.save(comment) - return comment + if not self.rollback: + old = page.text + page.text = rev[3] + pywikibot.showDiff(old, page.text) + page.save(comment) + return comment + try: + pywikibot.data.api.Request(action="rollback", title=page.title(), user=self.user, + token=rev[4], markbot=1).submit() + except pywikibot.data.api.APIError as e: + if e == "badtoken: Invalid token": + pywikibot.out("There is an issue for rollbacking the edit, Giving up") + return False + return u"The edit(s) made in %s by %s was rollbacked" % (page.title(), self.user)
def log(self, msg): pywikibot.output(msg) @@ -112,7 +126,7 @@ def callback(self, item): if 'top' in item: page = pywikibot.Page(self.site, item['title']) - text = page.get() + text = page.get(get_redirect=True) pattern = re.compile(u'[[.+?:.+?..+?]]', re.UNICODE) return pattern.search(text) >= 0 return False @@ -120,6 +134,7 @@
def main(): user = None + rollback = False for arg in pywikibot.handleArgs(): if arg.startswith('-username'): if len(arg) == 9: @@ -127,7 +142,9 @@ u'Please enter username of the person you want to revert:') else: user = arg[10:] - bot = myRevertBot(site=pywikibot.Site(), user=user) + elif arg == '-rollback': + rollback = True + bot = myRevertBot(site=pywikibot.Site(), user=user, rollback=rollback) bot.revert_contribs()
if __name__ == "__main__":