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