mirror of https://github.com/tootsuite/mastodon
Add ability to filter instances by those which are not limited
parent
4bfb8887bf
commit
0248bca3c7
|
@ -56,6 +56,12 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_instances
|
def set_instances
|
||||||
|
# If we have `limited` in the query parameters, remove it and redirect to suspended:
|
||||||
|
return redirect_to admin_instances_path filter_params.merge(status: :suspended) if params[:limited].present?
|
||||||
|
|
||||||
|
# If we're in limited federation mode and have a status parameter, remove it:
|
||||||
|
return redirect_to admin_instances_path filter_params.merge(status: nil) if limited_federation_mode? && params[:status].present?
|
||||||
|
|
||||||
@instances = filtered_instances.page(params[:page])
|
@instances = filtered_instances.page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -68,7 +74,7 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def filtered_instances
|
def filtered_instances
|
||||||
InstanceFilter.new(limited_federation_mode? ? { allowed: true } : filter_params).results
|
InstanceFilter.new(limited_federation_mode? ? filter_params.merge(status: :allowed) : filter_params).results
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_params
|
def filter_params
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
class InstanceFilter
|
class InstanceFilter
|
||||||
KEYS = %i(
|
KEYS = %i(
|
||||||
limited
|
status
|
||||||
by_domain
|
by_domain
|
||||||
availability
|
availability
|
||||||
).freeze
|
).freeze
|
||||||
|
@ -27,10 +27,8 @@ class InstanceFilter
|
||||||
|
|
||||||
def scope_for(key, value)
|
def scope_for(key, value)
|
||||||
case key.to_s
|
case key.to_s
|
||||||
when 'limited'
|
when 'status'
|
||||||
Instance.joins(:domain_block).reorder(domain_blocks: { id: :desc })
|
status_scope(value)
|
||||||
when 'allowed'
|
|
||||||
Instance.joins(:domain_allow).reorder(domain_allows: { id: :desc })
|
|
||||||
when 'by_domain'
|
when 'by_domain'
|
||||||
Instance.matches_domain(value)
|
Instance.matches_domain(value)
|
||||||
when 'availability'
|
when 'availability'
|
||||||
|
@ -40,6 +38,27 @@ class InstanceFilter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def status_scope(value)
|
||||||
|
# The `join where` queries here look like they have a bug due to `domain_block`
|
||||||
|
# vs `domain_blocks`, however the table is `domain_blocks` while the relation on
|
||||||
|
# Instances is `domain_block`
|
||||||
|
case value.to_sym
|
||||||
|
when :allowed
|
||||||
|
Instance.joins(:domain_allow).reorder(Arel.sql('domain_allows.id desc'))
|
||||||
|
when :suspended
|
||||||
|
Instance.joins(:domain_block).where(domain_blocks: { severity: :suspend }).reorder(Arel.sql('domain_blocks.id desc'))
|
||||||
|
when :silenced
|
||||||
|
Instance.joins(:domain_block).where(domain_blocks: { severity: :silence }).reorder(Arel.sql('domain_blocks.id desc'))
|
||||||
|
when :noop
|
||||||
|
Instance.joins(:domain_block).where(domain_blocks: { severity: :noop }).reorder(Arel.sql('domain_blocks.id desc'))
|
||||||
|
when :not_limited
|
||||||
|
# Finds all instances where there isn't a record in the domain_blocks table
|
||||||
|
Instance.left_outer_joins(:domain_block).where(domain_blocks: { domain: nil })
|
||||||
|
else
|
||||||
|
raise Mastodon::InvalidParameterError, "Unknown limited scope value: #{value}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def availability_scope(value)
|
def availability_scope(value)
|
||||||
case value
|
case value
|
||||||
when 'failing'
|
when 'failing'
|
||||||
|
|
|
@ -15,10 +15,14 @@
|
||||||
.filter-subset
|
.filter-subset
|
||||||
%strong= t('admin.instances.moderation.title')
|
%strong= t('admin.instances.moderation.title')
|
||||||
%ul
|
%ul
|
||||||
%li= filter_link_to t('admin.instances.moderation.all'), limited: nil
|
- if limited_federation_mode?
|
||||||
|
%li= filter_link_to t('admin.instances.moderation.allowed'), status: nil
|
||||||
- unless limited_federation_mode?
|
- else
|
||||||
%li= filter_link_to t('admin.instances.moderation.limited'), limited: '1'
|
%li= filter_link_to t('admin.instances.moderation.all'), status: nil
|
||||||
|
%li= filter_link_to t('admin.instances.moderation.not_limited'), status: 'not_limited'
|
||||||
|
%li= filter_link_to t('admin.instances.moderation.noop'), status: 'noop'
|
||||||
|
%li= filter_link_to t('admin.instances.moderation.silenced'), status: 'silenced'
|
||||||
|
%li= filter_link_to t('admin.instances.moderation.suspended'), status: 'suspended'
|
||||||
|
|
||||||
.filter-subset
|
.filter-subset
|
||||||
%strong= t('admin.instances.availability.title')
|
%strong= t('admin.instances.availability.title')
|
||||||
|
@ -27,18 +31,16 @@
|
||||||
%li= filter_link_to t('admin.instances.delivery.failing'), availability: 'failing'
|
%li= filter_link_to t('admin.instances.delivery.failing'), availability: 'failing'
|
||||||
%li= filter_link_to t('admin.instances.delivery.unavailable'), availability: 'unavailable'
|
%li= filter_link_to t('admin.instances.delivery.unavailable'), availability: 'unavailable'
|
||||||
|
|
||||||
- unless limited_federation_mode?
|
= form_with url: admin_instances_url, method: :get, class: :simple_form do |form|
|
||||||
= form_with url: admin_instances_url, method: :get, class: :simple_form do |form|
|
|
||||||
.fields-group
|
.fields-group
|
||||||
- InstanceFilter::KEYS.each do |key|
|
- InstanceFilter::KEYS.each do |key|
|
||||||
= form.hidden_field key, value: params[key] if params[key].present?
|
= form.hidden_field key, value: params[key] if params[key].present?
|
||||||
|
|
||||||
- %i(by_domain).each do |key|
|
|
||||||
.input.string.optional
|
.input.string.optional
|
||||||
= form.text_field key,
|
= form.text_field :by_domain,
|
||||||
value: params[key],
|
value: params[:by_domain],
|
||||||
class: 'string optional',
|
class: 'string optional',
|
||||||
placeholder: I18n.t("admin.instances.#{key}")
|
placeholder: t('admin.instances.by_domain')
|
||||||
|
|
||||||
.actions
|
.actions
|
||||||
%button.button= t('admin.accounts.search')
|
%button.button= t('admin.accounts.search')
|
||||||
|
|
|
@ -539,7 +539,11 @@ en:
|
||||||
other: "%{count} known accounts"
|
other: "%{count} known accounts"
|
||||||
moderation:
|
moderation:
|
||||||
all: All
|
all: All
|
||||||
limited: Limited
|
allowed: Allowed
|
||||||
|
noop: Filtered
|
||||||
|
not_limited: Not Limited
|
||||||
|
silenced: Silenced
|
||||||
|
suspended: Suspended
|
||||||
title: Moderation
|
title: Moderation
|
||||||
private_comment: Private comment
|
private_comment: Private comment
|
||||||
public_comment: Public comment
|
public_comment: Public comment
|
||||||
|
|
|
@ -34,6 +34,20 @@ RSpec.describe Admin::InstancesController do
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'outdated filter parameters' do
|
||||||
|
it 'redirect to status suspended when just limited is set' do
|
||||||
|
get :index, params: { limited: 1 }
|
||||||
|
|
||||||
|
expect(response).to redirect_to admin_instances_path({ status: :suspended })
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'retains other filters when redirecting if limited is set' do
|
||||||
|
get :index, params: { limited: 1, availability: 'failing' }
|
||||||
|
|
||||||
|
expect(response).to redirect_to admin_instances_path({ status: :suspended, availability: 'failing' })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def instance_directory_links
|
def instance_directory_links
|
||||||
response.parsed_body.css('div.directory__tag a')
|
response.parsed_body.css('div.directory__tag a')
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue