Murfel has uploaded a new change for review.
https://gerrit.wikimedia.org/r/184209
Change subject: Different filenames and descriptions support for Uploadbot
......................................................................
Different filenames and descriptions support for Uploadbot
Parameter url may be a two-dimensional list with path, filename and
description for each file. It is not available from command line (yet?).
Bug: T86300
Change-Id: I6609af1c9b2119cbd76ff6045a207f84284ebeeb
---
M scripts/upload.py
M tests/uploadbot_tests.py
2 files changed, 90 insertions(+), 49 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core
refs/changes/09/184209/1
diff --git a/scripts/upload.py b/scripts/upload.py
index e3daa44..fbc2ed3 100755
--- a/scripts/upload.py
+++ b/scripts/upload.py
@@ -74,7 +74,9 @@
Constructor.
@param url: path to url or local file (deprecated), or list of urls or
- paths to local files.
+ paths to local files, or list of lists of form of [url, filename,
+ description] where filename and description are either strings or
+ None.
@type url: string (deprecated) or list
@param description: Description of file for its page. If multiple files
are uploading the same description is used for every file.
@@ -195,29 +197,42 @@
return tempname
def process_filename(self, file_url=None):
- """Return base filename portion of file_url."""
+ """Return base filename portion of file_url or file_url[0]."""
if not file_url:
file_url = self.url
- pywikibot.warning("file_url is not given. "
- "Set to self.url by default.")
+ pywikibot.warning(
+ "file_url is not given. Set to "
+ "[self.url, None, self.description] by default.")
+
+ return_filename = False
+ if isinstance(file_url, basestring):
+ return_filename = True
+ file_url = [file_url, None]
+ if self.description:
+ file_url.append(self.description)
+ else:
+ file_url.append(None)
# Isolate the pure name
- filename = file_url
+ filename = file_url[0]
# Filename may be either a URL or a local file path
if "://" in filename:
# extract the path portion of the URL
filename = urlparse(filename).path
filename = os.path.basename(filename)
+
+ if not file_url[1]:
+ file_url[1] = filename
if self.useFilename:
- filename = self.useFilename
+ file_url[1] = self.useFilename
if not self.keepFilename:
pywikibot.output(
- u"The filename on the target wiki will default to: %s"
- % filename)
+ u"Thefile_url[1]on the target wiki will default to: %s"
+ % file_url[1])
newfn = pywikibot.input(
u'Enter a better name, or press enter to accept:')
if newfn != "":
- filename = newfn
+ file_url[1] = newfn
# FIXME: these 2 belong somewhere else, presumably in family
# forbidden characters are handled by pywikibot/page.py
forbidden = ':*?/\\' # to be extended
@@ -228,13 +243,13 @@
first_check = True
while True:
if not first_check:
- filename = pywikibot.input(u'Enter a better name, '
- 'or press enter to skip:')
- if not filename:
+ file_url[1] = pywikibot.input(u'Enter a better name, '
+ 'or press enter to skip:')
+ if notfile_url[1]:
return None
first_check = False
ext = os.path.splitext(filename)[1].lower().strip('.')
- # are any chars in forbidden also in filename?
+ # are any chars in forbidden also infile_url[1]?
invalid = set(forbidden) & set(filename)
if invalid:
c = "".join(invalid)
@@ -247,42 +262,41 @@
% (u' '.join(allowed_formats), ext),
default=False, automatic_quit=False):
continue
- potential_file_page = pywikibot.FilePage(self.targetSite, filename)
+ potential_file_page = pywikibot.FilePage(self.targetSite,
file_url[1])
if potential_file_page.exists():
if potential_file_page.canBeEdited():
if pywikibot.input_yn(u"File with name %s already exists. "
"Would you like to change the name? "
"(Otherwise file will be
overwritten.)"
- % filename, default=True,
+ % file_url[1], default=True,
automatic_quit=False):
continue
else:
break
else:
pywikibot.output(u"File with name %s already exists and "
- "cannot be overwritten." % filename)
+ "cannot be overwritten." % file_url[1])
continue
else:
try:
if potential_file_page.fileIsShared():
pywikibot.output(u"File with name %s already exists in
shared "
"repository and cannot be
overwritten."
- % filename)
+ % file_url[1])
continue
except pywikibot.NoPage:
break
# A proper description for the submission.
# Empty descriptions are not accepted.
+ if not file_url[2]:
+ file_url[2] = self.description
pywikibot.output(u'The suggested description is:\n%s'
- % self.description)
+ % file_url[2])
# Description must be set and verified
- if not self.description:
- self.verifyDescription = True
-
- while not self.description or self.verifyDescription:
- if not self.description:
+ while not file_url[2] or self.verifyDescription:
+ if not file_url[2]:
pywikibot.output(
u'\03{lightred}It is not possible to upload a file '
'without a summary/description.\03{default}')
@@ -290,20 +304,23 @@
# if no description, default is 'yes'
if pywikibot.input_yn(
u'Do you want to change this description?',
- default=not self.description):
+ default=not file_url[2]):
from pywikibot import editor as editarticle
editor = editarticle.TextEditor()
try:
- newDescription = editor.edit(self.description)
+ newDescription = editor.edit(file_url[2])
except Exception as e:
pywikibot.error(e)
continue
# if user saved / didn't press Cancel
if newDescription:
- self.description = newDescription
+ file_url[2] = newDescription
self.verifyDescription = False
- return filename
+ if return_filename:
+ self.description = file_url[2]
+ return file_url[1]
+ return file_url
def abort_on_warn(self, warn_code):
"""Determine if the warning message should cause an abort."""
@@ -325,20 +342,24 @@
self.upload_file(self.url, debug)
def upload_file(self, file_url, debug=False):
- """Upload the image at file_url to the target wiki.
+ """Upload the image at file_url or file_url[0] to the target wiki.
Return the filename that was used to upload the image.
If the upload fails, ask the user whether to try again or not.
- If the user chooses not to retry, return null.
+ If the user chooses not to retry, return None.
"""
filename = self.process_filename(file_url)
if not filename:
return None
+ elif isinstance(filename, basestring):
+ file_url = [file_url, filename, self.description]
+ else:
+ file_url = filename
site = self.targetSite
- imagepage = pywikibot.FilePage(site, filename) # normalizes filename
- imagepage.text = self.description
+ imagepage = pywikibot.FilePage(site, file_url[1]) # normalizes
filename
+ imagepage.text = file_url[2]
pywikibot.output(u'Uploading file to %s via API...' % site)
@@ -347,13 +368,13 @@
if self.ignoreWarning is True:
apiIgnoreWarnings = True
if self.uploadByUrl:
- site.upload(imagepage, source_url=file_url,
+ site.upload(imagepage, source_url=file_url[0],
ignore_warnings=apiIgnoreWarnings)
else:
- if "://" in file_url:
- temp = self.read_file_content(file_url)
+ if "://" in file_url[0]:
+ temp = self.read_file_content(file_url[0])
else:
- temp = file_url
+ temp = file_url[0]
site.upload(imagepage, source_filename=temp,
ignore_warnings=apiIgnoreWarnings,
chunk_size=self.chunk_size)
@@ -387,7 +408,7 @@
else:
# No warning, upload complete.
pywikibot.output(u"Upload of %s successful." % filename)
- return filename # data['filename']
+ return file_url[1] # data['filename']
def run(self):
"""Run bot."""
diff --git a/tests/uploadbot_tests.py b/tests/uploadbot_tests.py
index a84667c..ae57295 100644
--- a/tests/uploadbot_tests.py
+++ b/tests/uploadbot_tests.py
@@ -13,6 +13,7 @@
#
import os
+import time
from scripts import upload
from tests import _images_dir
@@ -28,38 +29,57 @@
family = 'wikipedia'
code = 'test'
- def test_png_list(self):
- """Test uploading a list of pngs using upload.py."""
+ def test_png_desc_list(self):
+ """Test uploading a descriptive list of pngs using upload.py."""
image_list = []
for directory_info in os.walk(_images_dir):
for dir_file in directory_info[2]:
image_list.append(os.path.join(directory_info[0], dir_file))
- bot = upload.UploadRobot(url=image_list,
- description="pywikibot upload.py script test",
+ desc_list = []
+ for image in image_list:
+ desc_list.append([])
+ desc_list[-1] = [image, make_unique_filename(self.get_site(),
image), None]
+ bot = upload.UploadRobot(url=desc_list,
+ description="pywikibot upload.py script test.
"
+ "Tested uploading a descriptive list of
pngs.",
useFilename=None, keepFilename=True,
- verifyDescription=True, aborts=set(),
+ verifyDescription=False, aborts=set(),
ignoreWarning=True,
targetSite=self.get_site())
bot.run()
def test_png(self):
"""Test uploading a png using upload.py."""
- bot = upload.UploadRobot(url=[os.path.join(_images_dir,
"MP_sounds.png")],
- description="pywikibot upload.py script test",
- useFilename=None, keepFilename=True,
- verifyDescription=True, aborts=set(),
+ path = os.path.join(_images_dir, "MP_sounds.png")
+ filename = make_unique_filename(self.get_site(), path)
+ bot = upload.UploadRobot(url=[path],
+ description="pywikibot upload.py script test.
"
+ "Tested uploading a png.",
+ useFilename=filename, keepFilename=True,
+ verifyDescription=False, aborts=set(),
ignoreWarning=True,
targetSite=self.get_site())
bot.run()
def test_png_url(self):
"""Test uploading a png from url using upload.py."""
- bot =
upload.UploadRobot(url=['https://upload.wikimedia.org/wikipedia/commons/f/fc/MP_sounds.png'],
- description="pywikibot upload.py script test",
- useFilename=None, keepFilename=True,
- verifyDescription=True, aborts=set(),
+ path =
'https://upload.wikimedia.org/wikipedia/commons/f/fc/MP_sounds.png'
+ filename = make_unique_filename(self.get_site(), path)
+ bot = upload.UploadRobot(url=[path],
+ description="pywikibot upload.py script test.
"
+ "Tested uploading a png from url.",
+ useFilename=filename, keepFilename=True,
+ verifyDescription=False, aborts=set(),
ignoreWarning=True,
targetSite=self.get_site())
bot.run()
+def make_unique_filename(site, path):
+ """Make unique filename to run test without human attention required."""
+ base = os.path.basename(path)
+ file_path = os.path.splitext(base)[0]
+ file_extension = os.path.splitext(base)[1]
+ filename = file_path + ' ' + str(time.time()) + file_extension
+ return filename
+
if __name__ == '__main__':
try:
unittest.main()
--
To view, visit https://gerrit.wikimedia.org/r/184209
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6609af1c9b2119cbd76ff6045a207f84284ebeeb
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Murfel <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits