monitoraggio.py

manutenzioni.py

# -*- coding: utf-8  -*-

######################################################################
#                   manutenzione.py ver. 2.0                         #
#            Bot per le statistiche del lavoro sporco                #
# basato su lavorosporco.py e statistichemanutenzioni.py di Pietrodn.#
######################################################################

"""
Bot che gestisce l'aggiornamento delle statistiche manutenzioni
sulla Wikipedia italiana.

Parametri:

-riepilogo      aggiorna il riepilogo generale

-progetti       aggiorna i dati per tutti i progetti

-progetto       aggiorna i dati per un singolo progetto (indicare quale)

-auto           non chiede prima di modificare le tabelle

"""
import wikipedia, pagegenerators, catlib
import os, re

templates = {   'A': 'Aiutare',
                'C': 'Controllare',
                'Categorizzare': 'Categorizzare',
                'Controlcopy': 'Controlcopy',
                'E': 'Ency',
                'O': 'Orfane',
                'P': 'NPOV',
                'F': 'Senza fonti',
                'S': 'Stub',
                'T': 'Tradurre',
                'U': 'Unire',
                'W': 'Wikificare',
                'Tmp': 'Templatizzare'
    }

def projects():
    """
    Cerca i progetti in cui sono presenti le statistiche manutenzioni.
    """
    progetti=[]
    lettera=''
    categoryname = (u'Statistiche manutenzioni')
    cat = catlib.Category('it', 'Categoria:%s' % categoryname)
    gen = pagegenerators.CategorizedPageGenerator(cat,  recurse = False, start=lettera)    
    for pagina in gen:        
        titolo=pagina.title()
        titolo=titolo.encode('utf-8')
        titolo=titolo.replace('Progetto:', '')
        titolo=titolo.replace('/Statistiche manutenzioni', '')
        progetti.append(titolo)            
    progetti.remove('Coordinamento')
    return progetti

def listaVoci(categoryname):
    """
    Crea la lista delle voci contenute in una categoria
    """
    cat = catlib.Category('it', 'Categoria:%s' % categoryname)
    if cat.exists() == False:
        cat = catlib.Category('it', 'Categoria:%s' % categoryname.lower())    
    listavoci = cat.articlesList(recurse = 1)    
    return listavoci

