Utilisateur:YannBot/del redirect.py

La bibliothèque libre.
#!/usr/bin/python
# -*- coding: utf-8 -*-

import catlib
import pagegenerators
import wikipedia
import delete_redirect
import fixing_redirects
import delete
import sys
import re
import time

def add_to_log(msg, opt):
    p = wikipedia.Page(opt.site, u"User:Phe/Log move page")
    text = p.get()
    text += u'\n*' + msg
    try:
        p.put(text, u'Journal des erreurs de déplacement')
        return True
    except wikipedia.EditConflict:
        return False

def log_error(msg, page, opt):
    err_msg = u'Error, page: [[%s]], %s' % (page.title(), msg)
    print err_msg
    if not add_to_log(err_msg, opt):
        time.sleep(10)
        if not add_to_log(err_msg, opt):
            print u'ERROR: Unable to log last error message'

def fixup_pagename(pages, titles):
    results = set()
    for p in pages:
        found = False
        for t in titles:
            if p.title() == t[0]:
                found = True
                results.add(wikipedia.Page(p.site(), t[1]))
        if not found:
            results.add(p)
    return results

def fix_redirect(pages, titles, opt):
    if not opt.dry_run:
        pages = fixup_pagename(pages, titles)
    pages = pagegenerators.PreloadingGenerator(pages)
    for p in pages:
        text = p.get(get_redirect = True)
        new_text = text
        for t in titles:
            regexp = u'\[\[[ ]*' + regex_from_title(t[0]) + u'[ ]*(\||\]|#)'
            repl = u'[[' + t[1] + u'\\1'
            new_text = re.sub(regexp, repl, new_text)
        if opt.dry_run:
            print 'Changing', p.title()
        wikipedia.showDiff(text, new_text)
        if not opt.dry_run:
            p.put(new_text,
                  comment = u'Correction des redirects après renommage')

def delete_redirect(p, opt):
    if p.exists():
        if p.isRedirectPage():
            print 'deleting page:', p.title()
            if len([ x for x in p.getReferences()]) > 1:
                if not opt.dry_run:
                    print u'skipping deletion, linked page exists, please fix linked pages and delete the redirect manually'
            else:
                if not opt.dry_run:
                    time.sleep(10)
                    p.delete(u'Nettoyage après correction des liens',
                             prompt = False)
        else:
            if not opt.dry_run:
                print u'skipping deletion, page is not a redirect, check linked page before deletion'

def delete_all_redirect(titles, opt):
    for t in titles:
        if opt.delete_redirect:
            p = wikipedia.Page(opt.site, t)
            delete_redirect(p, opt)
            talk_page = p.toggleTalkPage()
            delete_redirect(talk_page, opt)


if __name__ == '__main__':
    try:
        class Options:
            pass

        options = Options()
        options.dry_run = False
        options.fix_redirect = False
        options.sync_between_page = True
        options.delete_redirect = False
        gen = None

        options.site = wikipedia.getSite(code = 'fr', fam = 'wikisource')
        options.sysop = options.site.isAllowed('delete', True)

        for arg in sys.argv[1:]:
            if arg == '-dry-run':
                options.dry_run = True
            elif arg.startswith('-cat:'):
                cat_name = unicode(arg[len('-cat:'):], u'utf-8')
                cat = catlib.Category(options.site, cat_name)
                gen = pagegenerators.CategorizedPageGenerator(cat)
                options.sync_between_page = True
            elif arg.startswith('-prefix:'):
                prefix_name = unicode(arg[len('-prefix;'):], 'utf-8')
                gen = pagegenerators.PrefixingPageGenerator(prefix_name, includeredirects = False, site = options.site)
                options.sync_between_page = False
            elif arg.startswith('-links:'):
                pagename = unicode(arg[len('-links:'):], 'utf-8')
                page = wikipedia.Page(options.site, pagename)
                gen = pagegenerators.LinkedPageGenerator(page)
                options.sync_between_page = False
            elif arg.startswith('-page:'):
                pagename = unicode(arg[len('-page:'):], 'utf-8')
                gen = [ wikipedia.Page(options.site, pagename) ]
                options.sync_between_page = False
            elif arg == '-fix-redirect':
                options.fix_redirect = True
            elif arg == '-delete-redirect':
                options.delete_redirect = True
            elif arg == '-help':
                print sys.argv[0], '[-dry-run | -help | -cat:cat_name | -prefix:prefix_name | -fix-redirect | -delete-redirect ]'
                sys.exit(1)

        if options.delete_redirect and not options.sysop:
            print 'You asked to delete redirect but have not enough right todo that'
            sys.exit(1)

        if options.delete_redirect and not options.fix_redirect:
            print 'You asked to delete redirect but not to -fix-redirect'

        for redirect in gen:
                print redirect
                delete_redirect(redirect, options)

    finally:
        wikipedia.stopme()