This is an automated email from the ASF dual-hosted git repository.
sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git
The following commit(s) were added to refs/heads/master by this push:
new a15b030c Allow for processing multiple attachments in a single email
(e.g. SGA and CCLA)
a15b030c is described below
commit a15b030ce5a119295787ed37cdc0f02addeb9ea4
Author: Sebb <[email protected]>
AuthorDate: Wed Sep 18 15:58:24 2024 +0100
Allow for processing multiple attachments in a single email (e.g. SGA and
CCLA)
Instead of deleting attachment entries, mark them as deleted.
Update message retrieval accordingly
---
www/secretary/workbench/models/mailbox.rb | 16 ++++++++++++----
www/secretary/workbench/models/message.rb | 24 ++++++++++++++++++++----
www/secretary/workbench/server.rb | 11 +++++++++--
www/secretary/workbench/views/parts.js.rb | 5 +++--
4 files changed, 44 insertions(+), 12 deletions(-)
diff --git a/www/secretary/workbench/models/mailbox.rb
b/www/secretary/workbench/models/mailbox.rb
index 4e3bebbf..3303a21d 100644
--- a/www/secretary/workbench/models/mailbox.rb
+++ b/www/secretary/workbench/models/mailbox.rb
@@ -184,11 +184,19 @@ class Mailbox
#
# return headers (client view; only shows messages with attachments)
- #
- def client_headers
+ # If :listall is true, then include all entries with an attachments key
+ # (these are messages that originally had attachments)
+ def client_headers(listall: false)
# fetch a list of headers for all messages in the mailbox with attachments
- headers = self.headers.to_a.reject do |_id, message|
- Message.attachments(message).empty?
+ if listall
+ headers = self.headers.to_a.reject do |_id, message|
+ message[:attachments].nil?
+ end
+ else
+ headers = self.headers.to_a.reject do |_id, message|
+ # This does not return attachments with status :deleted
+ Message.attachments(message).empty?
+ end
end
# extract relevant fields from the headers
diff --git a/www/secretary/workbench/models/message.rb
b/www/secretary/workbench/models/message.rb
index d2adb211..2802daa3 100644
--- a/www/secretary/workbench/models/message.rb
+++ b/www/secretary/workbench/models/message.rb
@@ -119,12 +119,15 @@ class Message
mail.text_part
end
+ # return list of valid attachments which are not marked deleted (i.e.
processed)
def self.attachments(headers)
attachments = headers[:attachments]
return [] unless attachments
attachments.
- reject {|attachment| SIG_MIMES.include?(attachment[:mime]) and
- (not attachment[:name] or attachment[:name] !~ /\.pdf\.(asc|sig)$/)}.
+ reject do |attachment|
+ (attachment[:status] == :deleted) or
+ (SIG_MIMES.include?(attachment[:mime]) and (not attachment[:name] or
attachment[:name] !~ /\.pdf\.(asc|sig)$/))
+ end.
map {|attachment| attachment[:name]}.
reject {|name| name == 'signature.asc'}
end
@@ -155,12 +158,25 @@ class Message
end
def delete_attachment(name)
+ $stderr.puts "============================"
attachment = find(name)
if attachment
- @headers[:attachments].delete attachment.headers
- @headers[:status] = :deleted if @headers[:attachments].empty?
+ $stderr.puts attachment.inspect
+ $stderr.puts @headers[:attachments].inspect
+ $stderr.puts @headers[:attachments].class
+ $stderr.puts attachment.headers.inspect
+ idx = @headers[:attachments].find_index(attachment.headers)
+ $stderr.puts idx
+ $stderr.puts @headers[:attachments][idx]
+ $stderr.puts @headers[:attachments][idx].class
+ @headers[:attachments][idx][:status] = :deleted # .delete
attachment.headers
+ $stderr.puts @headers[:attachments][idx]
+ @headers[:status] = :deleted if @headers[:attachments].reject {|att|
att[:status] == :deleted}.empty?
write_headers
+ else
+ raise "Not found #{name}"
end
+ $stderr.puts "-----------------------------"
end
#
diff --git a/www/secretary/workbench/server.rb
b/www/secretary/workbench/server.rb
index 322357ae..8a3d862a 100644
--- a/www/secretary/workbench/server.rb
+++ b/www/secretary/workbench/server.rb
@@ -128,7 +128,7 @@ end
get %r{/(\d{6})/deleted} do |mbox|
@mbox = mbox
@prv, @nxt = Mailbox.prev_next(mbox)
- @messages = Mailbox.new(@mbox).client_headers.select do |message|
+ @messages = Mailbox.new(@mbox).client_headers(listall: true).select do
|message|
message[:status] == :deleted
end
_html :deleted
@@ -160,7 +160,7 @@ end
get %r{/(\d{6})/all} do |mbox|
@mbox = mbox
@prv, @nxt = Mailbox.prev_next(mbox)
- @messages = Mailbox.new(@mbox).client_headers
+ @messages = Mailbox.new(@mbox).client_headers(listall: true)
_html :all
end
@@ -220,6 +220,13 @@ patch %r{/(\d{6})/(\w+)/} do |month, hash|
Mailbox.update(month) do |headers|
if headers[hash]
updates = JSON.parse(request.env['rack.input'].read)
+ # undelete attachments if requested
+ attStatus = updates.delete('attachment_status')
+ if attStatus
+ headers[hash][:attachments]&.each do |att|
+ att[:status] = nil
+ end
+ end
# special processing for entries with symbols as keys
headers[hash].each do |key, value|
diff --git a/www/secretary/workbench/views/parts.js.rb
b/www/secretary/workbench/views/parts.js.rb
index 212d24c5..bccd79ba 100644
--- a/www/secretary/workbench/views/parts.js.rb
+++ b/www/secretary/workbench/views/parts.js.rb
@@ -571,7 +571,8 @@ class Parts < Vue
def undelete_message(event)
@busy = true
pathname = window.parent.location.pathname
- HTTP.patch(pathname, status: nil).then {
+ # request removal of :deleted status
+ HTTP.patch(pathname, {status: nil, attachment_status: true}).then {
window.parent.location.href = '../..'
}.catch {|error|
alert error
@@ -773,7 +774,7 @@ class Parts < Vue
# tasklist completion events
def status_update(event)
if event.data.status == 'complete'
- self.delete_message(event)
+ self.delete_attachment(event)
elsif event.data.status == 'keep'
@selected = nil
@form = :categorize