FelixReimann has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/81567


Change subject: add Qualifier write support
......................................................................

add Qualifier write support

qualifier read/write is enabled by
- editQualifier() api method in site.py
- addQualifier() front end method in page.py

Claim.qualifiers is changed from dict to list as the property of each claim is 
available using claim.id.

Test edit:
https://www.wikidata.org/w/index.php?title=Q10834790&diff=67432217&oldid=67430773

Change-Id: I917a69fff552be8b29a5d186d6b9f8df6eeea61d
---
M pywikibot/page.py
M pywikibot/site.py
2 files changed, 51 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/67/81567/1

diff --git a/pywikibot/page.py b/pywikibot/page.py
index c13ae4e..1140cbb 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -2708,7 +2708,7 @@
         if self.isQualifier and self.isReference:
             raise ValueError(u'Claim cannot be both a qualifier and 
reference.')
         self.sources = []
-        self.qualifiers = {}
+        self.qualifiers = []
         self.target = None
         self.snaktype = 'value'
         self.on_item = None  # The item it's on
@@ -2747,10 +2747,7 @@
             for prop in data['qualifiers']:
                 for qualifier in data['qualifiers'][prop]:
                     qual = Claim.qualifierFromJSON(site, qualifier)
-                    if prop in claim.qualifiers:
-                        claim.qualifiers[prop].append(qual)
-                    else:
-                        claim.qualifiers[prop] = [qual]
+                    claim.qualifiers.append(qual)
         return claim
 
     @staticmethod
@@ -2847,6 +2844,16 @@
         self.on_item.lastrevid = data['pageinfo']['lastrevid']
         self.sources.append(source)
 
+    def addQualifier(self, qualifier, **kwargs):
+        """Adds the given qualifier
+
+        @param qualifier: the qualifier to add
+        @type qualifier: Claim
+        """
+        data = self.repo.editQualifier(self, qualifier, **kwargs)
+        self.on_item.lastrevid = data['pageinfo']['lastrevid']
+        self.qualifiers.append(qualifier)
+
     def _formatDataValue(self):
         """
         Format the target into the proper JSON datavalue that Wikibase wants
diff --git a/pywikibot/site.py b/pywikibot/site.py
index 00a0104..dac99c7 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -3442,7 +3442,7 @@
                       ids=prop.getID(),
                       props='datatype',
                       )
-        expiry = datetime.timedelta(days=365*100)
+        expiry = datetime.timedelta(days=365 * 100)
         #Store it for 100 years
         req = api.CachedRequest(expiry, site=self, **params)
         data = req.submit()
@@ -3538,8 +3538,8 @@
         @param new Whether to create a new one if the "source" already exists
         @type new bool
         """
-        if claim.isReference:
-            raise ValueError("The claim cannot be a reference.")
+        if claim.isReference or claim.isQualifier:
+            raise ValueError("The claim cannot have a source.")
         params = dict(action='wbsetreference',
                       statement=claim.snak,
                       )
@@ -3577,6 +3577,42 @@
         return data
 
     @must_be(group='user')
+    def editQualifier(self, claim, qualifier, bot=True, **kwargs):
+        """
+        Create/Edit a qualifier
+
+        @param claim: A Claim object to add the qualifier to
+        @type claim: pywikibot.Claim
+        @param qualifier: A Claim object to be used as a qualifier
+        @type qualifier: pywikibot.Claim
+        """
+        if claim.isReference or claim.isQualifier:
+            raise ValueError("The claim cannot have a qualifier.")
+        params = dict(action='wbsetqualifier',
+                      claim=claim.snak,
+                      )
+        if claim.on_item:  # I can't think of when this would be false, but 
lets be safe
+            params['baserevid'] = claim.on_item.lastrevid
+        if bot:
+            params['bot'] = 1
+        params['token'] = self.token(claim, 'edit')
+        #build up the snak
+        if claim.getSnakType() == 'value':
+            params['value'] = json.dumps(qualifier._formatDataValue())
+        else:
+            raise NotImplementedError('%s snaktype is not supported yet.' % 
claim.getSnakType())
+        params['snaktype'] = 'value'
+        params['property'] = qualifier.getID()
+
+        for arg in kwargs:
+            if arg in ['bot', 'baserevid', 'summary']:
+                params[arg] = kwargs[arg]
+
+        req = api.Request(site=self, **params)
+        data = req.submit()
+        return data
+
+    @must_be(group='user')
     def removeClaims(self, claims, bot=True, **kwargs):
         params = dict(action='wbremoveclaims')
         if bot:

-- 
To view, visit https://gerrit.wikimedia.org/r/81567
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I917a69fff552be8b29a5d186d6b9f8df6eeea61d
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: FelixReimann <fe...@fex-it.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to