jenkins-bot has submitted this change and it was merged.
Change subject: use i18n messages; pep8 changes, update from core (gerrit: 79582) ......................................................................
use i18n messages; pep8 changes, update from core (gerrit: 79582)
Change-Id: Ib5a544ba0b7a123ca2cb4c15a5e0603ebdc9baea --- M blockpageschecker.py 1 file changed, 155 insertions(+), 119 deletions(-)
Approvals: Merlijn van Deen: Looks good to me, approved jenkins-bot: Verified
diff --git a/blockpageschecker.py b/blockpageschecker.py index c6dd531..4329983 100644 --- a/blockpageschecker.py +++ b/blockpageschecker.py @@ -56,15 +56,17 @@ # (C) Monobi a.k.a. Wikihermit, 2007 # (C) Filnik, 2007-2011 # (C) NicDumZ, 2008-2009 -# (C) Pywikipedia bot team, 2007-2010 +# (C) Pywikipedia bot team, 2007-2013 # # Distributed under the terms of the MIT license. # __version__ = '$Id$' #
-import re, webbrowser +import re +import webbrowser import wikipedia as pywikibot +from pywikibot import i18n import pagegenerators import config import catlib @@ -80,78 +82,73 @@ ################### -- Edit below! -- #################
templateSemiProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccoparziale(?:|[ _]scad|.*?||.*?)}}', - r'{{(?:[Tt]emplate:|)[Aa]bp(?:|[ _]scad|(?:.*?))}}'], - 'fr': [ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Ss]emi[- ]?protection(|[^}]*)}}'], - 'ja':[ur'(?<!<nowiki>){{(?:[Tt]emplate:|)半保護(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], - #'zh':[ur'{{(?:[Tt]emplate:|)Protected|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Mini-protected|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Protected-logo|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)'], - } -# Regex to get the total-protection template -templateTotalProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisoblocco(?:|[ _]scad|(?:.*?)|minaccia|cancellata)}}', - r'{{(?:[Tt]emplate:|)(?:[Cc][Tt]|[Cc]anc fatte|[Cc][Ee])}}', r'<div class="toccolours[ _]itwiki[ _]template[ _]avviso">(?:\s|\n)*?[Qq]uesta pagina'], - 'fr':[ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Pp]rotection(|[^}]*)}}', - ur'{{(?:[Tt]emplate:|[Mm]odèle:|)(?:[Pp]age|[Aa]rchive|[Mm]odèle) protégée?(|[^}]*)}}'], - 'ja':[ur'(?<!<nowiki>){{(?:[Tt]emplate:|)保護(?:性急|)(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], - #'zh':[r'{{(?:[Tt]emplate:|)Protected|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Mini-protected|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Protected-logo|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)'], - } -# Regex to get the semi-protection move template -templateSemiMoveProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], - 'ja':[ur'(?<!<nowiki>){{(?:[Tt]emplate:|)移動半保護(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], - #'zh':[r'{{(?:[Tt]emplate:|)Protected|(?:MS|ms)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Mini-protected|(?:MS|ms)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Protected-logo|(?:MS|ms)(?:|.+|)}}(\n+?|)'], - } -# Regex to get the total-protection move template -templateTotalMoveProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], - 'ja':[ur'(?<!<nowiki>){{(?:[Tt]emplate:|)移動保護(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], - #'zh':[ur'{{(?:[Tt]emplate:|)Protected|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Mini-protected|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Protected-logo|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)'], - } - -# If you use only one template for all the type of protection, put it here. -# You may use only one template or an unique template and some other "old" template that the -# script should still check (as on it.wikipedia) -templateUnique = { - 'en': None, - 'it': [r'{{(?:[Tt]emplate:|)[Pp]rotetta}}'], + 'en': None, + 'it': [r'{{(?:[Tt]emplate:|)[Aa]vvisobloccoparziale(?:|[ _]scad|.*?||.*?)}}', + r'{{(?:[Tt]emplate:|)[Aa]bp(?:|[ _]scad|(?:.*?))}}'], + 'fr': [ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Ss]emi[- ]?protection(|[^}]*)}}'], + 'ja': [ur'(?<!<nowiki>){{(?:[Tt]emplate:|)半保護(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], }
-# Array: 0 => Semi-block, 1 => Total Block, 2 => Semi-Move, 3 => Total-Move, 4 => template-unique +# Regex to get the total-protection template +templateTotalProtection = { + 'en': None, + 'it': [r'{{(?:[Tt]emplate:|)[Aa]vvisoblocco(?:|[ _]scad|(?:.*?)|minaccia|cancellata)}}', + r'{{(?:[Tt]emplate:|)(?:[Cc][Tt]|[Cc]anc fatte|[Cc][Ee])}}', + r'<div class="toccolours[ _]itwiki[ _]template[ _]avviso">(?:\s|\n)*?[Qq]uesta pagina'], + 'fr': [ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Pp]rotection(|[^}]*)}}', + ur'{{(?:[Tt]emplate:|[Mm]odèle:|)(?:[Pp]age|[Aa]rchive|[Mm]odèle) protégée?(|[^}]*)}}'], + 'ja': [ur'(?<!<nowiki>){{(?:[Tt]emplate:|)保護(?:性急|)(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], +} + +# Regex to get the semi-protection move template +templateSemiMoveProtection = { + 'en': None, + 'it': [r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], + 'ja': [ur'(?<!<nowiki>){{(?:[Tt]emplate:|)移動半保護(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], +} + +# Regex to get the total-protection move template +templateTotalMoveProtection = { + 'en': None, + 'it': [r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], + 'ja': [ur'(?<!<nowiki>){{(?:[Tt]emplate:|)移動保護(?:[Ss]|)(?:|.+|)}}(?!</nowiki>)\s*(?:\r\n|)*'], +} + +# If you use only one template for all the type of protection, put it here. +# You may use only one template or an unique template and some other "old" +# template that the script should still check (as on it.wikipedia) +templateUnique = { + 'en': None, + 'it': [r'{{(?:[Tt]emplate:|)[Pp]rotetta}}'], +} + +# Array: 0 => Semi-block, 1 => Total Block, 2 => Semi-Move, 3 => Total-Move, +# 4 => template-unique templateNoRegex = { - 'it':['{{Avvisobloccoparziale}}', '{{Avvisoblocco}}', None, None, '{{Protetta}}'], - 'fr':['{{Semi-protection}}', '{{Protection}}', None, None, None], - 'ja':[u'{{半保護}}', u'{{保護}}', u'{{移動半保護}}', u'{{移動保護}}', None], - #'zh':[u'{{Protected/semi}}',u'{{Protected}}',u'{{Protected/ms}}',u'{{Protected/move}}', None], - } + 'it': ['{{Avvisobloccoparziale}}', '{{Avvisoblocco}}', None, None, + '{{Protetta}}'], + 'fr': ['{{Semi-protection}}', '{{Protection}}', None, None, None], + 'ja': [u'{{半保護}}', u'{{保護}}', u'{{移動半保護}}', u'{{移動保護}}', None], +}
# Category where the bot will check categoryToCheck = { - 'en':[u'Category:Protected'], - 'ar':[u'تصنيف:محتويات محمية'], - 'fr':[u'Category:Page semi-protégée', u'Category:Page protégée', u'Catégorie:Article protégé'], - 'he':[u'קטגוריה:ויקיפדיה: דפים מוגנים', u'קטגוריה:ויקיפדיה: דפים מוגנים חלקית'], - 'it':[u'Categoria:Pagine protette - scadute', u'Categoria:Pagine semiprotette', u'Categoria:Voci protette'], - 'ja':[u'Category:編集保護中の記事',u'Category:編集半保護中の記事', - u'Category:移動保護中の記事',], - 'pt':[u'Category:!Páginas protegidas', u'Category:!Páginas semiprotegidas'], - 'zh':[u'Category:被保护的页面',u'Category:被保護的模板',u'Category:暂时不能移动的页面', - u'Category:被半保护的页面',], - } -# Comment used when the Bot edits -comment = { - 'en':u'Bot: Deleting out-dated template', - 'ar':u'بوت: حذف قالب قديم', - 'fr':u'Robot: Mise à jour des bandeaux de protection', - 'he':u'בוט: מסיר תבנית שעבר זמנה', - 'it':u'Bot: Tolgo o sistemo template di avviso blocco', - 'ja':u'ロボットによる: 保護テンプレート除去', - 'pt':u'Bot: Retirando predefinição de proteção', - 'zh':u'機器人: 移除過期的保護模板', - } + 'en': [u'Category:Protected'], + 'ar': [u'تصنيف:محتويات محمية'], + 'fr': [u'Category:Page semi-protégée', u'Category:Page protégée', + u'Catégorie:Article protégé'], + 'he': [u'קטגוריה:ויקיפדיה: דפים מוגנים', + u'קטגוריה:ויקיפדיה: דפים מוגנים חלקית'], + 'it': [u'Categoria:Pagine protette - scadute', + u'Categoria:Pagine semiprotette', u'Categoria:Voci protette'], + 'ja': [u'Category:編集保護中の記事', u'Category:編集半保護中の記事', + u'Category:移動保護中の記事'], + 'pt': [u'Category:!Páginas protegidas', + u'Category:!Páginas semiprotegidas'], + 'zh': [u'Category:被保护的页面', u'Category:被保護的模板', + u'Category:暂时不能移动的页面', u'Category:被半保护的页面'], +} + # Check list to block the users that haven't set their preferences project_inserted = ['en', 'fr', 'it', 'ja', 'pt', 'zh']
@@ -159,24 +156,25 @@ #------------------ END PREFERENCES ------------------# ################## -- Edit above! -- ##################
+ def understandBlock(text, TTP, TSP, TSMP, TTMP, TU): """ Understand if the page is blocked and if it has the right template """ - if TTP != None: - for catchRegex in TTP: # TTP = templateTotalProtection + if TTP: + for catchRegex in TTP: # TTP = templateTotalProtection resultCatch = re.findall(catchRegex, text) if resultCatch: return ('sysop-total', catchRegex) - if TSP != None: + if TSP: for catchRegex in TSP: resultCatch = re.findall(catchRegex, text) if resultCatch: return ('autoconfirmed-total', catchRegex) - if TU != None: + if TU: for catchRegex in TU: resultCatch = re.findall(catchRegex, text) if resultCatch: return ('unique', catchRegex) - if TSMP != None and TTMP != None and TTP != TTMP and TSP != TSMP: + if TSMP and TTMP and TTP != TTMP and TSP != TSMP: for catchRegex in TTMP: resultCatch = re.findall(catchRegex, text) if resultCatch: @@ -188,6 +186,7 @@ # If editable means that we have no regex, won't change anything with this # regex return ('editable', r'\A\n') +
def showQuest(site, page): quest = pywikibot.inputChoice(u'Do you want to open the page?', @@ -203,13 +202,16 @@ editor = editarticle.TextEditor() text = editor.edit(page.get())
+ def main(): """ Main Function """ # Loading the comments - global categoryToCheck, comment, project_inserted + global categoryToCheck, project_inserted # always, define a generator to understand if the user sets one, # defining what's genFactory - always = False; generator = False; show = False + always = False + generator = False + show = False moveBlockCheck = False protectedpages = False protectType = 'edit' @@ -238,7 +240,8 @@ genFactory.handleArg(arg)
if config.mylang not in project_inserted: - pywikibot.output(u"Your project is not supported by this script.\nYou have to edit the script and add it!") + pywikibot.output(u"Your project is not supported by this script.\n" + u"You have to edit the script and add it!") return site = pywikibot.getSite() if protectedpages: @@ -252,7 +255,7 @@ TU = pywikibot.translate(site, templateUnique)
category = pywikibot.translate(site, categoryToCheck) - commentUsed = pywikibot.translate(site, comment) + commentUsed = i18n.twtranslate(site, 'blockpageschecker-summary') if not generator: generator = genFactory.getCombinedGenerator() if not generator: @@ -298,11 +301,13 @@ try: config.sysopnames[site.family.name][site.lang] except: - pywikibot.output("%s is sysop-protected : this account can't edit it! Skipping..." % pagename) + pywikibot.output(u"%s is sysop-protected: " + u"this account can't edit it! Skipping..." + % pagename) continue
- # Understand, according to the template in the page, what should be the protection - # and compare it with what there really is. + # Understand, according to the template in the page, what should be the + # protection and compare it with what there really is. TemplateInThePage = understandBlock(text, TTP, TSP, TSMP, TTMP, TU) # Only to see if the text is the same or not... oldtext = text @@ -312,11 +317,12 @@ if not editRestr: # page is not edit-protected # Deleting the template because the page doesn't need it. - if TU != None: + if TU: replaceToPerform = u'|'.join(TTP + TSP + TU) else: replaceToPerform = u'|'.join(TTP + TSP) - text, changes = re.subn('<noinclude>(%s)</noinclude>' % replaceToPerform, '', text) + text, changes = re.subn('<noinclude>(%s)</noinclude>' + % replaceToPerform, '', text) if changes == 0: text, changes = re.subn('(%s)' % replaceToPerform, '', text) msg = u'The page is editable for all' @@ -326,28 +332,33 @@
elif editRestr[0] == 'sysop': # total edit protection - if (TemplateInThePage[0] == 'sysop-total' and TTP != None) or (TemplateInThePage[0] == 'unique' and TU != None): + if (TemplateInThePage[0] == 'sysop-total' and TTP) or \ + (TemplateInThePage[0] == 'unique' and TU): msg = 'The page is protected to the sysop' if not moveBlockCheck: msg += ', skipping...' pywikibot.output(msg) else: - pywikibot.output(u'The page is protected to the sysop, but the template seems not correct. Fixing...') - if TU != None: + pywikibot.output(u'The page is protected to the sysop, but the ' + u'template seems not correct. Fixing...') + if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[1], text)
- elif TSP != None or TU != None: + elif TSP or TU: # implicitely editRestr[0] = 'autoconfirmed', edit-Semi-protection - if TemplateInThePage[0] == 'autoconfirmed-total' or TemplateInThePage[0] == 'unique': + if TemplateInThePage[0] == 'autoconfirmed-total' or \ + TemplateInThePage[0] == 'unique': msg = 'The page is editable only for the autoconfirmed users' if not moveBlockCheck: msg += ', skipping...' pywikibot.output(msg) else: - pywikibot.output(u'The page is editable only for the autoconfirmed users, but the template seems not correct. Fixing...') - if TU != None: + pywikibot.output(u'The page is editable only for the ' + u'autoconfirmed users, but the template ' + u'seems not correct. Fixing...') + if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[0], text) @@ -365,52 +376,72 @@ changes = -1
if not moveRestr: - pywikibot.output(u'The page is movable for all, deleting the template...') + pywikibot.output(u'The page is movable for all, deleting the ' + u'template...') # Deleting the template because the page doesn't need it. - if TU != None: + if TU: replaceToPerform = u'|'.join(TSMP + TTMP + TU) else: replaceToPerform = u'|'.join(TSMP + TTMP) - text, changes = re.subn('<noinclude>(%s)</noinclude>' % replaceToPerform, '', text) + text, changes = re.subn('<noinclude>(%s)</noinclude>' + % replaceToPerform, '', text) if changes == 0: text, changes = re.subn('(%s)' % replaceToPerform, '', text) elif moveRestr[0] == 'sysop': # move-total-protection - if (TemplateInThePage[0] == 'sysop-move' and TTMP != None) or (TemplateInThePage[0] == 'unique' and TU != None): - pywikibot.output(u'The page is protected from moving to the sysop, skipping...') - if TU != None: - text = oldtext # no changes needed, better to revert the old text. + if (TemplateInThePage[0] == 'sysop-move' and TTMP) or \ + (TemplateInThePage[0] == 'unique' and TU): + pywikibot.output(u'The page is protected from moving to ' + u'the sysop, skipping...') + if TU: + # no changes needed, better to revert the old text. + text = oldtext else: - pywikibot.output(u'The page is protected from moving to the sysop, but the template seems not correct. Fixing...') - if TU != None: - text, changes = re.subn(TemplateInThePage[1], TNR[4], text) + pywikibot.output(u'The page is protected from moving to ' + u'the sysop, but the template seems not ' + u'correct. Fixing...') + if TU: + text, changes = re.subn(TemplateInThePage[1], TNR[4], + text) else: - text, changes = re.subn(TemplateInThePage[1], TNR[3], text) + text, changes = re.subn(TemplateInThePage[1], TNR[3], + text)
- elif TSMP != None or TU != None: - # implicitely moveRestr[0] = 'autoconfirmed', move-semi-protection - if TemplateInThePage[0] == 'autoconfirmed-move' or TemplateInThePage[0] == 'unique': - pywikibot.output(u'The page is movable only for the autoconfirmed users, skipping...') - if TU != None: - text = oldtext # no changes needed, better to revert the old text. + elif TSMP or TU: + # implicitely moveRestr[0] = 'autoconfirmed', + # move-semi-protection + if TemplateInThePage[0] == 'autoconfirmed-move' or \ + TemplateInThePage[0] == 'unique': + pywikibot.output(u'The page is movable only for the ' + u'autoconfirmed users, skipping...') + if TU: + # no changes needed, better to revert the old text. + text = oldtext else: - pywikibot.output(u'The page is movable only for the autoconfirmed users, but the template seems not correct. Fixing...') - if TU != None: - text, changes = re.subn(TemplateInThePage[1], TNR[4], text) + pywikibot.output(u'The page is movable only for the ' + u'autoconfirmed users, but the template ' + u'seems not correct. Fixing...') + if TU: + text, changes = re.subn(TemplateInThePage[1], TNR[4], + text) else: - text, changes = re.subn(TemplateInThePage[1], TNR[2], text) + text, changes = re.subn(TemplateInThePage[1], TNR[2], + text)
if changes == 0: - # We tried to fix move-protection templates, but it did not work. + # We tried to fix move-protection templates, but it did not work pywikibot.warning('No move-protection template could be found') -
if oldtext != text: # Ok, asking if the change has to be performed and do it if yes. - pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) + pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" + % page.title()) pywikibot.showDiff(oldtext, text) if not always: - choice = pywikibot.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N') + choice = pywikibot.inputChoice(u'Do you want to accept these ' + u'changes?', + ['Yes', 'No', 'All'], + ['y', 'N', 'a'], 'N') if choice == 'a': always = True if always or choice == 'y': @@ -421,8 +452,8 @@ pywikibot.output(u'Edit conflict! skip!') break except pywikibot.ServerError: - # Sometimes there is this error that's quite annoying because - # can block the whole process for nothing. + # Sometimes there is this error that's quite annoying + # because can block the whole process for nothing. errorCount += 1 if errorCount < 5: pywikibot.output(u'Server Error! Wait..') @@ -432,19 +463,24 @@ # Prevent Infinite Loops raise pywikibot.ServerError(u'Fifth Server Error!') except pywikibot.SpamfilterError, e: - pywikibot.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url)) + pywikibot.output(u'Cannot change %s because of ' + u'blacklist entry %s' + % (page.title(), e.url)) break except pywikibot.PageNotSaved, error: - pywikibot.output(u'Error putting page: %s' % (error.args,)) + pywikibot.output(u'Error putting page: %s' + % (error.args,)) break except pywikibot.LockedPage: - pywikibot.output(u'The page is still protected. Skipping...') + pywikibot.output(u'The page is still protected. ' + u'Skipping...') break else: # Break only if the errors are one after the other errorCount = 0 break
+ if __name__ == "__main__": try: main()
pywikibot-commits@lists.wikimedia.org