viki.py 7.36 KB
Newer Older
Linedwell's avatar
Linedwell committed
1 2 3
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Script de maintenance pour vikidia
4 5


Linedwell's avatar
Linedwell committed
6
# (C) Linedwell, 2011-2018
7 8 9 10
#
# Distribué sous licence GNU GPLv3
# Distributed under the terms of the GNU GPLv3 license
# http://www.gnu.org/licenses/gpl.html
Linedwell's avatar
Linedwell committed
11

12
import sys, getopt
Linedwell's avatar
Linedwell committed
13 14
sys.path.insert(1, '..') #ajoute au PYTHONPATH le répertoire parent

15
import mylogging
Linedwell's avatar
Linedwell committed
16

Linedwell's avatar
Linedwell committed
17 18 19 20 21 22
import re, time

import pywikibot
from pywikibot import pagegenerators

import callback
23
import logger
Linedwell's avatar
Linedwell committed
24 25 26


# Déclarations
27
site = pywikibot.Site('fr','vikidia')
Linedwell's avatar
Linedwell committed
28 29 30 31
nbrModif = 0
nbrTotal = 0

# Traitement des nouvelles pages
Linedwell's avatar
Linedwell committed
32
def newPages(allPages=False):
Linedwell's avatar
Linedwell committed
33 34 35 36
    global nbrModif, nbrTotal
    
    log = u''
    
37 38 39
    homonCat =  pywikibot.Category(site,u"Homonymie")
    
    ebaucheCat = pywikibot.Category(site,u"Ébauche")
Linedwell's avatar
Linedwell committed
40 41
    ebaucheCat = set(ebaucheCat.subcategories(recurse=3))
    
42 43 44 45 46
    hiddenCat = pywikibot.Category(site,u"Catégorie cachée")
    hiddenCat = set(hiddenCat.subcategories())
    
    portalCat = pywikibot.Category(site,u"Liste d'articles")
    portalCat = set(portalCat.subcategories())
47
    
48
    ignoreCat = pywikibot.Category(site,u"Page ignorée par les robots")
49 50 51
    ignorePage = pywikibot.Page(site,u"Utilisateur:LinedBot/Ignore")
    ignoreList = list(ignorePage.linkedPages())
        
52
    concoursCat = pywikibot.Category(site,u"Article VikiConcours")
53
    
54 55
    workCat = pywikibot.Category(site,u"Article en travaux")
    
Linedwell's avatar
Linedwell committed
56 57 58 59
    deadendPagesList = list(pagegenerators.DeadendPagesPageGenerator(site=site))
    lonelyPagesList = list(pagegenerators.LonelyPagesPageGenerator(site=site))
    
    
Linedwell's avatar
Linedwell committed
60
    if allPages:
61
        pagesList = pagegenerators.AllpagesPageGenerator(namespace=0,includeredirects=False,site=site)
Linedwell's avatar
Linedwell committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
    else:
        pagesList = pagegenerators.NewpagesPageGenerator(total=50,site=site)

    for page in pagesList:
        
        try:
            pageTemp = page.get()
            
        except pywikibot.NoPage:
            pywikibot.output(u"Page %s does not exist; skipping."
                             % page.title(asLink=True))
        except pywikibot.IsRedirectPage:
            pywikibot.output(u"Page %s is a redirect; skipping."
                             % page.title(asLink=True))
        except pywikibot.LockedPage:
            pywikibot.output(u"Page %s is locked; skipping."
                             % page.title(asLink=True))
        else:
80 81
            
            
82
            # On ne s'occupe de la page que si elle n'est ni une homonymie ni une page du VikiConcours ni une page en travaux
83
            pageCat = page.categories()
84
            if (not homonCat in pageCat) and (not concoursCat in pageCat) and (not workCat in pageCat):
Linedwell's avatar
Linedwell committed
85
                
86
                #On ne traite l'ajout de bandeau que si la page n'est pas ignorée
Linedwell's avatar
Linedwell committed
87
                jobList = []
88
                if (not ignoreCat in pageCat) and (not page in ignoreList):
89 90
                    
                    # s'il existe des références, on retire le job 'orphelin'
91
                    #if page in lonelyPagesList:    ##DESACTIVE TANT QUE LA PAGE SPECIALE NE SE MET PLUS A JOUR##
Linedwell's avatar
Linedwell committed
92
                    if len(set(page.backlinks(namespaces=0))) < 1:
93
                        jobList.append(u'orphelin')
94
                
95
                    # s'il n'existe aucune catégorie (directe), on ajoute le job 'catégoriser'
96
                    realCat = list(set(pageCat) - set(hiddenCat) - set(ebaucheCat))
Linedwell's avatar
Linedwell committed
97
                
98 99 100 101
                    nbCat = len(list(realCat))
                    if nbCat == 0:
                        jobList.append(u'catégoriser')
                    
102 103 104 105 106 107 108
                    # si la page n'appartient à aucun portail, on ajoute le job 'portail'
                    nbPort = len(set(pageCat) & set(portalCat))
                    if nbPort == 0:
                        jobList.append(u'portail')
                    
                    
                    # si la page ne pointe vers aucune autre, on ajoute le job 'impasse'