def main():
    # Imposto tutti parametri come falsi
    singleproject=False
    allprojects=False
    riepilogo=False
    auto=False
    # Leggo i parametri inseriti da linea di comando
    for arg in wikipedia.handleArgs():
        if arg == '-auto':
            auto = True
        elif arg == '-riepilogo':
            riepilogo = True
        elif arg == '-progetti':
            allprojects = True
        elif arg == '-auto':
            auto = True
        elif arg.startswith('-progetto'):            
            singleproject = True            
            if len(arg) == 9:
                progetto = wikipedia.input(u'Inserisci il nome del progetto:')
            else:
                progetto = arg[10:]                
            if progetto.startswith('Progetto:'):
                progetto = arg[19:]
    # Se non ci sono parametri, mostro docstring
    if str(wikipedia.handleArgs()) == '[]':    
        print __doc__
        
    # RIEPILOGO MANUTENZIONI 
    if riepilogo == True:
        from templatecount import TemplateCountRobot     
        counter = TemplateCountRobot()        
        pagina = wikipedia.Page('it', 'Progetto:Coordinamento/Statistiche manutenzioni')
        vecchieStatistiche = pagina.get()
        templateCountDict = counter.countTemplates(templates.keys(), None)
        for k in templateCountDict:
                sottopagina = wikipedia.Page(wikiSite, 'Progetto:Coordinamento/Statistiche manutenzioni/' + templates[k])
                oldtxt = sottopagina.get()
                newtxt = re.sub("</noinclude>.*", "</noinclude>" + str(templateCountDict[k]), oldtxt)
                if auto == True:
                    if sottopagina.exists():
                        wikipedia.setAction(u'Bot: Conto lavoro sporco')
                        sottopagina.put(newtxt)
                else:
                    wikipedia.showDiff(oldtxt, newtxt)
                    choice = wikipedia.inputChoice(u"Modificare?",  ['Yes', 'No'], ['y', 'N'], 'N')
                    if choice in ['Y', 'y']:
                        wikipedia.setAction(u'Bot:Conto lavoro sporco')
                        sottopagina.put(newtxt)
        findRegexp = "\d+:\d+, \d+ .{3} \d+ \(.*?\)"
        replaceRegexp = "~~~~~"
        nuoveStatistiche = re.sub(findRegexp, replaceRegexp, vecchieStatistiche)
        if auto == True:
            wikipedia.showDiff(vecchieStatistiche, nuoveStatistiche)
            choice = wikipedia.inputChoice(u"Aggiorno le date?",  ['Yes', 'No'], ['y', 'N'], 'N')
            if choice in ['Y', 'y']:
                wikipedia.setAction(u'Aggiorno le date del conto')
                pagina.put(nuoveStatistiche)
            else:        
                if pagina.exists():
                    wikipedia.setAction(u'Bot: Aggiorno le date del conto')
                    pagina.put(nuoveStatistiche)
                    
    # STATISTICHE MANUTENZIONI IN TUTTI I PROGETTI
    if allprojects == True:
        progetti = projects()
        for progetto in progetti:            
            categories = {  u'Da controllare per copyright - ' + progetto: 'Controlcopy',
                        u'Da verificare per enciclopedicità - ' + progetto: 'Ency',
                        u'Da aiutare ' + progetto: 'Aiutare',
                        u'Pagine orfane - ' + progetto: 'Orfane',
                        u'Da controllare ' + progetto: 'Controllare',
                        u'Segnalazioni NPOV ' + progetto: 'NPOV',
                        u'Voci mancanti di fonti - ' + progetto: 'Senza fonti',
                        u'Stub ' + progetto: 'Stub',
                        u'Da tradurre - ' + progetto: 'Tradurre',
                        u'Da unire - ' + progetto: 'Unire',        
                        u'Da wikificare ' + progetto: 'Wikificare',    
            }
            pagina = wikipedia.Page('it', 'Progetto:'+progetto+'/Statistiche manutenzioni')
            vecchieStatistiche = pagina.get()             
            for k in categories:                    
                listavoci=listaVoci(k)                    
                categoryCount = len(listavoci)
                sottopagina = wikipedia.Page('it', 'Progetto:'+progetto+'/Statistiche manutenzioni/' + categories[k])
                oldtxt = sottopagina.get()
                newtxt = str(categoryCount)
                if auto == True:
                    if sottopagina.exists():
                        wikipedia.setAction(u'Bot: Aggiorno statistiche manutenzioni del progetto %s' % progetto)
                        sottopagina.put(newtxt)
                else:
                    wikipedia.showDiff(oldtxt, newtxt)
                    choice = wikipedia.inputChoice(u"Modificare?",  ['Yes', 'No'], ['y', 'N'], 'N')
                    if choice in ['Y', 'y']:
                        wikipedia.setAction(u'Bot: Aggiorno statistiche del progetto %s' % progetto)
                        sottopagina.put(newtxt)
                        
    # STATISTICHE MANUTENZIONI IN UN SINGOLO PROGETTO
    if singleproject == True: 
        categories = {  u'Da controllare per copyright - ' + progetto: 'Controlcopy',
                    u'Da verificare per enciclopedicità - ' + progetto: 'Ency',
                    u'Da aiutare ' + progetto: 'Aiutare',
                    u'Pagine orfane - ' + progetto: 'Orfane',
                    u'Da controllare ' + progetto: 'Controllare',
                    u'Segnalazioni NPOV ' + progetto: 'NPOV',
                    u'Voci mancanti di fonti - ' + progetto: 'Senza fonti',
                    u'Stub ' + progetto: 'Stub',
                    u'Da tradurre - ' + progetto: 'Tradurre',
                    u'Da unire - ' + progetto: 'Unire',        
                    u'Da wikificare ' + progetto: 'Wikificare',    
        }
        pagina = wikipedia.Page('it', 'Progetto:'+progetto+'/Statistiche manutenzioni')
        vecchieStatistiche = pagina.get()         
        for k in categories:                
            listavoci=listaVoci(k)                
            categoryCount = len(listavoci)
            sottopagina = wikipedia.Page('it', 'Progetto:'+progetto+'/Statistiche manutenzioni/' + categories[k])
            oldtxt = sottopagina.get()
            newtxt = str(categoryCount)
            if auto == True:
                if sottopagina.exists():
                    wikipedia.setAction(u'Bot: Aggiorno statistiche manutenzioni del progetto %s' % progetto)
                    sottopagina.put(newtxt)
            else:
                wikipedia.showDiff(oldtxt, newtxt)
                choice = wikipedia.inputChoice(u"Modificare?",  ['Yes', 'No'], ['y', 'N'], 'N')
                if choice in ['Y', 'y']:
                    wikipedia.setAction(u'Bot: Aggiorno statistiche del progetto %s' % progetto)
                    sottopagina.put(newtxt)
                    
