Gerrit Patch Uploader has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/96693


Change subject: Ported protect.py from pywikibot compat to core
......................................................................

Ported protect.py from pywikibot compat to core

Made minor changes to protect.py to allow it to run on pywikibot/core

Change-Id: I0c31cd68dc372ed38f461e430c135350a1581828
---
A scripts/protect.py
1 file changed, 285 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/93/96693/1

diff --git a/scripts/protect.py b/scripts/protect.py
new file mode 100644
index 0000000..7635fd7
--- /dev/null
+++ b/scripts/protect.py
@@ -0,0 +1,285 @@
+# -*- coding: utf-8 -*-
+"""
+This script can be used to protect and unprotect pages en masse.
+Of course, you will need an admin account on the relevant wiki.
+
+Syntax: python protect.py OPTION...
+
+Command line options:
+
+-page:       Protect specified page
+-cat:        Protect all pages in the given category.
+-nosubcats:  Don't protect pages in the subcategories.
+-links:      Protect all pages linked from a given page.
+-file:       Protect all pages listed in a text file.
+-ref:        Protect all pages referring from a given page.
+-images:     Protect all images used on a given page.
+-always:     Don't prompt to protect pages, just do it.
+-summary:    Supply a custom edit summary.
+-unprotect:   Actually unprotect pages instead of protecting
+-edit:PROTECTION_LEVEL Set edit protection level to PROTECTION_LEVEL
+-move:PROTECTION_LEVEL Set move protection level to PROTECTION_LEVEL
+
+## Without support ##
+## -create:PROTECTION_LEVEL Set move protection level to PROTECTION_LEVEL ##
+
+Values for PROTECTION_LEVEL are: sysop, autoconfirmed, none.
+If an operation parameter (edit, move or create) is not specified, default
+protection level is 'sysop' (or 'none' if -unprotect).
+
+Examples:
+
+Protect everything in the category "To protect" prompting.
+    python protect.py -cat:"To protect" -always
+
+Unprotect all pages listed in text file "unprotect.txt" without prompting.
+    python protect.py -file:unprotect.txt -unprotect
+"""
+
+#
+# Written by http://it.wikisource.org/wiki/Utente:Qualc1
+# Created by modifying delete.py
+#
+# (C) Pywikipedia bot team, 2008-2012
+#
+# Distributed under the terms of the MIT license.
+#
+__version__ = '$Id$'
+#
+
+import pywikibot
+from pywikibot import catlib
+from pywikibot import pagegenerators
+
+# Summary messages for protecting from a category.
+msg_simple_protect = {
+    'ar': u'بوت: حماية قائمة من الملفات.',
+    'en': u'Robot: Protecting a list of files.',
+    'it': u'Bot: Protezione di una lista di pagine.',
+    'fa': u'ربات:حفاظت فهرستی از صفحه‌ها',
+    'nl': u'Bot: lijst met bestanden beveiligd',
+    'pt': u'Bot: Protegendo uma lista de artigos.',
+    'zh': u'機器人:保護清單中的所有檔案',
+}
+
+msg_protect_category = {
+    'ar': u'روبوت - حماية كل الصفحات من التصنيف %s',
+    'en': u'Robot: Protecting all pages from category %s',
+    'it': u'Bot: Protezione di tutte le pagine nella categoria %s.',
+    'fa': u'ربات:حفاظت تمام صفحه‌های رده %s',
+    'nl': u'Bot: alle pagina\'s uit categorie %s beveiligd',
+    'pt': u'Bot: Protegendo todos os artigos da categoria %s',
+    'zh': u'機器人: 保護目錄 %s 的所有頁面',
+}
+
+msg_protect_links = {
+    'ar': u'روبوت - حماية كل الصفحات الموصولة من %s',
+    'en': u'Robot: Protecting all pages linked from %s',
+    'it': u'Bot: Protezione di tutte le pagine linkate da %s.',
+    'fa': u'ربات:حفاظت تمام صفحه‌هایی که در %s پیوند شده‌اند.',
+    'nl': u'Bot: alle pagina\'s met verwijzingen vanaf %s beveiligd',
+    'pt': u'Bot: Protegendo todos os artigos ligados a %s',
+    'zh': u'機器人: 保護所有從 %s 連結的頁面',
+}
+
+msg_protect_ref = {
+    'ar': u'روبوت - حماية كل الصفحات الراجعة من %s',
+    'en': u'Robot: Protecting all pages referring from %s',
+    'it': u'Bot: Protezione di tutte le pagine con link verso %s.',
+    'fa': u'ربات:حفاظت تمام صفحه‌هایی که به %s پیوند داده‌اند',
+    'nl': u'Bot: alle pagina\'s met een verwijzing op beveiligd',
+    'pt': u'Bot: Protegendo todos os artigos afluentes a %s',
+    'zh': u'機器人: 保護所有連至 %s 的頁面',
+}
+
+msg_protect_images = {
+    'ar': u'روبوت - حماية كل الصور في الصفحة %s',
+    'en': u'Robot: Protecting all images on page %s',
+    'it': u'Bot: Protezione di tutte le immagini presenti in %s.',
+    'fa': u'ربات:حفاظت تمام تصاویر به کار رفته در %s',
+    'nl': u'Bot: alle bestanden gebruikt op %s beveiligd',
+    'pt': u'Bot: Protegendo todas as imagens do artigo %s',
+    'zh': u'機器人: 保護頁面 %s 中的所有圖條',
+}
+
+class ProtectionRobot:
+    """
+    This robot allows protection of pages en masse.
+    """
+
+    def __init__(self, generator, summary, always=False, unprotect=False,
+                edit='sysop', move='sysop', create='sysop'):
+        """
+        Arguments:
+            * generator - A page generator.
+            * always - Protect without prompting?
+            * edit, move, create - protection level for these operations
+            * unprotect - unprotect pages (and ignore edit, move, create 
params)
+        """
+        self.generator = generator
+        self.summary = summary
+        self.prompt = not always
+        self.unprotect = unprotect
+        self.edit = edit
+        self.move = move
+
+    def run(self):
+        """
+        Starts the robot's action.
+        """
+        #Loop through everything in the page generator and (un)protect it.
+        for page in self.generator:
+            pywikibot.output(u'Processing page %s' % page.title())
+            #print self.edit, self.move#, self.create
+            page.protect(unprotect=self.unprotect, reason=self.summary,
+                         prompt=self.prompt, editcreate=self.edit,
+                         move=self.move)
+
+# Asks a valid protection level for "operation".
+# Returns the protection level chosen by user.
+def choiceProtectionLevel(operation, default):
+    default = default[0]
+    firstChar = map(lambda level: level[0], protectionLevels)
+    choiceChar = pywikibot.inputChoice('Choice a protection level to %s:'
+                                       % operation,
+                                       protectionLevels, firstChar,
+                                       default=default)
+    for level in protectionLevels:
+        if level.startswith(choiceChar):
+            return level
+
+def main():
+    global protectionLevels
+    protectionLevels = ['sysop', 'autoconfirmed', 'none']
+
+    pageName = ''
+    summary = ''
+    always = False
+    doSinglePage = False
+    doCategory = False
+    protectSubcategories = True
+    doRef = False
+    doLinks = False
+    doImages = False
+    fileName = ''
+    gen = None
+    edit = ''
+    move = ''
+    defaultProtection = 'sysop'
+
+    # read command line parameters
+    for arg in pywikibot.handleArgs():
+        if arg == '-always':
+            always = True
+        elif arg.startswith('-file'):
+            if len(arg) == len('-file'):
+                fileName = pywikibot.input(u'Enter name of file to protect 
pages from:')
+            else:
+                fileName = arg[len('-file:'):]
+        elif arg.startswith('-summary'):
+            if len(arg) == len('-summary'):
+                summary = pywikibot.input(u'Enter a reason for the 
protection:')
+            else:
+                summary = arg[len('-summary:'):]
+        elif arg.startswith('-cat'):
+            doCategory = True
+            if len(arg) == len('-cat'):
+                pageName = pywikibot.input(u'Enter the category to protect 
from:')
+            else:
+                pageName = arg[len('-cat:'):]
+        elif arg.startswith('-nosubcats'):
+            protectSubcategories = False
+        elif arg.startswith('-links'):
+            doLinks = True
+            if len(arg) == len('-links'):
+                pageName = pywikibot.input(u'Enter the page to protect from:')
+            else:
+                pageName = arg[len('-links:'):]
+        elif arg.startswith('-ref'):
+            doRef = True
+            if len(arg) == len('-ref'):
+                pageName = pywikibot.input(u'Enter the page to protect from:')
+            else:
+                pageName = arg[len('-ref:'):]
+        elif arg.startswith('-page'):
+            doSinglePage = True
+            if len(arg) == len('-page'):
+                pageName = pywikibot.input(u'Enter the page to protect:')
+            else:
+                pageName = arg[len('-page:'):]
+        elif arg.startswith('-images'):
+            doImages = True
+            if len(arg) == len('-images'):
+                pageName = pywikibot.input(u'Enter the page with the images to 
protect:')
+            else:
+                pageName = arg[len('-images:'):]
+        elif arg.startswith('-unprotect'):
+            defaultProtection = 'none'
+        elif arg.startswith('-edit'):
+            edit = arg[len('-edit:'):]
+            if edit not in protectionLevels:
+                edit = choiceProtectionLevel('edit', defaultProtection)
+        elif arg.startswith('-move'):
+            move = arg[len('-move:'):]
+            if move not in protectionLevels:
+                move = choiceProtectionLevel('move', defaultProtection)
+        elif arg.startswith('-create'):
+            create = arg[len('-create:'):]
+            if create not in protectionLevels:
+                create = choiceProtectionLevel('create', defaultProtection)
+
+    mysite = pywikibot.getSite()
+
+    if doSinglePage:
+        if not summary:
+            summary = pywikibot.input(u'Enter a reason for the protection:')
+        page = pywikibot.Page(mysite, pageName)
+        gen = iter([page])
+    elif doCategory:
+        if not summary:
+            summary = pywikibot.translate(mysite,
+                                          msg_protect_category) % pageName
+        ns = mysite.category_namespace()
+        categoryPage = catlib.Category(mysite, ns + ':' + pageName)
+        gen = pagegenerators.CategorizedPageGenerator(categoryPage,
+                                                      
recurse=protectSubcategories)
+    elif doLinks:
+        if not summary:
+            summary = pywikibot.translate(mysite,
+                                          msg_protect_links) % pageName
+        linksPage = pywikibot.Page(mysite, pageName)
+        gen = pagegenerators.LinkedPageGenerator(linksPage)
+    elif doRef:
+        if not summary:
+            summary = pywikibot.translate(mysite, msg_protect_ref) % pageName
+        refPage = pywikibot.Page(mysite, pageName)
+        gen = pagegenerators.ReferringPageGenerator(refPage)
+    elif fileName:
+        if not summary:
+            summary = pywikibot.translate(mysite, msg_simple_protect)
+        gen = pagegenerators.TextfilePageGenerator(fileName)
+    elif doImages:
+        if not summary:
+            summary = pywikibot.translate(mysite, msg_protect_images) % 
pageName
+        gen = pagegenerators.ImagesPageGenerator(pywikibot.Page(mysite,
+                                                                pageName))
+
+    if gen:
+        pywikibot.setAction(summary)
+        # We are just protecting pages, so we have no need of using a 
preloading
+        # page generator
+        # to actually get the text of those pages.
+        if not edit:
+            edit = defaultProtection
+        if not move:
+            move = defaultProtection
+        bot = ProtectionRobot(gen, summary, always, edit=edit, move=move)
+        bot.run()
+    else:
+        pywikibot.showHelp(u'protect')
+
+if __name__ == "__main__":
+    try:
+        main()
+    finally:
+        pywikibot.stopme()

-- 
To view, visit https://gerrit.wikimedia.org/r/96693
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0c31cd68dc372ed38f461e430c135350a1581828
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Gerrit Patch Uploader <gerritpatchuploa...@gmail.com>
Gerrit-Reviewer: Kyle <brownky...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to