http://www.mediawiki.org/wiki/Special:Code/pywikipedia/11213
Revision: 11213 Author: legoktm Date: 2013-03-16 09:43:19 +0000 (Sat, 16 Mar 2013) Log Message: ----------- Add support for creating claims (not references)
*Clean up fromJSON logic *Implement getType() method for properties *Rename methods to use lowerCamelCase *Some minor PEP8 fixes and other things
Modified Paths: -------------- branches/rewrite/pywikibot/page.py branches/rewrite/pywikibot/site.py
Modified: branches/rewrite/pywikibot/page.py =================================================================== --- branches/rewrite/pywikibot/page.py 2013-03-16 02:47:23 UTC (rev 11212) +++ branches/rewrite/pywikibot/page.py 2013-03-16 09:43:19 UTC (rev 11213) @@ -2193,6 +2193,7 @@ Page.__init__(self, site, title) if isinstance(self.site, pywikibot.site.DataSite): self.repo = self.site + self.id = title.lower() else: self.repo = self.site.data_repository()
@@ -2259,6 +2260,19 @@ 'descriptions':self.descriptions, }
+ def getID(self, numeric=False, force=False): + """ + @param numeric Strip the first letter and return an int + @type numeric bool + @param force Force an update of new data + @type force bool + """ + if not hasattr(self, 'id') or force: + self.get(force=force) + if numeric: + return int(self.id[1:]) + return self.id + def latestRevision(self): if not hasattr(self, 'lastrevid'): self.get() @@ -2331,7 +2345,7 @@ 'claims': self.claims }
- def get_sitelink(self, site, force=False): + def getSitelink(self, site, force=False): """ Returns a page object for the specific site site is a pywikibot.Site @@ -2346,7 +2360,17 @@ else: return self.sitelinks[dbname]
+ def addClaim(self, claim, bot=True): + """ + Adds the claim to the item + @param claim The claim to add + @type claim Claim + @param bot Whether to flag as bot (if possible) + @type bot bool + """ + self.repo.addClaim(self, claim, bot=bot)
+ class PropertyPage(WikibasePage): """ Any page in the property namespace @@ -2359,12 +2383,21 @@ if not self.id.startswith(u'p'): raise ValueError(u"'%s' is not a property page!" % self.title())
- def get_type(self): + def get(self, force=False, *args): + if force or not hasattr(self, '_content'): + WikibasePage.get(self, force=force, *args) + self.type = self._content['datatype'] + + def getType(self): """ Returns the type that this item uses Examples: item, commons media file, StringValue, NumericalValue """ - raise NotImplementedError + if not hasattr(self, 'type'): + self.get() + if self.type == 'wikibase-entityid': + self.type = 'wikibase-item' + return self.type
class QueryPage(WikibasePage): @@ -2404,7 +2437,8 @@ claim.snak = data['id'] else: claim.isReference = True - if data['mainsnak']['datavalue']['type'] == 'wikibase-entityid': + claim.type = data['mainsnak']['datavalue']['type'] + if claim.type == 'wikibase-entityid': claim.target = ItemPage(site, 'Q' + str(data['mainsnak']['datavalue']['value']['numeric-id'])) else: @@ -2427,27 +2461,27 @@ c.hash = data['hash'] return c
- def set_target(self, value): + def setTarget(self, value): """ Sets the target to the passed value. There should be checks to ensure type compliance """ self.target = value
- def get_target(self): + def getTarget(self): """ Returns object that the property is associated with. None is returned if no target is set """ return self.target
- def get_sources(self): + def getSources(self): """ Returns a list of Claims """ return self.sources
- def add_source(self, source): + def addSource(self, source): """ source is a Claim. adds it as a reference.
Modified: branches/rewrite/pywikibot/site.py =================================================================== --- branches/rewrite/pywikibot/site.py 2013-03-16 02:47:23 UTC (rev 11212) +++ branches/rewrite/pywikibot/site.py 2013-03-16 09:43:19 UTC (rev 11213) @@ -29,6 +29,7 @@ import threading import time import urllib +import json
_logger = "wiki.site"
@@ -3333,7 +3334,36 @@ raise pywikibot.data.api.APIError, data['errors'] return data['entities']
+ def addClaim(self, item, claim, bot=True):
+ params = dict(action='wbcreateclaim', + entity=item.getID(), + baserevid=item.latestRevision(), + snaktype='value', + property=claim.getID() + ) + if bot: + params['bot'] = 1 + if claim.getType() == 'wikibase-item': + params['value'] = json.dumps({'entity-type': 'item', + 'numeric-id': claim.getTarget().getID(numeric=True)}) + elif claim.getType() == 'string': + params['value'] = '"' + claim.getTarget() + '"' + else: + raise NotImplementedError('%s datatype is not supported yet.' % claim.getType()) + params['token'] = self.token(item, 'edit') + req = api.Request(site=self, **params) + data = req.submit() + claim.snak = data['claim']['id'] + #Update the item + if claim.getID() in item.claims: + item.claims[claim.getID()].append(claim) + else: + item.claims[claim.getID()] = [claim] + item.lastrevid = data['pageinfo']['lastrevid'] + + + # deprecated BaseSite methods def fam(self): raise NotImplementedError
pywikipedia-svn@lists.wikimedia.org