Utente:IPork/Sandbox/prova.py

Da Wikisource.
# -*- coding: utf-8 -*-

"""
Questo programma deriva da category.py presente nell budle pywikipedia.
Lo si utilizza per generare le liste dei testi che seguono il percorso di qualità di it.wikisource.org
e relative tabelle delle statistiche.

Per lanciarlo basta digitare:
python gestione_elenchi_SAL.py progetto

Per sapere quali progetti sono conosciuti dal bot:
python gestione_elenchi_SAL.py listaProgetti

Ogni suggerimento o modifica è benvenuta!

iPork
http://it.wikisource.org/wiki/Utente:IPork
Qualc1
http://it.wikisource.org/wiki/Utente:Qualc1
"""

#*************** INIZIO: PARAMETRI PER PROGETTI  ***************
# per aggiungere un nuovo progetto basta aggiungerlo nella sezione qui sotto.

parametri = {
  'canti': 
    {
    'bot1': ['Elenchi dei canti per genere', 'Canti d\'amore', 'Template:Elenco dei canti d\'amore'],
    'bot2': ['Elenchi dei canti per genere', 'Canti anarchici', 'Template:Elenco dei canti anarchici'],
    'bot3': ['Elenchi dei canti per genere', 'Canti contro la guerra', 'Template:Elenco dei canti contro la guerra'],
    'bot4': ['Elenchi dei canti per genere', 'Canti dell\'emigrazione', 'Template:Elenco dei canti dell\'emigrazione'],
    'bot5': ['Elenchi dei canti per genere', 'Canti dell\'infanzia', 'Template:Elenco dei canti dell\'infanzia'],
    'bot6': ['Elenchi dei canti per genere', 'Canti del lavoro', 'Template:Elenco dei canti del lavoro'],
    'bot7': ['Elenchi dei canti per genere', 'Canti dei contadini', 'Template:Elenco dei canti dei contadini'],
    'bot8': ['Elenchi dei canti per genere', 'Canti delle filandere', 'Template:Elenco dei canti delle filandere'],
    'bot9': ['Elenchi dei canti per genere', 'Canti dei minatori', 'Template:Elenco dei canti dei minatori'],
    'bot10': ['Elenchi dei canti per genere', 'Canti delle mondine', 'Template:Elenco dei canti delle mondine'],
    'bot11': ['Elenchi dei canti per genere', 'Canti degli operai', 'Template:Elenco dei canti degli operai'],
    'bot12': ['Elenchi dei canti per genere', 'Canti dei pastori', 'Template:Elenco dei canti dei pastori'],
    'bot13': ['Elenchi dei canti per genere', 'Canti dei pescatori', 'Template:Elenco dei canti dei pescatori'],
    'bot14': ['Elenchi dei canti per genere', 'Canti della malavita', 'Template:Elenco dei canti della malavita'],
    'bot15': ['Elenchi dei canti per genere', 'Canti di montagna', 'Template:Elenco dei canti di montagna'],
    'bot16': ['Elenchi dei canti per genere', 'Canti narrativi', 'Template:Elenco dei canti narrativi'],
    'bot17': ['Elenchi dei canti per genere', 'Canti natalizi', 'Template:Elenco dei canti natalizi'],
    'bot18': ['Elenchi dei canti per genere', 'Canti d\'osteria', 'Template:Elenco dei canti d\'osteria'],
    'bot19': ['Elenchi dei canti per genere', 'Canti rituali', 'Template:Elenco dei canti rituali'],
    'bot20': ['Elenchi dei canti per genere', 'Canti socialisti e comunisti', 'Template:Elenco dei canti socialisti e comunisti'],
    'bot21': ['Elenchi dei canti per genere', 'Canti dei soldati', 'Template:Elenco dei canti dei soldati'],
    'bot22': ['Elenchi dei canti per genere', 'Canti degli Alpini', 'Template:Elenco dei canti degli Alpini'],
    'bot23': ['Elenchi dei canti per genere', 'Canti del Corpo dei Bersaglieri', 'Template:Elenco dei canti del Corpo dei Bersaglieri'],
    'bot24': ['Elenchi dei canti per genere', 'Canti della Brigata Paracadutisti Folgore', 'Template:Elenco dei canti della Brigata Paracadutisti Folgore'],
    'bot25': ['Elenchi dei canti per genere', 'Canti storici', 'Template:Elenco dei canti storici'],
    'bot26': ['Elenchi dei canti per genere', 'Canti della guerra di secessione americana', 'Template:Elenco dei canti della guerra di secessione americana'],
    'bot27': ['Elenchi dei canti per genere', 'Canti del Risorgimento italiano', 'Template:Elenco dei canti del Risorgimento italiano'],
    'bot28': ['Elenchi dei canti per genere', 'Canti del Regno d\'Italia', 'Template:Elenco dei canti del Regno d\'Italia'],
    'bot29': ['Elenchi dei canti per genere', 'Canti dell\'Italia fascista', 'Template:Elenco dei canti dell\'Italia fascista'],
    'bot30': ['Elenchi dei canti per genere', 'Canti della Repubblica Sociale Italiana', 'Template:Elenco dei canti della Repubblica Sociale Italiana'],
    'bot31': ['Elenchi dei canti per genere', 'Canti antifascisti e della Resistenza', 'Template:Elenco dei canti antifascisti e della Resistenza'],
    'bot32': ['Elenchi dei canti per genere', 'Canti universitari', 'Template:Elenco dei canti universitari'],
    'bot33': ['Elenchi dei canti per zone geografiche', 'Canti della Liguria', 'Template:Elenco dei canti della Liguria'],
    'bot34': ['Elenchi dei canti in ordine alfabetico', 'Canti-A', 'Template:Elenco dei canti-A'],
    }
}

