http://www.mediawiki.org/wiki/Special:Code/pywikipedia/11334

Revision: 11334
Author:   xqt
Date:     2013-04-04 06:30:35 +0000 (Thu, 04 Apr 2013)
Log Message:
-----------
sortkeyprefix breaks with mw 1.16
bugfix for bug #3603953

Modified Paths:
--------------
    trunk/pywikipedia/catlib.py

Modified: trunk/pywikipedia/catlib.py
===================================================================
--- trunk/pywikipedia/catlib.py 2013-04-04 05:54:15 UTC (rev 11333)
+++ trunk/pywikipedia/catlib.py 2013-04-04 06:30:35 UTC (rev 11334)
@@ -66,12 +66,15 @@
     """Subclass of Page that has some special tricks that only work for
        category: pages"""
 
-    def __init__(self, site, title = None, insite = None, sortKey = None, 
sortKeyPrefix = None):
-        wikipedia.Page.__init__(self, site = site, title = title, insite = 
insite, defaultNamespace = 14)
+    def __init__(self, site, title=None, insite=None, sortKey=None,
+                 sortKeyPrefix=None):
+        wikipedia.Page.__init__(self, site=site, title=title, insite=insite,
+                                defaultNamespace=14)
         self.sortKey = sortKey
         self.sortKeyPrefix = sortKeyPrefix
         if self.namespace() != 14:
-            raise ValueError(u'BUG: %s is not in the category namespace!' % 
title)
+            raise ValueError(u'BUG: %s is not in the category namespace!'
+                             % title)
         self.completelyCached = False
         self.articleCache = []
         self.subcatCache = []
@@ -84,7 +87,8 @@
 
         """
         if self.sortKey:
-            titleWithSortKey = '%s|%s' % (self.title(savetitle=True), 
self.sortKey)
+            titleWithSortKey = '%s|%s' % (self.title(savetitle=True),
+                                          self.sortKey)
         else:
             titleWithSortKey = self.title(savetitle=True)
         if not noInterwiki and (forceInterwiki
@@ -92,9 +96,11 @@
             if self.site().family != wikipedia.getSite().family \
                     and self.site().family.name != self.site().lang:
                 return '[[%s:%s:%s]]' % (self.site().family.name,
-                                         self.site().lang, 
self.title(savetitle=True))
+                                         self.site().lang,
+                                         self.title(savetitle=True))
             else:
-                return '[[%s:%s]]' % (self.site().lang, 
self.title(savetitle=True))
+                return '[[%s:%s]]' % (self.site().lang,
+                                      self.title(savetitle=True))
         elif textlink:
             return '[[:%s]]' % self.title(savetitle=True)
         else:
@@ -159,8 +165,9 @@
                             # contents of subcategory are cached by calling
                             # this method recursively; therefore, do not cache
                             # them again
-                            for item in page._getAndCacheContents(newrecurse, 
purge, cache=cache,
-                                             sortby=sortby, sortdir=sortdir):
+                            for item in page._getAndCacheContents(
+                                    newrecurse, purge, cache=cache,
+                                    sortby=sortby, sortdir=sortdir):
                                 yield item
             if not startFrom:
                 self.completelyCached = True
@@ -207,9 +214,11 @@
             'action': 'query',
             'list': 'categorymembers',
             'cmtitle': self.title(),
-            'cmprop': ['title', 'ids', 'sortkey', 'sortkeyprefix', 
'timestamp'],
+            'cmprop': ['title', 'ids', 'sortkey', 'timestamp'],
             #'': '',
         }
+        if self.site().versionnumber() > 16:
+            params['cmprop'].append('sortkeyprefix')
         if sortby:
             params['cmsort'] = sortby
         if sortdir:
@@ -223,15 +232,17 @@
             if currentPageOffset:
                 params.update(currentPageOffset)
                 wikipedia.output('Getting [[%s]] list from %s...'
-                                 % (self.title(), "%s=%s" % 
currentPageOffset.popitem()))
+                                 % (self.title(),
+                                    "%s=%s" % currentPageOffset.popitem()))
             else:
                 msg = 'Getting [[%s]] list' % self.title()
+                # category sort keys are uppercase
                 if startFrom:
-                    startFrom = startFrom.upper() # category sort keys are 
uppercase
+                    startFrom = startFrom.upper()
                     params['cmstartsortkey'] = startFrom
                     msg += ' starting at %s' % startFrom
                 if endsort:
-                    endsort = endsort.upper() # category sort keys are 
uppercase
+                    endsort = endsort.upper()
                     params['cmendsortkey'] = endsort
                     msg += ' ending at %s' % endsort
                 wikipedia.output(msg + u'...')
@@ -246,11 +257,20 @@
                 count += 1
                 # For MediaWiki versions where subcats look like articles
                 if memb['ns'] == 14:
-                    yield SUBCATEGORY, Category(self.site(), memb['title'], 
sortKey=memb['sortkey'], sortKeyPrefix=memb['sortkeyprefix'])
+                    if 'sortkeyprefix' in memb:
+                        sortKeyPrefix = memb['sortkeyprefix']
+                    else:
+                        sortKeyPrefix = None
+                    yield SUBCATEGORY, \
+                          Category(self.site(), memb['title'],
+                                   sortKey=memb['sortkey'],
+                                   sortKeyPrefix=sortKeyPrefix)
                 elif memb['ns'] == 6:
-                    yield ARTICLE, wikipedia.ImagePage(self.site(), 
memb['title'])
+                    yield ARTICLE, wikipedia.ImagePage(self.site(),
+                                                       memb['title'])
                 else:
-                    yield ARTICLE, wikipedia.Page(self.site(), memb['title'], 
defaultNamespace=memb['ns'])
+                    yield ARTICLE, wikipedia.Page(self.site(), memb['title'],
+                                                  defaultNamespace=memb['ns'])
                 if count >= params['cmlimit']:
                     break
             # try to find a link to the next list page


_______________________________________________
Pywikipedia-svn mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-svn

Reply via email to