[Pywikipedia-l] SVN: [5334] branches/rewrite/pywikibot
russblau at svn.wikimedia.org
russblau at svn.wikimedia.org
Thu May 8 16:06:22 UTC 2008
Revision: 5334
Author: russblau
Date: 2008-05-08 16:06:22 +0000 (Thu, 08 May 2008)
Log Message:
-----------
Site: allimages, allusers, and blocks methods
Modified Paths:
--------------
branches/rewrite/pywikibot/data/api.py
branches/rewrite/pywikibot/site.py
Modified: branches/rewrite/pywikibot/data/api.py
===================================================================
--- branches/rewrite/pywikibot/data/api.py 2008-05-08 16:04:53 UTC (rev 5333)
+++ branches/rewrite/pywikibot/data/api.py 2008-05-08 16:06:22 UTC (rev 5334)
@@ -278,6 +278,7 @@
'allpages': 'aplimit',
'alllinks': 'allimit',
'allcategories': 'aclimit',
+ 'allimages': 'ailimit',
'backlinks': 'bllimit',
'categorymembers': 'cmlimit',
'embeddedin': 'eilimit',
Modified: branches/rewrite/pywikibot/site.py
===================================================================
--- branches/rewrite/pywikibot/site.py 2008-05-08 16:04:53 UTC (rev 5333)
+++ branches/rewrite/pywikibot/site.py 2008-05-08 16:06:22 UTC (rev 5334)
@@ -508,7 +508,7 @@
def loadpageinfo(self, page):
"""Load page info from api and save in page attributes"""
title = page.title(withSection=False)
- query = api.PropertyGenerator("info",
+ query = api.PropertyGenerator("info", site=self,
titles=title.encode(self.encoding()))
for pageitem in query:
if pageitem['title'] != title:
@@ -603,7 +603,7 @@
if hasattr(p, "_pageid")
and p._pageid > 0]
cache = dict((p.title(withSection=False), p) for p in sublist)
- rvgen = api.PropertyGenerator("revisions|info")
+ rvgen = api.PropertyGenerator("revisions|info", site=self)
if len(pageids) == len(sublist):
# only use pageids if all pages have them
rvgen.request["pageids"] = "|".join(pageids)
@@ -660,7 +660,7 @@
"""
bltitle = page.title(withSection=False).encode(self.encoding())
- blgen = api.PageGenerator("backlinks", gbltitle=bltitle)
+ blgen = api.PageGenerator("backlinks", gbltitle=bltitle, site=self)
if namespaces is not None:
blgen.request["gblnamespace"] = u"|".join(unicode(ns)
for ns in namespaces)
@@ -683,7 +683,7 @@
"""
eititle = page.title(withSection=False).encode(self.encoding())
- eigen = api.PageGenerator("embeddedin", geititle=eititle)
+ eigen = api.PageGenerator("embeddedin", geititle=eititle, site=self)
if namespaces is not None:
eigen.request["geinamespace"] = u"|".join(unicode(ns)
for ns in namespaces)
@@ -707,7 +707,7 @@
def pagelinks(self, page, namespaces=None):
"""Iterate internal wikilinks contained (or transcluded) on page."""
- plgen = api.PageGenerator("links")
+ plgen = api.PageGenerator("links", site=self)
if hasattr(page, "_pageid"):
plgen.request['pageids'] = str(page._pageid)
else:
@@ -721,7 +721,7 @@
def pagecategories(self, page, withSortKey=False):
"""Iterate categories to which page belongs."""
# Sortkey doesn't work with generator; FIXME or deprecate
- clgen = api.CategoryPageGenerator("categories")
+ clgen = api.CategoryPageGenerator("categories", site=self)
if hasattr(page, "_pageid"):
clgen.request['pageids'] = str(page._pageid)
else:
@@ -732,13 +732,13 @@
def pageimages(self, page):
"""Iterate images used (not just linked) on the page."""
imtitle = page.title(withSection=False).encode(self.encoding())
- imgen = api.ImagePageGenerator("images", titles=imtitle)
+ imgen = api.ImagePageGenerator("images", titles=imtitle, site=self)
return imgen
def pagetemplates(self, page, namespaces=None):
"""Iterate templates transcluded (not just linked) on the page."""
tltitle = page.title(withSection=False).encode(self.encoding())
- tlgen = api.PageGenerator("templates", titles=tltitle)
+ tlgen = api.PageGenerator("templates", titles=tltitle, site=self)
if namespaces is not None:
tlgen.request["gtlnamespace"] = u"|".join(unicode(ns)
for ns in namespaces)
@@ -762,7 +762,7 @@
% category.title())
cmtitle = category.title(withSection=False).encode(self.encoding())
cmgen = api.PageGenerator(u"categorymembers", gcmtitle=cmtitle,
- gcmprop="ids|title|sortkey")
+ gcmprop="ids|title|sortkey", site=self)
if namespaces is not None:
cmgen.request[u"gcmnamespace"] = u"|".join(unicode(ns)
for ns in namespaces)
@@ -845,10 +845,12 @@
# assemble API request
if revids is None:
rvtitle = page.title(withSection=False).encode(self.encoding())
- rvgen = api.PropertyGenerator(u"revisions", titles=rvtitle)
+ rvgen = api.PropertyGenerator(u"revisions", titles=rvtitle,
+ site=self)
else:
ids = u"|".join(unicode(r) for r in revids)
- rvgen = api.PropertyGenerator(u"revisions", revids=ids)
+ rvgen = api.PropertyGenerator(u"revisions", revids=ids,
+ site=self)
if getText:
rvgen.request[u"rvprop"] = \
u"ids|flags|timestamp|user|comment|content"
@@ -906,8 +908,8 @@
"""Iterate all interlanguage links on page, yielding Link objects."""
lltitle = page.title(withSection=False)
llquery = api.PropertyGenerator("langlinks",
- titles=lltitle.encode(self.encoding())
- )
+ titles=lltitle.encode(self.encoding()),
+ site=self)
for pageitem in llquery:
if pageitem['title'] != lltitle:
raise Error(
@@ -923,8 +925,8 @@
"""Iterate all external links on page, yielding URL strings."""
eltitle = page.title(withSection=False)
elquery = api.PropertyGenerator("extlinks",
- titles=eltitle.encode(self.encoding())
- )
+ titles=eltitle.encode(self.encoding()),
+ site=self)
for pageitem in elquery:
if pageitem['title'] != eltitle:
raise RuntimeError(
@@ -986,7 +988,7 @@
filterredirs = False
apgen = api.PageGenerator("allpages", gapnamespace=str(namespace),
- gapfrom=start)
+ gapfrom=start, site=self)
if prefix:
apgen.request["gapprefix"] = prefix
if filterredir is not None:
@@ -1037,7 +1039,7 @@
if not isinstance(namespace, int):
raise Error("alllinks: only one namespace permitted.")
algen = api.ListGenerator("alllinks", alnamespace=str(namespace),
- alfrom=start)
+ alfrom=start, site=self)
if prefix:
algen.request["alprefix"] = prefix
if isinstance(limit, int):
@@ -1052,7 +1054,6 @@
p.fromid = link['fromid']
yield p
-
def allcategories(self, start="!", prefix="", limit=None,
reverse=False):
"""Iterate categories used (which need not have a Category page).
@@ -1067,7 +1068,7 @@
order (default: iterate in forward order)
"""
- acgen = api.CategoryGenerator("allcategories", gapfrom=start)
+ acgen = api.CategoryGenerator("allcategories", gapfrom=start, site=self)
if prefix:
acgen.request["gacprefix"] = prefix
if isinstance(limit, int):
@@ -1076,7 +1077,114 @@
acgen.request["gacdir"] = "descending"
return acgen
+ def allusers(self, start="!", prefix="", limit=None, group=None):
+ """Iterate registered users, ordered by username.
+ Iterated values are dicts containing 'name', 'editcount',
+ 'registration', and (sometimes) 'groups' keys. 'groups' will be
+ present only if the user is a member of at least 1 group, and will
+ be a list of unicodes; all the other values are unicodes and should
+ always be present.
+
+ @param start: start at this username (name need not exist)
+ @param prefix: only iterate usernames starting with this substring
+ @param limit: maximum number of users to iterate (default: all)
+ @param group: only iterate users that are members of this group
+ @type group: str
+
+ """
+ augen = api.ListGenerator("allusers", aufrom=start,
+ auprop="editcount|groups|registration",
+ site=self)
+ if prefix:
+ augen.request["auprefix"] = prefix
+ if group:
+ augen.request["augroup"] = group
+ if isinstance(limit, int):
+ augen.request["aulimit"] = str(limit)
+ return augen
+
+ def allimages(self, start="!", prefix="", minsize=None, maxsize=None,
+ limit=None, reverse=False, sha1=None, sha1base36=None):
+ """Iterate all images, ordered by image title.
+
+ Yields ImagePages, but these pages need not exist on the wiki.
+
+ @param start: start at this title (name need not exist)
+ @param prefix: only iterate titles starting with this substring
+ @param limit: maximum number of titles to iterate (default: all)
+ @param minsize: only iterate images of at least this many bytes
+ @param maxsize: only iterate images of no more than this many bytes
+ @param reverse: if True, iterate in reverse lexigraphic order
+ @param sha1: only iterate image (it is theoretically possible there
+ could be more than one) with this sha1 hash
+ @param sha1base36: same as sha1 but in base 36
+
+ """
+ aigen = api.ImagePageGenerator("allimages", gaifrom=start,
+ site=self)
+ if prefix:
+ aigen.request["gaiprefix"] = prefix
+ if isinstance(limit, int):
+ aigen.request["gailimit"] = str(limit)
+ if isinstance(minsize, int):
+ aigen.request["gaiminsize"] = str(minsize)
+ if isinstance(maxsize, int):
+ aigen.request["gaimaxsize"] = str(maxsize)
+ if reverse:
+ aigen.request["gaidir"] = "descending"
+ if sha1:
+ aigen.request["gaisha1"] = sha1
+ if sha1base36:
+ aigen.request["gaisha1base36"] = sha1base36
+ return aigen
+
+ def blocks(self, starttime=None, endtime=None, reverse=False,
+ blockids=None, users=None, limit=None):
+ """Iterate all current blocks, in order of creation.
+
+ Note that logevents only logs user blocks, while this method
+ iterates all blocks including IP ranges. The iterator yields dicts
+ containing keys corresponding to the block properties (see
+ http://www.mediawiki.org/wiki/API:Query_-_Lists for documentation).
+
+ @param starttime: start iterating at this timestamp
+ @param endtime: stop iterating at this timestamp
+ @param reverse: if True, iterate oldest blocks first (default: newest)
+ @param blockids: only iterate blocks with these id numbers
+ @param users: only iterate blocks affecting these usernames or IPs
+ @param limit: maximum number of blocks to iterate (default: all)
+
+ """
+ if starttime and endtime:
+ if reverse:
+ if starttime > endtime:
+ logging.error(
+ "blocks: starttime must be before endtime with reverse=True")
+ return
+ else:
+ if endtime < starttime:
+ logging.error(
+ "blocks: endtime must be before starttime with reverse=False")
+ return
+ bkgen = api.ListGenerator("blocks", site=self)
+ bkgen.request["bkprop"] = \
+ "id|user|by|timestamp|expiry|reason|range|flags"
+ if starttime:
+ bkgen.request["bkstart"] = starttime
+ if endtime:
+ bkgen.request["bkend"] = endtime
+ if reverse:
+ bkgen.request["bkdir"] = newer
+ if blockids:
+ bkgen.request["bkids"] = blockids
+ if users:
+ bkgen.request["bkusers"] = users
+ if isinstance(limit, int):
+ bkgen.request["bklimit"] = str(limit)
+ return bkgen
+
+
#### METHODS NOT IMPLEMENTED YET (but may be delegated to Family object) ####
class NotImplementedYet:
More information about the Pywikipedia-l
mailing list