if __name__ == "__main__":
        try:
                main()
        finally:
                wikipedia.stopme()

aggiornaliste.py

# -*- coding: utf8 -*-
"""
Script per aggiornare liste di monitoraggio. Parametri:

    -stati         Aggiorna le liste degli stati

    -page          Aggiorna una lista specifica (inserire il nome di una pagina)
"""
import wikipedia, config
import replace, pagegenerators
import re, sys, string, catlib
import datetime

def lista(pagina):
    gen=pagegenerators.LinkedPageGenerator(pagina)
    punto=0
    testo=''
    tab=''
    for voce in gen:
        if voce.isRedirectPage():
            titolo = voce.getRedirectTarget()
            voce = wikipedia.Page('it', titolo)
        frase=''
        note=''
        
        if voce.namespace() == 0:
            
            titolo=voce.title()
            titolurl=voce.urlname()
            
            titolodiscu='Discussione:'+titolo
            discussione=wikipedia.Page('it', titolodiscu)
            
            if discussione.exists():
                accuratezza=''
                scrittura=''
                fonti=''
                immagini=''
                coloreaccuratezza=''
                colorescrittura=''
                colorefonti=''
                coloreimmagini=''
            
                punto=punto+1
                print punto, titolodiscu

                testodiscu=discussione.get()            
                               
                trova= re.search(r'immagini ?= ?[^\|^\}]*', testodiscu)
                if trova:
                    stringa=trova.group()
                    immagini=re.sub(r'immagini ?= ?', '', stringa)
                    immagini = re.sub('\n', '', immagini).strip()

                    if re.match(' ?[Aa] ?', immagini):
                            immagini=u'\'\'\'ottima\'\'\''
                            coloreimmagini='background: rgb(102, 153, 255)'
                            
                    elif re.match(' ?[Bb] ?', immagini):
                            immagini=u'\'\'\'buona\'\'\''
                            coloreimmagini='background: rgb(152, 251, 152)'
                        
                    elif re.match(' ?[Dd] ?', immagini):
                            immagini=u'\'\'\'carente\'\'\''
                            coloreimmagini='background: rgb(255, 102, 102)'
                            
                    elif re.match(' ?[Cc] ?', immagini):
                            immagini=u'\'\'\'sufficiente.\'\'\''
                            coloreimmagini='background: rgb(255, 170, 102)'

                    else:
                        immagini=u'\'\'\'n.c.\'\'\''
          
                trova= re.search(r'fonti ?= ?[^\|^\}]*', testodiscu)            
                if trova:
                    stringa=trova.group()
                    fonti=re.sub(r'fonti ?= ?', '', stringa)
                    fonti = re.sub('\n', '', fonti).strip()

                    if re.match(' ?[Aa] ?', fonti):
                            fonti=u'\'\'\'ottima\'\'\''
                            colorefonti='background: rgb(102, 153, 255)'
                            
                    elif re.match(' ?[Bb] ?', fonti):
                            fonti=u'\'\'\'buona\'\'\''
                            colorefonti='background: rgb(152, 251, 152)'
                        
                    elif re.match(' ?[Dd] ?', fonti):
                            fonti=u'\'\'\'carente\'\'\''
                            colorefonti='background: rgb(255, 102, 102)'
                            
                    elif re.match(' ?[Cc] ?', fonti):
                            fonti=u'\'\'\'sufficiente.\'\'\''
                            colorefonti='background: rgb(255, 170, 102)'

                    else:
                        fonti=u'\'\'\'n.c.\'\'\''

                trova= re.search(r'accuratezza ?= ?[^\|^\}]*', testodiscu)           
                if trova:
                    stringa=trova.group()
                    accuratezza=re.sub(r'accuratezza ?= ?', '', stringa)
                    accuratezza = re.sub('\n', '', accuratezza).strip()

                    if re.match(' ?[Aa] ?', accuratezza):
                            accuratezza=u'\'\'\'ottima\'\'\''
                            coloreaccuratezza='background: rgb(102, 153, 255)'
                            
                    elif re.match(' ?[Bb] ?', accuratezza):
                            accuratezza=u'\'\'\'buona\'\'\''
                            coloreaccuratezza='background: rgb(152, 251, 152)'
                        
                    elif re.match(' ?[Dd] ?', accuratezza):
                            accuratezza=u'\'\'\'carente\'\'\''
                            coloreaccuratezza='background: rgb(255, 102, 102)'
                            
                    elif re.match(' ?[Cc] ?', accuratezza):
                            accuratezza=u'\'\'\'sufficiente.\'\'\''
                            coloreaccuratezza='background: rgb(255, 170, 102)'

                    else:
                        accuratezza=u'\'\'\'n.c.\'\'\''
                    
          
                trova= re.search(r'scrittura ?= ?[^\|^\}]*', testodiscu)
                if trova:
                    stringa=trova.group()
                    scrittura=re.sub(r'scrittura ?= ?', '', stringa)
                    scrittura = re.sub('\n', '', scrittura).strip()

                    if re.match(' ?[Aa] ?', scrittura):
                            scrittura=u'\'\'\'ottima\'\'\''
                            colorescrittura='background: rgb(102, 153, 255)'
                            
                    elif re.match(' ?[Bb] ?', scrittura):
                            scrittura=u'\'\'\'buona\'\'\''
                            colorescrittura='background: rgb(152, 251, 152)'
                        
                    elif re.match(' ?[Dd] ?', scrittura):
                            scrittura=u'\'\'\'carente\'\'\''
                            colorescrittura='background: rgb(255, 102, 102)'
                            
                    elif re.match(' ?[Cc] ?', scrittura):
                            scrittura=u'\'\'\'sufficiente.\'\'\''
                            colorescrittura='background: rgb(255, 170, 102)'

                    else:
                        scrittura=u'\'\'\'n.c.\'\'\''

                trova= re.search(r'note ?= ?[^\|^\}]*', testodiscu)
                if trova:
                    stringa=trova.group()
                    note=re.sub(r'note ?= ?', '', stringa)
                    note = re.sub("\n", " ", note).strip()
                    note = re.sub("'", "\'", note)                            

                if fonti == '':
                    fonti = u'\'\'\'n.c.\'\'\''
                if immagini == '':
                    immagini = u'\'\'\'n.c.\'\'\''
                if accuratezza == '':
                    accuratezza = u'\'\'\'n.c.\'\'\''
                if scrittura == '':
                    scrittura = u'\'\'\'n.c.\'\'\''
                if note == '':
                        note=''
                else:
                    note = "*<small>Note: "+note+"</small>\n"
                    
                print accuratezza, scrittura, fonti, immagini
                print note

                frase= '\n*\'\'\'[['+titolo+']]\'\'\' - <small>([['+titolodiscu+'|discussione]])</small>' + ' - accuratezza: '+ accuratezza+ ' - scrittura: '+ scrittura + ' - presenza fonti: ' + fonti + ' - presenza immagini: '+ immagini 
                testo=testo+frase
                cella= '\n\n{| class="toccolours" width=100% style="background:#FCFCFF;"\n|style="width:20em"|\'\'\'[['+titolo+']]\'\'\' - <small>([['+titolodiscu+'|discussione]]) - ([http://it.wikipedia.org/w/index.php?title=Discussione:'+titolurl+'&action=edit&section=0 edita])</small>' + '\n| style="text-align: center;"| accuratezza:\n|style="text-align: center;"| <div style="'+coloreaccuratezza+'">'+ accuratezza+ '</div>\n| style="text-align: center;"| scrittura:\n|style="text-align: center;"| <div style="'+colorescrittura+'">'+ scrittura + '</div>\n| style="text-align: center;"| presenza fonti:\n|style="text-align: center;"| <div style="'+colorefonti+'">' + fonti + '</div>\n| style="text-align: center;"| presenza immagini:\n|style="text-align: center;"| <div style="'+coloreimmagini+'">'+ immagini +'</div>\n|-\n|colspan=9|\n'+ note+'|}'
                tab=tab+cella
                
    return tab

