Browse Source

Fix token-getter code and refactor into a get_token() function.

tags/v0.2
Ben Kurtovic 11 years ago
parent
commit
3d5be6c627
1 changed files with 30 additions and 3 deletions
  1. +30
    -3
      earwigbot/wiki/site.py

+ 30
- 3
earwigbot/wiki/site.py View File

@@ -73,6 +73,7 @@ class Site(object):
- :py:meth:`sql_query`: does an SQL query and yields its results
- :py:meth:`get_maxlag`: returns the internal database lag
- :py:meth:`get_replag`: estimates the external database lag
- :py:meth:`get_token`: gets a token for a specific API action
- :py:meth:`namespace_id_to_name`: returns names associated with an NS id
- :py:meth:`namespace_name_to_id`: returns the ID associated with a NS name
- :py:meth:`get_page`: returns a Page for the given title
@@ -297,8 +298,7 @@ class Site(object):
# Try to log in if we got logged out:
self._login(self._login_info)
if "token" in params: # Fetch a new one; this is invalid now
tparams = {"action": "tokens", "type": params["action"]}
params["token"] = self._api_query(tparams, ae_retry=False)
params["token"] = self.get_token(params["action"], False)
return self._api_query(params, tries, wait, ae_retry=False)
if not all(self._login_info):
e = "Assertion failed, and no login info was provided."
@@ -656,7 +656,7 @@ class Site(object):
query until we exceed :py:attr:`self._max_retries`.

There is helpful MediaWiki API documentation at `MediaWiki.org
<http://www.mediawiki.org/wiki/API>`_.
<https://www.mediawiki.org/wiki/API>`_.
"""
with self._api_lock:
return self._api_query(kwargs)
@@ -762,6 +762,33 @@ class Site(object):
result = list(self.sql_query(query))
return int(result[0][0])

def get_token(self, action, lock=True):
"""Return a token for a data-modifying API action.

*action* must be one of the types listed on
<https://www.mediawiki.org/wiki/API:Tokens>. If it's given as a union
of types separated by |, then the function will return a dictionary
of tokens instead of a single one. *lock* is for internal usage;
setting it to ``False`` prevents the query from acquiring the internal
API access lock.

Raises :py:exc:`~earwigbot.exceptions.PermissionsError` if we don't
have permissions for the requested action(s), or they are invalid.
Raises :py:exc:`~earwigbot.exceptions.APIError` if there was some other
API issue.
"""
if lock:
result = self.api_query(action="tokens", type=action)
else:
params = {"action": "tokens", "type": action}
result = self._api_query(params, ae_retry=False)

if "warnings" in result and "token" in result["warnings"]:
raise exceptions.PermissionsError(result["warnings"]["token"]["*"])
if "|" in action:
return result["tokens"]
return result["tokens"].values()[0]

def namespace_id_to_name(self, ns_id, all=False):
"""Given a namespace ID, returns associated namespace names.



Loading…
Cancel
Save