diff --git a/mwclient/client.py b/mwclient/client.py index 6d866d60a3fd6bebda10b89fc06913ce3bdebadb..dc08069cae31320e583e8c724d62adbc1af3f713 100644 --- a/mwclient/client.py +++ b/mwclient/client.py @@ -61,6 +61,8 @@ class Site(object): else: self.connection = pool + self.version = None + self.Pages = listing.PageList(self) self.Categories = listing.PageList(self, namespace = 14) self.Images = listing.PageList(self, namespace = 6) @@ -127,15 +129,17 @@ class Site(object): while True: info = self.raw_api(action, **kwargs) if not info: info = {} - if 'userinfo' in info.get('query', ()): - userinfo = info['query']['userinfo'] - if 'blockedby' in userinfo: - self.blocked = (userinfo['blockedby'], - userinfo.get('blockreason', u'')) - else: - self.blocked = False - self.hasmsg = 'message' in userinfo - self.logged_in = 'anon' not in userinfo + + try: + userinfo = compatibility.userinfo(info, self.require(1, 12, raise_error = None)) + except KeyError: + userinfo = () + if 'blockedby' in userinfo: + self.blocked = (userinfo['blockedby'], userinfo.get('blockreason', u'')) + else: + self.blocked = False + self.hasmsg = 'message' in userinfo + self.logged_in = 'anon' not in userinfo if 'error' in info: if info['error']['code'] in (u'internal_api_error_DBConnectionError', ): self.wait(token) @@ -212,6 +216,10 @@ class Site(object): return self.wait_tokens[token] def require(self, major, minor, revision = None, raise_error = True): + if self.version is None: + if raise_error is None: return + raise RuntimeError('Site %s has not yet been initialized' % repr(self)) + if revision is None: if self.version[:2] >= (major, minor): return True diff --git a/mwclient/compatibility.py b/mwclient/compatibility.py index 65392aad8d50b18959a88786696f3271b827b015..4bd7625d93f6ce5a03f94b966c96a7a7ea324eb9 100644 --- a/mwclient/compatibility.py +++ b/mwclient/compatibility.py @@ -4,8 +4,22 @@ def title(prefix, new_format): else: return 'titles' -def userinfo(data, new_format): - if new_format: +def userinfo(data, new_format = None): + if new_format is None: + # Unknown version; trying to guess + if 'userinfo' in data: + return data['userinfo'] + elif 'userinfo' in data.get('query', ()): + return data['query']['userinfo'] + else: + return {} + elif new_format: return data['query']['userinfo'] else: return data['userinfo'] + +def iiprop(post_112): + if post_112: + return 'timestamp|user|comment|url|size|sha1|metadata' + else: + return 'timestamp|user|comment|url|size|sha1' \ No newline at end of file diff --git a/mwclient/listing.py b/mwclient/listing.py index 0df04311c62818410995553d6fbcdc2104319d60..2b34a94227f56b5dee4b0662d76818c157264d27 100644 --- a/mwclient/listing.py +++ b/mwclient/listing.py @@ -1,4 +1,5 @@ import client, page +import compatibility class List(object): def __init__(self, site, list_name, prefix, limit = None, return_values = None, *args, **kwargs): @@ -95,7 +96,6 @@ class GeneratorList(List): self.args['prop'] = 'info|imageinfo' self.args['inprop'] = 'protection' - self.args['iiprop'] = 'timestamp|user|comment|url|size|sha1|metadata' self.result_member = 'pages' @@ -108,6 +108,13 @@ class GeneratorList(List): if info['ns'] == 6: return page.Image(self.site, u'', info) return page.Page(self.site, u'', info) + + def load_chunk(self): + # Put this here so that the constructor does not fail + # on uninitialized sites + self.args['iiprop'] = compatibility.iiprop(site.require(1, 12, raise_error = False)) + return List.load_chunk(self) + class Category(page.Page, GeneratorList): def __init__(self, site, name, info = None, namespace = None): diff --git a/mwclient/page.py b/mwclient/page.py index 1e6ac1a014799875ce62a10b298a3e6a3e3e609e..e41b1b82a0e0ad2254421f352ab9c907853d663e 100644 --- a/mwclient/page.py +++ b/mwclient/page.py @@ -184,7 +184,7 @@ class Page(object): kwargs = dict(listing.List.generate_kwargs(prefix, namespace = namespace, filterredir = filterredir)) if redirect: kwargs['%sredirect' % prefix] = '1' - kwargs[compatibility.title(prefix, self.site.require(1, 11))] = self.name + kwargs[compatibility.title(prefix, self.site.require(1, 11, raise_error = False))] = self.name return listing.List.get_list(generator)(self.site, 'backlinks', 'bl', limit = limit, return_values = 'title', **kwargs) def categories(self, generator = True): @@ -201,7 +201,7 @@ class Page(object): kwargs = dict(listing.List.generate_kwargs(prefix, namespace = namespace, filterredir = filterredir)) if redirect: kwargs['%sredirect' % prefix] = '1' - kwargs[compatibility.title(prefix, self.site.require(1, 11))] = self.name + kwargs[compatibility.title(prefix, self.site.require(1, 11, raise_error = False))] = self.name return listing.List.get_list(generator)(self.site, 'embeddedin', 'ei', limit = limit, return_values = 'title', **kwargs) def extlinks(self): @@ -247,14 +247,14 @@ class Image(Page): def __init__(self, site, name, info = None): site.require(1, 11) Page.__init__(self, site, name, info, - extra_properties = {'imageinfo': (('iiprop', - 'timestamp|user|comment|url|size|sha1|metadata'), )}) + extra_properties = {'imageinfo': (('iiprop', compatibility.iiprop( + site.require(1, 12, raise_error = False))), )}) self.imagerepository = self._info.get('imagerepository', '') self.imageinfo = self._info.get('imageinfo', ((), ))[0] def imagehistory(self): return listing.PageProperty(self, 'imageinfo', 'ii', - iiprop = 'timestamp|user|comment|url|size|sha1|metadata') + iiprop = compatibility.iiprop(self.site.require(1, 12, raise_error = False))) def imageusage(self, namespace = None, filterredir = 'all', redirect = False, limit = None, generator = True): self.site.require(1, 11)