User:Edoderoobot/cs-description-fix

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


items2do = 0
debugedo=True
debugedo=False

default_query='claim[31:4167836] or claim[31:11266439] or claim[31:13406463]' #category or template or list
default_language = 'cs' 

def log_premature(itemno):
  with codecs.open("cs-description-fix.prelog.csv","a", encoding="utf-8") as logfile:
    logfile.write('%s\n' % (itemno))
  logfile.close
  
  
def logme(verbose, formatstring, *parameters):
  with codecs.open("cs-description-fix.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 do something on Wikidata tiems
    """
    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> 999999993 :
               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 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 ... 


  newdesc = u''
  if lng in wditem.descriptions:
    if wditem.descriptions[lng]=='kategorie Wikimedie':newdesc='kategorie na projektech Wikimedia'
    if wditem.descriptions[lng]=='seznam Wikimedie':newdesc='seznam na projektech Wikimedia'
    if wditem.descriptions[lng]=='šablona Wikimedie':newdesc='šablona na projektech Wikimedia'
  if newdesc=='': #nothing changed, skip it...
    return 0
  else:
    try:
      data = ( {'descriptions': {lng:newdesc}} )
      wditem.editEntity(data,summary=u'cs-description-fix, python code on https://goo .gl/NcxNZ0, logfile on https://goo .gl/BezTim')
    except ValueError:
          logme(False, "ValueError occured on %s",wditem.title())
    except :
          logme(False, "Undefined error occured on %s-[%s]",wditem.title(),'')
    else :
          logme(False, '%s|%s|%s|%s|%s|%s',datetime.now().strftime("%Y-%b-%d/%H:%M:%S"),wditem.title(),lng,'',newdesc,'')
 
    return 1
        

def main():
    print ("main")
    query = default_query #later, I want to manage this with params
    lng = default_language

    pigenerator = pagegenerators.PreloadingItemGenerator(pagegenerators.WikidataItemGenerator(WikidataQueryItemPageGenerator(query)))
    
    wikidataBot = WDBot(pigenerator)
    wikidataBot.run(lng)
    print("\n")

  
if __name__ == "__main__":  
 if debugedo:
   print("debug is on")
 else:
   main()