Revision: 7451
Author:   alexsh
Date:     2009-10-13 17:47:54 +0000 (Tue, 13 Oct 2009)

Log Message:
-----------
Page().move(): add API method and add movesubpages option

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

Modified: trunk/pywikipedia/wikipedia.py
===================================================================
--- trunk/pywikipedia/wikipedia.py      2009-10-13 17:40:08 UTC (rev 7450)
+++ trunk/pywikipedia/wikipedia.py      2009-10-13 17:47:54 UTC (rev 7451)
@@ -2577,12 +2577,21 @@
         users = set([edit[2] for edit in edits])
         return users
 
-    def move(self, newtitle, reason=None, movetalkpage=True, sysop=False,
+    def move(self, newtitle, reason=None, movetalkpage=True, 
movesubpages=False, sysop=False,
              throttle=True, deleteAndMove=False, safe=True, fixredirects=True, 
leaveRedirect=True):
         """Move this page to new title given by newtitle. If safe, don't try
         to move and delete if not directly requested.
 
         * fixredirects has no effect in MW < 1.13"""
+        try:
+            if config.use_api and self.site().versionnumber() >= 12:
+                x = self.site().api_address()
+                del x
+            else:
+                raise NotImplementedError
+        except NotImplementedError:
+            return self._moveOld(newtitle, reason, movetalkpage, sysop,
+              throttle, deleteAndMove, safe, fixredirects, leaveRedirect)
         # Login
         try:
             self.get()
@@ -2591,6 +2600,7 @@
         sysop = self._getActionUser(action = 'move', restriction = 
self.moveRestriction, sysop = False)
         if deleteAndMove:
             sysop = self._getActionUser(action = 'delete', restriction = '', 
sysop = True)
+            Page(self,site(), 
newtitle).delete(self.site().mediawiki_message('delete_and_move_reason'), 
False, False)
 
         # Check blocks
         self.site().checkBlocks(sysop = sysop)
@@ -2601,9 +2611,79 @@
             reason = input(u'Please enter a reason for the move:')
         if self.isTalkPage():
             movetalkpage = False
+        
+        params = {
+            'action': 'move',
+            'from': self.title(),
+            'to': newtitle,
+            'token': self.site().getToken(sysop=sysop),
+            'reason': reason,
+            #'': '',
+        }
+        if movesubpages:
+            params['movesubpages'] = 1
+        
+        if movetalkpage:
+            params['movetalk'] = 1
+        
+        if not leaveRedirect:
+            params['noredirect'] = 1
+        
+        result = query.GetData(params, self.site(), sysop=sysop)
+        if 'error' in result:
+            err = result['error']['code']
+            if err == 'articleexists':
+                if safe:
+                    output(u'Page move failed: Target page [[%s]] already 
exists.' % newtitle)
+                    return False
+                else:
+                    try:
+                        # Try to delete and move
+                        return self.move(newtitle, reason, movetalkpage, 
movesubpages, throttle = throttle, deleteAndMove = True)
+                    except NoUsername:
+                        # We dont have the user rights to delete
+                        output(u'Page moved failed: Target page [[%s]] already 
exists.' % newtitle)
+                        return False
+            #elif err == 'protectedpage':
+            #    
+            else:
+                output("Unknown Error: %s" % result)
+        elif 'move' in result:
+            if deleteAndMove:
+                output(u'Page %s moved to %s, deleting the existing page' % 
(self.title(), newtitle))
+            else:
+                output(u'Page %s moved to %s' % (self.title(), newtitle))
+            
+            if hasattr(self, '_contents'):
+                self.get(force=True, get_redirect=True, throttle=False)
+            return True
+        
+    
+    def _moveOld(self, newtitle, reason=None, movetalkpage=True, 
movesubpages=False, sysop=False,
+             throttle=True, deleteAndMove=False, safe=True, fixredirects=True, 
leaveRedirect=True):
+        
+        # Login
+        try:
+            self.get()
+        except:
+            pass
+        sysop = self._getActionUser(action = 'move', restriction = 
self.moveRestriction, sysop = False)
+        if deleteAndMove:
+            sysop = self._getActionUser(action = 'delete', restriction = '', 
sysop = True)
+
+        # Check blocks
+        self.site().checkBlocks(sysop = sysop)
+
+        if throttle:
+            put_throttle()
+        if reason is None:
+            reason = input(u'Please enter a reason for the move:')
+        if self.isTalkPage():
+            movetalkpage = False
+        
         host = self.site().hostname()
         address = self.site().move_address()
-        token = self.site().getToken(self, sysop = sysop)
+        token = self.site().getToken(sysop = sysop)
         predata = {
             'wpOldTitle': self.title().encode(self.site().encoding()),
             'wpNewTitle': newtitle.encode(self.site().encoding()),
@@ -2612,21 +2692,31 @@
         if deleteAndMove:
             predata['wpDeleteAndMove'] = 
self.site().mediawiki_message('delete_and_move_confirm')
             predata['wpConfirm'] = '1'
+        
         if movetalkpage:
             predata['wpMovetalk'] = '1'
         else:
             predata['wpMovetalk'] = '0'
+        
         if self.site().versionnumber() >= 13:
             if fixredirects:
                 predata['wpFixRedirects'] = '1'
             else:
                 predata['wpFixRedirects'] = '0'
+        
         if leaveRedirect:
             predata['wpLeaveRedirect'] = '1'
         else:
             predata['wpLeaveRedirect'] = '0'
+        
+        if movesubpages:
+            predata['wpMovesubpages'] = '1'
+        else:
+            predata['wpMovesubpages'] = '0'
+        
         if token:
             predata['wpEditToken'] = token
+        
         if self.site().hostname() in config.authenticate.keys():
             predata['Content-type'] = 'application/x-www-form-urlencoded'
             predata['User-agent'] = useragent
@@ -2635,11 +2725,16 @@
             data = u''
         else:
             response, data = self.site().postForm(address, predata, sysop = 
sysop)
+        
         if data == u'' or self.site().mediawiki_message('pagemovedsub') in 
data:
             if deleteAndMove:
                 output(u'Page %s moved to %s, deleting the existing page' % 
(self.title(), newtitle))
             else:
                 output(u'Page %s moved to %s' % (self.title(), newtitle))
+            
+            if hasattr(self, '_contents'):
+                self.get(force=True, get_redirect=True, throttle=False)
+            
             return True
         else:
             self.site().checkBlocks(sysop = sysop)
@@ -2650,7 +2745,7 @@
                 else:
                     try:
                         # Try to delete and move
-                        return self.move(newtitle = newtitle, reason = reason, 
movetalkpage = movetalkpage, throttle = throttle, deleteAndMove = True)
+                        return self._moveOld(newtitle, reason, movetalkpage, 
movesubpages, throttle = throttle, deleteAndMove = True)
                     except NoUsername:
                         # We dont have the user rights to delete
                         output(u'Page moved failed: Target page [[%s]] already 
exists.' % newtitle)



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

Reply via email to