Commit fd19ccbd0b07c50bbd9a11d9d2d2550d55f9b7a6:
Rough in an activity log so that people who use the application on whimsy
can be aware of who else is active...
git-svn-id:
https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy@819618
90ea9780-b833-de11-8433-001ec94261de
Branch: refs/heads/master
Author: Sam Ruby <[email protected]>
Committer: Sam Ruby <[email protected]>
Pusher: rubys <[email protected]>
------------------------------------------------------------
www/secretary/workbench/file.cgi | +++++++++++
www/secretary/workbench/worklist.cgi | ++ --
------------------------------------------------------------
48 changes: 46 additions, 2 deletions.
------------------------------------------------------------
diff --git a/www/secretary/workbench/file.cgi b/www/secretary/workbench/file.cgi
index d580588..5d3c1f6 100755
--- a/www/secretary/workbench/file.cgi
+++ b/www/secretary/workbench/file.cgi
@@ -426,11 +426,24 @@ _html do
.traceback {background-color:#ff0; margin: 1em 0; padding: 1em;
border: 2px solid}
#notice {color: green}
+ .collision {background-color: #ee82ee}
}
end
_body? do
+ activity_log = nil
+ File.open "#{RECEIVED}/activity.yml", File::RDWR|File::CREAT, 0644 do
|file|
+ file.flock File::LOCK_EX
+ activity_log = YAML.load(file.read) || []
+ activity_log.unshift({'user' => $USER, 'time' => Time.now.utc}.
+ merge(Hash[params.map {|key,value| [key,value.first]}]))
+ file.rewind
+ file.write YAML.dump(activity_log[0...5])
+ file.flush
+ file.truncate file.pos
+ end
+
begin
filename = [@filename, @cfilename, @gfilename, @mfilename, @nfilename].
find {|name| name and not name.empty?}
@@ -779,6 +792,37 @@ _html do
end
end
+ _h2 'Recent Activity'
+ _table border: 1, cellpadding: 5, cellspacing: 0 do
+ _thead do
+ _tr do
+ _th 'Time'
+ _th 'User'
+ _th 'Action'
+ _th 'Parameters'
+ end
+ end
+ _tbody do
+ activity_log[1..-1].each do |entry|
+ collision = (entry['user'] != $USER and not entry['user'].empty?)
+ collision &&= (Time.now-entry['time'] < 600)
+ _tr_ class: ('collision' if collision) do
+ _td entry.delete('time')
+ _td entry.delete('user')
+ if entry['action']
+ _td entry.delete('action')
+ elsif entry['doctype'] == 'other'
+ _td entry['dest']
+ else
+ _td entry['doctype']
+ end
+ entry.delete_if {|name, value| value.empty?}
+ _td entry.inspect
+ end
+ end
+ end
+ end
+
when 'view'
@dir.untaint if Dir.chdir(RECEIVED) {Dir['*'].include? @dir.chomp('/')}
files = Dir["#{RECEIVED}/#{@dir}/*"].sort
diff --git a/www/secretary/workbench/worklist.cgi
b/www/secretary/workbench/worklist.cgi
index 32715e2..726010e 100755
--- a/www/secretary/workbench/worklist.cgi
+++ b/www/secretary/workbench/worklist.cgi
@@ -77,7 +77,7 @@ _html do
end
end
- files.reject! {|f| f=~ /\/(pending|completed)\.yml\s*$/}
+ files.reject! {|f| f=~ /\/(activity|pending|completed)\.yml\s*$/}
unless files.empty? and !File.exist?(PENDING_YML)
_h2_ 'Pending'
files.each {|line| _pre line.strip.sub(/\s+/,' ')}
@@ -96,7 +96,7 @@ _html do
Dir.chdir("#{RECEIVED}") do
Dir["*"].sort_by {|name| File.stat(name.untaint).mtime}.each do |file|
next if %w{README deadletter archives}.include? file
- next if %w{pending.yml completed.yml}.include? file
+ next if %w{pending.yml completed.yml activity.yml}.include? file
next if file =~ /^to_\w+$/
if File.directory? file
next if Dir.entries(file).reject {|name| name=~/^\./}.empty?