updateProtection.py 3.9 KB
Newer Older
Linedwell's avatar
Linedwell committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Script de mise à jour des modèles de protection

# (C) Linedwell, 2011-2017
#
# Distribué sous licence GNU GPLv3
# Distributed under the terms of the GNU GPLv3 license
# http://www.gnu.org/licenses/gpl.html

import sys
sys.path.insert(1, '..') #ajoute au PYTHONPATH le répertoire parent

import mylogging

import re, time

import pywikibot
from pywikibot import pagegenerators


# Déclarations
site = pywikibot.Site('fr','wikipedia')
nbrModif = 0
nbrTotal = 0


# Récupération des pages avec un modèle de protection inadapté
def getPagesList():
Linedwell's avatar
Linedwell committed
30 31 32 33
    cat = pywikibot.Category(site,u'Catégorie:Page dont la protection est à vérifier')
    pagesInCat = list(cat.articles(False))
    pagesList = pagegenerators.PreloadingGenerator(pagesInCat)
    pagesList = pagegenerators.NamespaceFilterPageGenerator(pagesList,[0]) #On ne garde que les articles (Namespace 0)
Linedwell's avatar
Linedwell committed
34

Linedwell's avatar
Linedwell committed
35
    return pagesList
Linedwell's avatar
Linedwell committed
36 37 38

# Mets à jour le modèle de protection présent sur une page afin de correspondre à la protection effective
def updatePage(page):
Linedwell's avatar
Linedwell committed
39 40
    protlev = getProtectionLevel(page)
    pywikibot.output(u"Current protection level: %s"
41
                                 % (protlev,))
Linedwell's avatar
Linedwell committed
42 43 44 45 46 47 48 49 50 51
    pageTemp = page.get()
    pageTempNew = updateEditProtectionTemplate(pageTemp, protlev[0])
    pageTempNew = updateMoveProtectionTemplate(pageTempNew, protlev[1])
    pywikibot.showDiff(pageTemp, pageTempNew)
    sk = raw_input()
    if sk != '':
        return
    summary = u"[[WP:Bot|Robot]] : Mise à jour du modèle de protection"
    page.text = pageTempNew
    page.save(summary)
Linedwell's avatar
Linedwell committed
52

53
# Récupère sous forme de tuple les niveaux de protection en écriture et en renommage de la page, None si aucune protection en cours
Linedwell's avatar
Linedwell committed
54
def getProtectionLevel(page):
Linedwell's avatar
Linedwell committed
55 56 57 58 59
    prot = page.protection()
    pl_ed = None
    pl_mv = None
    if u'edit' in prot: # Si la page est actuellement protégée en écriture
        pl_ed = prot[u'edit'][0]
Linedwell's avatar
Linedwell committed
60

Linedwell's avatar
Linedwell committed
61 62
    if u'move' in prot: # Si la page est actuellement protégée en renommage
        pl_mv = prot[u'move'][0]
Linedwell's avatar
Linedwell committed
63

Linedwell's avatar
Linedwell committed
64
    return (pl_ed, pl_mv)
Linedwell's avatar
Linedwell committed
65 66

# Retrait du modèle précédent et ajout si nécessaire du modèle de protection adéquat
67
def updateEditProtectionTemplate(text, protlev):
Linedwell's avatar
Linedwell committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
    motif = [u'SP(E)?',u'[Ss]emi-protégé',u'([Ss]emi[- ])?[Pp]rotection([_ ](étendue|(?P<SPL>longue)))?']

    protTemplate = {
        'autoconfirmed' : u'{{Semi-protection}}',
        'editextendedsemiprotected' : u'{{Semi-protection étendue}}',
        'sysop' : u'{{Protection}}',
    }

    for m in motif:
        parser = re.compile(r'{{' + m + r'.*?}}(\s*?|(?={{))', re.U | re.DOTALL)
        searchResult = parser.search(text) #On cherche si le motif {{m}} existe dans la page
        if searchResult:
            pywikibot.output(u"Template found: %s" % searchResult.group())
            text = parser.sub('',text,1) #Retire la 1re occurrence du motif dans la page
            if protlev and searchResult.group('SPL'):
                text = u'{{Semi-protection longue}}' + '\n' + text
            elif protlev: 
                text = protTemplate[protlev] + '\n' + text
    #print text
    return text
Linedwell's avatar
Linedwell committed
88

89
def updateMoveProtectionTemplate(text, protlev):
Linedwell's avatar
Linedwell committed
90
    motif = [u'Nom[_ ]protégé']
91

Linedwell's avatar
Linedwell committed
92 93 94 95 96 97 98 99 100
    for m in motif:
        parser = re.compile(r'{{' + m + r'}}(\s*?|(?={{))',re.I | re.U | re.DOTALL)
        searchResult = parser.search(text) #On cherche si le motif {{m}} existe dans la page
        if searchResult:
            pywikibot.output(u"Template found: %s" % searchResult.group())
            if not protlev:
                text = parser.sub('',text,1) #Retire la 1re occurrence du motif dans la page
    #print text
    return text
101 102 103 104




Linedwell's avatar
Linedwell committed
105 106 107 108 109 110
#Exécution
def main():
    timeStart = time.time()
    pagesList = getPagesList()

    for page in pagesList:
Linedwell's avatar
Linedwell committed
111
        pywikibot.output("Checking %s;" % page.title(asLink=True))
Linedwell's avatar
Linedwell committed
112 113 114 115 116 117 118 119 120
        updatePage(page)

    timeEnd = time.time()

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