jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/462149 )
Change subject: api.QueryGenerator: Handle slots during initialization ......................................................................
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(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
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/000... + """ + 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':