109
                    #if page in deadendPagesList:
110
                    if len(set(page.linkedPages(namespaces=0))) < 1: ##DESACTIVE TANT QUE LA PAGE SPECIALE NE SE MET PLUS A JOUR##
111 112
                        jobList.append(u'impasse')
                    
113
                    
114
                    """
115 116 117
                    # si la page fait plus de 2000 octets et ne contient aucun lien externe
                    if len(pageTemp) > 2000 and len(list(page.extlinks())) == 0:
                        jobList.append(u'sourcer')
118
                    """
Linedwell's avatar
Linedwell committed
119
            
120
                else:
Linedwell's avatar
Linedwell committed
121 122
                    pywikibot.output(u"Page %s in ignore list; skipping."
                                 % page.title(asLink=True))
Linedwell's avatar
Linedwell committed
123

124 125

                pageTemp, oldJobList = removeBanner(pageTemp)
Linedwell's avatar
Linedwell committed
126 127 128 129 130 131 132 133 134 135 136 137 138
                jobList = updateJobList(oldJobList, jobList)
                job = u''

            
                # Différence symétrique entre les deux listes, on regarde si des éléments ne sont pas contenus dans les deux listes : (A-B)+(B-A)
                diff = list(set(oldJobList).symmetric_difference(set(jobList)))

                if diff != []:
                    nbrTotal += 1
                    if len(jobList) > 0:
                        job = ','.join(jobList)
                        banner = u'{{Maintenance|job=' + job + '|date=~~~~~}}\n\n'
                        pageTemp = banner + pageTemp
139 140 141
                        summary = u'[[VD:Robot|Robot]] : Mise à jour du bandeau de maintenance.'
                    else:
                        summary = u'[[VD:Robot|Robot]] : Retrait du bandeau de maintenance.'
Linedwell's avatar
Linedwell committed
142 143

                    c = callback.Callback()
144 145
                    page.text = pageTemp
                    page.save(summary,callback=c)
Linedwell's avatar
Linedwell committed
146 147 148 149

                    if c.error == None:
                        nbrModif += 1

150
                    log +=u'*' + '{{Utilisateur:LinedBot/ExtLinker|' + page.title() + u'}} : Mise à jour du bandeau {{m|maintenance}} avec les paramètres suivants : ' + job + '\n'
Linedwell's avatar
Linedwell committed
151 152 153 154 155 156 157

    return log



# Retrait du bandeau si besoin
def removeBanner(pageTemp):
Linedwell's avatar
Linedwell committed
158
    parser = re.compile(r'{{Maintenance\|job=(?P<jb>.*?)(?:\|.*?)?}}(?P<fin>\r\n|\n|\ )',re.I | re.U | re.DOTALL)
Linedwell's avatar
Linedwell committed
159 160 161 162 163 164 165 166 167 168 169
    searchResult = parser.search(pageTemp)
    oldJobList = []
    if searchResult:
        jobT = searchResult.group('jb')
        jobT = ''.join(jobT.split()) # on retire tous les espaces de la chaine
        oldJobList = jobT.split(',') # on convertit la chaine en list
        pageTemp = parser.sub('',pageTemp,1)
    return pageTemp, oldJobList

# Retourne une jobList mise à jour (catégories appliquées par le bot + utilisateurs)
def updateJobList(oldJobList, newJobList):
170
    botJobList = [u'catégoriser',u'impasse',u'orphelin',u'portail']
Linedwell's avatar
Linedwell committed
171 172 173 174 175 176 177 178 179 180
    
    tempJobList = list(oldJobList)
    for j in botJobList:
        if j in oldJobList:
            tempJobList.remove(j)
    newJobList = list(set(newJobList+tempJobList))
    return newJobList


# Exécution
181
def main():
182
    
Linedwell's avatar
Linedwell committed
183
    allPages = False
184 185
    
    try:
186
        opts, args = getopt.getopt(sys.argv[1:], 'a', ['all'])
187 188 189 190 191
    except getopt.GetoptError:
        sys.exit(2)

    for opt, arg in opts:
        if opt in ('-a', '--all'):
Linedwell's avatar
Linedwell committed
192
            allPages = True
193

Linedwell's avatar
Linedwell committed
194 195
    log = u''
    timeStart = time.time()
Linedwell's avatar
Linedwell committed
196
    log += newPages(allPages)
Linedwell's avatar
Linedwell committed
197
    timeEnd = time.time()
198 199
    logger.setValues(nbrTotal,nbrModif)
    logger.editLog(site,log)
Linedwell's avatar
Linedwell committed
200
    pywikibot.output(u"%s (of %s) pages were modified in %s s." %(nbrModif,nbrTotal,round(timeEnd-timeStart,2)))
Linedwell's avatar
Linedwell committed
201 202 203 204


if __name__ == "__main__":
    try:
205
        main()
Linedwell's avatar
Linedwell committed
206
    finally:
Linedwell's avatar
Linedwell committed
207
        pywikibot.stopme()