This site is no longer actively maintained. It exists for historical purposes as an example of Phabricator integration and Lua scripting.

Difference between revisions of "Module:Reports"

From cpt
No edit summary
No edit summary
Line 146: Line 146:
day = frame.args[3]
day = frame.args[3]
}
}
local count = frame.args[4]
local step = frame.args[4]
local count = frame.args[5]
local timestamp_start = os.time( start )
local timestamp_start = os.time( start )
local s = ''
local s = ''
for index = 1, count do
for index = 1, count do
local timestamp_stop = timestamp_start + 86400
local timestamp_stop = timestamp_start + (step * 86400)
local created = 0
local created = 0
local closed = 0
local closed = 0

Revision as of 17:06, 16 July 2019

Documentation for this module may be created at Module:Reports/doc

local p = {}

function p.cleanse(frame)
	local s = frame.args[1]
	s = string.gsub( s, '{', '{' )
	s = string.gsub( s, '}', '}' )
	s = string.gsub( s, '%[', '[' )
	s = string.gsub( s, '%]', ']' )
	s = string.gsub( s, '|', '|' )
	return s
end

function p.cptWorkboardsTableRow(frame)
	local s = ''
	local link = frame.args[1]
	local category = frame.args[2]
	local workboards = frame.args[3]
	local backlog = frame.args[4]
	if ( #category > 0 and ( #workboards == 0 and #backlog == 0 )) or
		( #category == 0 and ( #workboards > 0 or ( #backlog > 0 and backlog ~= 'Watching / External' ))) then
		s = s .. '\n|' .. link
		s = s .. '\n|' .. category
		s = s .. '\n|' .. workboards
		s = s .. '\n|' .. backlog
		s = s .. '\n|-'
	end
	return s	
end

function p.priorityToNumber(priority)
	local priority_map = {};
	priority_map['pink'] = 1
	priority_map['red'] = 2
	priority_map['orange'] = 3
	priority_map['yellow'] = 4
	priority_map['sky'] = 5
	priority_map['violet'] = 6
	if priority_map[priority] then
		return priority_map[priority]
	else
		return '7'
	end
end		

function p.priorityToColor(priority)	
	local priority_map = {};
	priority_map[1] = '#da49be'
	priority_map[2] = '#c0392b'
	priority_map[3] = '#e67e22'
	priority_map[4] = '#f1c40f'
	priority_map[5] = '#3498db'
	priority_map[6] = '#8e44ad'
	priority_map[7] = '#000'
	if priority_map[priority] then
		return priority_map[priority]
	else
		return '#000'
	end
end
	
function p.Workboard(frame)
	local s = ''
	local initiative = frame.args[1]
	local result = mw.smw.getQueryResult(
		'[[Has subobject::<q>[[Project::Core Platform Team]][[Column::' ..
		initiative .. ']]</q>]][[Status::open||stalled]]' ..
		'|?CPT Workboards Column|?CPT Backlog Column|?Priority|link=none|limit=500' )
	if result ~= nil then
		local tasks = {}
		local columns = {}
		local priorities = {}
		local empty = true
		local missing = false
		for k1,v1 in pairs( result.results ) do
			local workboards_column = v1.printouts['CPT Workboards Column'][1]
			local backlog_column = v1.printouts['CPT Backlog Column'][1]
			empty = false
			if workboards_column ~= nil then
				tasks[v1.fulltext] = workboards_column
				columns[workboards_column] = true
			elseif backlog_column ~= nil then
				tasks[v1.fulltext] = backlog_column
				columns[backlog_column] = true
			else
				tasks[v1.fulltext] = false
				missing = true
			end
			priorities[v1.fulltext] = p.priorityToNumber( v1.printouts['Priority'][1] )
		end
		if ( empty ) then
			s = 'No results'
		else
			local sorted_columns = {}
			for k1,v1 in pairs ( columns ) do
				table.insert( sorted_columns, k1 )
			end
			table.sort( sorted_columns )
			s = s .. '{| style="border-spacing:10px;border-collapse:separate;"\n'
			for k1,v1 in pairs( sorted_columns ) do
				s = s .. '! style="border:1px solid #000;padding:5px;background-color:#bbb;text-align:center;" |' .. v1 .. '\n'
			end
			if ( missing ) then
				s = s .. '! style="border:1px solid #000;padding:5px;background-color:#bbb;text-align:center;" |BACKLOG\n'
			end
			s = s .. '|-\n'
			for k1,v1 in pairs( sorted_columns ) do
				s = s .. '| style="vertical-align:top;min-width:200px;" |\n'
				for priority = 1,7 do
					for k2,v2 in pairs ( tasks ) do
						if priorities[k2] == priority and v1 == v2 then
							s = s .. '{| width=100% style="margin-bottom:10px;"\n| ' ..
								'style="border:1px solid #000;border-left:4px solid ' ..
								p.priorityToColor( priorities[k2] ) ..
								';padding:5px;text-align:center;vertical-align:middle;" |' ..
								'[[File:Phab.png|20px|link=https://phabricator.wikimedia.org/' ..
								string.gsub( k2, 'Phab:', '' ) .. ']] [[' .. k2 .. ']]\n|}\n'
						end
					end
				end
			end
			if ( missing ) then
				s = s .. '| style="vertical-align:top;min-width:200px;" |\n'
				for priority = 1,7 do
					for k1,v1 in pairs ( tasks ) do
						if priorities[k1] == priority and v1 == false then
							s = s .. '{| width=100% style="margin-bottom:10px;"\n| ' ..
								'style="border:1px solid #000;border-left:4px solid ' ..
								p.priorityToColor( priorities[k1] ) ..
								';padding:5px;text-align:center;vertical-align:middle;" |' ..
								'[[File:Phab.png|20px|link=https://phabricator.wikimedia.org/' ..
								string.gsub( k1, 'Phab:', '' ) .. ']] [[' .. k1 .. ']]\n|}\n'
						end
					end
				end
			end
			s = s .. '|}'
		end
	end
	return s
end

function p.burnupFromDate(frame)
	local start = {
		year = frame.args[1],
		month = frame.args[2],
		day = frame.args[3]
	}
	local step = frame.args[4]
	local count = frame.args[5]
	local timestamp_start = os.time( start )
	local s = ''
	for index = 1, count do
		local timestamp_stop = timestamp_start + (step * 86400)
		local created = 0
		local closed = 0
		local result = mw.smw.getQueryResult(
			'[[Category:Phabricator Tasks]]' ..
			'[[Task Created Timestamp::>' .. timestamp_start .. ']]' ..
			'[[Task Created Timestamp::<<' .. timestamp_stop .. ']]' ..
			'|limit=3000' )
		if result ~= nil then
			created = #result.results
		end
		result = mw.smw.getQueryResult(
			'[[Category:Phabricator Tasks]]' ..
			'[[Task Closed Timestamp::>' .. timestamp_start .. ']]' ..
			'[[Task Closed Timestamp::<<' .. timestamp_stop .. ']]' ..
			'|limit=3000' )
		if result ~= nil then
			closed = #result.results
		end
		s = s .. os.date( '%Y-%m-%d', timestamp_start ) .. ': Created ' ..
			created .. ', Closed ' .. closed .. '<br/>'
		timestamp_start = timestamp_stop
	end
	return s
end

return p