jenkins-bot has submitted this change and it was merged.
Change subject: Add support for statements in PropertyPage
......................................................................
Add support for statements in PropertyPage
It's possible to make/remove statements in Property pages in wikidata.
- People can make changes in claims (add/remove/modify) using editEntity
- Add .claims attribute to PropertyPage class as well
Bug: T92669
Change-Id: Ic0ca0de87af017a6356beac2dad793ac81cc7ee8
---
M pywikibot/page.py
M tests/wikibase_edit_tests.py
2 files changed, 62 insertions(+), 39 deletions(-)
Approvals:
John Vandenberg: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/page.py b/pywikibot/page.py
index 446bbe0..17ae0db 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -3271,9 +3271,20 @@
self.descriptions[lang] = self._content[
'descriptions'][lang]['value']
+ # claims
+ self.claims = {}
+ if 'claims' in self._content:
+ for pid in self._content['claims']:
+ self.claims[pid] = []
+ for claim in self._content['claims'][pid]:
+ c = Claim.fromJSON(self.repo, claim)
+ c.on_item = self
+ self.claims[pid].append(c)
+
return {'aliases': self.aliases,
'labels': self.labels,
'descriptions': self.descriptions,
+ 'claims': self.claims,
}
def _diff_to(self, type_key, key_name, value_name, diffto, data):
@@ -3326,6 +3337,35 @@
if aliases:
data['aliases'] = aliases
+
+ claims = {}
+ for prop in self.claims:
+ if len(self.claims[prop]) > 0:
+ claims[prop] = [claim.toJSON() for claim in self.claims[prop]]
+
+ if diffto and 'claims' in diffto:
+ temp = defaultdict(list)
+ claim_ids = set()
+
+ diffto_claims = diffto['claims']
+
+ for prop in claims:
+ for claim in claims[prop]:
+ if (prop not in diffto_claims or
+ claim not in diffto_claims[prop]):
+ temp[prop].append(claim)
+
+ claim_ids.add(claim['id'])
+
+ for prop, prop_claims in diffto_claims.items():
+ for claim in prop_claims:
+ if 'id' in claim and claim['id'] not in claim_ids:
+ temp[prop].append({'id': claim['id'], 'remove': ''})
+
+ claims = temp
+
+ if claims:
+ data['claims'] = claims
return data
def getID(self, numeric=False, force=False):
@@ -3620,16 +3660,6 @@
"""
super(ItemPage, self).get(force=force, *args, **kwargs)
- # claims
- self.claims = {}
- if 'claims' in self._content:
- for pid in self._content['claims']:
- self.claims[pid] = list()
- for claim in self._content['claims'][pid]:
- c = Claim.fromJSON(self.repo, claim)
- c.on_item = self
- self.claims[pid].append(c)
-
# sitelinks
self.sitelinks = {}
if 'sitelinks' in self._content:
@@ -3670,34 +3700,6 @@
self._diff_to('sitelinks', 'site', 'title', diffto, data)
- claims = {}
- for prop in self.claims:
- if len(self.claims[prop]) > 0:
- claims[prop] = [claim.toJSON() for claim in self.claims[prop]]
-
- if diffto and 'claims' in diffto:
- temp = defaultdict(list)
- claim_ids = set()
-
- diffto_claims = diffto['claims']
-
- for prop in claims:
- for claim in claims[prop]:
- if (prop not in diffto_claims or
- claim not in diffto_claims[prop]):
- temp[prop].append(claim)
-
- claim_ids.add(claim['id'])
-
- for prop, prop_claims in diffto_claims.items():
- for claim in prop_claims:
- if 'id' in claim and claim['id'] not in claim_ids:
- temp[prop].append({'id': claim['id'], 'remove': ''})
-
- claims = temp
-
- if claims:
- data['claims'] = claims
return data
def iterlinks(self, family=None):
@@ -3805,7 +3807,8 @@
"""
Remove the claims from the item.
- @type claims: list
+ @param claims: list of claims to be removed
+ @type claims: list or pywikibot.Claim
"""
# this check allows single claims to be removed by pushing them into a
diff --git a/tests/wikibase_edit_tests.py b/tests/wikibase_edit_tests.py
index 84dc056..f0907e32 100644
--- a/tests/wikibase_edit_tests.py
+++ b/tests/wikibase_edit_tests.py
@@ -78,6 +78,26 @@
end_date.setTarget(pywikibot.WbTime(year=2012))
item.claims['P115'][0].addQualifier(end_date)
+ # Testing all again but this time in properties
+ item = pywikibot.PropertyPage(testsite, 'P115')
+ item.get()
+ if 'P115' in item.claims:
+ to_remove = []
+ for claim in item.claims['P115']:
+ to_remove.append({'id': claim.toJSON()['id'], 'remove': ''})
+ item.editEntity({'claims': to_remove})
+
+ claim = pywikibot.page.Claim(testsite, 'P115',
datatype='wikibase-item')
+ target = pywikibot.ItemPage(testsite, 'Q271')
+ claim.setTarget(target)
+ item.editEntity({'claims': [claim.toJSON()]})
+
+ item.get(force=True)
+
+ end_date = pywikibot.page.Claim(testsite, 'P88', isQualifier=True)
+ end_date.setTarget(pywikibot.WbTime(year=2012))
+ item.claims['P115'][0].addQualifier(end_date)
+
def test_edit_entity_new_item(self):
testsite = self.get_repo()
ts = str(time.time())
--
To view, visit https://gerrit.wikimedia.org/r/219244
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ic0ca0de87af017a6356beac2dad793ac81cc7ee8
Gerrit-PatchSet: 11
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Ladsgroup <[email protected]>
Gerrit-Reviewer: John Vandenberg <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: Mpaa <[email protected]>
Gerrit-Reviewer: Ricordisamoa <[email protected]>
Gerrit-Reviewer: XZise <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits