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)