| #!/usr/bin/env ruby |
| PAGETITLE = "Member's Meeting Attendance Cross-Check" # Wvisible:meeting |
| $LOAD_PATH.unshift '/srv/whimsy/lib' |
| |
| require 'whimsy/asf' |
| require 'wunderbar/bootstrap' |
| require 'json' |
| |
| # read in attendance |
| meetings = ASF::SVN['Meetings'] |
| json = JSON.parse(IO.read File.join(meetings, 'attendance.json')) |
| attend = json['matrix'].keys |
| |
| # parse received info |
| added = Hash.new('unknown') |
| Dir[File.join(meetings, '*', 'memapp-received.txt')].each do |received| |
| meeting = File.basename(File.dirname(received)) |
| next if meeting.include? 'template' |
| text = File.read(received) |
| list = text.scan(/<(.*)@.*>.*Yes/i) + |
| text.scan(/^(?:no\s*)*(?:yes\s+)+(\w\S*)/) |
| list.flatten.each {|id| added[id] = meeting} |
| end |
| |
| # cross check against members.txt |
| missing = [] |
| ASF::Member.list.each do |id, info| |
| unless attend.delete(info[:name]) or info['status'] |
| missing << [info[:name], added[id]] |
| end |
| end |
| |
| # produce HTML |
| _html do |
| _whimsy_body( |
| title: PAGETITLE, |
| related: { |
| '/members/non-participants' => 'Members Not Attending X Meetings', |
| '/members/inactive' => 'Inactive Member Feedback Form', |
| '/members/proxy' => 'Members Meeting Proxy Assignment', |
| '/members/subscriptions' => 'Members@ Mailing List Crosscheck' |
| }, |
| helpblock: -> { |
| _ 'This script cross-checks all people listed in members.txt versus the official attendance.json file that notes which members attended (or proxied) which meetings.' |
| _ "Includes data through #{json['dates'].last} meeting." |
| } |
| ) do |
| _h2_ 'Listed as attending a members meeting, but not in members.txt; note name changes or spelling differences may be the culprit.' |
| _ul do |
| attend.sort.each do |name| |
| _li name |
| end |
| end |
| |
| _h2_ 'Listed in members.txt but not listed as attending a members meeting.' |
| _table do |
| _thead do |
| _th 'Name' |
| _th 'Date added as a member' |
| end |
| missing.sort.each do |name, meeting| |
| next if meeting =~ /^2015/ |
| _tr_ do |
| _td name |
| _td meeting |
| end |
| end |
| end |
| end |
| end |