| #!/usr/bin/env ruby |
| PAGETITLE = "Apache Corporate Organization Chart" # Wvisible:orgchart |
| $LOAD_PATH.unshift '/srv/whimsy/lib' |
| require 'json' |
| require 'whimsy/asf' |
| require 'whimsy/asf/orgchart' # New class not yet in gem; duplicates www/roster/models/orgchart |
| require 'wunderbar' |
| require 'wunderbar/bootstrap' |
| require 'wunderbar/markdown' |
| OTHER_LINKS = { |
| 'https://people.apache.org/phonebook.html' => 'Apache Project Rosters Listing', |
| 'https://incubator.apache.org/projects/#current' => 'Apache Incubator Podling Listing', |
| 'https://people.apache.org/committer-index.html' => 'Apache Individual Committer Listing', |
| 'https://www.apache.org/foundation/members' => 'Social Listing Of ASF Members' |
| } |
| URLROOT = '/foundation/orgchart' |
| |
| # Output the orgchart overview |
| def emit_orgchart(org: {}) |
| _whimsy_panel_table( |
| title: 'Apache Corporate Organization Chart', |
| helpblock: -> { |
| _ 'This is a listing of most ' |
| _em 'corporate' |
| _ ' officers and roles at the ASF. This does ' |
| _strong 'not' |
| _ ' include the many Apache ' |
| _em 'Project' |
| _ ' VPs that help build Apache software products in our communities.' |
| } |
| ) do |
| _table.table.table_striped do |
| _thead do |
| _th 'Title / Role' |
| _th 'Contact, Chair, or Person holding that title' |
| _th 'Website' |
| end |
| _tbody do |
| org.sort_by {|key, value| value['info']['role']}.each do |key, value| |
| _tr_ do |
| _td do |
| _a value['info']['role'], href: "#{URLROOT}/#{key}" |
| end |
| _td do |
| id = value['info']['id'] || value['info']['chair'] |
| tmp = ASF::Person[id] |
| if tmp.nil? |
| _em id |
| else |
| _ tmp.public_name |
| end |
| end |
| _td do |
| web = value['info']['website'] |
| web.nil? ? _('') : _a(web.sub(%r{http(s)?://}, ''), href: web) |
| end |
| end |
| end |
| end |
| end |
| end |
| end |
| |
| # Output one role's duties and data |
| def emit_role(role: {}, oversees: {}, desc: {}) |
| id = role['info']['id'] || role['info']['chair'] |
| tmp = ASF::Person[id] |
| if tmp.nil? |
| idnam = id |
| else |
| idnam = tmp.public_name |
| end |
| _ol.breadcrumb do |
| _li do |
| _a 'OrgChart', href: "#{URLROOT}" |
| end |
| _li.active do |
| _ "#{role['info']['role']}" |
| end |
| end |
| _whimsy_panel_table( |
| title: "#{role['info']['role']} - #{idnam}", |
| ) do |
| _table.table.table_striped do |
| _tbody do |
| role['info'].each do |k, value| |
| key = k.downcase # Prevent case mismatches |
| next if key == 'role' |
| next if key == 'roster' # No purpose in public display yet |
| next if key =~ /private/i |
| next unless value |
| _tr_ do |
| # Different output than www/roster/orgchart |
| _td do |
| _(desc[key]) if desc.key?(key) |
| end |
| if %w(id chair).include? key |
| _td do |
| if tmp.nil? |
| _em idnam |
| else |
| _ idnam |
| end |
| end |
| elsif %w(reports-to).include? key |
| _td! do |
| value.split(/[, ]+/).each_with_index do |role_inner, index| |
| _span ', ' if index > 0 |
| if role_inner == 'members' |
| _a 'Apache Membership', href: 'https://www.apache.org/foundation/members' |
| else |
| _a role_inner, href: "#{URLROOT}/#{role_inner}" |
| end |
| end |
| end |
| elsif %w(email).include? key |
| _td do |
| _a value, href: "mailto:#{value}" |
| end |
| elsif %w(resolution website).include? key |
| _td do |
| _a value, href: value |
| end |
| else |
| _td value |
| end |
| end |
| end |
| end |
| end |
| unless oversees.empty? |
| oversees = oversees.sort_by {|name, duties| duties['info']['role']} |
| _ul.list_group do |
| _li.list_group_item.active do |
| _h4 'This Officer Oversees' |
| end |
| _li.list_unstyled do |
| _ul style: 'margin-top: 15px; margin-bottom: 15px;' do |
| oversees.each do |name, duties| |
| _li do |
| _a duties['info']['role'], href: "#{URLROOT}/#{name}" |
| end |
| end |
| end |
| end |
| end |
| end |
| _ul.list_group do |
| role.each do |title, text| |
| next if title == 'info' or title == 'mtime' |
| next if title =~ /private/i |
| _li.list_group_item.active do |
| _h4 title.capitalize |
| end |
| _li.list_group_item do |
| _markdown text |
| end |
| end |
| end |
| end |
| end |
| |
| _html do |
| _body? do |
| _whimsy_body( |
| title: PAGETITLE, |
| relatedtitle: 'More About ASF Operations', |
| related: { |
| "https://www.apache.org/foundation/governance/orgchart" => "Graphical Org Chart", |
| "https://www.apache.org/foundation" => "Official ASF Officer Listing", |
| "https://www.apache.org/foundation/governance/" => "Corporate Governance At The ASF" |
| }, |
| helpblock: -> { |
| _p "The ASF is a 501C3 non-profit corporation in the US - and there's a lot going on the corporate side of the ASF, to keep the corporate records and infrastructure that the many Apache projects you use working." |
| _p "Below is a listing of the officers and people who make the corporate side of the ASF work. Here are a few more links that explain how corporate governance works at the ASF, which is separate from how Apache PMCs work." |
| _ul do |
| OTHER_LINKS.each do |url, desc| |
| _li do |
| _a desc, href: url |
| end |
| end |
| end |
| } |
| ) do |
| request = ENV['REQUEST_URI'] |
| if request =~ /orgchart\/?\z/ |
| emit_orgchart(org: ASF::OrgChart.load) |
| elsif request =~ /orgchart\/([^\/?#]+)/ |
| orgchart = ASF::OrgChart.load |
| name = $1 |
| if orgchart.key? name |
| oversees = orgchart.select do |role, duties| |
| duties['info']['reports-to'].split(/[, ]+/).include? name |
| end |
| emit_role(role: orgchart[name], oversees: oversees, desc: ASF::OrgChart.desc) |
| else |
| _whimsy_panel("ERROR: role '#{name}' not found", style: 'panel-danger') do |
| _ 'Sorry, the URL you attempted to access ' |
| _code request |
| _ ' is not a valid role.' |
| _a 'Go back to the orgchart', href: "#{URLROOT}" |
| end |
| end |
| else |
| _p "DEBUG: You may be running this script from the command line." |
| _a 'Go back to the orgchart', href: "#{URLROOT}" |
| end |
| end |
| end |
| end |