[Pywikipedia-svn] SVN: [7296] trunk/pywikipedia

siebrand at svn.wikimedia.org siebrand at svn.wikimedia.org
Thu Sep 24 23:28:58 UTC 2009


Revision: 7296
Author:   siebrand
Date:     2009-09-24 23:28:58 +0000 (Thu, 24 Sep 2009)

Log Message:
-----------
[#2865524] Patch by tatata7
* fix for MediaWiki version 1.11 API to get 'userinfo'.
* interwiki support for Wikitravel

Modified Paths:
--------------
    trunk/pywikipedia/families/wikitravel_family.py
    trunk/pywikipedia/wikipedia.py

Modified: trunk/pywikipedia/families/wikitravel_family.py
===================================================================
--- trunk/pywikipedia/families/wikitravel_family.py	2009-09-24 23:24:22 UTC (rev 7295)
+++ trunk/pywikipedia/families/wikitravel_family.py	2009-09-24 23:28:58 UTC (rev 7296)
@@ -33,22 +33,42 @@
             'ru':'ru',
             'sv':'sv',
             'zh':'zh',
+            'wts':'wts',
         }
         self.namespaces[-2] = {
-            '_default': u'Media',
+            '_default': [u'Media', self.namespaces[-2]['_default']],
             'ar': u'ملف',
+            'ca': u'Media',
+            'de': u'Media',
+            'en': u'Media',
+            'eo': u'Media',
+            'es': u'Media',
+            'fi': u'Media',
+            'fr': u'Media',
             'he': u'מדיה',
+            'hi': u'Media',
             'hu': u'Média',
+            'it': u'Media',
+            'ja': u'Media',
+            'nl': u'Media',
+            'pl': u'Media',
+            'pt': u'Media',
+            'ro': u'Media',
             'ru': u'Медиа',
+            'sv': u'Media',
+            'zh': u'Media',
+            'wts': u'Media',
         }
         self.namespaces[-1] = {
-            '_default': u'Special',
+            '_default': [u'Special', self.namespaces[-1]['_default']],
             'ar': u'خاص',
             'ca': u'Especial',
             'de': u'Spezial',
+            'en': u'Special',
             'eo': u'Speciala',
             'es': u'Especial',
             'fi': u'Toiminnot',
+            'fr': u'Special',
             'he': u'מיוחד',
             'hi': u'विशेष',
             'hu': u'Speciális',
@@ -57,20 +77,25 @@
             'nl': u'Speciaal',
             'pl': u'Specjalna',
             'pt': u'Especial',
+            'ro': u'Special',
             'ru': u'Служебная',
+            'sv': u'Special',
+            'zh': u'Special',
+            'wts': u'Special',
         }
         self.namespaces[1] = {
             '_default': u'Talk',
             'ar': u'نقاش',
             'ca': u'Discussió',
             'de': u'Diskussion',
+            'en': u'Talk',            
             'eo': u'Diskuto',
             'es': u'Discusión',
             'fi': u'Keskustelu',
             'fr': u'Discuter',
             'he': u'שיחה',
             'hi': u'वार्ता',
-            'hu': u'Vita',
+            'hu': u'Vita',            
             'it': u'Discussione',
             'ja': u'ノート',
             'nl': u'Overleg',
@@ -79,18 +104,22 @@
             'ro': u'Discuţie',
             'ru': u'Обсуждение',
             'sv': u'Diskussion',
+            'zh': u'Talk',
+            'wts': u'Talk',
         }
         self.namespaces[2] = {
             '_default': u'User',
             'ar': u'مستخدم',
             'ca': u'Usuari',
             'de': u'Benutzer',
+            'en': u'User',
             'eo': u'Vikipediisto',
             'es': u'Usuario',
             'fi': u'Käyttäjä',
             'fr': u'Utilisateur',
             'he': u'משתמש',
             'hi': u'सदस्य',
+            'hu': u'User',
             'it': u'Utente',
             'ja': u'利用者',
             'nl': u'Gebruiker',
@@ -99,12 +128,15 @@
             'ro': u'Utilizator',
             'ru': u'Участник',
             'sv': u'Användare',
+            'zh': u'User',
+            'wts': u'User',
         }
         self.namespaces[3] = {
             '_default': u'User talk',
             'ar': u'نقاش المستخدم',
             'ca': u'Usuari Discussió',
             'de': u'Benutzer Diskussion',
+            'en': u'User talk',
             'eo': u'Vikipediista diskuto',
             'es': u'Usuario Discusión',
             'fi': u'Keskustelu käyttäjästä',
@@ -120,21 +152,43 @@
             'ro': u'Discuţie Utilizator',
             'ru': u'Обсуждение участника',
             'sv': u'Användardiskussion',
+            'zh': u'User talk',
+            'wts': u'User talk',
         }
         self.namespaces[4] = {
-            '_default': u'Wikitravel',
+            '_default': [u'Wikitravel', self.namespaces[4]['_default']],
+            'ar': u'Wikitravel',
+            'ca': u'Wikitravel',
+            'de': u'Wikitravel',
+            'en': u'Wikitravel',
+            'eo': u'Wikitravel',
+            'es': u'Wikitravel',
+            'fi': u'Wikitravel',
+            'fr': u'Wikitravel',
             'he': u'ויקיטיול',
             'hi': u'विकिट्रैवल',
+            'hu': u'Wikitravel',
+            'it': u'Wikitravel',
+            'ja': u'Wikitravel',
+            'nl': u'Wikitravel',
+            'pl': u'Wikitravel',
+            'pt': u'Wikitravel',
+            'ro': u'Wikitravel',
+            'ru': u'Wikitravel',
+            'sv': u'Wikitravel',
+            'zh': u'Wikitravel',
+            'wts': u'Wikitravel Shared',
         }
         self.namespaces[5] = {
-            '_default': u'Wikitravel talk',
+            '_default': [u'Wikitravel talk', self.namespaces[5]['_default']],
             'ar': u'نقاش Wikitravel',
             'ca': u'Wikitravel Discussió',
             'de': u'Wikitravel Diskussion',
+            'en': u'Wikitravel talk',
             'eo': u'Wikitravel diskuto',
             'es': u'Wikitravel Discusión',
+            'fr': u'Discussion Wikitravel',
             'fi': u'Keskustelu Wikitravelista',
-            'fr': u'Discussion Wikitravel',
             'he': u'שיחת ויקיטיול',
             'hi': u'विकिट्रैवल वार्ता',
             'hu': u'Wikitravel vita',
@@ -146,15 +200,19 @@
             'ro': u'Discuţie Wikitravel',
             'ru': u'Обсуждение Wikitravel',
             'sv': u'Wikitraveldiskussion',
+            'zh': u'Wikitravel talk',
+            'wts': u'Wikitravel Shared talk',
         }
         self.namespaces[6] = {
             '_default': u'Image',
             'ar': u'صورة',
             'ca': u'Imatge',
             'de': u'Bild',
+            'en': u'Image',            
             'eo': u'Dosiero',
             'es': u'Imagen',
             'fi': u'Kuva',
+            'fr': u'Image',
             'he': u'תמונה',
             'hi': u'चित्र',
             'hu': u'Kép',
@@ -166,12 +224,15 @@
             'ro': u'Imagine',
             'ru': u'Изображение',
             'sv': u'Bild',
+            'zh': u'Image',
+            'wts': u'Image',
         }
         self.namespaces[7] = {
-            '_default': u'Image talk',
+            '_default': [u'Image talk', self.namespaces[7]['_default']],
             'ar': u'نقاش الصورة',
             'ca': u'Imatge Discussió',
             'de': u'Bild Diskussion',
+            'en': u'Image talk',
             'eo': u'Dosiera diskuto',
             'es': u'Imagen Discusión',
             'fi': u'Keskustelu kuvasta',
@@ -187,23 +248,45 @@
             'ro': u'Discuţie Imagine',
             'ru': u'Обсуждение изображения',
             'sv': u'Bilddiskussion',
+            'zh': u'Image talk',
+            'wts': u'Image talk',
         }
         self.namespaces[8] = {
-            '_default': u'MediaWiki',
+            '_default': [u'MediaWiki', self.namespaces[8]['_default']],
             'ar': u'ميدياويكي',
+            'ca': u'MediaWiki',
+            'de': u'MediaWiki',
+            'en': u'MediaWiki',
+            'eo': u'MediaWiki',
+            'es': u'MediaWiki',
             'fi': u'Järjestelmäviesti',
+            'fr': u'MediaWiki',
             'he': u'מדיה ויקי',
+            'hi': u'MediaWiki',
+            'hu': u'MediaWiki',
+            'it': u'MediaWiki',
+            'ja': u'MediaWiki',
+            'nl': u'MediaWiki',
+            'pl': u'MediaWiki',
+            'pt': u'MediaWiki',
+            'ro': u'MediaWiki',
+            'ru': u'MediaWiki',
+            'sv': u'MediaWiki',
+            'zh': u'MediaWiki',
+            'wts': u'MediaWiki',
         }
         self.namespaces[9] = {
-            '_default': u'MediaWiki talk',
+            '_default': [u'MediaWiki talk', self.namespaces[9]['_default']],
             'ar': u'نقاش ميدياويكي',
             'ca': u'MediaWiki Discussió',
             'de': u'MediaWiki Diskussion',
+            'en': u'MediaWiki talk',
             'eo': u'MediaWiki diskuto',
             'es': u'MediaWiki Discusión',
             'fi': u'Keskustelu järjestelmäviestistä',
             'fr': u'Discussion MediaWiki',
             'he': u'שיחת מדיה ויקי',
+            'hi': u'MediaWiki talk',
             'hu': u'MediaWiki vita',
             'it': u'Discussioni MediaWiki',
             'ja': u'MediaWiki‐ノート',
@@ -213,12 +296,15 @@
             'ro': u'Discuţie MediaWiki',
             'ru': u'Обсуждение MediaWiki',
             'sv': u'MediaWiki-diskussion',
+            'zh': u'MediaWiki talk',
+            'wts': u'MediaWiki talk',
         }
         self.namespaces[10] = {
-            '_default': u'Template',
+            '_default': [u'Template', self.namespaces[10]['_default']],
             'ar': u'قالب',
             'ca': u'Plantilla',
             'de': u'Vorlage',
+            'en': u'Template',
             'eo': u'Ŝablono',
             'es': u'Plantilla',
             'fi': u'Malline',
@@ -226,18 +312,23 @@
             'he': u'תבנית',
             'hi': u'साँचा',
             'hu': u'Sablon',
+            'it': u'Template',
+            'ja': u'Template',
             'nl': u'Sjabloon',
             'pl': u'Szablon',
             'pt': u'Predefinição',
             'ro': u'Format',
             'ru': u'Шаблон',
             'sv': u'Mall',
+            'zh': u'Template',
+            'wts': u'Template',
         }
         self.namespaces[11] = {
-            '_default': u'Template talk',
+            '_default': [u'Template talk', self.namespaces[11]['_default']],
             'ar': u'نقاش قالب',
             'ca': u'Plantilla Discussió',
             'de': u'Vorlage Diskussion',
+            'en': u'Template talk',
             'eo': u'Ŝablona diskuto',
             'es': u'Plantilla Discusión',
             'fi': u'Keskustelu mallineesta',
@@ -253,35 +344,45 @@
             'ro': u'Discuţie Format',
             'ru': u'Обсуждение шаблона',
             'sv': u'Malldiskussion',
+            'zh': u'Template talk',
+            'wts': u'Template talk',
         }
         self.namespaces[12] = {
-            '_default': u'Help',
+            '_default': [u'Help', self.namespaces[12]['_default']],
             'ar': u'مساعدة',
             'ca': u'Ajuda',
             'de': u'Hilfe',
+            'en': u'Help',
             'eo': u'Helpo',
             'es': u'Ayuda',
             'fi': u'Ohje',
             'fr': u'Aide',
             'he': u'עזרה',
+            'hi': u'Help',
             'hu': u'Segítség',
             'it': u'Aiuto',
+            'ja': u'Help',
+            'nl': u'Help',
             'pl': u'Pomoc',
             'pt': u'Ajuda',
             'ro': u'Ajutor',
             'ru': u'Справка',
             'sv': u'Hjälp',
+            'zh': u'Help',
+            'wts': u'Help',
         }
         self.namespaces[13] = {
-            '_default': u'Help talk',
+            '_default': [u'Help talk', self.namespaces[13]['_default']],
             'ar': u'نقاش المساعدة',
             'ca': u'Ajuda Discussió',
             'de': u'Hilfe Diskussion',
+            'en': u'Help talk',
             'eo': u'Helpa diskuto',
             'es': u'Ayuda Discusión',
             'fi': u'Keskustelu ohjeesta',
             'fr': u'Discussion Aide',
             'he': u'שיחת עזרה',
+            'hi': u'Help talk',
             'hu': u'Segítség vita',
             'it': u'Discussioni aiuto',
             'ja': u'Help‐ノート',
@@ -291,12 +392,15 @@
             'ro': u'Discuţie Ajutor',
             'ru': u'Обсуждение справки',
             'sv': u'Hjälpdiskussion',
+            'zh': u'Help talk',
+            'wts': u'Help talk',
         }
         self.namespaces[14] = {
-            '_default': u'Category',
+            '_default': [u'Category', self.namespaces[14]['_default']],
             'ar': u'تصنيف',
             'ca': u'Categoria',
             'de': u'Kategorie',
+            'en': u'Category',
             'eo': u'Kategorio',
             'es': u'Categoría',
             'fi': u'Luokka',
@@ -305,18 +409,22 @@
             'hi': u'श्रेणी',
             'hu': u'Kategória',
             'it': u'Categoria',
+            'ja': u'Category',
             'nl': u'Categorie',
             'pl': u'Kategoria',
             'pt': u'Categoria',
             'ro': u'Categorie',
             'ru': u'Категория',
             'sv': u'Kategori',
+            'zh': u'Category',
+            'wts': u'Category',
         }
         self.namespaces[15] = {
-            '_default': u'Category talk',
+            '_default': [u'Category talk', self.namespaces[15]['_default']],
             'ar': u'نقاش التصنيف',
             'ca': u'Categoria Discussió',
             'de': u'Kategorie Diskussion',
+            'en': u'Category talk',
             'eo': u'Kategoria diskuto',
             'es': u'Categoría Discusión',
             'fi': u'Keskustelu luokasta',
@@ -332,24 +440,167 @@
             'ro': u'Discuţie Categorie',
             'ru': u'Обсуждение категории',
             'sv': u'Kategoridiskussion',
+            'zh': u'Category talk',
+            'wts': u'Category talk',
         }
+        # Do not add '_default' key into this name space.
+        # It cause weird error; Bot says "Please create a file user-config.py, and ...".
+        self.namespaces[200] = {
+            'wts': u'Tech',
+        }
+        # Do not add '_default' key into this name space.
+        # It cause weird error; Bot says "Please create a file user-config.py, and ...".
+        self.namespaces[201] = {
+            'wts': u'Tech talk',
+        }
 
-
         # A few selected big languages for things that we do not want to loop over
         # all languages. This is only needed by the titletranslate.py module, so
         # if you carefully avoid the options, you could get away without these
         # for another wikimedia family.
-
         self.languages_by_size = ['en','fr','ro']
 
+        # for Wikitravel's /Run subpages check.
+        self.wt_script_policy = {
+            '_default': u'Script policy',
+            'ar': u'Bot',
+            'ca': u'Bots',
+            'de': u'Regeln für Skripte',
+            'en': u'Script policy',
+            'eo': u'Roboto',
+            'es': u'Bots',
+            'fi': u'Botit',
+            'fr': u'Règles concernant les scripts',
+            'he': u'Bot',
+            'hi': u'यंत्रमानव',
+            'hu': u'Botok',
+            'it': u'Politica script',
+            'ja': u'スクリプトの基本方針',
+            'nl': u'Richtlijnen scripting',
+            'pl': u'Boty',
+            'pt': u'Robôs',
+            'ro': u'Bot',
+            'ru': u'Боты',
+            'sv': u'Robotar',
+            'zh': u'機器人方針',
+            'wts': u'Script policy',
+        }
+
+        # String used as separator between interwiki links and the text
+        self.interwiki_text_separator = '\r\n'
+
+        # Interwiki sorting order for Wikitravel Shared (wts:)
+        self.alphabetic = [
+            'ar', 'ca', 'de', 'en', 'eo', 'es', 'fi', 'fr', 'he', 'hi',
+            'hu', 'it', 'ja', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'zh',
+            'wts'
+        ]
+
+        # for Wikitravel Shared (wts:)
+            # Which languages have a special order for putting interlanguage links,
+            # and what order is it? If a language is not in interwiki_putfirst,
+            # alphabetical order on language code is used. For languages that are in
+            # interwiki_putfirst, interwiki_putfirst is checked first, and
+            # languages are put in the order given there. All other languages are put
+            # after those, in code-alphabetical order.
+        self.interwiki_putfirst = {
+            'ar': self.alphabetic,
+            'ca': self.alphabetic,
+            'de': self.alphabetic,
+            'en': self.alphabetic,
+            'eo': self.alphabetic,
+            'es': self.alphabetic,
+            'fi': self.alphabetic,
+            'fr': self.alphabetic,
+            'he': self.alphabetic,
+            'hi': self.alphabetic,
+            'hu': self.alphabetic,
+            'it': self.alphabetic,
+            'ja': self.alphabetic,
+            'nl': self.alphabetic,
+            'pl': self.alphabetic,
+            'pt': self.alphabetic,
+            'ro': self.alphabetic,
+            'ru': self.alphabetic,
+            'sv': self.alphabetic,
+            'zh': self.alphabetic,
+        }
+
+        # for Wikitravel Shared (wts:), Previous DOTM, etc.
+            # Allows crossnamespace interwiki linking.
+            # Lists the possible crossnamespaces combinations
+            # keys are originating NS
+            # values are dicts where:
+            #   keys are the originating langcode, or _default
+            #   values are dicts where:
+            #       keys are the languages that can be linked to from the lang+ns, or _default
+            #       values are a list of namespace numbers
+        self.crossnamespace[0] = {
+            '_default': {
+                '_default': [4],
+                'wts': [4, 14],
+            },
+        }
+        self.crossnamespace[4] = {
+            '_default': {
+                '_default': [0],
+            },
+        }
+        self.crossnamespace[14] = {
+            'wts': {
+                '_default': [0], 
+            },
+        }
+
+    # Wikitravel's bot control by checking /Run subpages.
+    def bot_control(self,site):
+        import urllib
+        from wikipedia import Error, Page
+        wt_username = urllib.quote(config.usernames[self.name][site.lang].encode('utf-8'))
+        wt_namespace = urllib.quote(self.namespaces[2][site.lang].encode('utf-8'))
+        wt_user_run = unicode(wt_namespace) + u':' + unicode(wt_username) + u'/Run'
+        wt_page = Page(site, wt_user_run)
+        wt_user_run_text = wt_page.get(get_redirect = True)
+        wt_namespace = urllib.quote(self.namespaces[4][site.lang].encode('utf-8'))
+        wt_script_policy = urllib.quote(self.wt_script_policy[site.lang].encode('utf-8'))
+        wt_system_run = unicode(wt_namespace) + u':' + unicode(wt_script_policy) + u'/Run'
+        wt_page = Page(site, wt_system_run)
+        wt_system_run_text = wt_page.get(get_redirect = True)
+        if 'yes' not in wt_user_run_text or 'yes' not in wt_system_run_text:
+            raise Error('Bot stopped by /Run page on %s -- %s = %s , %s = %s'
+                     % (site.lang, wt_user_run, wt_user_run_text, wt_system_run, wt_system_run_text))
+        return True
+
     def hostname(self,code):
         return 'wikitravel.org'
 
+    # fix for Wikitravel's mediawiki message setting
+    def mediawiki_message(self,site):
+        # (eo:)
+        if site.lang == 'eo':
+            site._mediawiki_messages['readonly_lag'] = u'The database has been automatically locked while the slave database servers catch up to the master'
+        # (hi:)
+        if site.lang == 'hi':
+            site._mediawiki_messages['readonly'] = u'Database locked'
+            site._mediawiki_messages['readonly_lag'] = u'The database has been automatically locked while the slave database servers catch up to the master'
+        return site
+
     def scriptpath(self, code):
-        return '/wiki/%s' % code
+        # for Wikitravel Shared (wts:)
+        if code == 'wts':
+            return '/wiki/shared'
+        else:
+            return '/wiki/%s' % code
 
     def shared_image_repository(self, code):
         return ('wikitravel_shared', 'wikitravel_shared')
 
+    # fix for Wikitravel's user page link.
+    def user_page_link(self,site,index):
+        site._isLoggedIn[index] = True
+        site._userName[index] = config.usernames[self.name][site.lang].encode('utf-8')
+        return site
+
     def version(self, code):
-        return "1.10.1"
+        return "1.11.2"
+

Modified: trunk/pywikipedia/wikipedia.py
===================================================================
--- trunk/pywikipedia/wikipedia.py	2009-09-24 23:24:22 UTC (rev 7295)
+++ trunk/pywikipedia/wikipedia.py	2009-09-24 23:28:58 UTC (rev 7296)
@@ -814,7 +814,7 @@
         else:
             RversionTab = re.compile(r'<li id="ca-history"><a href=".*?title=.*?&amp;action=history".*?>.*?</a></li>', re.DOTALL)
         matchVersionTab = RversionTab.search(text)
