Browse Source

Improvements to Site and User by removing unnecessary API queries.

* Site: New _get_logged_in_user() method, name self-explanatory. This acts
  as a replacement for the former crud in get_user(), which now calls this
  when the username arg is None. This method will first try to determine
  our username based on a special cookie in self._cookiejar (cookie.name is
  self._name + "UserName", e.g. "enwikiUserName"), and will only do an API
  query if no cookie was found. This removes an API query that is usually
  only necessary if we are not logged in.
* Site: silly bugfix in __init__().
* User: Reverted earlier change to _get_attribute() (addition of
  raise_exception arg); name() and exists() now use their own code, which
  is simpler.
* User: Calling name() does not do an API query unless force=True, unlike
  the other "get" methods.
* User: .join() instead of .format() because I feel it looks cleaner and is
  probably more efficient.
tags/v0.1^2
Ben Kurtovic 13 years ago
parent
commit
c7bbb21117
2 changed files with 32 additions and 12 deletions
  1. +22
    -6
      wiki/tools/site.py
  2. +10
    -6
      wiki/tools/user.py

+ 22
- 6
wiki/tools/site.py View File

@@ -2,8 +2,9 @@


from cookielib import CookieJar from cookielib import CookieJar
from json import loads from json import loads
from urllib import urlencode
from urllib import unquote_plus, urlencode
from urllib2 import build_opener, HTTPCookieProcessor, URLError from urllib2 import build_opener, HTTPCookieProcessor, URLError
from urlparse import urlparse


from wiki.tools.category import Category from wiki.tools.category import Category
from wiki.tools.constants import * from wiki.tools.constants import *
@@ -34,7 +35,7 @@ class Site(object):
self._namespaces = namespaces self._namespaces = namespaces


# set up cookiejar and URL opener for making API queries # 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 = build_opener(HTTPCookieProcessor(self._cookiejar))
self._opener.addheaders = [('User-agent', USER_AGENT)] self._opener.addheaders = [('User-agent', USER_AGENT)]


@@ -72,6 +73,24 @@ class Site(object):
e = "Couldn't login; server says '{0}'.".format(res) e = "Couldn't login; server says '{0}'.".format(res)
raise LoginError(e) 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): def _load_attributes(self, force=False):
""" """
Docstring needed Docstring needed
@@ -253,8 +272,5 @@ class Site(object):
Docstring needed Docstring needed
""" """
if username is None: 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) return User(self, username)

+ 10
- 6
wiki/tools/user.py View File

@@ -30,13 +30,13 @@ class User(object):
self._emailable = None self._emailable = None
self._gender = None self._gender = None


def _get_attribute(self, attr, force, raise_exception=True):
def _get_attribute(self, attr, force):
""" """
Docstring needed Docstring needed
""" """
if self._exists is None or force: if self._exists is None or force:
self._load_attributes() 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) e = "User '{0}' does not exist.".format(self._name)
raise UserNotFoundError(e) raise UserNotFoundError(e)
return getattr(self, attr) return getattr(self, attr)
@@ -84,13 +84,17 @@ class User(object):
""" """
Docstring needed Docstring needed
""" """
return self._get_attribute("_name", force, raise_exception=False)
if force:
self._load_attributes()
return self._name


def exists(self, force=False): def exists(self, force=False):
""" """
Docstring needed 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): def userid(self, force=False):
""" """
@@ -145,7 +149,7 @@ class User(object):
Docstring needed Docstring needed
""" """
prefix = self.site.namespace_id_to_name(NS_USER) 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) return Page(self.site, pagename)


def talkpage(self): def talkpage(self):
@@ -153,5 +157,5 @@ class User(object):
Docstring needed Docstring needed
""" """
prefix = self.site.namespace_id_to_name(NS_USER_TALK) 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) return Page(self.site, pagename)

Loading…
Cancel
Save