You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by cl...@apache.org on 2020/06/22 21:15:23 UTC
[whimsy] 01/01: Work in progress... coi affirmation
This is an automated email from the ASF dual-hosted git repository.
clr pushed a commit to branch coi
in repository https://gitbox.apache.org/repos/asf/whimsy.git
commit c91054b8fd7417f1e9f5ab32b6208e80d8ab796e
Author: Craig L Russell <ap...@gmail.com>
AuthorDate: Mon Jun 22 14:14:45 2020 -0700
Work in progress... coi affirmation
---
www/officers/coi.cgi | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 180 insertions(+)
diff --git a/www/officers/coi.cgi b/www/officers/coi.cgi
new file mode 100755
index 0000000..c97ddd9
--- /dev/null
+++ b/www/officers/coi.cgi
@@ -0,0 +1,180 @@
+#!/usr/bin/env ruby
+PAGETITLE = "Conflict of Interest"
+$LOAD_PATH.unshift '/srv/whimsy/lib'
+require 'wunderbar'
+require 'wunderbar/bootstrap'
+require 'whimsy/asf'
+require 'mail'
+require 'date'
+require 'tmpdir'
+
+coi_url = ASF::SVN.svnurl('conflict-of-interest')
+YEAR = DateTime.now.strftime "%Y"
+coi_current_url = File.join(coi_url, YEAR)
+coi_current_template_url = File.join(coi_current_url, 'template.txt')
+
+user = ASF::Person.find($USER)
+committees = ASF::Committee.officers + ASF::Committee.nonpmcs
+chairs = committees.map do |committee|
+ committee.chairs.map {|chair| chair[:id]}
+end
+ids = (chairs.flatten + ASF::Service['board'].members.map(&:id)).uniq
+
+# Get the list of files in this year's directory
+signerfileslist, err = ASF::SVN.svn('list', coi_current_url, {user: $USER, password: $PASSWORD})
+#signerfileslist = 'template.txt\nclr99.jpg\nfielding33.pdf\ncurcuru20.jpg'
+signerfiles = signerfileslist.split('\n')
+signers = []
+# Get the url for the user's affirmation
+user_affirmation_file = nil
+signerfiles.each do |signerfile|
+ stem = signerfile[0..signerfile.index(".")-1]
+ user_affirmation_file = signerfile if stem == user.id
+ signers.push stem unless stem == 'template'
+end
+# Get the list of required users who have not yet signed
+nonsigners = []
+ids.each do |required|
+ nonsigners.push(required) unless signers.include? required
+end
+
+# Decide if user should sign the affirmation form
+user_is_required = ids.include? user.id
+not_required_message = user_is_required ?' required':' not required'
+user_affirmation = signers.include? user.id
+have_affirmed_message = user_affirmation ? ' have affirmed' : ' have not affirmed'
+user_is_required_but_not_affirmed = (user_is_required and not user_affirmation)
+current_timestamp = DateTime.now.strftime "%Y-%m-%d %H:%M:%S"
+panel_message = user_is_required_but_not_affirmed ? 'Register Your Conflict of Interest Affirmation':'Thank you for signing the Conflict of Interest Affirmation'
+
+# Read the template and append the signature block
+def get_affirmed_template(url, user, password, name, timestamp)
+ signature_block =
+ "I, the undersigned, acknowledge that I have received,\n
+ read and understood the Conflict of Interest policy;\n
+ I agree to comply with the policy;\n
+ I understand that ASF is charitable and in order to maintain\n
+ its federal tax exemption it must engage primarily in activities\n
+ which accomplish one or more of its tax-exempt purposes.\n
+ Signed: __\n
+ Date: __\n
+ Metadata: __________Whimsy coi.cgi___________\n"
+ template, err =
+ ASF::SVN.svn('cat', url, {user: user, password: password})
+ affirmed = (template + signature_block)
+ .gsub("Signed: __", "Signed: __________#{name}___________")
+ .gsub("Date: __", " Date: __________#{timestamp}______")
+end
+
+_html do
+ _body? do
+ _whimsy_body(
+ title: PAGETITLE,
+ related: {
+ 'http://www.apache.org/foundation/records/minutes/2020/board_minutes_2020_03_18.txt' => 'Conflict of Interest Resolution Board minutes',
+ coi_current_template_url => 'Conflict of Interest Resolution',
+ },
+ helpblock: -> {
+ _p do
+ _ 'This page allows officers to register their Conflict of Interest annual affirmation.'
+ end
+ if _.get?
+ _p 'The following are currently required to affirm the Conflict of Interest:'
+ ids.each do |id|
+ affirmer = ASF::Person.find(id)
+ _ "#{affirmer.cn} (#{affirmer.id}) "
+ end
+ _p
+ _p "You are signed in as #{user.cn} (#{user.id}) at #{current_timestamp}."
+ _p {_ "You are ";_b "#{not_required_message}";_ " to affirm the Conflict of Interest policy for this year."}
+ _p {_ "You ";_b "#{have_affirmed_message}";_ "the Conflict of Interest policy for this year."}
+ _p 'Signers for this year:'
+ signers.each do |signer|
+ _ signer
+ end
+ _p 'Nonsigners for this year:'
+ nonsigners.each do |nonsigner|
+ _ nonsigner
+ end
+ _p
+ if user_affirmation_file
+ _a "Your Conflict of Interest affirmation",
+ href: "#{coi_current_url}/#{user_affirmation_file}"
+ end
+ if user_is_required_but_not_affirmed
+ _p {_b "You are invited to sign the affirmation below"}
+ end
+ end
+ }
+ ) do
+ if _.get?
+ if user_is_required_but_not_affirmed
+ _whimsy_panel(panel_message, style: 'panel-success') do
+ affirmed = get_affirmed_template(coi_current_template_url, $USER, $PASSWORD, user.cn, current_timestamp)
+ affirmed.each_line do |line|
+ _p line
+ end
+ _form.form_horizontal method: 'post' do
+ _div.form_group do
+ _div.col_sm_offset_2.col_sm_10 do
+ _input.btn.btn_default type: 'submit', value: 'Affirm Conflict of Interest policy'
+ end
+ end
+ end
+ end
+ end
+ else # POST
+ _whimsy_panel('About to commit your affirmation...', style: 'panel-success') do
+ _div.transcript do
+ _h3_ 'Affirm transcript'
+ emit_post(_)
+ end
+ end
+ end
+# end
+ end
+ end
+end
+
+# Emit a record of a user's submission - POST
+def emit_post(_)
+ _h3_ 'Affirm Conflict of Interest - Session Transcript'
+
+ # collect data
+ user = ASF::Person.find($USER)
+ current_timestamp = DateTime.now.strftime "%Y-%m-%d %H:%M:%S"
+ affirmed = get_affirmed_template(coi_current_template_url, $USER, $PASSWORD, user.cn, current_timestamp)
+ user_filename = "#{user.id}.txt"
+
+ # report on commit
+ _div.transcript do
+ Dir.mktmpdir do |tmpdir|
+ svn = ASF::SVN.getInfoItem(coi_current_url,'url')
+
+ ASF::SVN.svn_('checkout',[svn.untaint, tmpdir.untaint], _,
+ {args: '--quiet', user: $USER, password: $PASSWORD})
+ Dir.chdir(tmpdir) do
+ # write affirmation form
+ filename = user_filename.untaint
+ File.write(filename, affirmed)
+ ASF::SVN.svn_('add', filename, _)
+ ASF::SVN.svn_('propset', ['svn:mime-type', 'text/plain; charset=utf-8', filename], _)
+
+ # commit
+# ASF::SVN.svn_('commit',[filename], _,
+ # {msg: "Affirm Conflict of Interest Policy for #{$USER}", user: $USER, password: $PASSWORD})
+# TODO: send email to @proxy per WHIMSY-78
+ end
+ end
+ end
+
+ # Report on contents now that they're checked in
+ _h3! do
+ _span "You can review "
+ _a "Your Conflict of Interest affirmation",
+ href: "#{coi_current_url}/#{$USER}.txt}"
+ _span " as now checked in to svn."
+ end
+# _pre proxyform
+end
+