Module:Effective protection level: Difference between revisions

    From Nonbinary Wiki
    (add a metamethod so the action can be passed as the first param to #invoke instead of 'main')
    (make the metatable work with the change coming June 5th)
    Line 3: Line 3:
    -- Returns the permission required to perform a given action on a given title.
    -- Returns the permission required to perform a given action on a given title.
    -- If no title is specified, the title of the page being displayed is used.
    -- If no title is specified, the title of the page being displayed is used.
    function p.main(frame, action, pagename)
    function p._main(action, pagename)
    frame = frame or mw.getCurrentFrame()
    action = action or frame.args.action or frame.args[1]
    pagename = pagename or frame.args.pagename or frame.args[2]
    local title
    local title
    if type(pagename) == 'table' then
    if type(pagename) == 'table' then
    title = pagename
    title = pagename
    pagename = title.prefixedText
    else
    else
    title = mw.title.new(pagename) or mw.title.getCurrentTitle()
    title = pagename and mw.title.new(pagename) or mw.title.getCurrentTitle()
    end
    end
    pagename = title.prefixedText
    if action == 'autoreview' then
    if action == 'autoreview' then
    local level = frame:callParserFunction('PENDINGCHANGELEVEL', pagename)
    local level = mw.getCurrentFrame():callParserFunction('PENDINGCHANGELEVEL', pagename)
    if level == 'review' then
    if level == 'review' then
    return 'reviewer'
    return 'reviewer'
    Line 34: Line 31:
    if level == 'sysop' then
    if level == 'sysop' then
    return 'sysop'
    return 'sysop'
    elseif frame:callParserFunction('CASCADINGSOURCES', pagename) ~= '' then -- used by a cascading-protected page
    elseif mw.getCurrentFrame():callParserFunction('CASCADINGSOURCES', pagename) ~= '' then -- used by a cascading-protected page
    return 'sysop'
    return 'sysop'
    elseif level == 'templateeditor' then
    elseif level == 'templateeditor' then
    Line 65: Line 62:


    setmetatable(p, { __index = function(t, k)
    setmetatable(p, { __index = function(t, k)
    return function(frame, ...)
    return function(frameOrPagename)
    return t.main(frame, k, ...)
    if type(frameOrPagename) == 'table' and frameOrPagename.args then
    return t._main(k, frame.args[1])
    else
    return t._main(k, frameOrPagename)
    end
    end
    end
    end })
    end })


    return p
    return p

    Revision as of 00:24, 27 May 2014

    Documentation for this module may be created at Module:Effective protection level/doc

    local p = {}
    
    -- Returns the permission required to perform a given action on a given title.
    -- If no title is specified, the title of the page being displayed is used.
    function p._main(action, pagename)
    	local title
    	if type(pagename) == 'table' then
    		title = pagename
    	else
    		title = pagename and mw.title.new(pagename) or mw.title.getCurrentTitle()
    	end
    	pagename = title.prefixedText
    	if action == 'autoreview' then
    		local level = mw.getCurrentFrame():callParserFunction('PENDINGCHANGELEVEL', pagename)
    		if level == 'review' then
    			return 'reviewer'
    		elseif level ~= '' then
    			return level
    		else
    			return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review
    		end
    	elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' then
    		error( 'First parameter must be one of edit, move, create, upload, autoreview', 2 )
    	end
    	if title.namespace == 8 then -- MediaWiki namespace
    		return 'sysop'
    	elseif title.namespace == 2 and ( mw.ustring.find( pagename, '/.*%.js$') or mw.ustring.find( pagename, '/.*%.css$') ) then -- user .js or .css page
    		return 'sysop'
    	else
    		local level = title.protectionLevels[action] and title.protectionLevels[action][1]
    		if level == 'sysop' then
    			return 'sysop'
    		elseif mw.getCurrentFrame():callParserFunction('CASCADINGSOURCES', pagename) ~= '' then -- used by a cascading-protected page
    			return 'sysop'
    		elseif level == 'templateeditor' then
    			return 'templateeditor'
    		elseif action == 'move' then
    			local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.
    			if blacklistentry and not blacklistentry.params.autoconfirmed then
    				return 'accountcreator'
    			elseif title.namespace == 6 then
    				return 'filemover'
    			else
    				return 'autoconfirmed'
    			end
    		else
    			local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
    			if blacklistentry then
    				return blacklistentry.params.autoconfirmed and 'autoconfirmed' or 'accountcreator'
    			elseif level then
    				return level
    			elseif action == 'upload' then
    				return 'autoconfirmed'
    			elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts
    				return 'user'
    			else
    				return '*'
    			end
    		end
    	end
    end
    
    setmetatable(p, { __index = function(t, k)
    	return function(frameOrPagename)
    		if type(frameOrPagename) == 'table' and frameOrPagename.args then
    			return t._main(k, frame.args[1])
    		else
    			return t._main(k, frameOrPagename)
    		end
    	end
    end })
    
    return p