fixes #2418 (includes hiding deleted dmails and allowing filtering on user name)

This commit is contained in:
r888888888
2015-07-07 16:47:23 -07:00
parent 4a24fe5074
commit 67e46f6e5c
9 changed files with 121 additions and 8 deletions

View File

@@ -17,7 +17,7 @@ class DmailsController < ApplicationController
if params[:folder] && params[:set_default_folder]
cookies.permanent[:dmail_folder] = params[:folder]
end
@query = Dmail.visible.search(params[:search])
@query = Dmail.active.visible.search(params[:search])
@dmails = @query.order("dmails.created_at desc").paginate(params[:page], :limit => params[:limit])
respond_with(@dmails) do |format|
format.xml do

View File

@@ -0,0 +1,29 @@
module Maintenance
module User
class DmailFiltersController < ApplicationController
before_filter :ensure_ownership
before_filter :member_only
def edit
@dmail_filter = CurrentUser.dmail_filter || DmailFilter.new
end
def update
@dmail_filter = CurrentUser.dmail_filter || DmailFilter.new
@dmail_filter.update_attributes(params[:dmail_filter])
flash[:notice] = "Filter updated"
redirect_to(dmail_path(@dmail.id))
end
private
def ensure_ownership
@dmail = Dmail.find(params[:dmail_id])
if @dmail.owner_id != CurrentUser.user.id
raise User::PrivilegeError.new
end
end
end
end
end

View File

@@ -76,11 +76,16 @@ module ApplicationHelper
time_tag(time.strftime("%Y-%m-%d %H:%M"), time)
end
def link_to_user(user)
def link_to_user(user, options = {})
user_class = user.level_class
user_class = user_class + " user-post-approver" if user.can_approve_posts?
user_class = user_class + " with-style" if CurrentUser.user.style_usernames?
link_to(user.pretty_name, user_path(user), :class => user_class)
if options[:raw_name]
name = user.name
else
name = user.pretty_name
end
link_to(name, user_path(user), :class => user_class)
end
def mod_link_to_user(user, positive_or_negative)

View File

@@ -20,6 +20,10 @@ class AnonymousUser
Time.now
end
def dmail_filter
nil
end
def name
"Anonymous"
end

View File

@@ -11,7 +11,7 @@ class DmailFilter < ActiveRecord::Base
end
def filtered?(dmail)
dmail.from.level <= User::Levels::MODERATOR && has_filter? && (dmail.body =~ regexp || dmail.title =~ regexp)
dmail.from.level <= User::Levels::MODERATOR && has_filter? && (dmail.body =~ regexp || dmail.title =~ regexp || dmail.from.name =~ regexp)
end
def has_filter?
@@ -19,6 +19,6 @@ class DmailFilter < ActiveRecord::Base
end
def regexp
@regexp ||= Regexp.compile(words.scan(/\S+/).map {|x| Regexp.escape(x)}.join("|"))
@regexp ||= Regexp.compile('\b(?:' + words.scan(/\S+/).map {|x| Regexp.escape(x)}.join("|") + ')\b')
end
end

View File

@@ -21,6 +21,7 @@
<p>
<%= link_to "Respond", new_dmail_path(:respond_to_id => @dmail) %>
| <%= link_to "Forward", new_dmail_path(:respond_to_id => @dmail, :forward => true) %>
| <%= link_to "Filter messages like these", edit_maintenance_user_dmail_filter_path(:dmail_id => @dmail.id) %>
</p>
</div>
</div>

View File

@@ -0,0 +1,37 @@
<div id="c-users">
<div id="a-edit">
<h1>Edit Message Filters</h1>
<div>
<h2><%= @dmail.title %></h2>
<ul style="margin-bottom: 1em;">
<li><strong>Sender</strong>: <%= link_to_user @dmail.from %></li>
<li><strong>Recipient</strong>: <%= link_to_user @dmail.to, :raw => true %></li>
<li><strong>Date</strong>: <%= compact_time(@dmail.created_at) %></li>
<% if CurrentUser.user.is_moderator? %>
<li><strong>Sender IP</strong>: <%= @dmail.creator_ip_addr %></li>
<% end %>
</ul>
<h3>Body</h3>
<div class="prose">
<%= format_text(@dmail.body) %>
</div>
</div>
<%= simple_form_for @dmail_filter, :url => maintenance_user_dmail_filter_path(:dmail_id => @dmail.id), :method => :put do |f| %>
<div class="input text optional field_with_hint">
<label class="text" for="dmail_filter_words">Banned Words</label>
<%= text_area_tag "dmail_filter[words]", @dmail_filter.words, :id => "dmail_filter_words", :class => "text", :style => "height: 10em;" %>
<p class="hint">A list of banned words or users (space delimited). Any message you receive with a banned word will automatically be deleted. Make sure user names have no spaces in them (replace with underscores).</p>
</div>
<%= f.button :submit, "Submit" %>
<% end %>
</div>
</div>
<% content_for(:page_title) do %>
Edit Message Filters - <%= Danbooru.config.app_name %>
<% end %>

View File

@@ -56,6 +56,7 @@ Rails.application.routes.draw do
resource :login_reminder, :only => [:new, :create]
resource :deletion, :only => [:show, :destroy]
resource :email_change, :only => [:new, :create]
resource :dmail_filter, :only => [:edit, :update]
end
end

View File

@@ -1,7 +1,43 @@
require 'test_helper'
class DmailFilterTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
def setup
super
@receiver = FactoryGirl.create(:user)
@sender = FactoryGirl.create(:user)
end
def create_dmail(body, title)
CurrentUser.scoped(@sender, "127.0.0.1") do
Dmail.create_split(:to_id => @receiver.id, :body => body, :title => title)
end
end
context "a dmail filter for a word" do
setup do
@dmail_filter = @receiver.create_dmail_filter(:words => "banned")
end
should "filter on that word in the body" do
create_dmail("banned", "okay")
assert_equal(true, @receiver.dmails.last.is_deleted?)
end
should "filter on that word in the title" do
create_dmail("okay", "banned")
assert_equal(true, @receiver.dmails.last.is_deleted?)
end
end
context "a dmail filter for a user name" do
setup do
@dmail_filter = @receiver.create_dmail_filter(:words => @sender.name)
end
should "filter on the sender" do
create_dmail("okay", "okay")
assert_equal(true, @receiver.dmails.last.is_deleted?)
end
end
end