Merge branch 'main' into glitch-soc/merge-upstream

Conflicts:
- `app/views/admin/trends/links/index.html.haml`:
  Not really a conflict, upstream change textually too close to a glitch-soc
  change (removed `javascript_pack_tag` to accomodate for glitch-soc's theming
  system).
  Ported upstream changes.
- `app/views/admin/trends/links/preview_card_providers/index.html.haml`:
  Not really a conflict, upstream change textually too close to a glitch-soc
  change (removed `javascript_pack_tag` to accomodate for glitch-soc's theming
  system).
  Ported upstream changes.
- `app/views/admin/trends/statuses/index.html.haml`:
  Not really a conflict, upstream change textually too close to a glitch-soc
  change (removed `javascript_pack_tag` to accomodate for glitch-soc's theming
  system).
  Ported upstream changes.
- `app/views/admin/trends/tags/index.html.haml`:
  Not really a conflict, upstream change textually too close to a glitch-soc
  change (removed `javascript_pack_tag` to accomodate for glitch-soc's theming
  system).
  Ported upstream changes.
pull/1710/head
Claire 2022-03-02 20:48:27 +01:00
commit 8743b1ea40
14 changed files with 100 additions and 31 deletions

View File

@ -10,9 +10,7 @@ class Api::V1::ReportsController < Api::BaseController
@report = ReportService.new.call(
current_account,
reported_account,
status_ids: reported_status_ids,
comment: report_params[:comment],
forward: report_params[:forward]
report_params
)
render json: @report, serializer: REST::ReportSerializer
@ -20,14 +18,6 @@ class Api::V1::ReportsController < Api::BaseController
private
def reported_status_ids
reported_account.statuses.with_discarded.find(status_ids).pluck(:id)
end
def status_ids
Array(report_params[:status_ids])
end
def reported_account
Account.find(report_params[:account_id])
end

View File

@ -94,8 +94,9 @@ class Api::V1::StatusesController < Api::BaseController
end
def set_thread
@thread = status_params[:in_reply_to_id].blank? ? nil : Status.find(status_params[:in_reply_to_id])
rescue ActiveRecord::RecordNotFound
@thread = Status.find(status_params[:in_reply_to_id]) if status_params[:in_reply_to_id].present?
authorize(@thread, :show?) if @thread.present?
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404
end

View File

@ -904,6 +904,14 @@ a.name-tag,
text-align: center;
}
.applications-list__item {
padding: 15px 0;
background: $ui-base-color;
border: 1px solid lighten($ui-base-color, 4%);
border-radius: 4px;
margin-top: 15px;
}
.announcements-list {
border: 1px solid lighten($ui-base-color, 4%);
border-radius: 4px;

View File

@ -1069,6 +1069,7 @@ code {
&:last-child {
border-bottom: 0;
padding-bottom: 0;
}
}
}

View File

@ -6,10 +6,10 @@ class ReportService < BaseService
def call(source_account, target_account, options = {})
@source_account = source_account
@target_account = target_account
@status_ids = options.delete(:status_ids) || []
@comment = options.delete(:comment) || ''
@category = options.delete(:category) || 'other'
@rule_ids = options.delete(:rule_ids)
@status_ids = options.delete(:status_ids).presence || []
@comment = options.delete(:comment).presence || ''
@category = options.delete(:category).presence || 'other'
@rule_ids = options.delete(:rule_ids).presence
@options = options
raise ActiveRecord::RecordNotFound if @target_account.suspended?
@ -26,7 +26,7 @@ class ReportService < BaseService
def create_report!
@report = @source_account.reports.create!(
target_account: @target_account,
status_ids: @status_ids,
status_ids: reported_status_ids,
comment: @comment,
uri: @options[:uri],
forwarded: forward?,
@ -56,6 +56,10 @@ class ReportService < BaseService
!@target_account.local? && ActiveModel::Type::Boolean.new.cast(@options[:forward])
end
def reported_status_ids
@target_account.statuses.with_discarded.find(Array(@status_ids)).pluck(:id)
end
def payload
Oj.dump(serialize_payload(@report, ActivityPub::FlagSerializer, account: some_local_account))
end

View File

@ -1,6 +1,10 @@
- content_for :page_title do
= t('admin.trends.links.title')
%p= t('admin.trends.links.description_html')
%hr.spacer/
= form_tag admin_trends_links_path, method: 'GET', class: 'simple_form' do
- Trends::PreviewCardFilter::KEYS.each do |key|
= hidden_field_tag key, params[key] if params[key].present?

View File

@ -1,6 +1,10 @@
- content_for :page_title do
= t('admin.trends.preview_card_providers.title')
%p= t('admin.trends.preview_card_providers.description_html')
%hr.spacer/
.filters
.filter-subset
%strong= t('admin.tags.review')
@ -14,7 +18,6 @@
= fa_icon 'chevron-left fw'
= t('admin.trends.links.title')
%hr.spacer/
= form_for(@form, url: batch_admin_trends_links_preview_card_providers_path) do |f|

View File

@ -22,6 +22,9 @@
- if status.language.present?
= standard_locale_name(status.language)
- if status.trendable? && !status.account.discoverable?
= t('admin.trends.statuses.not_discoverable')
- if status.trendable? && (rank = Trends.statuses.rank(status.id))
%abbr{ title: t('admin.trends.tags.current_score', score: Trends.statuses.score(status.id)) }= t('admin.trends.tags.trending_rank', rank: rank + 1)

View File

@ -1,6 +1,10 @@
- content_for :page_title do
= t('admin.trends.statuses.title')
%p= t('admin.trends.statuses.description_html')
%hr.spacer/
= form_tag admin_trends_statuses_path, method: 'GET', class: 'simple_form' do
- Trends::StatusFilter::KEYS.each do |key|
= hidden_field_tag key, params[key] if params[key].present?

View File

@ -1,6 +1,10 @@
- content_for :page_title do
= t('admin.trends.tags.title')
%p= t('admin.trends.tags.description_html')
%hr.spacer/
.filters
.filter-subset
%strong= t('admin.tags.review')

View File

@ -5,9 +5,9 @@
%hr.spacer/
.announcements-list
.applications-list
- @applications.each do |application|
.announcements-list__item
.applications-list__item
- if application.website.present?
= link_to application.name, application.website, target: '_blank', rel: 'noopener noreferrer', class: 'announcements-list__item__title'
- else

View File

@ -777,6 +777,7 @@ en:
links:
allow: Allow link
allow_provider: Allow publisher
description_html: These are links that are currently being shared a lot by accounts that your server sees posts from. It can help your users find out what's going on in the world. No links are displayed publicly until you approve the publisher. You can also allow or reject individual links.
disallow: Disallow link
disallow_provider: Disallow publisher
shared_by_over_week:
@ -788,14 +789,17 @@ en:
pending_review: Pending review
preview_card_providers:
allowed: Links from this publisher can trend
description_html: These are domains from which links are often shared on your server. Links will not trend publicly unless the domain of the link is approved. Your approval (or rejection) extends to subdomains.
rejected: Links from this publisher won't trend
title: Publishers
rejected: Rejected
statuses:
allow: Allow post
allow_account: Allow author
description_html: These are posts that your server knows about that are currently being shared and favourited a lot at the moment. It can help your new and returning users to find more people to follow. No posts are displayed publicly until you approve the author, and the author allows their account to be suggested to others. You can also allow or reject individual posts.
disallow: Disallow post
disallow_account: Disallow author
not_discoverable: Author has not opted-in to being discoverable
shared_by:
one: Shared or favourited one time
other: Shared and favourited %{friendly_count} times
@ -808,6 +812,7 @@ en:
tag_servers_dimension: Top servers
tag_servers_measure: different servers
tag_uses_measure: total uses
description_html: These are hashtags that are currently appearing in a lot of posts that your server sees. It can help your users find out what people are talking the most about at the moment. No hashtags are displayed publicly until you approve them.
listable: Can be suggested
not_listable: Won't be suggested
not_trendable: Won't appear under trends

View File

@ -13,22 +13,64 @@ RSpec.describe Api::V1::ReportsController, type: :controller do
end
describe 'POST #create' do
let(:scopes) { 'write:reports' }
let!(:status) { Fabricate(:status) }
let!(:admin) { Fabricate(:user, admin: true) }
let!(:admin) { Fabricate(:user, admin: true) }
let(:scopes) { 'write:reports' }
let(:status) { Fabricate(:status) }
let(:target_account) { status.account }
let(:category) { nil }
let(:forward) { nil }
let(:rule_ids){ nil }
before do
allow(AdminMailer).to receive(:new_report).and_return(double('email', deliver_later: nil))
post :create, params: { status_ids: [status.id], account_id: status.account.id, comment: 'reasons' }
post :create, params: { status_ids: [status.id], account_id: target_account.id, comment: 'reasons', category: category, rule_ids: rule_ids, forward: forward }
end
it 'returns http success' do
expect(response).to have_http_status(200)
end
it 'creates a report' do
expect(status.reload.account.targeted_reports).not_to be_empty
expect(response).to have_http_status(200)
expect(target_account.targeted_reports).to_not be_empty
end
it 'saves comment' do
expect(target_account.targeted_reports.first.comment).to eq 'reasons'
end
it 'sends e-mails to admins' do
expect(AdminMailer).to have_received(:new_report).with(admin.account, Report)
end
context 'when a status does not belong to the reported account' do
let(:target_account) { Fabricate(:account) }
it 'returns http not found' do
expect(response).to have_http_status(404)
end
end
context 'when a category is chosen' do
let(:category) { 'spam' }
it 'saves category' do
expect(target_account.targeted_reports.first.spam?).to be true
end
end
context 'when violated rules are chosen' do
let(:rule) { Fabricate(:rule) }
let(:category) { 'violation' }
let(:rule_ids) { [rule.id] }
it 'saves category' do
expect(target_account.targeted_reports.first.violation?).to be true
end
it 'saves rule_ids' do
expect(target_account.targeted_reports.first.rule_ids).to match_array([rule.id])
end
end
end
end

View File

@ -1,5 +1,5 @@
Fabricator(:rule) do
priority ""
deleted_at "2021-02-21 05:51:09"
text "MyText"
end
priority 0
deleted_at nil
text { Faker::Lorem.paragraph }
end