User:Edoderoobot/WD-system-description.py

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()