Index: wikipedia.py =================================================================== --- wikipedia.py (revision 5101) +++ wikipedia.py (working copy) @@ -1215,7 +1215,7 @@ return self._putPage(newtext, comment, watchArticle, minorEdit, newPage, self.site().getToken(sysop = sysop), sysop = sysop) def _putPage(self, text, comment=None, watchArticle=False, minorEdit=True, - newPage=False, token=None, newToken=False, sysop=False): + newPage=False, token=None, newToken=0, sysop=False): """Upload 'text' as new content of Page by filling out the edit form. Don't use this directly, use put() instead. @@ -1351,10 +1351,17 @@ return self._putPage(text, comment, watchArticle, minorEdit, newPage, token=self.site().getToken(sysop = True), sysop = True) except NoUsername: raise LockedPage() - if not newToken and " 0: + # We might have used, or already retrieved, an outdated token + if verbose: + output(u"Retrying once more.") + if newToken < 3: + # retry twice with a forced new token, else give up + return self._putPage(text, comment, watchArticle, minorEdit, newPage, token=self.site().getToken(sysop = sysop, getagain = (newToken > 0)), newToken = (1 + newToken), sysop = sysop) if data.find("Wikimedia Error") > -1: output( u"Wikimedia has technical problems; will retry in %i minute%s." @@ -1370,6 +1377,8 @@ # Something went wrong, and we don't know what. Show the # HTML code that hopefully includes some error message. output(u"ERROR: Unexpected response from wiki server.") + if verbose: + output(u" token= (%s) " % (token)) output(u" %s (%s) " % (response.status, response.reason)) output(data) # Unexpected responses should raise an error and not pass, @@ -4163,7 +4172,7 @@ return text - def _getUserData(self, text, sysop = False): + def _getUserData(self, text, sysop = False, forceReload = False): """ Get the user data from a wiki page data. @@ -4173,6 +4182,8 @@ """ if '
' not in text: # Not a wiki page + if verbose: + output(u'Not a wiki page.') return index = self._userIndex(sysop) @@ -4203,7 +4214,9 @@ self._messages[index] = False # Don't perform other checks if the data was already loaded - if self._userData[index]: + if self._userData[index] and not forceReload: + if verbose: + output(u'User Data already loaded.') return # Search for the the user page link at the top. @@ -4263,6 +4276,8 @@ tokenloc = tokenR.search(text) if tokenloc: self._token[index] = tokenloc.group(1) + if verbose: + output(u'Token loaded: %s' % (self._token[index])) if self._rights[index] is not None: # In this case, token and rights are loaded - user data is now loaded self._userData[index] = True @@ -4340,17 +4355,17 @@ except KeyError: return False - def _load(self, sysop = False): + def _load(self, sysop = False, forceReload = False): """ Loads user data. - This is only done if we didn't do get any page yet and the information + This is only done if we didn't get any page yet and the information is requested, otherwise we should already have this data. Parameters: * sysop - Get sysop user data? """ index = self._userIndex(sysop) - if self._userData[index]: + if self._userData[index] and not forceReload: return if verbose: @@ -4358,10 +4373,10 @@ # Get data url = self.edit_address('Non-existing_page') - text = self.getUrl(url, sysop = sysop) + text = self.getUrl(path = url, sysop = sysop) # Parse data - self._getUserData(text, sysop = sysop) + self._getUserData(text = text, sysop = sysop, forceReload = forceReload) def search(self, query, number = 10, namespaces = None): """Yield search results (using Special:Search page) for query.""" @@ -5368,10 +5383,14 @@ index = self._userIndex(sysop) if getagain or (getalways and self._token[index] is None): output(u'Getting a token.') - self._load(sysop = sysop) + self._load(sysop = sysop, forceReload = getagain) if self._token[index] is not None: + if verbose: + output(u'Got the token %s' % (self._token[index])) return self._token[index] else: + if verbose: + output(u'Have not got a token.') return False # Caches to provide faster access @@ -5525,10 +5544,14 @@ return ['ar','tr'] if code=='sk': return ['cs'] - if code in ['bar','hsb','ksh']: + if code in ['bar','ksh','stq']: return ['de'] if code in ['als','lb']: return ['de','fr'] + if code == 'dsb': + return ['hsb','de'] + if code == 'hsb': + return ['dsb','de'] if code=='io': return ['eo'] if code in ['an','ast','ay','ca','gn','nah','qu']: