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" <[email protected]>
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/importProperties.php
>  ).
>
> I simply modified the 'createProperty' function (
> https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/importProperties.php#L147
>  ),
> 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 <
> [email protected]> 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/importProperties.php
>>  ),
>> how can I manage properties more complex than the ones contained in the
>> example (
>> https://github.com/JeroenDeDauw/Wikibase/blob/master/repo/maintenance/en-elements-properties.csv
>>  )?
>>
>>
>> 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#L3760
>>  )
>>
>>         # 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#L4168
>>  )
>>
>>         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
> [email protected]
> https://lists.wikimedia.org/mailman/listinfo/pywikibot
>
>
_______________________________________________
pywikibot mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot

Reply via email to