diff --git a/wiki/tools/site.py b/wiki/tools/site.py index f4b854f..f32e3c2 100644 --- a/wiki/tools/site.py +++ b/wiki/tools/site.py @@ -2,8 +2,9 @@ from cookielib import CookieJar from json import loads -from urllib import urlencode +from urllib import unquote_plus, urlencode from urllib2 import build_opener, HTTPCookieProcessor, URLError +from urlparse import urlparse from wiki.tools.category import Category from wiki.tools.constants import * @@ -34,7 +35,7 @@ class Site(object): self._namespaces = namespaces # set up cookiejar and URL opener for making API queries - self._cookiejar = CookieJar(cookie_file) + self._cookiejar = CookieJar() self._opener = build_opener(HTTPCookieProcessor(self._cookiejar)) self._opener.addheaders = [('User-agent', USER_AGENT)] @@ -72,6 +73,24 @@ class Site(object): e = "Couldn't login; server says '{0}'.".format(res) raise LoginError(e) + def _get_logged_in_user(self): + """ + Docstring needed + """ + # first try to get username from the cookie jar to avoid an + # unnecessary API query + cookie_name = ''.join((self._name, "UserName")) + cookie_domain = urlparse(self._base_url).netloc + for cookie in self._cookiejar: + if cookie.name == cookie_name and cookie.domain == cookie_domain: + return unquote_plus(cookie.value) + + # if we end up here, we're probably an anon and thus an API query + # will be required to get our username + params = {"action": "query", "meta": "userinfo"} + result = self.api_query(params) + return result["query"]["userinfo"]["name"] + def _load_attributes(self, force=False): """ Docstring needed @@ -253,8 +272,5 @@ class Site(object): Docstring needed """ if username is None: - params = {"action": "query", "meta": "userinfo"} - result = self.api_query(params) - username = result["query"]["userinfo"]["name"] - + username = self._get_logged_in_user() return User(self, username) diff --git a/wiki/tools/user.py b/wiki/tools/user.py index 94a46d4..98f9670 100644 --- a/wiki/tools/user.py +++ b/wiki/tools/user.py @@ -30,13 +30,13 @@ class User(object): self._emailable = None self._gender = None - def _get_attribute(self, attr, force, raise_exception=True): + def _get_attribute(self, attr, force): """ Docstring needed """ if self._exists is None or force: self._load_attributes() - if self._exists is False and raise_exception: + if self._exists is False: e = "User '{0}' does not exist.".format(self._name) raise UserNotFoundError(e) return getattr(self, attr) @@ -84,13 +84,17 @@ class User(object): """ Docstring needed """ - return self._get_attribute("_name", force, raise_exception=False) + if force: + self._load_attributes() + return self._name def exists(self, force=False): """ Docstring needed """ - return self._get_attribute("_exists", force, raise_exception=False) + if self._exists is None or force: + self._load_attributes() + return self._exists def userid(self, force=False): """ @@ -145,7 +149,7 @@ class User(object): Docstring needed """ prefix = self.site.namespace_id_to_name(NS_USER) - pagename = "{0}:{1}".format(prefix, self._name) + pagename = ''.join((prefix, ":", self._name)) return Page(self.site, pagename) def talkpage(self): @@ -153,5 +157,5 @@ class User(object): Docstring needed """ prefix = self.site.namespace_id_to_name(NS_USER_TALK) - pagename = "{0}:{1}".format(prefix, self._name) + pagename = ''.join((prefix, ":", self._name)) return Page(self.site, pagename)