User:Edoderoobot/WD-system-description.py
Jump to navigation
Jump to search
import pywikibot
from pywikibot import pagegenerators
import pywikibot.data.wikidataquery as wdquery
import codecs #used in logfiles, unicoded strings
import sys
import datetime
from datetime import datetime, date, time
querydict={
'Q15184295':{'nl':'Wikimedia-module'},
'Q11266439':{'nl':'Wikimedia-sjabloon'},
'Q4167836' :{'nl':'Wikimedia-categorie'},
'Q4167410' :{'nl':'Wikimedia-doorverwijspagina'},
'Q4663903' :{'nl':'Wikimedia-portaal'},
#'Q17633526':{'nl':'Wikinews-artikel'} #wikinews items are special for the moment (2016) ... too many are wikinews AND wikipedia, still
}
debugedo=True
debugedo=False
default_query='claim[31:11266439]'
default_language = 'nl'
items2do = 0
itemsdone= 0
def log_premature(itemno):
with codecs.open("template-description.prelog.csv","a", encoding="utf-8") as logfile:
logfile.write('%s\n' % (itemno))
logfile.close
def logme(verbose, formatstring, *parameters):
with codecs.open("template-description.log.csv", "a", encoding="utf-8") as logfile:
formattedstring = u'%s%s' % (formatstring, '\n')
try:
logfile.write(formattedstring % (parameters) )
except :
exctype, value = sys.exc_info()[:2]
print("1) Error writing to logfile on: [%s] [%s]" % (exctype, value))
verbose = True #now I want to see what!
logfile.close()
if verbose:
print(formatstring % (parameters))
class WDBot():
"""
A bot to process items on Wikidata
"""
def __init__(self, generator):
"""
Arguments:
* generator - A generator that yields itempage objects.
"""
self.generator = generator
self.repo = pywikibot.Site().data_repository()
def run(self,lng):
"""
Starts the robot.
"""
site = pywikibot.getSite('sv')
repo = site.data_repository()
itemsdone=0
for WDIquery in self.generator:
if itemsdone< 0 :
break
if WDIquery.exists() :
#log_premature(WDIquery.title()) #log which item we process ... in case of an error, I know which item it is
WDIquery.get(get_redirect=True)
itemsdone += action_one_item(repo,WDIquery,lng)
def WikidataQueryItemPageGenerator(query, site=None):
"""Generate pages that result from the given WikidataQuery.
@param query: the WikidataQuery query string.
"""
global items2do
if site is None:
site = pywikibot.Site()
repo = site.data_repository()
wd_queryset = wdquery.QuerySet(query)
wd_query = wdquery.WikidataQuery(cacheMaxAge=0)
data = wd_query.query(wd_queryset)
items2do = data[u'status'][u'items']
pywikibot.output(u'retrieved %d items' % data[u'status'][u'items'])
for item in data[u'items']:
yield pywikibot.ItemPage(repo, u'Q' + str(item))
def action_one_item(repo, wditem, lng):
global items2do
global itemsdone
items2do -= 1
str1 = '{:>10d}'.format(itemsdone)
str2 = '{:>10}'.format(wditem.title())
str3 = '{:>10d}'.format(items2do)
sys.stdout.write("\r%s%s%s" % (str1, str3, str2)) #print how many items we still have to do ...
if 'P31' in wditem.claims: #item has P31?
for P31 in wditem.claims.get('P31'): #check all defined P31's
target = P31.getTarget().title()
if target in querydict: #is this one of the items we're looking for?
itemdict = querydict[target] #if yes, then see if we can add a language
for lang in itemdict: #go along all languages defined
if not (lang in wditem.descriptions):
label = ''
if lang in wditem.labels:
label = wditem.labels[lang]
#print('[%s]-[%s]-<%s>' % (wditem.title(), label, itemdict[lang]))
try:
data={}
data.update({'descriptions': {lang:itemdict[lang]}})
wditem.editEntity(data,summary=u'WD-system-description.py')
except:
print('Exception fired on: [%s]' % wditem.title())
return 0
return 1
return 0
def main():
print ("main")
query = default_query #later, I want to manage this with params
lng = default_language
for r in querydict:
query = 'claim[31:%s]' % r[1:]
pigenerator = pagegenerators.PreloadingItemGenerator(pagegenerators.WikidataItemGenerator(WikidataQueryItemPageGenerator(query)))
wikidataBot = WDBot(pigenerator)
wikidataBot.run(lng)
if __name__ == "__main__":
if debugedo:
print("debug is on")
site=pywikibot.Site('nl')
repo=site.data_repository()
wd = pywikibot.ItemPage(repo,'Q25088614')
wd.get(get_redirect=True)
action_one_item(repo,wd,'nl')
else:
print("Klaar voor de start")
main()