Hi pywikibot experts,
How can I create new properties via pywikibot? (I'm trying to do it via bot, because I'm doing some experiments on a dedicated wikibase installation with - possibly - hundreds of properties to be created... and Pywikibot would certainly be my favorite tool!)
In case I have, instead, to directly wrap the action "wbeditentity" from mediawiki API ( https://www.wikidata.org/w/api.php?action=help&modules=wbeditentity ), are there some Python examples?
And, in case I have to use the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), how can I manage properties more complex than the ones contained in the example ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/en-ele... )?
Using pywikibot, I'm able to MODIFY existing properties with instructions like the following ones (which let me generate the object-content in one shot via json ... as I need):
In [1]: import pywikibot ; site = pywikibot.Site() ; repo = site.data_repository() In [2]: property_page = pywikibot.PropertyPage(repo, u"P2") In [3]: myjson = {u'descriptions': {u'en': {u'language': u'en', u'value': u'invented description'}}, u'labels': {u'en': {u'language': u'en', u'value': u'test property'}}} In [4]: property_page.editEntity(myjson)
...but I cannot CREATE new properties (instantiating a PropertyPage object), because pywikibot asks for the identifier of an existing instance:
In [11]: p_page = pywikibot.PropertyPage(repo) --------------------------------------------------------------------------- InvalidTitle Traceback (most recent call last) <ipython-input-11-e72b812b8cd3> in <module>() ----> 1 p_page = pywikibot.PropertyPage(repo)
/home/user/src/pywikibot_repo/pywikibot/page.pyc in __init__(self, source, title) 4027 if not title or not self.id.startswith('P'): 4028 raise pywikibot.InvalidTitle( -> 4029 u"'%s' is not an property page title" % title) 4030 Property.__init__(self, source, self.id) 4031
InvalidTitle: '' is not an property page title
In [12]:
In fact, as I understand, in the source code of the "WikibasePage" class, I see that while for the Item type, a "Special case for empty item" is mentioned ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L3... )
# Special case for empty item. if title is None or title == '-1': super(ItemPage, self).__init__(site, u'-1', ns=ns) assert self.id == '-1' return
...for the Property type, instead, an empty object is NOT allowed ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L4... )
if not title or not self.id.startswith('P'): raise pywikibot.InvalidTitle( u"'%s' is not an property page title" % title) Property.__init__(self, source, self.id)
Thanks a lot for your attention!
Hi pywikibot experts,
Just a little update about the 3rd method I found to automatically create new properties: the use of the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ).
I simply modified the 'createProperty' function ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), as follows:
/** * @param string[] $contents Associative array, mapping language codes to labels. * * @return bool true if the item was created, false otherwise */ private function createProperty( array $contents ) { $property = Property::newFromType( 'string' ); $fingerprint = $property->getFingerprint();
foreach ( $contents as $contents_to_be_split ) { list($propertylabel_en, $propertydescription_en, $propertylabel_it, $propertydescription_it) = explode("|", $contents_to_be_split); $fingerprint->setLabel( "en", $propertylabel_en ); $fingerprint->setDescription( "en", $propertydescription_en ); $fingerprint->setLabel( "it", $propertylabel_it ); $fingerprint->setDescription( "it", $propertydescription_it ); }
try { $this->store->saveEntity( $property, 'imported', $this->user, EDIT_NEW ); return true; } catch ( Exception $ex ) { $this->doPrint( 'ERROR: ' . str_replace( "\n", ' ', $ex->getMessage() ) ); }
return false; }
It works for more complex cases of fingerprints also containing descriptions, and multiple languages (but it doesn't work for the creation of statements into the new property)
In any case, I would really prefer a solution based on Pywikibot, as described in my previous mail
Thanks for your attention!
On Wed, Mar 23, 2016 at 2:57 PM, comfortably numb < comfortably.numb.349@gmail.com> wrote:
Hi pywikibot experts,
How can I create new properties via pywikibot? (I'm trying to do it via bot, because I'm doing some experiments on a dedicated wikibase installation with - possibly - hundreds of properties to be created... and Pywikibot would certainly be my favorite tool!)
In case I have, instead, to directly wrap the action "wbeditentity" from mediawiki API ( https://www.wikidata.org/w/api.php?action=help&modules=wbeditentity ), are there some Python examples?
And, in case I have to use the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), how can I manage properties more complex than the ones contained in the example ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/en-ele... )?
Using pywikibot, I'm able to MODIFY existing properties with instructions like the following ones (which let me generate the object-content in one shot via json ... as I need):
In [1]: import pywikibot ; site = pywikibot.Site() ; repo = site.data_repository() In [2]: property_page = pywikibot.PropertyPage(repo, u"P2") In [3]: myjson = {u'descriptions': {u'en': {u'language': u'en', u'value': u'invented description'}}, u'labels': {u'en': {u'language': u'en', u'value': u'test property'}}} In [4]: property_page.editEntity(myjson)
...but I cannot CREATE new properties (instantiating a PropertyPage object), because pywikibot asks for the identifier of an existing instance:
In [11]: p_page = pywikibot.PropertyPage(repo)
InvalidTitle Traceback (most recent call last) <ipython-input-11-e72b812b8cd3> in <module>() ----> 1 p_page = pywikibot.PropertyPage(repo)
/home/user/src/pywikibot_repo/pywikibot/page.pyc in __init__(self, source, title) 4027 if not title or not self.id.startswith('P'): 4028 raise pywikibot.InvalidTitle( -> 4029 u"'%s' is not an property page title" % title) 4030 Property.__init__(self, source, self.id) 4031
InvalidTitle: '' is not an property page title
In [12]:
In fact, as I understand, in the source code of the "WikibasePage" class, I see that while for the Item type, a "Special case for empty item" is mentioned ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L3... )
# Special case for empty item. if title is None or title == '-1': super(ItemPage, self).__init__(site, u'-1', ns=ns) assert self.id == '-1' return
...for the Property type, instead, an empty object is NOT allowed ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L4... )
if not title or not self.id.startswith('P'): raise pywikibot.InvalidTitle( u"'%s' is not an property page title" % title) Property.__init__(self, source, self.id)
Thanks a lot for your attention!
Creating properties should happen in repo.editEntity but looking there I see that it's marked as TODO.
So you can either patch that or use the layout for a local function which creates properties instead.
/André
------ André Costa GLAM Developer Wikimedia Sverige On 25 Mar 2016 09:32, "comfortably numb" comfortably.numb.349@gmail.com wrote:
Hi pywikibot experts,
Just a little update about the 3rd method I found to automatically create new properties: the use of the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ).
I simply modified the 'createProperty' function ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), as follows:
/** * @param string[] $contents Associative array, mapping language
codes to labels. * * @return bool true if the item was created, false otherwise */ private function createProperty( array $contents ) { $property = Property::newFromType( 'string' ); $fingerprint = $property->getFingerprint();
foreach ( $contents as $contents_to_be_split ) { list($propertylabel_en, $propertydescription_en,
$propertylabel_it, $propertydescription_it) = explode("|", $contents_to_be_split); $fingerprint->setLabel( "en", $propertylabel_en ); $fingerprint->setDescription( "en", $propertydescription_en ); $fingerprint->setLabel( "it", $propertylabel_it ); $fingerprint->setDescription( "it", $propertydescription_it ); }
try { $this->store->saveEntity( $property, 'imported',
$this->user, EDIT_NEW ); return true; } catch ( Exception $ex ) { $this->doPrint( 'ERROR: ' . str_replace( "\n", ' ', $ex->getMessage() ) ); }
return false; }
It works for more complex cases of fingerprints also containing descriptions, and multiple languages (but it doesn't work for the creation of statements into the new property)
In any case, I would really prefer a solution based on Pywikibot, as described in my previous mail
Thanks for your attention!
On Wed, Mar 23, 2016 at 2:57 PM, comfortably numb < comfortably.numb.349@gmail.com> wrote:
Hi pywikibot experts,
How can I create new properties via pywikibot? (I'm trying to do it via bot, because I'm doing some experiments on a dedicated wikibase installation with - possibly - hundreds of properties to be created... and Pywikibot would certainly be my favorite tool!)
In case I have, instead, to directly wrap the action "wbeditentity" from mediawiki API ( https://www.wikidata.org/w/api.php?action=help&modules=wbeditentity ), are there some Python examples?
And, in case I have to use the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), how can I manage properties more complex than the ones contained in the example ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/en-ele... )?
Using pywikibot, I'm able to MODIFY existing properties with instructions like the following ones (which let me generate the object-content in one shot via json ... as I need):
In [1]: import pywikibot ; site = pywikibot.Site() ; repo = site.data_repository() In [2]: property_page = pywikibot.PropertyPage(repo, u"P2") In [3]: myjson = {u'descriptions': {u'en': {u'language': u'en', u'value': u'invented description'}}, u'labels': {u'en': {u'language': u'en', u'value': u'test property'}}} In [4]: property_page.editEntity(myjson)
...but I cannot CREATE new properties (instantiating a PropertyPage object), because pywikibot asks for the identifier of an existing instance:
In [11]: p_page = pywikibot.PropertyPage(repo)
InvalidTitle Traceback (most recent call last) <ipython-input-11-e72b812b8cd3> in <module>() ----> 1 p_page = pywikibot.PropertyPage(repo)
/home/user/src/pywikibot_repo/pywikibot/page.pyc in __init__(self, source, title) 4027 if not title or not self.id.startswith('P'): 4028 raise pywikibot.InvalidTitle( -> 4029 u"'%s' is not an property page title" % title) 4030 Property.__init__(self, source, self.id) 4031
InvalidTitle: '' is not an property page title
In [12]:
In fact, as I understand, in the source code of the "WikibasePage" class, I see that while for the Item type, a "Special case for empty item" is mentioned ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L3... )
# Special case for empty item. if title is None or title == '-1': super(ItemPage, self).__init__(site, u'-1', ns=ns) assert self.id == '-1' return
...for the Property type, instead, an empty object is NOT allowed ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L4... )
if not title or not self.id.startswith('P'): raise pywikibot.InvalidTitle( u"'%s' is not an property page title" % title) Property.__init__(self, source, self.id)
Thanks a lot for your attention!
pywikibot mailing list pywikibot@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/pywikibot
Example
import json import pywikibot
site = pywikibot.Site('en', 'mywiki') site.login() data = { 'datatype': 'string', # mandatory 'descriptions': { 'en': { 'language': 'en', 'value': 'invented description' } }, 'labels': { 'en': { 'language': 'en', 'value': 'test property' } } } params = { 'action': 'wbeditentity', 'new': 'property', 'data': json.dumps(data), 'summary': 'my edit summary', 'token': site.tokens['edit'] } req = site._simple_request(**params) print(req.submit())
Il 23/03/2016 14:57, comfortably numb ha scritto:
Hi pywikibot experts,
How can I create new properties via pywikibot? (I'm trying to do it via bot, because I'm doing some experiments on a dedicated wikibase installation with - possibly - hundreds of properties to be created... and Pywikibot would certainly be my favorite tool!)
In case I have, instead, to directly wrap the action "wbeditentity" from mediawiki API ( https://www.wikidata.org/w/api.php?action=help&modules=wbeditentity ), are there some Python examples?
And, in case I have to use the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), how can I manage properties more complex than the ones contained in the example ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/en-ele... )?
Using pywikibot, I'm able to MODIFY existing properties with instructions like the following ones (which let me generate the object-content in one shot via json ... as I need):
In [1]: import pywikibot ; site = pywikibot.Site() ; repo = site.data_repository() In [2]: property_page = pywikibot.PropertyPage(repo, u"P2") In [3]: myjson = {u'descriptions': {u'en': {u'language': u'en', u'value': u'invented description'}}, u'labels': {u'en': {u'language': u'en', u'value': u'test property'}}} In [4]: property_page.editEntity(myjson)
...but I cannot CREATE new properties (instantiating a PropertyPage object), because pywikibot asks for the identifier of an existing instance:
In [11]: p_page = pywikibot.PropertyPage(repo)
InvalidTitle Traceback (most recent call last) <ipython-input-11-e72b812b8cd3> in <module>() ----> 1 p_page = pywikibot.PropertyPage(repo)
/home/user/src/pywikibot_repo/pywikibot/page.pyc in __init__(self, source, title) 4027 if not title or not self.id.startswith('P'): 4028 raise pywikibot.InvalidTitle( -> 4029 u"'%s' is not an property page title" % title) 4030 Property.__init__(self, source, self.id http://self.id) 4031
InvalidTitle: '' is not an property page title
In [12]:
In fact, as I understand, in the source code of the "WikibasePage" class, I see that while for the Item type, a "Special case for empty item" is mentioned ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L3... )
# Special case for empty item. if title is None or title == '-1':
super(ItemPage, self).__init__(site, u'-1', ns=ns) assert self.id http://self.id == '-1' return
...for the Property type, instead, an empty object is NOT allowed ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L4... )
if not title or not self.id.startswith('P'):
raise pywikibot.InvalidTitle( u"'%s' is not an property page title" % title) Property.__init__(self, source, self.id http://self.id)
Thanks a lot for your attention!
pywikibot mailing list pywikibot@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/pywikibot
You can actually use site.EditEntity() even for creating Properties.
Re-using Ricordisamoa's example.
import pywikibot
site = pywikibot.Site('en', 'mywiki') site.login() data = { 'datatype': 'string', # mandatory 'descriptions': { 'en': { 'language': 'en', 'value': 'invented description' } }, 'labels': { 'en': { 'language': 'en', 'value': 'test property' } } } identification = { 'new': 'property' } summary = 'my edit summary' results = site.editEntity(identification, data, summary) prop = pywikibot.PropertyPage(site, results.get(u'entity').get('id'))
On 25 March 2016 at 22:18, Ricordisamoa ricordisamoa@openmailbox.org wrote:
Example
import json import pywikibot
site = pywikibot.Site('en', 'mywiki') site.login() data = { 'datatype': 'string', # mandatory 'descriptions': { 'en': { 'language': 'en', 'value': 'invented description' } }, 'labels': { 'en': { 'language': 'en', 'value': 'test property' } } } params = { 'action': 'wbeditentity', 'new': 'property', 'data': json.dumps(data), 'summary': 'my edit summary', 'token': site.tokens['edit'] } req = site._simple_request(**params) print(req.submit())
Il 23/03/2016 14:57, comfortably numb ha scritto:
Hi pywikibot experts,
How can I create new properties via pywikibot? (I'm trying to do it via bot, because I'm doing some experiments on a dedicated wikibase installation with - possibly - hundreds of properties to be created... and Pywikibot would certainly be my favorite tool!)
In case I have, instead, to directly wrap the action "wbeditentity" from mediawiki API ( https://www.wikidata.org/w/api.php?action=help&modules=wbeditentity ), are there some Python examples?
And, in case I have to use the php script "importProperties.php" ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/import... ), how can I manage properties more complex than the ones contained in the example ( https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/en-ele... )?
Using pywikibot, I'm able to MODIFY existing properties with instructions like the following ones (which let me generate the object-content in one shot via json ... as I need):
In [1]: import pywikibot ; site = pywikibot.Site() ; repo = site.data_repository() In [2]: property_page = pywikibot.PropertyPage(repo, u"P2") In [3]: myjson = {u'descriptions': {u'en': {u'language': u'en', u'value': u'invented description'}}, u'labels': {u'en': {u'language': u'en', u'value': u'test property'}}} In [4]: property_page.editEntity(myjson)
...but I cannot CREATE new properties (instantiating a PropertyPage object), because pywikibot asks for the identifier of an existing instance:
In [11]: p_page = pywikibot.PropertyPage(repo)
InvalidTitle Traceback (most recent call last) <ipython-input-11-e72b812b8cd3> in <module>() ----> 1 p_page = pywikibot.PropertyPage(repo)
/home/user/src/pywikibot_repo/pywikibot/page.pyc in __init__(self, source, title) 4027 if not title or not self.id.startswith('P'): 4028 raise pywikibot.InvalidTitle( -> 4029 u"'%s' is not an property page title" % title) 4030 Property.__init__(self, source, self.id) 4031
InvalidTitle: '' is not an property page title
In [12]:
In fact, as I understand, in the source code of the "WikibasePage" class, I see that while for the Item type, a "Special case for empty item" is mentioned ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L3... )
# Special case for empty item. if title is None or title == '-1': super(ItemPage, self).__init__(site, u'-1', ns=ns) assert self.id == '-1' return
...for the Property type, instead, an empty object is NOT allowed ( https://github.com/wikimedia/pywikibot-core/blob/master/pywikibot/page.py#L4... )
if not title or not self.id.startswith('P'): raise pywikibot.InvalidTitle( u"'%s' is not an property page title" % title) Property.__init__(self, source, self.id)
Thanks a lot for your attention!
pywikibot mailing listpywikibot@lists.wikimedia.orghttps://lists.wikimedia.org/mailman/listinfo/pywikibot
pywikibot mailing list pywikibot@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/pywikibot