jenkins-bot has submitted this change and it was merged.
Change subject: Implement wbsetclaim function
......................................................................
Implement wbsetclaim function
wbsetclaim lets us add a claim and reference in one edit, but requires
us to create the serialized object ourselves.
Also added in proper handling of ranks.
Code based on Aude's PHP implementation
Change-Id: I599bd354c3e201149fd799b71937be0d7cc79f8e
---
M pywikibot/page.py
M pywikibot/site.py
2 files changed, 119 insertions(+), 13 deletions(-)
Approvals:
Ladsgroup: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/page.py b/pywikibot/page.py
index 52e792a..bee1461 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -2693,6 +2693,7 @@
self.qualifiers = {}
self.target = None
self.snaktype = 'value'
+ self.rank = 'normal'
self.on_item = None # The item it's on
@staticmethod
@@ -2722,6 +2723,7 @@
else:
#This covers string type
claim.target = data['mainsnak']['datavalue']['value']
+ claim.rank = data['rank']
if 'references' in data:
for source in data['references']:
claim.sources.append(Claim.referenceFromJSON(site, source))
@@ -2755,7 +2757,6 @@
"""
wrap = {'mainsnak': data}
return Claim.fromJSON(site, wrap)
-
def setTarget(self, value):
"""
@@ -2792,6 +2793,12 @@
"""
return self.target
+ def getRank(self):
+ return self.rank
+
+ def setRank(self):
+ raise NotImplementedError
+
def getSnakType(self):
"""
Returns the "snaktype"
@@ -2822,8 +2829,9 @@
def addSource(self, source, **kwargs):
"""
- source is a Claim.
- adds it as a reference.
+ Adds a reference to the current claim
+ @param source: reference to add
+ @type source: pywikibot.Claim
"""
data = self.repo.editSource(self, source, new=True, **kwargs)
source.hash = data['reference']['hash']
@@ -2833,6 +2841,7 @@
def _formatDataValue(self):
"""
Format the target into the proper JSON datavalue that Wikibase wants
+ @return: dict|basestring
"""
if self.getType() == 'wikibase-item':
value = {'entity-type': 'item',
@@ -2847,6 +2856,32 @@
raise NotImplementedError('%s datatype is not supported yet.' %
self.getType())
return value
+ def _buildMainSnak(self):
+ """
+ Builds the full mainsnak that Wikibase wants
+ @return: dict
+ """
+ if self.getType() == 'wikibase-item':
+ datavalue = {
+ 'type': 'wikibase-entityid',
+ 'value': self._formatDataValue()
+ }
+ elif self.getType() in ['string', 'commonsMedia']:
+ datavalue = {
+ 'type': 'string',
+ 'value': self._formatDataValue()
+ }
+ elif self.getType() == 'globecoordinate':
+ datavalue = {
+ 'type': 'globecoordinate',
+ 'value': self._formatDataValue()
+ }
+ else:
+ raise NotImplementedError('%s datatype is not supported yet.' %
self.getType())
+ return datavalue
+
+
+
diff --git a/pywikibot/site.py b/pywikibot/site.py
index bca3feb..31ce3d5 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -17,6 +17,7 @@
import datetime
import itertools
import os
+from random import randint
import re
import sys
import threading
@@ -3460,6 +3461,85 @@
item.claims[claim.getID()] = [claim]
item.lastrevid = data['pageinfo']['lastrevid']
+ def setClaim(self, item, claim, bot=True, **kwargs):
+ """
+ Implementation of wbsetclaim
+ The advantage of using this is that we can create
+ the reference in the same edit as adding the claim
+ @param item: Item to add a claim on
+ @type item: pywikibot.ItemPage
+ @param claim: Claim to add. This claim can have references
+ @type claim: pywikibot.Claim
+ @param bot: Mark edit as bot
+ @type bot: bool
+ @return: dict
+ """
+ if claim.getSnakType() != 'value':
+ raise NotImplementedError
+ # Assemble the claim thingy
+ data = {
+ 'id': self.generateGUID(item),
+ 'mainsnak': {
+ 'snaktype': claim.getSnakType(),
+ 'property': claim.getID(),
+ 'datavalue': claim._buildMainSnak(),
+ },
+ 'type': 'statement',
+ 'rank': claim.getRank(),
+ 'references': [],
+ }
+ if claim.sources:
+ # FIXME: Only the first ref will be added
+ ref = claim.sources[0]
+ data['references'].append({
+ 'snaks': {
+ ref.getID(): [{
+ 'snaktype': 'value', # FIXME: Support multiple
snaktypes
+ 'property': ref.getID(),
+ 'datavalue': ref._buildMainSnak(),
+ }]
+ }
+ })
+
+ params = {
+ 'action': 'wbsetclaim',
+ 'claim': json.dumps(data),
+ 'token': self.token(item, 'edit'),
+ 'baserevid': item.lastrevid,
+ }
+ if bot:
+ params['bot'] = 1
+
+ req = api.Request(site=self, **params)
+ data = req.submit()
+ if claim.getID() in item.claims:
+ item.claims[claim.getID()].append(claim)
+ else:
+ item.claims[claim.getID()] = [claim]
+ item.lastrevid = data['pageinfo']['lastrevid']
+ claim.on_item = item
+
+ def generateGUID(self, item):
+ """
+ Function to generate a random GUID, converted from the
+ one in Wikibase in PHP
+ @param item: item the guid is for
+ @type item: pywikibot.ItemPage
+ @return: str
+ """
+ fmt = '{0:04X}{0:04X}-{0:04X}-{0:04X}-{0:04X}-{0:04X}{0:04X}{0:04X}'
+ string = fmt.format(
+ randint(0, 65535),
+ randint(0, 65535),
+ randint(0, 65535),
+ randint(16384, 20479),
+ randint(32768, 49151),
+ randint(0, 65535),
+ randint(0, 65535),
+ randint(0, 65535),
+ )
+ return item.getID() + '$' + string
+
@must_be(group='user')
def changeClaimTarget(self, claim, snaktype='value', bot=True, **kwargs):
"""
@@ -3510,16 +3590,7 @@
if not new and hasattr(source, 'hash'):
params['reference'] = source.hash
#build up the snak
- if source.getType() == 'wikibase-item':
- datavalue = {'type': 'wikibase-entityid',
- 'value': source._formatDataValue(),
- }
- elif source.getType() == 'string':
- datavalue = {'type': 'string',
- 'value': source._formatDataValue(),
- }
- else:
- raise NotImplementedError('%s datatype is not supported yet.' %
claim.getType())
+ datavalue = source._buildMainSnak()
snak = {source.getID(): [{'snaktype': 'value',
'property': source.getID(),
'datavalue': datavalue,
--
To view, visit https://gerrit.wikimedia.org/r/80328
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I599bd354c3e201149fd799b71937be0d7cc79f8e
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Legoktm <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-commits