-        if not matchVersionTab:
+        if not matchVersionTab and not self.site().family.name == 'wikitravel':
             raise NoPage(self.site(), self.aslink(forceInterwiki = True),"Page does not exist. In rare cases, if you are certain the page does exist, look into overriding family.RversionTab" )
         # Look if the page is on our watchlist
         matchWatching = Rwatchlist.search(text)
@@ -1009,6 +1009,10 @@
         user_config.py, or using page.put(force=True).
 
         """
+
+        if self.site().family.name == 'wikitravel':        # Wikitravel's bot control.
+            self.site().family.bot_control(self.site())
+
         if config.ignore_bot_templates: #Check the "master ignore switch"
             return True
 
@@ -3969,6 +3973,9 @@
                 cats = getCategoryLinks(s2, site = site)
                 s2 = removeCategoryLinksAndSeparator(s2.replace(marker,'',cseparatorstripped).strip(), site) + separator + s
                 newtext = replaceCategoryLinks(s2, cats, site=site, addOnly=True)
+            elif site.family.name == 'wikitravel':     # for Wikitravel's language links position.
+                s = separator + s + separator
+                newtext = s2[:firstafter].replace(marker,'') + s + s2[firstafter:]
             else:
                 if template:
                     # Do we have a noinclude at the end of the template?
@@ -4749,7 +4756,10 @@
                 'meta': 'userinfo',
                 'uiprop': 'blockinfo',
             }
-            data = query.GetData(params, self)['query']['userinfo']
+            if self.versionnumber() == 11:     # fix for version 1.11 API.
+                data = query.GetData(params, self)['userinfo']
+            else:
+                data = query.GetData(params, self)['query']['userinfo']
             return data.has_key('blockby')
         except NotImplementedError:
             return False
@@ -5268,6 +5278,9 @@
                 # No idea what is the user name, and it isn't important
                 self._userName[index] = None
 
+            if self.family.name == 'wikitravel':    # fix for Wikitravel's user page link.
+                self = self.family.user_page_link(self,index)
+
             # Check user groups, if possible (introduced in 1.10)
             groupsR = re.compile(r'var wgUserGroups = \[\"(.+)\"\];')
             m = groupsR.search(text)
@@ -5436,6 +5449,9 @@
                     continue
                 break
 
+        if self.family.name == 'wikitravel':    # fix for Wikitravel's mediawiki message setting
+            self = self.family.mediawiki_message(self)
+
         key = key.lower()
         try:
             return self._mediawiki_messages[key]





More information about the Pywikipedia-svn mailing list