#*************** FINE: PARAMETRI PER PROGETTI  ***************


#
# (C) Rob W.W. Hooft, 2004
# (C) Daniel Herding, 2004
#
__version__ = '$Id: category.py 3998 2007-08-07 20:28:27Z wikipedian $'
#
# Distributed under the terms of the MIT license.
#
import pickle, bz2
import wikipedia, catlib
import datetime


class CategoryDatabase:
    '''
    This is a temporary knowledge base saving for each category the contained
    subcategories and articles, so that category pages do not need to
    be loaded over and over again
    '''
    def __init__(self, rebuild = False, filename = 'category.dump.bz2'):
        if rebuild:
            self.rebuild()
        else:
            try:

                f = bz2.BZ2File(filename, 'r')
                wikipedia.output(u'Reading dump from %s' % filename)
                databases = pickle.load(f)
                f.close()
                # keys are categories, values are 2-tuples with lists as entries.
                self.catContentDB = databases['catContentDB']
                # like the above, but for supercategories
                self.superclassDB = databases['superclassDB']
                del databases
            except:
                # If something goes wrong, just rebuild the database
                self.rebuild()

    def rebuild(self):
        self.catContentDB={}
        self.superclassDB={}

    def getSubcats(self, supercat):
        '''
        For a given supercategory, return a list of Categorys for all its
        subcategories.
        Saves this list in a temporary database so that it won't be loaded from the
        server next time it's required.
        '''
        # if we already know which subcategories exist here
        if self.catContentDB.has_key(supercat):
            return self.catContentDB[supercat][0]
        else:
            subcatlist = supercat.subcategoriesList()
            articlelist = supercat.articlesList()
            # add to dictionary
            self.catContentDB[supercat] = (subcatlist, articlelist)
            return subcatlist

    def getArticles(self, cat):
        '''
        For a given category, return a list of Pages for all its articles.
        Saves this list in a temporary database so that it won't be loaded from the
        server next time it's required.
        '''
        # if we already know which articles exist here
        if self.catContentDB.has_key(cat):
            return self.catContentDB[cat][1]
        else:
            subcatlist = cat.subcategoriesList()
            articlelist = cat.articlesList()
            # add to dictionary
            self.catContentDB[cat] = (subcatlist, articlelist)
            return articlelist

    def getSupercats(self, subcat):
        # if we already know which subcategories exist here
        if self.superclassDB.has_key(subcat):
            return self.superclassDB[subcat]
        else:
            supercatlist = subcat.supercategoriesList()
            # add to dictionary
            self.superclassDB[subcat] = supercatlist
            return supercatlist

    def dump(self, filename = 'category.dump.bz2'):
        '''
        Saves the contents of the dictionaries superclassDB and catContentDB to disk.
        '''
        wikipedia.output(u'Dumping to %s, please wait...' % filename)
        f = bz2.BZ2File(filename, 'w')
        databases = {
            'catContentDB': self.catContentDB,
            'superclassDB': self.superclassDB
        }
        # store dump to disk in binary format
        try:
            pickle.dump(databases, f, protocol=pickle.HIGHEST_PROTOCOL)
        except pickle.PicklingError:
            pass
        f.close()

class CategoryListifyRobot:
    '''
    Creates a list containing all of the members in a category.
    '''
    listify_msg={
        'en':u'Robot: Listifying from %s (%d entries)',
        'it':u'Generazione elenco testi %s (%d testi)',
    }

    def __init__(self, infoPagine, editSummary, overwrite = True, subCats = False, talkPages = True):
        textTitle, catTitle, listTitle = infoPagine
        self.textTitle = textTitle
        self.editSummary = editSummary
        self.overwrite = overwrite
        self.cat = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle)
        self.list = wikipedia.Page(wikipedia.getSite(), listTitle)
        self.subCats = subCats
        self.talkPages = talkPages

    def run(self):
        testoCat = self.textTitle
        listOfArticles = self.cat.articlesList()
        totale = len(listOfArticles)
        count = 0
        if self.subCats:
            listOfArticles += self.cat.subcategoriesList()
        if self.editSummary:
            wikipedia.setAction(self.editSummary)
        else:
            wikipedia.setAction(wikipedia.translate(wikipedia.getSite(), self.listify_msg) % (self.cat.title(), len(listOfArticles)))

        listString = "<noinclude>{{Lista Bot}}\n\nElenco generato il giorno %s\n\n</noinclude>" % (datetime.datetime.now().strftime("%d.%m.%Y, %H:%M"))
        for article in listOfArticles:
            count = count + 1
            if not article.isImage() and not article.isCategory():
                if self.talkPages and not article.isTalkPage():
                    listString = listString + "''[[%s]]'' <small> - [[%s|Fonte]] </small>{{SAL icona|%s}} <br />\n" % (article.title(), article.toggleTalkPage().title(), article.title())
                else:
                    listString = listString + "''[[%s]]'' <small> - [[%s|Fonte]] </small>{{SAL icona|%s}} <br />\n" % (article.title(), article.toggleTalkPage().title(), article.title())
            else:
                if self.talkPages and not article.isTalkPage():
                    listString = listString + "''[[%s]]'' <small> - [[%s|Fonte]] </small>{{SAL icona|%s}} <br />\n" % (article.title(), article.toggleTalkPage().title(), article.title())
                else:
                    listString = listString + "''[[%s]]'' <small> - [[%s|Fonte]] </small>{{SAL icona|%s}} <br />\n" % (article.title(), article.toggleTalkPage().title(), article.title())
        listString = listString + "<!-- \nElenco dei testi formattato per il bot. \n\n"
        for article in listOfArticles:
            count = count + 1
            if not article.isImage() and not article.isCategory():
                if self.talkPages and not article.isTalkPage():
                    listString = listString + "[[%s]]\n" % article.title()
                else:
                    listString = listString + "[[%s]]\n" % article.title()
            else:
                if self.talkPages and not article.isTalkPage():
                    listString = listString + "[[%s]]\n" % article.title()
                else:
                    listString = listString + "[[%s]]\n" % article.title()
        listString = listString + "\n -->\n\n<noinclude>[[Categoria:%s|{{PAGENAME}}]]</noinclude>" % testoCat
        if self.list.exists() and not self.overwrite:
            wikipedia.output(u'Page %s already exists, aborting.' % self.list.title())
        else:
            self.list.put(listString)

class CreateTableRobot:
    '''
    Creates a table.
    '''
    table_msg={
        'en':u'Robot: Listifying (%d - %d - %d - %d - %d - %d)',
        'it':u'Aggiornamento statistiche SAL (%d - %d - %d - %d - %d - %d)',
    }

    def __init__(self, infoPagine, editSummary, overwrite = True, subCats = False, talkPages = False):
        catTitle1, catTitle2, catTitle3, catTitle4, catTitle5, listTitle = infoPagine
        self.editSummary = editSummary
        self.overwrite = overwrite
        self.catName1 = catTitle1
        self.catName2 = catTitle2
        self.catName3 = catTitle3
        self.catName4 = catTitle4
        self.catName5 = catTitle5
        self.cat1 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle1)
        self.cat2 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle2)
        self.cat3 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle3)
        self.cat4 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle4)
        self.cat5 = catlib.Category(wikipedia.getSite(), 'Category:' + catTitle5)
        self.list = wikipedia.Page(wikipedia.getSite(), listTitle)
        self.subCats = subCats
        self.talkPages = talkPages

    def run(self):
        nomeCat1 = self.catName1
        nomeCat2 = self.catName2
        nomeCat3 = self.catName3
        nomeCat4 = self.catName4
        nomeCat5 = self.catName5
        listOfArticles1 = self.cat1.articlesList()
        listOfArticles2 = self.cat2.articlesList()
        listOfArticles3 = self.cat3.articlesList()
        listOfArticles4 = self.cat4.articlesList()
        listOfArticles5 = self.cat5.articlesList()
        totale1 = len(listOfArticles1)
        totale2 = len(listOfArticles2)
        totale3 = len(listOfArticles3)
        totale4 = len(listOfArticles4)
        totale5 = len(listOfArticles5)
        totaleTotale = totale1 + totale2 + totale3 + totale4 + totale5

        if self.editSummary:
            wikipedia.setAction(self.editSummary)
        else:
            wikipedia.setAction(wikipedia.translate(wikipedia.getSite(), self.table_msg) % (totale1, totale2, totale3, totale4, totale5, totaleTotale))

        listString = "{|border=\"1\" cellpadding=\"2\" cellspacing=\"0\" style=\"background: #f9f9f9; border: 1px solid #aaaaaa; border-collapse: collapse; white-space: nowrap; text-align: left\"\n|-\n| width=\"100\" align=\"center\" | [[Immagine:25%%.svg|12px]] '''[[:Categoria:%s|SAL 25%%]]'''\n| width=\"100\" align=\"center\" | [[Immagine:50%%.svg|12px]] '''[[:Categoria:%s|SAL 50%%]]'''\n| width=\"100\" align=\"center\" | [[Immagine:75%%.svg|12px]] '''[[:Categoria:%s|SAL 75%%]]'''\n| width=\"100\" align=\"center\" | [[Immagine:100%%.svg|12px]] '''[[:Categoria:%s|SAL 100%%]]''' \n| width=\"100\" align=\"center\" | [[Immagine:101%%.svg|12px]] '''[[:Categoria:%s|Ed. WS]]'''\n| width=\"100\" align=\"center\" | '''Totale'''\n|- style=\"text-align: center;\"\n| %d || %d || %d || %d || %d || %d \n|-\n| colspan=\"6\" align=\"right\" style=\"font-size:80%%;\" | aggiornato al %s\n|}" % (nomeCat1, nomeCat2, nomeCat3, nomeCat4, nomeCat5, totale1, totale2, totale3, totale4, totale5, totaleTotale, datetime.datetime.now().strftime("%d.%m.%Y, %H:%M"))
        if self.list.exists() and not self.overwrite:
            wikipedia.output(u'Page %s already exists, aborting.' % self.list.title())
        else:
            self.list.put(listString)

def listaProgetti():
    """Visualizza la lista dei progetti conosciuti dal bot"""

    print "\n\nDi seguito sono elencati i parametri da aggiungere per generare le statistiche dei testi dei diversi progetti:\n"
    for progetto in sorted(parametri.keys()):
	    print "   " + progetto
    print "\nPer generare le statistiche usare la forma \"python gestione_elenchi_SAL.py PARAMETRO\"\n"

def helpExit(avviso = ""):
	print "** " + avviso + " **"
	#wikipedia.showHelp('gestione_elenchi_SAL')
	print __doc__
	import sys
	sys.exit(1)

if __name__ == "__main__":
    editSummary = ''
    overwrite = True
    talkPages = True

    try:
        catDB = CategoryDatabase()
        action = None
        restore = False
        for arg in wikipedia.handleArgs():
            if arg in parametri:
                action = arg
	    elif arg == 'listaProgetti':
	    	listaProgetti()
		import sys
		sys.exit()
            elif arg.startswith('-summary:'):
                editSummary = arg[len('-summary:'):]
            else:
                helpExit("Non conosco il progetto " + arg)
	if action is None:
		helpExit(u"Non c'è il parametro che indica il progetto")

        bot1 = CategoryListifyRobot(parametri[action]['bot1'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot2 = CategoryListifyRobot(parametri[action]['bot2'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot3 = CategoryListifyRobot(parametri[action]['bot3'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot4 = CategoryListifyRobot(parametri[action]['bot4'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot5 = CategoryListifyRobot(parametri[action]['bot5'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot6 = CategoryListifyRobot(parametri[action]['bot6'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot7 = CategoryListifyRobot(parametri[action]['bot7'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot8 = CategoryListifyRobot(parametri[action]['bot8'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot9 = CategoryListifyRobot(parametri[action]['bot9'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot10 = CategoryListifyRobot(parametri[action]['bot10'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot11 = CategoryListifyRobot(parametri[action]['bot11'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot12 = CategoryListifyRobot(parametri[action]['bot12'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot13 = CategoryListifyRobot(parametri[action]['bot13'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot14 = CategoryListifyRobot(parametri[action]['bot14'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot15 = CategoryListifyRobot(parametri[action]['bot15'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot16 = CategoryListifyRobot(parametri[action]['bot16'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot17 = CategoryListifyRobot(parametri[action]['bot17'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot18 = CategoryListifyRobot(parametri[action]['bot18'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot19 = CategoryListifyRobot(parametri[action]['bot19'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot20 = CategoryListifyRobot(parametri[action]['bot20'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot21 = CategoryListifyRobot(parametri[action]['bot21'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot22 = CategoryListifyRobot(parametri[action]['bot22'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot23 = CategoryListifyRobot(parametri[action]['bot23'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot24 = CategoryListifyRobot(parametri[action]['bot24'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot25 = CategoryListifyRobot(parametri[action]['bot25'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot26 = CategoryListifyRobot(parametri[action]['bot26'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot27 = CategoryListifyRobot(parametri[action]['bot27'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot28 = CategoryListifyRobot(parametri[action]['bot28'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot29 = CategoryListifyRobot(parametri[action]['bot29'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot30 = CategoryListifyRobot(parametri[action]['bot30'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot31 = CategoryListifyRobot(parametri[action]['bot31'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot32 = CategoryListifyRobot(parametri[action]['bot32'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot33 = CategoryListifyRobot(parametri[action]['bot33'], editSummary, overwrite, subCats = False, talkPages = talkPages)
        bot34 = CategoryListifyRobot(parametri[action]['bot34'], editSummary, overwrite, subCats = False, talkPages = talkPages)

        bot1.run()
        bot2.run()
        bot3.run()
        bot4.run()
        bot5.run()
        bot6.run()
        bot7.run()
        bot8.run()
        bot9.run()
        bot10.run()
        bot11.run()
        bot12.run()
        bot13.run()
        bot14.run()
        bot15.run()
        bot16.run()
        bot15.run()
        bot16.run()
        bot17.run()
        bot18.run()
        bot19.run()
        bot20.run()
        bot21.run()
        bot22.run()
        bot23.run()
        bot24.run()
        bot25.run()
        bot26.run()
        bot27.run()
        bot28.run()
        bot29.run()
        bot30.run()
        bot31.run()
        bot32.run()
        bot33.run()
        bot34.run()

    finally:
        catDB.dump()