User:Edoderoobot/nl-street2en-description

From Wikidata
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



debugedo=True
debugedo=False

townlanguages=['nl','en','de','fr']
default_query='claim[31:79007] and claim[17:55]' #a street in the Netherlands
default_language = 'nl'
items2do = 0

def log_premature(itemno):
  with codecs.open("nl-street2en-name-description.prelog.csv","a", encoding="utf-8") as logfile:
    logfile.write('%s\n' % (itemno))
  logfile.close
 
 
def logme(verbose, formatstring, *parameters):
  with codecs.open("nl-street2en-name-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()
       
        items_found=0
        for WDIquery in self.generator:
            if items_found> 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)
                items_found += 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 get_town(repo,wditem,property):
    town = u''
    if (town=='') and (property in wditem.claims):
        LNKtown = wditem.claims.get(property)[0].getTarget()
       
        if not (LNKtown is None):
          wdi_town = pywikibot.ItemPage(repo,LNKtown.title())
          wdi_town.get(get_redirect=True)
          for trylng in townlanguages:
            if town=='':
              if trylng in wdi_town.labels: town=wdi_town.labels[trylng]
    return(town)

   
def action_one_item(repo, wditem, lng):
  global items2do

  items2do -= 1
  str1 = '{:>10d}'.format(items2do)
  str2 = '{:>10}'.format(wditem.title())
  sys.stdout.write("\r%s%s" % (str1, str2))   #print how many items we still have to do ...

  try:
    lng = 'en'
    data = {}
    town = ''
    if not(lng in wditem.descriptions):  #not already filled
      if town=='': town = get_town(repo,wditem,'P276')
      if town=='': town = get_town(repo,wditem,'P131')
      if town=='':
        my_description = "street in the Netherlands"
      else :
        my_description = "street in %s, the Netherlands" % town
      if (lng not in wditem.descriptions):
        data.update({'descriptions': {lng:my_description}} )
   
    if not (lng in wditem.labels):  #name of town is still blank?
      data.update({'labels': {lng:wditem.labels['nl']}})
   
    if len(data)>0:
      #print(data)
      wditem.editEntity(data,summary=u'en-dutch-street, python code on https://goo .gl/EGL2ZE, logfile on https://goo .gl/BezTim')
    else :
      return(0)
   
    logme(False,"%s|%s",datetime.now().strftime("%Y-%b-%d/%H:%M:%S"),wditem.title())
  except ValueError:
    return(0)
 
   
  return(1)
       

def main():
    lng = default_language

    pigenerator = pagegenerators.PreloadingItemGenerator(pagegenerators.WikidataItemGenerator(WikidataQueryItemPageGenerator(query)))
   
    wikidataBot = WDBot(pigenerator)
    wikidataBot.run(lng)

 
if __name__ == "__main__": 
 if debugedo:
   print("debug is on")
 else:
   print("Klaar voor de start")
   main()