def tolkien():    
    log=wikipedia.Page('it', 'Utente:YuBot/Monitoraggio_Tolkien')
    prelista=pagegenerators.LinkedPageGenerator(log)
    for pagina in prelista:
        testo = lista(pagina)
    
        incipit=u'{{torna a|Progetto:Tolkien/Monitoraggio voci}}\nQuesta pagina riporta un quadro sinottico delle voci monitorate relative alle \'\'\'opere di J.R.R. Tolkien\'\'\'.\nL\'elenco viene creato da [[utente:YuBot|]] a partire da una lista, ed è aggiornato al {{subst:CURRENTDAY}} {{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}. Lo scopo è sostituire alle pagine di monitoraggio non più funzionanti un log aggiornato periodocamente. Per aggiungere una voce, si può scriverne il nome in formato testo, tra doppie parentesi quadre, \'\'nella giusta posizione\'\': al prossimo aggiornamento la cella con le informazioni relative alla voce verrà aggiunte alla lista \'\'nella posizione in cui è stato inserito il link\'\'.  \n\n'
        categoria='\n[[Categoria:Pagine di monitoraggio voci|Tolkien]]'
        new=incipit+testo+categoria
        
        commento='Bot: aggiorno pagine monitoraggio Tolkien'
        pagina.put(new, comment=commento)        

def stati():
    log=wikipedia.Page('it', 'Utente:YuBot/Monitoraggio stati')
    prelista=pagegenerators.LinkedPageGenerator(log)
    for pagina in prelista:
        testo = lista(pagina)
    
        incipit=u'Questo è un elenco di stati  creato da [[utente:YuBot|]] a partire da una lista, aggiornato al {{subst:CURRENTDAY}} {{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}. Lo scopo è mantenere un log aggiornato periodocamente relativo a una lista di voci da tenere sotto osservazione. Per aggiungere una voce, si può scriverne il nome in formato testo, tra doppie parentesi quadre, \'\'nella giusta posizione\'\': al prossimo aggiornamento la cella con le informazioni relative alla voce verrà aggiunta alla lista \'\'nella posizione in cui è stato inserito il link\'\'.  \n\n'
        categoria='\n[[Categoria:Pagine di monitoraggio voci|Stati]]'
        new=incipit+testo+categoria
        
        commento='Bot: aggiorno le pagine monitoraggio degli stati '
        pagina.put(new, comment=commento)

def main():
    
    # Read commandline parameters.
    for arg in wikipedia.handleArgs():
        if arg == '-stati':
            stati()
        if arg == '-tolkien':
            tolkien()
        elif arg.startswith('-page'):
            if len(arg) == 5:
                pagename = wikipedia.input(u'Scrivi il nome della pagina:')
            else:
                pagename = arg[6:]

            pagina = wikipedia.Page( 'it', pagename)
            testo = lista(pagina)
    
            incipit=u'Questo è un elenco di voci  creato da [[utente:YuBot|]] a partire da una lista, aggiornato al {{subst:CURRENTDAY}} {{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}. Lo scopo è mantenere un log aggiornato periodocamente relativo a una lista di voci da tenere sotto osservazione. Per aggiungere una voce, si può scriverne il nome in formato testo, tra doppie parentesi quadre, \'\'nella giusta posizione\'\': al prossimo aggiornamento la cella con le informazioni relative alla voce verrà aggiunta alla lista \'\'nella posizione in cui è stato inserito il link\'\'.  \n\n'
            categoria='\n[[Categoria:Pagine di monitoraggio voci]]'
            new=incipit+testo+categoria
        
            commento='Bot: aggiorno lista monitoraggio'
            pagina.put(new, comment=commento)
            
    if str(wikipedia.handleArgs()) == '[]':    
        print __doc__

if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()