Danmichaelo has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/368171 )
Change subject: [FEAT]Use wbsetlabel and wbsetdescription
......................................................................
[FEAT]Use wbsetlabel and wbsetdescription
If setting a single label or description, use the 'wbsetlabel' or
'wbsetdescription' APIs so autocomments are produced.
Change-Id: Ia0b3a3904ed027a1b84a285f4571344eb2ef8882
---
M pywikibot/page.py
M pywikibot/site.py
M tests/wikibase_edit_tests.py
3 files changed, 166 insertions(+), 11 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core
refs/changes/71/368171/1
diff --git a/pywikibot/page.py b/pywikibot/page.py
index bb8b224..14536fc 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -3914,6 +3914,21 @@
self.clear_cache()
@staticmethod
+ def _normalizeLanguage(value):
+ """
+ Helper function to replace a site object with its language code.
+
+ @param value: The value to normalize
+ @type value: str|pywikibot.site.BaseSite
+
+ @return: the language string
+ @rtype: str
+ """
+ if isinstance(language, pywikibot.site.BaseSite):
+ return value.lang
+ return value
+
+ @staticmethod
def _normalizeLanguages(data):
"""
Helper function to replace site objects with their language codes.
@@ -3924,11 +3939,10 @@
@return: the altered dict from parameter data.
@rtype: dict
"""
- for key in data:
- if isinstance(key, pywikibot.site.BaseSite):
- data[key.lang] = data[key]
- del data[key]
- return data
+ return {
+ self._normalizeLanguage(key): value
+ for key, value in data.items()
+ }
@classmethod
def _normalizeData(cls, data):
@@ -4013,17 +4027,70 @@
self._content = updates['entity']
self.get()
+ @allow_asynchronous
+ def setLabel(self, language, value, **kwargs):
+ """
+ Set/edit a label using the Wikibase wbsetlabel API.
+
+ To set labels in multiple languages, use the editLabels method instead.
+
+ @param language: Label language code or Site
+ @type language: str or L{pywikibot.site.BaseSite}
+ @param value: Label value string
+ @type value: str
+ @keyword asynchronous: if True, launch a separate thread to add claim
+ asynchronously
+ @type asynchronous: bool
+ @keyword callback: a callable object that will be called after the
entity
+ has been updated. It must take two arguments: (1) a WikibasePage
+ object, and (2) an exception instance, which will be None if the
+ page was saved successfully. This is intended for use by bots that
+ need to keep track of which saves were successful.
+ @type callback: callable
+ """
+ self.repo.setLabel(self, self._normalizeLanguage(language), value,
+ **kwargs)
+
def editLabels(self, labels, **kwargs):
"""
Edit entity labels.
- Labels should be a dict, with the key
- as a language or a site object. The
- value should be the string to set it to.
- You can set it to '' to remove the label.
+ @param labels: Dict with the key as a language or a site object.
+ The value should be the string to set it to. You can set it
+ to '' to remove the label.
+ @type labels: dict
"""
data = {'labels': labels}
- self.editEntity(data, **kwargs)
+ if len(labels.items()) == 1:
+ language, value = list(labels.items())[0]
+ self.setLabel(language, value)
+ else:
+ self.editEntity(data, **kwargs)
+
+ @allow_asynchronous
+ def setDescription(self, language, value, **kwargs):
+ """
+ Set/edit a description using the Wikibase wbsetdescription API.
+
+ To set descriptions in multiple languages, use the editDescriptions
+ method instead.
+
+ @param language: Description language code or Site
+ @type language: str or L{pywikibot.site.BaseSite}
+ @param value: Description value string
+ @type value: str
+ @keyword asynchronous: if True, launch a separate thread to add claim
+ asynchronously
+ @type asynchronous: bool
+ @keyword callback: a callable object that will be called after the
entity
+ has been updated. It must take two arguments: (1) a WikibasePage
+ object, and (2) an exception instance, which will be None if the
+ page was saved successfully. This is intended for use by bots that
+ need to keep track of which saves were successful.
+ @type callback: callable
+ """
+ self.repo.setDescription(self, self._normalizeLanguage(language),
value,
+ **kwargs)
def editDescriptions(self, descriptions, **kwargs):
"""
@@ -4035,7 +4102,11 @@
You can set it to '' to remove the description.
"""
data = {'descriptions': descriptions}
- self.editEntity(data, **kwargs)
+ if len(descriptions.items()) == 1:
+ language, value = list(descriptions.items())[0]
+ self.setDescription(language, value)
+ else:
+ self.editEntity(data, **kwargs)
def editAliases(self, aliases, **kwargs):
"""
diff --git a/pywikibot/site.py b/pywikibot/site.py
index e2bc6cc..f49279a 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -7928,3 +7928,57 @@
if limit is not None:
gen.set_maximum_items(limit)
return gen
+
+ @must_be(group='user')
+ def setLabel(self, item, language, value, bot=True, summary=None):
+ """
+ Set or edit a label.
+
+ @param item: Entity to modify
+ @type item: WikibasePage
+ @param language: Label language code
+ @type language: str
+ @param value: Label value
+ @type value: str
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
+ @param summary: Edit summary
+ @type summary: str
+ """
+ params = {'action': 'wbsetlabel', 'id': item.getID(),
+ 'baserevid': item.latest_revision_id,
+ 'language': language, 'value': value,
+ 'summary': summary, 'bot': bot,
+ 'token': self.tokens['edit']}
+ req = self._simple_request(**params)
+ data = req.submit()
+ # Update the item
+ item.labels[language] = value
+ item.latest_revision_id = data['entity']['lastrevid']
+
+ @must_be(group='user')
+ def setDescription(self, item, language, value, bot=True, summary=None):
+ """
+ Set or edit a description.
+
+ @param item: Entity to modify
+ @type item: WikibasePage
+ @param language: Description language code
+ @type language: str
+ @param value: Description value
+ @type value: str
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
+ @param summary: Edit summary
+ @type summary: str
+ """
+ params = {'action': 'wbsetdescription', 'id': item.getID(),
+ 'baserevid': item.latest_revision_id,
+ 'language': language, 'value': value,
+ 'summary': summary, 'bot': bot,
+ 'token': self.tokens['edit']}
+ req = self._simple_request(**params)
+ data = req.submit()
+ # Update the item
+ item.descriptions[language] = value
+ item.latest_revision_id = data['entity']['lastrevid']
diff --git a/tests/wikibase_edit_tests.py b/tests/wikibase_edit_tests.py
index 5c50893..6b3137b 100644
--- a/tests/wikibase_edit_tests.py
+++ b/tests/wikibase_edit_tests.py
@@ -40,6 +40,27 @@
item.get(force=True)
self.assertEqual(item.labels['en'], 'Test123')
+ def test_label_set_using_wbsetlabel(self):
+ """Test setting a Bokmål label using the wbsetlabel endpoint."""
+ item = pywikibot.ItemPage(self.get_repo(), 'Q68')
+ self.assertIsInstance(item, pywikibot.ItemPage)
+ item.setLabel('nb', 'Testetikett æøå')
+ self.assertEqual(item.labels['nb'], 'Testetikett æøå')
+ item.get(force=True)
+ self.assertEqual(item.labels['nb'], 'Testetikett æøå')
+
+ def test_label_set_using_wbsetlabel_with_invalid_language_code(self):
+ """Test setting a Bokmål label using wbsetlabel."""
+ item = pywikibot.ItemPage(self.get_repo(), 'Q68')
+ self.assertIsInstance(item, pywikibot.ItemPage)
+ try:
+ item.setLabel('123', 'Test')
+ except pywikibot.exceptions.OtherPageSaveError as err:
+ self.assertEqual('unknown_language', err.reason.code)
+ self.assertEqual('Unrecognized value for parameter "language":
123.',
+ err.reason.info)
+ self.assertIsNone(item.labels.get('123'))
+
def test_label_remove(self):
"""Test adding a Farsi and English label and removing the Farsi one."""
testsite = self.get_repo()
@@ -59,6 +80,15 @@
item.get()
self.assertNotIn('fa', item.labels.keys())
+ def test_description_set_using_wbsetdescription(self):
+ """Test setting a Bokmål description using wbsetdescription."""
+ item = pywikibot.ItemPage(self.get_repo(), 'Q68')
+ self.assertIsInstance(item, pywikibot.ItemPage)
+ item.setDescription('nb', 'testbeskrivelse æøå')
+ self.assertEqual(item.descriptions['nb'], 'testbeskrivelse æøå')
+ item.get(force=True)
+ self.assertEqual(item.descriptions['nb'], 'testbeskrivelse æøå')
+
def test_alias_set(self):
"""Test setting an English alias."""
testsite = self.get_repo()
--
To view, visit https://gerrit.wikimedia.org/r/368171
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia0b3a3904ed027a1b84a285f4571344eb2ef8882
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Danmichaelo <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits