<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinkledeprod.js</id>
	<title>MediaWiki:Gadget-twinkledeprod.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinkledeprod.js"/>
	<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;action=history"/>
	<updated>2026-08-23T05:51:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://en.bharatpedia.org/w/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;diff=303785&amp;oldid=prev</id>
		<title>ImportMaster: robot: Import pages to supprt Twinkle</title>
		<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;diff=303785&amp;oldid=prev"/>
		<updated>2021-03-02T19:16:30Z</updated>

		<summary type="html">&lt;p&gt;robot: Import pages to supprt Twinkle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
****************************************&lt;br /&gt;
*** twinkledeprod.js: Batch deletion of expired PRODs (sysops only)&lt;br /&gt;
****************************************&lt;br /&gt;
* Mode of invocation:     Tab (&amp;quot;Deprod&amp;quot;)&lt;br /&gt;
* Active on:              Categories whose name contains &amp;quot;proposed_deletion&amp;quot;&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Twinkle.deprod = function() {&lt;br /&gt;
	if (&lt;br /&gt;
		!Morebits.userIsSysop ||&lt;br /&gt;
		mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) !== 14 ||&lt;br /&gt;
		!(/proposed_deletion/i).test(mw.config.get(&amp;#039;wgPageName&amp;#039;))&lt;br /&gt;
	) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Twinkle.addPortletLink(Twinkle.deprod.callback, &amp;#039;Deprod&amp;#039;, &amp;#039;tw-deprod&amp;#039;, &amp;#039;Delete prod pages found in this category&amp;#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var concerns = {};&lt;br /&gt;
&lt;br /&gt;
Twinkle.deprod.callback = function() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow(800, 400);&lt;br /&gt;
	Window.setTitle(&amp;#039;PROD cleaning&amp;#039;);&lt;br /&gt;
	Window.setScriptName(&amp;#039;Twinkle&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(&amp;#039;Proposed deletion&amp;#039;, &amp;#039;BP:PROD&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(&amp;#039;Twinkle help&amp;#039;, &amp;#039;BP:TW/DOC#deprod&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(&amp;#039;Give feedback&amp;#039;, &amp;#039;WT:TW&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm(callback_commit);&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
	statusdiv.style.padding = &amp;#039;15px&amp;#039;;  // just so it doesn&amp;#039;t look broken&lt;br /&gt;
	Window.setContent(statusdiv);&lt;br /&gt;
	Morebits.status.init(statusdiv);&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	var query = {&lt;br /&gt;
		action: &amp;#039;query&amp;#039;,&lt;br /&gt;
		generator: &amp;#039;categorymembers&amp;#039;,&lt;br /&gt;
		gcmtitle: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
		gcmlimit: Twinkle.getPref(&amp;#039;batchMax&amp;#039;),&lt;br /&gt;
		gcmnamespace: &amp;#039;0|108|2&amp;#039;, // mostly to ignore categories and files&lt;br /&gt;
		prop: &amp;#039;info|revisions&amp;#039;,&lt;br /&gt;
		rvprop: &amp;#039;content&amp;#039;,&lt;br /&gt;
		inprop: &amp;#039;protection&amp;#039;,&lt;br /&gt;
		format: &amp;#039;json&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var statelem = new Morebits.status(&amp;#039;Grabbing list of pages&amp;#039;);&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api(&amp;#039;loading...&amp;#039;, query, function(apiobj) {&lt;br /&gt;
		var response = apiobj.getResponse();&lt;br /&gt;
		var pages = (response.query &amp;amp;&amp;amp; response.query.pages) || [];&lt;br /&gt;
		var list = [];&lt;br /&gt;
		var re = /\{\{Proposed deletion/;&lt;br /&gt;
		pages.sort(Twinkle.sortByNamespace);&lt;br /&gt;
		pages.forEach(function(page) {&lt;br /&gt;
			var metadata = [];&lt;br /&gt;
&lt;br /&gt;
			var content = page.revisions[0].content;&lt;br /&gt;
			var res = re.exec(content);&lt;br /&gt;
			var title = page.title;&lt;br /&gt;
			if (res) {&lt;br /&gt;
				var parsed = Morebits.wikitext.parseTemplate(content, res.index);&lt;br /&gt;
				concerns[title] = parsed.parameters.concern || &amp;#039;&amp;#039;;&lt;br /&gt;
				metadata.push(concerns[title]);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var editProt = page.protection.filter(function(pr) {&lt;br /&gt;
				return pr.type === &amp;#039;edit&amp;#039; &amp;amp;&amp;amp; pr.level === &amp;#039;sysop&amp;#039;;&lt;br /&gt;
			}).pop();&lt;br /&gt;
			if (editProt) {&lt;br /&gt;
				metadata.push(&amp;#039;fully protected&amp;#039; +&lt;br /&gt;
					(editProt.expiry === &amp;#039;infinity&amp;#039; ? &amp;#039; indefinitely&amp;#039; : &amp;#039;, expires &amp;#039; + editProt.expiry));&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			list.push({&lt;br /&gt;
				label: metadata.length ? &amp;#039;(&amp;#039; + metadata.join(&amp;#039;; &amp;#039;) + &amp;#039;)&amp;#039; : &amp;#039;&amp;#039;,&lt;br /&gt;
				value: title,&lt;br /&gt;
				checked: concerns[title] !== &amp;#039;&amp;#039;,&lt;br /&gt;
				style: editProt ? &amp;#039;color:red&amp;#039; : &amp;#039;&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({ type: &amp;#039;header&amp;#039;, label: &amp;#039;Pages to delete&amp;#039; });&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;button&amp;#039;,&lt;br /&gt;
			label: &amp;#039;Select All&amp;#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, &amp;#039;pages&amp;#039;)).prop(&amp;#039;checked&amp;#039;, true);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;button&amp;#039;,&lt;br /&gt;
			label: &amp;#039;Deselect All&amp;#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, &amp;#039;pages&amp;#039;)).prop(&amp;#039;checked&amp;#039;, false);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
			name: &amp;#039;pages&amp;#039;,&lt;br /&gt;
			list: list&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;submit&amp;#039;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		var rendered = apiobj.params.form.render();&lt;br /&gt;
		apiobj.params.Window.setContent(rendered);&lt;br /&gt;
		Morebits.quickForm.getElements(rendered, &amp;#039;pages&amp;#039;).forEach(Twinkle.generateBatchPageLinks);&lt;br /&gt;
	}, statelem);&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.params = { form: form, Window: Window };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var callback_commit = function(event) {&lt;br /&gt;
		var pages = Morebits.quickForm.getInputData(event.target).pages;&lt;br /&gt;
		Morebits.status.init(event.target);&lt;br /&gt;
&lt;br /&gt;
		var batchOperation = new Morebits.batchOperation(&amp;#039;Deleting pages&amp;#039;);&lt;br /&gt;
		batchOperation.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
		batchOperation.setOption(&amp;#039;preserveIndividualStatusLines&amp;#039;, true);&lt;br /&gt;
		batchOperation.setPageList(pages);&lt;br /&gt;
		batchOperation.run(function(pageName) {&lt;br /&gt;
			var params = { page: pageName, reason: concerns[page] };&lt;br /&gt;
&lt;br /&gt;
			var query = {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				titles: pageName,&lt;br /&gt;
				prop: &amp;#039;redirects&amp;#039;,&lt;br /&gt;
				rdlimit: &amp;#039;max&amp;#039;, // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
				format: &amp;#039;json&amp;#039;&lt;br /&gt;
			};&lt;br /&gt;
			var wikipedia_api = new Morebits.wiki.api(&amp;#039;Grabbing redirects&amp;#039;, query, callback_deleteRedirects);&lt;br /&gt;
			wikipedia_api.params = params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
			var pageTitle = mw.Title.newFromText(pageName);&lt;br /&gt;
			// Don&amp;#039;t delete user talk pages, essentially limiting this to Talk: and Book talk:&lt;br /&gt;
			if (pageTitle &amp;amp;&amp;amp; pageTitle.namespace % 2 === 0 &amp;amp;&amp;amp; pageTitle.namespace !== 2) {&lt;br /&gt;
				pageTitle.namespace++;  // now pageTitle is the talk page title!&lt;br /&gt;
				query = {&lt;br /&gt;
					action: &amp;#039;query&amp;#039;,&lt;br /&gt;
					titles: pageTitle.toText(),&lt;br /&gt;
					format: &amp;#039;json&amp;#039;&lt;br /&gt;
				};&lt;br /&gt;
				wikipedia_api = new Morebits.wiki.api(&amp;#039;Checking whether &amp;#039; + pageName + &amp;#039; has a talk page&amp;#039;, query,&lt;br /&gt;
					callback_deleteTalk);&lt;br /&gt;
				wikipedia_api.params = params;&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var page = new Morebits.wiki.page(pageName, &amp;#039;Deleting page &amp;#039; + pageName);&lt;br /&gt;
			page.setEditSummary(&amp;#039;Expired [[BP:PROD|PROD]], concern was: &amp;#039; + concerns[pageName]);&lt;br /&gt;
			page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
			page.suppressProtectWarning();&lt;br /&gt;
			page.deletePage(batchOperation.workerSuccess, batchOperation.workerFailure);&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	callback_deleteTalk = function(apiobj) {&lt;br /&gt;
		// no talk page; forget about it&lt;br /&gt;
		if (apiobj.getResponse().query.pages[0].missing) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var page = new Morebits.wiki.page(&amp;#039;Talk:&amp;#039; + apiobj.params.page, &amp;#039;Deleting talk page of page &amp;#039; + apiobj.params.page);&lt;br /&gt;
		page.setEditSummary(&amp;#039;[[BP:CSD#G8|G8]]: [[Help:Talk page|Talk page]] of deleted page &amp;quot;&amp;#039; + apiobj.params.page + &amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
		page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
		page.deletePage();&lt;br /&gt;
	},&lt;br /&gt;
	callback_deleteRedirects = function(apiobj) {&lt;br /&gt;
		var response = apiobj.getResponse();&lt;br /&gt;
		var redirects = response.query.pages[0].redirects || [];&lt;br /&gt;
		redirects.forEach(function(rd) {&lt;br /&gt;
			var title = rd.title;&lt;br /&gt;
			var page = new Morebits.wiki.page(title, &amp;#039;Deleting redirecting page &amp;#039; + title);&lt;br /&gt;
			page.setEditSummary(&amp;#039;[[BP:CSD#G8|G8]]: Redirect to deleted page &amp;quot;&amp;#039; + apiobj.params.page + &amp;#039;&amp;quot;&amp;#039;);&lt;br /&gt;
			page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
			page.deletePage();&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
Twinkle.addInitCallback(Twinkle.deprod, &amp;#039;deprod&amp;#039;);&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>ImportMaster</name></author>
	</entry>
</feed>