This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch mod-gui
in repository https://gitbox.apache.org/repos/asf/whimsy.git


The following commit(s) were added to refs/heads/mod-gui by this push:
     new 0117109  Add preferences and filter messages accordingly
0117109 is described below

commit 01171093846cde592393969700a261ac9f4776ac
Author: Sebb <[email protected]>
AuthorDate: Fri Jan 18 23:13:34 2019 +0000

    Add preferences and filter messages accordingly
---
 www/moderation/desk/defines.rb                     |  4 +-
 www/moderation/desk/models/events.rb               | 11 +++--
 www/moderation/desk/models/mailbox.rb              |  8 ++--
 www/moderation/desk/models/prefs.rb                | 38 +++++++++++++++++
 www/moderation/desk/server.rb                      | 47 +++++++++++++++++++---
 www/moderation/desk/views/actions/setprefs.html.rb | 34 ++++++++++++++++
 www/moderation/desk/views/prefs.html.rb            | 47 ++++++++++++++++++++++
 7 files changed, 176 insertions(+), 13 deletions(-)

diff --git a/www/moderation/desk/defines.rb b/www/moderation/desk/defines.rb
index 521c22b..3e8acb5 100644
--- a/www/moderation/desk/defines.rb
+++ b/www/moderation/desk/defines.rb
@@ -4,4 +4,6 @@ ACCEPT=':Accept'
 ACCEPTALLOW=':AcceptAllow'
 # does not make much sense to allow on its own
 REJECT=':Reject'
-MARKSPAM=':Spam'
\ No newline at end of file
+MARKSPAM=':Spam'
+
+ALLDOMAINS='_all_'
diff --git a/www/moderation/desk/models/events.rb 
b/www/moderation/desk/models/events.rb
index 52a8656..339cd16 100644
--- a/www/moderation/desk/models/events.rb
+++ b/www/moderation/desk/models/events.rb
@@ -12,9 +12,14 @@ class Events
     @listener = Listen.to ARCHIVE do |modified, added, removed|
       (modified + added).each do |file|
          next unless file.end_with? '.yml'
-         mbox = Mailbox.new(File.basename(file))
-#         $stderr.puts "Event #{mbox}"
-         @events.push({messages: mbox.client_headers})
+         # The client is responsible for fetching the headers
+         # this makes it easier to provide config settings to the mailbox
+         event = {
+           nextmbox: File.basename(file),
+           source: nil,
+           headers: [],
+         }
+         @events.push(event)
       end
     end
 
diff --git a/www/moderation/desk/models/mailbox.rb 
b/www/moderation/desk/models/mailbox.rb
index 2dc4603..258eb3b 100644
--- a/www/moderation/desk/models/mailbox.rb
+++ b/www/moderation/desk/models/mailbox.rb
@@ -11,6 +11,7 @@ require 'stringio'
 require 'yaml'
 
 require_relative '../config.rb'
+require_relative '../defines'
 
 require_relative 'message.rb'
 require_relative 'auth.rb'
@@ -20,9 +21,10 @@ class Mailbox
   #
   # Initialize a mailbox
   #
-  def initialize(name)
+  def initialize(name, domains=nil)
     name = File.basename(name, '.yml')
-
+    # If we want all domains, skip the check
+    @domains = (domains.nil? || domains.include?(ALLDOMAINS) )? nil : domains
     if name =~ /^#{MBOX_RE}$/
       @name = name.untaint
       @mbox = Dir["#{ARCHIVE}/#{@name}", 
"#{ARCHIVE}/#{@name}.gz"].first.untaint
@@ -175,7 +177,7 @@ class Mailbox
 
   # Is the list wanted by the caller?
   def list_wanted?(message)
-    true
+    @domains.nil? || @domains.include?(message[:domain])
   end
 
   # Is the message visible to the caller?
diff --git a/www/moderation/desk/models/prefs.rb 
b/www/moderation/desk/models/prefs.rb
new file mode 100644
index 0000000..1b25c26
--- /dev/null
+++ b/www/moderation/desk/models/prefs.rb
@@ -0,0 +1,38 @@
+# encapsulate access to preferences
+
+require 'yaml/store'
+require_relative '../config.rb'
+
+class Prefs
+
+  def initialize()
+    @name  = File.join(ARCHIVE,'prefs.yml')
+    @store = YAML::Store.new(@name)
+  end
+
+  # Return the list of domains (xxx.apache.org etc)
+  def [](id)
+    @store.transaction do
+      data = @store[id]
+      data && data[:domains]
+    end
+  end
+
+  # Store the list of domains (xxx.apache.org etc)
+  def []=(id, domains)
+    value = {
+      last_updated: Time.now,
+      domains: domains,
+    }
+    @store.transaction do
+      @store[id]=value
+    end
+  end
+end
+
+if __FILE__ == $0
+  prefs = Prefs.new
+  puts prefs['test'].inspect
+  prefs['test'] = [1,2,3]
+  puts prefs['test'].inspect
+end
\ No newline at end of file
diff --git a/www/moderation/desk/server.rb b/www/moderation/desk/server.rb
index db0e3f6..d88e0f2 100644
--- a/www/moderation/desk/server.rb
+++ b/www/moderation/desk/server.rb
@@ -12,10 +12,14 @@ require 'ruby2js/filter/require'
 #require 'sanitize'
 require 'escape'
 
+require 'whimsy/asf'
+
 require_relative 'helpers'
 require_relative 'models/mailbox'
 require_relative 'models/safetemp'
 require_relative 'models/events'
+require_relative 'models/auth'
+require_relative 'models/prefs'
 
 
 # monkey patch mail gem to work around a regression introduced in 2.7.0:
@@ -39,13 +43,45 @@ module Mail
   end
 end
 
-require 'whimsy/asf'
 ASF::Mail.configure
 
 set :show_exceptions, true
 
 disable :logging # suppress log of requests to stderr/error.log
 
+def get_pref # common setup
+  @info = Auth.info({})
+  @id = @info[:id]
+  @prefs = Prefs.new()
+  @domains = @prefs[@id] || []
+end
+
+def check_pref
+  get_pref
+  # TODO this forces user to choose at least one domain
+  unless @domains && @domains.length > 0
+    redirect to('/prefs')
+  end
+  pass
+end
+
+# Allow direct access to preferences
+get '/prefs/?' do
+  get_pref
+  _html :prefs
+end
+
+# handle the update (easiest to use post from form button)
+post '/actions/setprefs' do
+  get_pref
+  _html :"actions/setprefs"
+end
+
+# force user to use preferences if they have not yet done so
+get   '*' do check_pref end
+post  '*' do check_pref end
+patch '*' do check_pref end
+
 get '/' do
   # Ensure trailing slash is present
   redirect to('/') if env['REQUEST_URI'] == env['SCRIPT_NAME']
@@ -56,7 +92,7 @@ end
 get '/messages' do # must agree with src in main.html
 
   @mbox = Mailbox.mboxname()
-  @messages = Mailbox.new(@mbox).client_headers
+  @messages = Mailbox.new(@mbox, @domains).client_headers
 
   @cssmtime = File.mtime('public/secmail.css').to_i
   @appmtime = Wunderbar::Asset.convert(File.join(settings.views, 
'app.js.rb')).mtime.to_i
@@ -68,11 +104,11 @@ get '/index.html' do
   call env.merge('PATH_INFO' => '/')
 end
 
-# initial list of messages
+# list of messages for a month
 get %r{/(#{MBOX_RE})/messages} do |mbox|
 
   @mbox = mbox
-  @messages = Mailbox.new(@mbox).client_headers
+  @messages = Mailbox.new(@mbox, @domains).client_headers
 
   @cssmtime = File.mtime('public/secmail.css').to_i
   @appmtime = Wunderbar::Asset.convert(File.join(settings.views, 
'app.js.rb')).mtime.to_i
@@ -81,8 +117,7 @@ end
 
 # support for fetching next lot of messages
 get %r{/(#{MBOX_RE})} do |mbox|
-  @mbox = mbox
-  _json Mailbox.new(@mbox).client_headers
+  _json Mailbox.new(mbox, @domains).client_headers
 end
 
 # retrieve a single message (same as body now)
diff --git a/www/moderation/desk/views/actions/setprefs.html.rb 
b/www/moderation/desk/views/actions/setprefs.html.rb
new file mode 100644
index 0000000..8dee3f6
--- /dev/null
+++ b/www/moderation/desk/views/actions/setprefs.html.rb
@@ -0,0 +1,34 @@
+# Set user preferences
+
+require_relative '../../defines'
+
+params = @request.params
+prefs = []
+if @info[:member] && params[ALLDOMAINS] == 'on'
+  prefs << ALLDOMAINS
+end
+
+# We keep the other settings to make it easier to switch back
+@info[:project_owners].each do |p|
+  p += '.apache.org' # TODO improve this
+  if params[p] == 'on'
+    prefs << p
+  end
+end
+
+_html do
+  _title 'ASF Moderation Helper - setting preferences'
+  _link rel: 'stylesheet', type: 'text/css', href: 
"../secmail.css?#{@cssmtime}"
+  _header_ do
+    _h1.bg_success do
+      _a 'ASF Moderation Helper', href: '..', target: '_top'
+      _ ' - setting preferences'
+    end
+  end
+  @prefs[@id]=prefs
+  _p "Successfully updated the project list for #{@id}"
+  _p do
+    _ 'Return to '
+    _a 'ASF Moderation Helper', href: '..', target: '_top'
+  end
+end
diff --git a/www/moderation/desk/views/prefs.html.rb 
b/www/moderation/desk/views/prefs.html.rb
new file mode 100644
index 0000000..77b5845
--- /dev/null
+++ b/www/moderation/desk/views/prefs.html.rb
@@ -0,0 +1,47 @@
+require_relative '../defines'
+
+# Update the project list
+_html do
+  _title 'ASF Moderation Helper - select preferences'
+  _link rel: 'stylesheet', type: 'text/css', href: "secmail.css?#{@cssmtime}"
+
+  _header_ do
+    _h1.bg_success do
+      _a 'ASF Moderation Helper', href: '.', target: '_top'
+      _ ' - select preferences'
+    end
+  end
+
+  _h1 "Set preferences for #{@id}"
+
+  _form method: 'post', action: 'actions/setprefs' do
+    _table.table do
+      _tr do
+        _th 'Selected'
+        _th 'Project'
+      end
+      if @info[:member]
+        _tr do
+          _td do
+            _input type: 'checkbox', name: ALLDOMAINS, checked: 
@domains.include?(ALLDOMAINS)            
+          end
+          _td '*** All domains ***'
+        end
+      end
+      @info[:project_owners].each do |up|
+        up += '.apache.org' # TODO improve this
+        _tr do
+          _td do
+            _input type: 'checkbox', name: up, checked: @domains.include?(up)
+          end
+          _td up
+        end
+      end
+    end
+    _input.btn.btn_primary value: 'Update', type: 'submit', ref: 'update'    
+  end
+  _p do
+    _ 'Return to '
+    _a 'ASF Moderation Helper', href: '.', target: '_top'
+  end
+end

Reply via email to