[Pywikipedia-l] SVN: [5385] branches/rewrite/pywikibot

russblau at svn.wikimedia.org russblau at svn.wikimedia.org
Fri May 16 14:41:55 UTC 2008


Revision: 5385
Author:   russblau
Date:     2008-05-16 14:41:54 +0000 (Fri, 16 May 2008)

Log Message:
-----------
site: deletedrevs, users, and randompages methods (cannot test deletedrevs because I don't have a sysop account); minor code cleanup elsewhere

Modified Paths:
--------------
    branches/rewrite/pywikibot/site.py
    branches/rewrite/pywikibot/tests/site_tests.py

Modified: branches/rewrite/pywikibot/site.py
===================================================================
--- branches/rewrite/pywikibot/site.py	2008-05-16 13:19:35 UTC (rev 5384)
+++ branches/rewrite/pywikibot/site.py	2008-05-16 14:41:54 UTC (rev 5385)
@@ -167,7 +167,7 @@
         """Return list of all valid language codes for this site's Family."""
         return self.family().langs.keys()
 
-    def getNamespaceIndex(self, namespace):
+    def ns_index(self, namespace):
         """Given a namespace name, return its int index, or None if invalid."""
         for ns in self.namespaces():
             if namespace.lower() in [name.lower()
@@ -175,22 +175,23 @@
                 return ns
         return None
 
+    getNamespaceIndex = ns_index  # for backwards-compatibility
+
     def namespaces(self):
         """Return dict of valid namespaces on this wiki."""
         return self._namespaces
 
-    def normalize_namespace(self, value):
+    def ns_normalize(self, value):
         """Return canonical local form of namespace name.
 
         @param value: A namespace name
         @type value: unicode
 
         """
-        index = self.getNamespaceIndex(value)
+        index = self.ns_index(value)
         return self.namespace(index)
 
-    # alias for backwards-compatibility
-    normalizeNamespace = normalize_namespace
+    normalizeNamespace = ns_normalize  # for backwards-compatibility
 
     def redirect(self, default=True):
         """Return the localized redirect tag for the site.
@@ -380,9 +381,6 @@
         """Return the current username if logged in, otherwise return None.
 
         DEPRECATED (use .user() method instead)
-        Checks if we're logged in by loading a page and looking for the login
-        link. We assume that we're not being logged out during a bot run, so
-        loading the test page is only required once.
 
         """
         logging.debug("Site.loggedInAs() method is deprecated.")
@@ -695,7 +693,7 @@
         return eigen
 
     def pagereferences(self, page, followRedirects, filterRedirects,
-                      withTemplateInclusion, onlyTemplateInclusion):
+                       withTemplateInclusion, onlyTemplateInclusion):
         """Convenience method combining pagebacklinks and page_embeddedin."""
         if onlyTemplateInclusion:
             return self.page_embeddedin(page)
@@ -1488,8 +1486,8 @@
                 if start < end:
                     raise Error(
             "watchlist_revs: start must be later than end with reverse=False")
-        wlgen = ListGenerator("watchlist", wlallrev="", site=self,
-                              wlprop="user|comment|timestamp|title|ids|flags")
+        wlgen = api.ListGenerator("watchlist", wlallrev="", site=self,
+                           wlprop="user|comment|timestamp|title|ids|flags")
         #TODO: allow users to ask for "patrol" as well?
         if start is not None:
             wlgen.request["wlstart"] = start
@@ -1513,7 +1511,100 @@
             wlgen.request["wlshow"] = "|".join(wlshow)
         return wlgen
 
+    def deletedrevs(self, start=None, end=None, reverse=None, limit=None,
+                    get_text=False):
+        """Iterate deleted revisions.
 
+        Each value returned by the iterator will be a dict containing the
+        'title' and 'ns' keys for a particular Page and a 'revisions' key
+        whose value is a list of revisions in the same format as
+        recentchanges (plus a 'content' element if requested). If get_text
+        is true, the toplevel dict will contain a 'token' key as well.
+
+        @param start: Iterate revisions starting at this timestamp
+        @param end: Iterate revisions ending at this timestamp
+        @param reverse: Iterate oldest revisions first (default: newest)
+        @param limit: Iterate no more than this number of revisions.
+        @param get_text: If True, retrieve the content of each revision and
+            an undelete token
+
+        """
+        if start and end:
+            if reverse:
+                if end < start:
+                    raise Error(
+"deletedrevs: end must be later than start with reverse=True")
+            else:
+                if start < end:
+                    raise Error(
+"deletedrevs: start must be later than end with reverse=False")
+        if not self.logged_in():
+            self.login()
+        if "deletedhistory" not in self.getuserinfo()['rights']:
+            try:
+                self.login(True)
+            except NoUsername:
+                pass
+            if "deletedhistory" not in self.getuserinfo()['rights']:
+                raise Error(
+"deletedrevs: User:%s not authorized to access deleted revisions."
+                        % self.user())
+        if get_text:
+            if "undelete" not in self.getuserinfo()['rights']:
+                try:
+                    self.login(True)
+                except NoUsername:
+                    pass
+                if "undelete" not in self.getuserinfo()['rights']:
+                    raise Error(
+"deletedrevs: User:%s not authorized to view deleted content."
+                            % self.user())
+            
+        drgen = api.ListGenerator("deletedrevs", site=self,
+                    drprop="revid|user|comment|minor")
+        if get_text:
+            drgen.request['drprop'] = drgen.request['drprop'] + "|content|token"
+        if start is not None:
+            drgen.request["drstart"] = start
+        if end is not None:
+            drgen.request["drend"] = end
+        if reverse:
+            drgen.request["drdir"] = "newer"
+        if isinstance(limit, int):
+            drgen.limit = limit
+        return drgen
+
+    def users(self, usernames):
+        """Iterate info about a list of users by name or IP.
+
+        @param usernames: a list of user names
+        @type usernames: list, or other iterable, of unicodes
+
+        """
+        if not isinstance(usernames, basestring):
+            usernames = u"|".join(usernames)
+        usgen = api.ListGenerator("users", ususers=usernames, site=self,
+                          usprop="blockinfo|groups|editcount|registration")
+        return usgen
+
+    def randompages(self, limit=1, namespaces=None):
+        """Iterate a number of random pages.
+
+        Pages are listed in a fixed sequence, only the starting point is
+        random.
+        
+        @param limit: the maximum number of pages to iterate (default: 1)
+        @param namespaces: only iterate pages in these namespaces.
+
+        """
+        rngen = api.PageGenerator("random", site=self)
+        rngen.limit = limit
+        if namespaces:
+            rngen.request["wlnamespace"] = u"|".join(unicode(ns)
+                                                     for ns in namespaces)
+        return rngen
+
+
 #### METHODS NOT IMPLEMENTED YET (but may be delegated to Family object) ####
 class NotImplementedYet:
 
@@ -2423,7 +2514,7 @@
             interlangTargetFamily = Family(self.family().interwiki_forward)
         else:
             interlangTargetFamily = self.family()
-        if self.getNamespaceIndex(first):
+        if self.ns_index(first):
             return False
         if first in interlangTargetFamily.langs:
             if first == self.language():

Modified: branches/rewrite/pywikibot/tests/site_tests.py
===================================================================
--- branches/rewrite/pywikibot/tests/site_tests.py	2008-05-16 13:19:35 UTC (rev 5384)
+++ branches/rewrite/pywikibot/tests/site_tests.py	2008-05-16 14:41:54 UTC (rev 5385)
@@ -24,7 +24,7 @@
         self.assertEqual(mysite.language(), "en")
         self.assert_(isinstance(mysite.user(), (basestring, type(None))))
         self.assertEqual(mysite.sitename(), "wikipedia:en")
-        self.assertEqual(mysite.normalize_namespace("project"), "Wikipedia")
+        self.assertEqual(mysite.ns_normalize("project"), "Wikipedia")
         self.assertEqual(mysite.redirect(), "REDIRECT")
 
 





More information about the Pywikipedia-l mailing list