jenkins-bot merged this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
api.QueryGenerator: Handle slots during initialization

This is a more general solution that replaces 304e52a and 057a50b.

Bug: T200955
Change-Id: I3afef82836d574d235c849d86c1a552614c3af9b
---
M pywikibot/data/api.py
M pywikibot/site.py
2 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index cc1fa7f..68ea978 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -1412,7 +1412,7 @@
if "action" not in parameters:
raise ValueError("'action' specification missing from Request.")
self.action = parameters['action']
- self.update(parameters)
+ self.update(parameters) # also convert all parameter values to lists
self._warning_handler = None
# Actions that imply database updates on the server, used for various
# things like throttling or skipping actions when we're in simulation
@@ -1612,11 +1612,11 @@

def __contains__(self, key):
"""Implement dict interface."""
- return self._params.__contains__(key)
+ return key in self._params

def __iter__(self):
"""Implement dict interface."""
- return self._params.__iter__()
+ return iter(self._params)

def __len__(self):
"""Implement dict interface."""
@@ -2697,6 +2697,37 @@
# "templates":{"tlcontinue":"310820|828|Namespace_detect"}}
# self.continuekey is a list
self.continuekey = self.modules
+ self._add_slots()
+
+ def _add_slots(self):
+ """Add slots to params if the site supports multi-content revisions.
+
+ On MW 1.32+ the following query parameters require slots to be given
+ when content or contentmodel is requested.
+
+ * prop=revisions
+ * prop=deletedrevisions or
+ * list=allrevisions
+ * list=alldeletedrevisions
+
+ More info:
+ https://lists.wikimedia.org/pipermail/mediawiki-api-announce/2018-August/000140.html
+ """
+ if self.site.mw_version < '1.32':
+ return
+ request = self.request
+ props = request.get('prop')
+ if props:
+ if 'revisions' in props:
+ request['rvslots'] = '*'
+ if 'deletedrevisions' in props:
+ request['drvslots'] = '*'
+ lists = request.get('list')
+ if lists:
+ if 'allrevisions' in lists:
+ request['arvslots'] = '*'
+ if 'deletedrevisions' in lists:
+ request['adrslots'] = '*'

def set_query_increment(self, value):
"""Set the maximum number of items to be retrieved per API query.
diff --git a/pywikibot/site.py b/pywikibot/site.py
index 286f213..3cff718 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -3391,8 +3391,6 @@
else:
rvgen.request['titles'] = list(cache.keys())
rvgen.request['rvprop'] = rvprop
- if self.mw_version >= '1.32':
- rvgen.request['rvslots'] = '*'
pywikibot.output(u"Retrieving %s pages from %s."
% (len(cache), self))

@@ -4002,8 +4000,6 @@
elif endsort:
raise ValueError("categorymembers: "
"invalid combination of 'sortby' and 'endsort'")
- if content and self.mw_version >= '1.32':
- cmargs['rvslots'] = '*'

return self._generator(api.PageGenerator, namespaces=namespaces,
total=total, g_content=content, **cmargs)
@@ -4085,10 +4081,6 @@
rvargs = {'type_arg': 'info|revisions'}

rvargs['rvprop'] = ['ids', 'timestamp', 'flags', 'comment', 'user']
- if self.mw_version >= '1.32':
- rvargs['rvslots'] = '*'
- # 'roles' is not implemented in Revision class yet.
- # rvargs['rvprop'].append('roles')
if self.mw_version >= '1.21':
rvargs['rvprop'].append('contentmodel')
if self.mw_version >= '1.19':

To view, visit change 462149. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I3afef82836d574d235c849d86c1a552614c3af9b
Gerrit-Change-Number: 462149
Gerrit-PatchSet: 3
Gerrit-Owner: Dalba <dalba.wiki@gmail.com>
Gerrit-Reviewer: Dalba <dalba.wiki@gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot (75)