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

Reply via email to