Revision: 7461
Author:   alexsh
Date:     2009-10-14 16:22:04 +0000 (Wed, 14 Oct 2009)

Log Message:
-----------
Site()._getUserData(): separate API and ordinary page getinfo process

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

Modified: trunk/pywikipedia/wikipedia.py
===================================================================
--- trunk/pywikipedia/wikipedia.py      2009-10-14 16:19:39 UTC (rev 7460)
+++ trunk/pywikipedia/wikipedia.py      2009-10-14 16:22:04 UTC (rev 7461)
@@ -5335,7 +5335,7 @@
             conn.close()
 
         # If a wiki page, get user data
-        self._getUserData(data, sysop = sysop)
+        self._getUserDataOld(data, sysop = sysop)
 
         return response, data
 
@@ -5481,7 +5481,7 @@
             text = unicode(text, charset, errors = 'replace')
 
         # If a wiki page, get user data
-        self._getUserData(text, sysop = sysop)
+        self._getUserDataOld(text, sysop = sysop)
 
         if back_response:
             return response, text
@@ -5490,230 +5490,236 @@
 
     def _getUserData(self, text, sysop = False, force = True):
         """
-        Get the user data from a wiki page data.
+        Get the user data from an API query dict.
 
         Parameters:
         * text - the page text
         * sysop - is the user a sysop?
         """
-
+        
         index = self._userIndex(sysop)
+        # Check for blocks
+        if 'blockedby' in text and not self._isBlocked[index]:
+            # Write a warning if not shown earlier
+            if sysop:
+                account = 'Your sysop account'
+            else:
+                account = 'Your account'
+            output(u'WARNING: %s on %s is blocked. Editing using this account 
will stop the run.' % (account, self))
+        self._isBlocked[index] = 'blockedby' in text
 
-        if type(text) == dict: #text is dict, query from API
-            # Check for blocks
-            if 'blockedby' in text and not self._isBlocked[index]:
-                # Write a warning if not shown earlier
+        # Check for new messages, the data must had key 'messages' in dict.
+        if 'messages' in text:
+            if not self._messages[index]:
+                # User has *new* messages
                 if sysop:
-                    account = 'Your sysop account'
+                    output(u'NOTE: You have new messages in your sysop account 
on %s' % self)
                 else:
-                    account = 'Your account'
-                output(u'WARNING: %s on %s is blocked. Editing using this 
account will stop the run.' % (account, self))
-            self._isBlocked[index] = 'blockedby' in text
+                    output(u'NOTE: You have new messages on %s' % self)
+            self._messages[index] = True
+        else:
+            self._messages[index] = False
 
-            # Check for new messages, the data must had key 'messages' in dict.
-            if 'messages' in text:
-                if not self._messages[index]:
-                    # User has *new* messages
+        # Don't perform other checks if the data was already loaded
+        if self._userData[index] and not force:
+            return
+
+        # Get username.
+        # The data in anonymous mode had key 'anon'
+        # if 'anon' exist, username is IP address, not to collect it right now
+        if not 'anon' in text:
+            self._isLoggedIn[index] = True
+            self._userName[index] = text['name']
+        else:
+            self._isLoggedIn[index] = False
+            self._userName[index] = None
+
+        # Get user groups and rights
+        if 'groups' in text:
+            self._rights[index] = text['groups']
+            self._rights[index].extend(text['rights'])
+            # Warnings
+            # Don't show warnings for not logged in users, they will just fail 
to
+            # do any action
+            if self._isLoggedIn[index]:
+                if 'bot' not in self._rights[index] and 
config.notify_unflagged_bot:
+                    # Sysop + bot flag = Sysop flag in MediaWiki < 1.7.1?
                     if sysop:
-                        output(u'NOTE: You have new messages in your sysop 
account on %s' % self)
+                        output(u'Note: Your sysop account on %s does not have 
a bot flag. Its edits will be visible in the recent changes.' % self)
                     else:
-                        output(u'NOTE: You have new messages on %s' % self)
-                self._messages[index] = True
+                        output(u'WARNING: Your account on %s does not have a 
bot flag. Its edits will be visible in the recent changes and it may get 
blocked.' % self)
+                if sysop and 'sysop' not in self._rights[index]:
+                    output(u'WARNING: Your sysop account on %s does not seem 
to have sysop rights. You may not be able to perform any sysop-restricted 
actions using it.' % self)
+        else:
+            # 'groups' is not exists, set default rights
+            self._rights[index] = []
+            if self._isLoggedIn[index]:
+                # Logged in user
+                self._rights[index].append('user')
+                # Assume bot, and thus autoconfirmed
+                self._rights[index].extend(['bot', 'autoconfirmed'])
+                if sysop:
+                    # Assume user reported as a sysop indeed has the sysop 
rights
+                    self._rights[index].append('sysop')
+        # Assume the user has the default rights if API not query back
+        self._rights[index].extend(['read', 'createaccount', 'edit', 'upload', 
'createpage', 'createtalk', 'move', 'upload'])
+        #remove Duplicate rights
+        self._rights[index] = list(set(self._rights[index]))
+
+        # Get token
+        if 'preferencestoken' in text:
+            self._token[index] = text['preferencestoken']
+            if self._rights[index] is not None:
+                # Token and rights are loaded - user data is now loaded
+                self._userData[index] = True
+        elif self.versionnumber() < 14:
+            # uiprop 'preferencestoken' is start from 1.14, if 1.8~13, we need 
to use other way to get token
+            params = {
+                'action': 'query',
+                'prop': 'info',
+                'titles':'Non-existing page',
+                'intoken': 'edit',
+            }
+            data = query.GetData(params, self, 
sysop=sysop)['query']['pages'].values()[0]
+            if 'edittoken' in data:
+                self._token[index] = data['edittoken']
+                self._userData[index] = True
             else:
-                self._messages[index] = False
+                output(u'WARNING: Token not found on %s. You will not be able 
to edit any page.' % self)
+        else:
+            if not self._isBlocked[index]:
+                output(u'WARNING: Token not found on %s. You will not be able 
to edit any page.' % self)
+    
+    def _getUserDataOld(self, text, sysop = False, force = True):
+        """
+        Get the user data from a wiki page data.
 
-            # Don't perform other checks if the data was already loaded
-            if self._userData[index] and not force:
-                return
+        Parameters:
+        * text - the page text
+        * sysop - is the user a sysop?
+        """
 
-            # Get username.
-            # The data in anonymous mode had key 'anon'
-            # if 'anon' exist, username is IP address, not to collect it right 
now
-            if not 'anon' in text:
-                self._isLoggedIn[index] = True
-                self._userName[index] = text['name']
-            else:
-                self._isLoggedIn[index] = False
-                self._userName[index] = None
+        index = self._userIndex(sysop)
 
-            # Get user groups and rights
-            if 'groups' in text:
-                self._rights[index] = text['groups']
-                self._rights[index].extend(text['rights'])
-                # Warnings
-                # Don't show warnings for not logged in users, they will just 
fail to
-                # do any action
-                if self._isLoggedIn[index]:
-                    if 'bot' not in self._rights[index] and 
config.notify_unflagged_bot:
-                        # Sysop + bot flag = Sysop flag in MediaWiki < 1.7.1?
-                        if sysop:
-                            output(u'Note: Your sysop account on %s does not 
have a bot flag. Its edits will be visible in the recent changes.' % self)
-                        else:
-                            output(u'WARNING: Your account on %s does not have 
a bot flag. Its edits will be visible in the recent changes and it may get 
blocked.' % self)
-                    if sysop and 'sysop' not in self._rights[index]:
-                        output(u'WARNING: Your sysop account on %s does not 
seem to have sysop rights. You may not be able to perform any sysop-restricted 
actions using it.' % self)
-            else:
-                # 'groups' is not exists, set default rights
-                self._rights[index] = []
-                if self._isLoggedIn[index]:
-                    # Logged in user
-                    self._rights[index].append('user')
-                    # Assume bot, and thus autoconfirmed
-                    self._rights[index].extend(['bot', 'autoconfirmed'])
-                    if sysop:
-                        # Assume user reported as a sysop indeed has the sysop 
rights
-                        self._rights[index].append('sysop')
-            # Assume the user has the default rights if API not query back
-            self._rights[index].extend(['read', 'createaccount', 'edit', 
'upload', 'createpage', 'createtalk', 'move', 'upload'])
-            #remove Duplicate rights
-            self._rights[index] = list(set(self._rights[index]))
+        if '<div id="globalWrapper">' not in text:
+            # Not a wiki page
+            return
+        # Check for blocks - but only if version is 1.11 (userinfo is 
available)
+        # and the user data was not yet loaded
+        if self.versionnumber() >= 11 and (not self._userData[index] or force):
+            blocked = self._getBlock(sysop = sysop)
+            if blocked and not self._isBlocked[index]:
+                # Write a warning if not shown earlier
+                if sysop:
+                    account = 'Your sysop account'
+                else:
+                    account = 'Your account'
+                output(u'WARNING: %s on %s is blocked. Editing using this 
account will stop the run.' % (account, self))
+            self._isBlocked[index] = blocked
 
-            # Get token
-            if 'preferencestoken' in text:
-                self._token[index] = text['preferencestoken']
-                if self._rights[index] is not None:
-                    # Token and rights are loaded - user data is now loaded
-                    self._userData[index] = True
-            elif self.versionnumber() < 14:
-                # uiprop 'preferencestoken' is start from 1.14, if 1.8~13, we 
need to use other way to get token
-                params = {
-                    'action': 'query',
-                    'prop': 'info',
-                    'titles':'Non-existing page',
-                    'intoken': 'edit',
-                }
-                data = query.GetData(params, self, 
sysop=sysop)['query']['pages'].values()[0]
-                if 'edittoken' in data:
-                    self._token[index] = data['edittoken']
-                    self._userData[index] = True
+        # Check for new messages
+        if '<div class="usermessage">' in text:
+            if not self._messages[index]:
+                # User has *new* messages
+                if sysop:
+                    output(u'NOTE: You have new messages in your sysop account 
on %s' % self)
                 else:
-                    output(u'WARNING: Token not found on %s. You will not be 
able to edit any page.' % self)
-            else:
-                if not self._isBlocked[index]:
-                    output(u'WARNING: Token not found on %s. You will not be 
able to edit any page.' % self)
+                    output(u'NOTE: You have new messages on %s' % self)
+            self._messages[index] = True
         else:
-            #ordinary mode to get data from edit page HTMLs and JavaScripts
+            self._messages[index] = False
+        # Don't perform other checks if the data was already loaded
+        if self._userData[index] and not force:
+            return
 
-            if '<div id="globalWrapper">' not in text:
-                # Not a wiki page
-                return
-            # Check for blocks - but only if version is 1.11 (userinfo is 
available)
-            # and the user data was not yet loaded
-            if self.versionnumber() >= 11 and (not self._userData[index] or 
force):
-                blocked = self._getBlock(sysop = sysop)
-                if blocked and not self._isBlocked[index]:
-                    # Write a warning if not shown earlier
-                    if sysop:
-                        account = 'Your sysop account'
-                    else:
-                        account = 'Your account'
-                    output(u'WARNING: %s on %s is blocked. Editing using this 
account will stop the run.' % (account, self))
-                self._isBlocked[index] = blocked
+        # Search for the the user page link at the top.
+        # Note that the link of anonymous users (which doesn't exist at all
+        # in Wikimedia sites) has the ID pt-anonuserpage, and thus won't be
+        # found here.
+        userpageR = re.compile('<li id="pt-userpage"><a 
href=".+?">(?P<username>.+?)</a></li>')
+        m = userpageR.search(text)
+        if m:
+            self._isLoggedIn[index] = True
+            self._userName[index] = m.group('username')
+        else:
+            self._isLoggedIn[index] = False
+            # No idea what is the user name, and it isn't important
+            self._userName[index] = None
 
-            # Check for new messages
-            if '<div class="usermessage">' in text:
-                if not self._messages[index]:
-                    # User has *new* messages
-                    if sysop:
-                        output(u'NOTE: You have new messages in your sysop 
account on %s' % self)
-                    else:
-                        output(u'NOTE: You have new messages on %s' % self)
-                self._messages[index] = True
-            else:
-                self._messages[index] = False
+        if self.family.name == 'wikitravel':    # fix for Wikitravel's user 
page link.
+            self = self.family.user_page_link(self,index)
 
-            # Don't perform other checks if the data was already loaded
-            if self._userData[index] and not force:
-                return
-
-            # Search for the the user page link at the top.
-            # Note that the link of anonymous users (which doesn't exist at all
-            # in Wikimedia sites) has the ID pt-anonuserpage, and thus won't be
-            # found here.
-            userpageR = re.compile('<li id="pt-userpage"><a 
href=".+?">(?P<username>.+?)</a></li>')
-            m = userpageR.search(text)
-            if m:
-                self._isLoggedIn[index] = True
-                self._userName[index] = m.group('username')
-            else:
-                self._isLoggedIn[index] = False
-                # 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)
-            checkLocal = True
-            if default_code in self.family.cross_allowed: # if current 
languages in cross allowed list, check global bot flag.
-                globalgroupsR = re.compile(r'var wgGlobalGroups = 
\[\"(.+)\"\];')
-                mg = globalgroupsR.search(text)
-                if mg: # the account had global permission
-                    globalRights = mg.group(1)
-                    globalRights = globalRights.split('","')
-                    self._rights[index] = globalRights
-                    if self._isLoggedIn[index]:
-                        if 'Global_bot' in globalRights: # This account has 
the global bot flag, no need to check local flags.
-                            checkLocal = False
-                        else:
-                            output(u'Your bot account does not have global the 
bot flag, checking local flag.')
-            else:
-                if verbose: output(u'Note: this language does not allow global 
bots.')
-            if m and checkLocal:
-                rights = m.group(1)
-                rights = rights.split('", "')
-                if '*' in rights:
-                    rights.remove('*')
-                self._rights[index] = rights
-                # Warnings
-                # Don't show warnings for not logged in users, they will just 
fail to
-                # do any action
+        # Check user groups, if possible (introduced in 1.10)
+        groupsR = re.compile(r'var wgUserGroups = \[\"(.+)\"\];')
+        m = groupsR.search(text)
+        checkLocal = True
+        if default_code in self.family.cross_allowed: # if current languages 
in cross allowed list, check global bot flag.
+            globalgroupsR = re.compile(r'var wgGlobalGroups = \[\"(.+)\"\];')
+            mg = globalgroupsR.search(text)
+            if mg: # the account had global permission
+                globalRights = mg.group(1)
+                globalRights = globalRights.split('","')
+                self._rights[index] = globalRights
                 if self._isLoggedIn[index]:
-                    if 'bot' not in self._rights[index] and 
config.notify_unflagged_bot:
-                        # Sysop + bot flag = Sysop flag in MediaWiki < 1.7.1?
-                        if sysop:
-                            output(u'Note: Your sysop account on %s does not 
have a bot flag. Its edits will be visible in the recent changes.' % self)
-                        else:
-                            output(u'WARNING: Your account on %s does not have 
a bot flag. Its edits will be visible in the recent changes and it may get 
blocked.' % self)
-                    if sysop and 'sysop' not in self._rights[index]:
-                        output(u'WARNING: Your sysop account on %s does not 
seem to have sysop rights. You may not be able to perform any sysop-restricted 
actions using it.' % self)
-            else:
-                # We don't have wgUserGroups, and can't check the rights
-                self._rights[index] = []
-                if self._isLoggedIn[index]:
-                    # Logged in user
-                    self._rights[index].append('user')
-                    # Assume bot, and thus autoconfirmed
-                    self._rights[index].extend(['bot', 'autoconfirmed'])
+                    if 'Global_bot' in globalRights: # This account has the 
global bot flag, no need to check local flags.
+                        checkLocal = False
+                    else:
+                        output(u'Your bot account does not have global the bot 
flag, checking local flag.')
+        else:
+            if verbose: output(u'Note: this language does not allow global 
bots.')
+        if m and checkLocal:
+            rights = m.group(1)
+            rights = rights.split('", "')
+            if '*' in rights:
+                rights.remove('*')
+            self._rights[index] = rights
+            # Warnings
+            # Don't show warnings for not logged in users, they will just fail 
to
+            # do any action
+            if self._isLoggedIn[index]:
+                if 'bot' not in self._rights[index] and 
config.notify_unflagged_bot:
+                    # Sysop + bot flag = Sysop flag in MediaWiki < 1.7.1?
                     if sysop:
-                        # Assume user reported as a sysop indeed has the sysop 
rights
-                        self._rights[index].append('sysop')
-            # Assume the user has the default rights
-            self._rights[index].extend(['read', 'createaccount', 'edit', 
'upload', 'createpage', 'createtalk', 'move', 'upload'])
-            if 'bot' in self._rights[index] or 'sysop' in self._rights[index]:
-                self._rights[index].append('apihighlimits')
-            if 'sysop' in self._rights[index]:
-                self._rights[index].extend(['delete', 'undelete', 'block', 
'protect', 'import', 'deletedhistory', 'unwatchedpages'])
+                        output(u'Note: Your sysop account on %s does not have 
a bot flag. Its edits will be visible in the recent changes.' % self)
+                    else:
+                        output(u'WARNING: Your account on %s does not have a 
bot flag. Its edits will be visible in the recent changes and it may get 
blocked.' % self)
+                if sysop and 'sysop' not in self._rights[index]:
+                    output(u'WARNING: Your sysop account on %s does not seem 
to have sysop rights. You may not be able to perform any sysop-restricted 
actions using it.' % self)
+        else:
+            # We don't have wgUserGroups, and can't check the rights
+            self._rights[index] = []
+            if self._isLoggedIn[index]:
+                # Logged in user
+                self._rights[index].append('user')
+                # Assume bot, and thus autoconfirmed
+                self._rights[index].extend(['bot', 'autoconfirmed'])
+                if sysop:
+                    # Assume user reported as a sysop indeed has the sysop 
rights
+                    self._rights[index].append('sysop')
+        # Assume the user has the default rights
+        self._rights[index].extend(['read', 'createaccount', 'edit', 'upload', 
'createpage', 'createtalk', 'move', 'upload'])
+        if 'bot' in self._rights[index] or 'sysop' in self._rights[index]:
+            self._rights[index].append('apihighlimits')
+        if 'sysop' in self._rights[index]:
+            self._rights[index].extend(['delete', 'undelete', 'block', 
'protect', 'import', 'deletedhistory', 'unwatchedpages'])
 
-            # Search for a token
-            tokenR = re.compile(r"\<input type='hidden' value=\"(.*?)\" 
name=\"wpEditToken\"")
-            tokenloc = tokenR.search(text)
-            if tokenloc:
-                self._token[index] = tokenloc.group(1)
-                if self._rights[index] is not None:
-                    # In this case, token and rights are loaded - user data is 
now loaded
-                    self._userData[index] = True
-            else:
+        # Search for a token
+        tokenR = re.compile(r"\<input type='hidden' value=\"(.*?)\" 
name=\"wpEditToken\"")
+        tokenloc = tokenR.search(text)
+        if tokenloc:
+            self._token[index] = tokenloc.group(1)
+            if self._rights[index] is not None:
+                # In this case, token and rights are loaded - user data is now 
loaded
+                self._userData[index] = True
+        else:
+            # Token not found
+            # Possible reason for this is the user is blocked, don't show a
+            # warning in this case, otherwise do show a warning
+            # Another possible reason is that the page cannot be edited - 
ensure
+            # there is a textarea and the tab "view source" is not shown
+            if u'<textarea' in text and u'<li id="ca-viewsource"' not in text 
and not self._isBlocked[index]:
                 # Token not found
-                # Possible reason for this is the user is blocked, don't show a
-                # warning in this case, otherwise do show a warning
-                # Another possible reason is that the page cannot be edited - 
ensure
-                # there is a textarea and the tab "view source" is not shown
-                if u'<textarea' in text and u'<li id="ca-viewsource"' not in 
text and not self._isBlocked[index]:
-                    # Token not found
-                    output(u'WARNING: Token not found on %s. You will not be 
able to edit any page.' % self)
+                output(u'WARNING: Token not found on %s. You will not be able 
to edit any page.' % self)
 
     def mediawiki_message(self, key):
         """Return the MediaWiki message text for key "key" """
@@ -5871,14 +5877,13 @@
                 params['uiprop'] += '|preferencestoken'
 
             text = query.GetData(params, self, 
sysop=sysop)['query']['userinfo']
-            ##output('%s' % text) # for debug use only
+            self._getUserData(text, sysop = sysop, force = force)
         else:
             url = self.edit_address('Non-existing_page')
             text = self.getUrl(url, sysop = sysop)
+            self._getUserDataOld(text, sysop = sysop, force = force)
+        
 
-        # Parse data
-        self._getUserData(text, sysop = sysop, force = force)
-
     def search(self, query, number = 10, namespaces = None):
         """Yield search results (using Special:Search page) for query."""
         throttle = True



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

Reply via email to