Merge branch 'master' into glitch-soc/merge-upstream
Conflicts: - app/controllers/accounts_controller.rb - app/controllers/follower_accounts_controller.rb - app/controllers/statuses_controller.rb All conflicts caused by the additional `use_pack` used for glitch-soc's theming system.
This commit is contained in:
@ -11,6 +11,8 @@ class AccountsController < ApplicationController
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
use_pack 'public'
|
||||
mark_cacheable! unless user_signed_in?
|
||||
|
||||
@body_classes = 'with-modals'
|
||||
@pinned_statuses = []
|
||||
@endorsed_accounts = @account.endorsed_accounts.to_a.sample(4)
|
||||
@ -31,17 +33,21 @@ class AccountsController < ApplicationController
|
||||
end
|
||||
|
||||
format.atom do
|
||||
mark_cacheable!
|
||||
|
||||
@entries = @account.stream_entries.where(hidden: false).with_includes.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id])
|
||||
render xml: OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, @entries.reject { |entry| entry.status.nil? || entry.status.local_only? }))
|
||||
end
|
||||
|
||||
format.rss do
|
||||
mark_cacheable!
|
||||
|
||||
@statuses = cache_collection(default_statuses.without_reblogs.without_replies.limit(PAGE_SIZE), Status)
|
||||
render xml: RSS::AccountSerializer.render(@account, @statuses)
|
||||
end
|
||||
|
||||
format.json do
|
||||
skip_session!
|
||||
mark_cacheable!
|
||||
|
||||
render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
|
||||
ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
|
||||
|
@ -227,6 +227,11 @@ class ApplicationController < ActionController::Base
|
||||
response.headers['Vary'] = 'Accept'
|
||||
end
|
||||
|
||||
def mark_cacheable!
|
||||
skip_session!
|
||||
expires_in 0, public: true
|
||||
end
|
||||
|
||||
def skip_session!
|
||||
request.session_options[:skip] = true
|
||||
end
|
||||
|
@ -7,6 +7,7 @@ class FollowerAccountsController < ApplicationController
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
use_pack 'public'
|
||||
mark_cacheable! unless user_signed_in?
|
||||
|
||||
next if @account.user_hides_network?
|
||||
|
||||
|
@ -32,17 +32,18 @@ class RelationshipsController < ApplicationController
|
||||
def relationships_scope
|
||||
scope = begin
|
||||
if following_relationship?
|
||||
current_account.following.includes(:account_stat)
|
||||
current_account.following.joins(:account_stat)
|
||||
else
|
||||
current_account.followers.includes(:account_stat)
|
||||
current_account.followers.joins(:account_stat)
|
||||
end
|
||||
end
|
||||
|
||||
scope.merge!(Follow.recent)
|
||||
scope.merge!(mutual_relationship_scope) if mutual_relationship?
|
||||
scope.merge!(abandoned_account_scope) if params[:status] == 'abandoned'
|
||||
scope.merge!(active_account_scope) if params[:status] == 'active'
|
||||
scope.merge!(moved_account_scope) if params[:status] == 'moved'
|
||||
scope.merge!(primary_account_scope) if params[:status] == 'primary'
|
||||
scope.merge!(by_domain_scope) if params[:by_domain].present?
|
||||
scope.merge!(dormant_account_scope) if params[:activity] == 'dormant'
|
||||
|
||||
scope
|
||||
end
|
||||
@ -51,14 +52,18 @@ class RelationshipsController < ApplicationController
|
||||
Account.where(id: current_account.following)
|
||||
end
|
||||
|
||||
def abandoned_account_scope
|
||||
def moved_account_scope
|
||||
Account.where.not(moved_to_account_id: nil)
|
||||
end
|
||||
|
||||
def active_account_scope
|
||||
def primary_account_scope
|
||||
Account.where(moved_to_account_id: nil)
|
||||
end
|
||||
|
||||
def dormant_account_scope
|
||||
AccountStat.where(last_status_at: nil).or(AccountStat.where(AccountStat.arel_table[:last_status_at].lt(1.month.ago)))
|
||||
end
|
||||
|
||||
def by_domain_scope
|
||||
Account.where(domain: params[:by_domain])
|
||||
end
|
||||
@ -80,7 +85,7 @@ class RelationshipsController < ApplicationController
|
||||
end
|
||||
|
||||
def current_params
|
||||
params.slice(:page, :status, :relationship, :by_domain).permit(:page, :status, :relationship, :by_domain)
|
||||
params.slice(:page, :status, :relationship, :by_domain, :activity).permit(:page, :status, :relationship, :by_domain, :activity)
|
||||
end
|
||||
|
||||
def action_from_button
|
||||
|
@ -28,6 +28,8 @@ class StatusesController < ApplicationController
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
use_pack 'public'
|
||||
mark_cacheable! unless user_signed_in?
|
||||
|
||||
@body_classes = 'with-modals'
|
||||
|
||||
set_ancestors
|
||||
@ -37,7 +39,7 @@ class StatusesController < ApplicationController
|
||||
end
|
||||
|
||||
format.json do
|
||||
skip_session! unless @stream_entry.hidden?
|
||||
mark_cacheable! unless @stream_entry.hidden?
|
||||
|
||||
render_cached_json(['activitypub', 'note', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
|
||||
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter)
|
||||
|
@ -7,7 +7,7 @@ module Admin::FilterHelper
|
||||
CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
|
||||
TAGS_FILTERS = %i(hidden).freeze
|
||||
INSTANCES_FILTERS = %i(limited by_domain).freeze
|
||||
FOLLOWERS_FILTERS = %i(relationship status by_domain).freeze
|
||||
FOLLOWERS_FILTERS = %i(relationship status by_domain activity).freeze
|
||||
|
||||
FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS + FOLLOWERS_FILTERS
|
||||
|
||||
|
@ -7,6 +7,7 @@ import {
|
||||
importFetchedStatus,
|
||||
importFetchedStatuses,
|
||||
} from './importer';
|
||||
import { saveSettings } from './settings';
|
||||
import { defineMessages } from 'react-intl';
|
||||
import { List as ImmutableList } from 'immutable';
|
||||
import { unescapeHTML } from '../utils/html';
|
||||
@ -187,5 +188,6 @@ export function setFilter (filterType) {
|
||||
value: filterType,
|
||||
});
|
||||
dispatch(expandNotifications());
|
||||
dispatch(saveSettings());
|
||||
};
|
||||
};
|
||||
|
@ -131,15 +131,6 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/domain.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "It crashed!",
|
||||
"id": "error_boundary.it_crashed"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/components/error_boundary.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
@ -1870,6 +1861,10 @@
|
||||
{
|
||||
"defaultMessage": "Boosts:",
|
||||
"id": "notifications.column_settings.reblog"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Poll results:",
|
||||
"id": "notifications.column_settings.poll"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/notifications/components/column_settings.json"
|
||||
@ -1888,6 +1883,10 @@
|
||||
"defaultMessage": "Boosts",
|
||||
"id": "notifications.filter.boosts"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Poll results",
|
||||
"id": "notifications.filter.polls"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Follows",
|
||||
"id": "notifications.filter.follows"
|
||||
@ -1912,6 +1911,10 @@
|
||||
{
|
||||
"defaultMessage": "{name} boosted your status",
|
||||
"id": "notification.reblog"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "A poll you have voted in has ended",
|
||||
"id": "notification.poll"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/notifications/components/notification.json"
|
||||
@ -1973,24 +1976,6 @@
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/reblogs/index.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "A look inside...",
|
||||
"id": "standalone.public_title"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/standalone/community_timeline/index.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
"defaultMessage": "A look inside...",
|
||||
"id": "standalone.public_title"
|
||||
}
|
||||
],
|
||||
"path": "app/javascript/mastodon/features/standalone/public_timeline/index.json"
|
||||
},
|
||||
{
|
||||
"descriptors": [
|
||||
{
|
||||
|
@ -137,7 +137,6 @@
|
||||
"empty_column.mutes": "You haven't muted any users yet.",
|
||||
"empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
|
||||
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
|
||||
"error_boundary.it_crashed": "It crashed!",
|
||||
"follow_request.authorize": "Authorize",
|
||||
"follow_request.reject": "Reject",
|
||||
"getting_started.developers": "Developers",
|
||||
@ -253,6 +252,7 @@
|
||||
"notification.favourite": "{name} favourited your status",
|
||||
"notification.follow": "{name} followed you",
|
||||
"notification.mention": "{name} mentioned you",
|
||||
"notification.poll": "A poll you have voted in has ended",
|
||||
"notification.reblog": "{name} boosted your status",
|
||||
"notifications.clear": "Clear notifications",
|
||||
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
|
||||
@ -263,6 +263,7 @@
|
||||
"notifications.column_settings.filter_bar.show": "Show",
|
||||
"notifications.column_settings.follow": "New followers:",
|
||||
"notifications.column_settings.mention": "Mentions:",
|
||||
"notifications.column_settings.poll": "Poll results:",
|
||||
"notifications.column_settings.push": "Push notifications",
|
||||
"notifications.column_settings.reblog": "Boosts:",
|
||||
"notifications.column_settings.show": "Show in column",
|
||||
@ -272,6 +273,7 @@
|
||||
"notifications.filter.favourites": "Favourites",
|
||||
"notifications.filter.follows": "Follows",
|
||||
"notifications.filter.mentions": "Mentions",
|
||||
"notifications.filter.polls": "Poll results",
|
||||
"notifications.group": "{count} notifications",
|
||||
"poll.closed": "Closed",
|
||||
"poll.refresh": "Refresh",
|
||||
@ -313,7 +315,6 @@
|
||||
"search_results.hashtags": "Hashtags",
|
||||
"search_results.statuses": "Toots",
|
||||
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
|
||||
"standalone.public_title": "A look inside...",
|
||||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.block": "Block @{name}",
|
||||
|
@ -137,7 +137,6 @@
|
||||
"empty_column.mutes": "まだ誰もミュートしていません。",
|
||||
"empty_column.notifications": "まだ通知がありません。他の人とふれ合って会話を始めましょう。",
|
||||
"empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のサーバーのユーザーをフォローしたりしていっぱいにしましょう",
|
||||
"error_boundary.it_crashed": "It crashed!",
|
||||
"follow_request.authorize": "許可",
|
||||
"follow_request.reject": "拒否",
|
||||
"getting_started.developers": "開発",
|
||||
@ -313,7 +312,6 @@
|
||||
"search_results.hashtags": "ハッシュタグ",
|
||||
"search_results.statuses": "トゥート",
|
||||
"search_results.total": "{count, number}件の結果",
|
||||
"standalone.public_title": "A look inside...",
|
||||
"status.admin_account": "@{name} のモデレーション画面を開く",
|
||||
"status.admin_status": "このトゥートをモデレーション画面で開く",
|
||||
"status.block": "@{name}さんをブロック",
|
||||
|
@ -149,6 +149,10 @@ a.table-action-link {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: $no-gap-breakpoint) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__actions,
|
||||
@ -170,6 +174,10 @@ a.table-action-link {
|
||||
text-align: right;
|
||||
padding-right: 16px - 5px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: $no-gap-breakpoint) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__row {
|
||||
@ -177,6 +185,12 @@ a.table-action-link {
|
||||
border-top: 0;
|
||||
background: darken($ui-base-color, 4%);
|
||||
|
||||
@media screen and (max-width: $no-gap-breakpoint) {
|
||||
&:first-child {
|
||||
border-top: 1px solid darken($ui-base-color, 8%);
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: darken($ui-base-color, 2%);
|
||||
}
|
||||
@ -215,5 +229,15 @@ a.table-action-link {
|
||||
border: 1px solid darken($ui-base-color, 8%);
|
||||
border-top: 0;
|
||||
box-shadow: none;
|
||||
|
||||
@media screen and (max-width: $no-gap-breakpoint) {
|
||||
border-top: 1px solid darken($ui-base-color, 8%);
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 870px) {
|
||||
.accounts-table tbody td.optional {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,8 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity
|
||||
@account,
|
||||
target_account,
|
||||
status_ids: target_statuses.nil? ? [] : target_statuses.map(&:id),
|
||||
comment: @json['content'] || ''
|
||||
comment: @json['content'] || '',
|
||||
uri: report_uri
|
||||
)
|
||||
end
|
||||
end
|
||||
@ -28,4 +29,8 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity
|
||||
def object_uris
|
||||
@object_uris ||= Array(@object.is_a?(Array) ? @object.map { |item| value_or_id(item) } : value_or_id(@object))
|
||||
end
|
||||
|
||||
def report_uri
|
||||
@json['id'] unless @json['id'].nil? || invalid_origin?(@json['id'])
|
||||
end
|
||||
end
|
||||
|
@ -13,6 +13,7 @@
|
||||
# action_taken_by_account_id :bigint(8)
|
||||
# target_account_id :bigint(8) not null
|
||||
# assigned_account_id :bigint(8)
|
||||
# uri :string
|
||||
#
|
||||
|
||||
class Report < ApplicationRecord
|
||||
@ -28,6 +29,12 @@ class Report < ApplicationRecord
|
||||
|
||||
validates :comment, length: { maximum: 1000 }
|
||||
|
||||
def local?
|
||||
false # Force uri_for to use uri attribute
|
||||
end
|
||||
|
||||
before_validation :set_uri, only: :create
|
||||
|
||||
def object_type
|
||||
:flag
|
||||
end
|
||||
@ -89,4 +96,8 @@ class Report < ApplicationRecord
|
||||
|
||||
Admin::ActionLog.from("(#{sql}) AS admin_action_logs")
|
||||
end
|
||||
|
||||
def set_uri
|
||||
self.uri = ActivityPub::TagManager.instance.generate_uri_for(self) if uri.nil? && account.local?
|
||||
end
|
||||
end
|
||||
|
@ -473,8 +473,8 @@ class Status < ApplicationRecord
|
||||
end
|
||||
|
||||
def set_visibility
|
||||
self.visibility = reblog.visibility if reblog? && visibility.nil?
|
||||
self.visibility = (account.locked? ? :private : :public) if visibility.nil?
|
||||
self.visibility = reblog.visibility if reblog?
|
||||
self.sensitive = false if sensitive.nil?
|
||||
end
|
||||
|
||||
|
@ -5,7 +5,6 @@ class ActivityPub::FlagSerializer < ActiveModel::Serializer
|
||||
attribute :virtual_object, key: :object
|
||||
|
||||
def id
|
||||
# This is nil for now
|
||||
ActivityPub::TagManager.instance.uri_for(object)
|
||||
end
|
||||
|
||||
|
@ -21,7 +21,8 @@ class ReportService < BaseService
|
||||
@report = @source_account.reports.create!(
|
||||
target_account: @target_account,
|
||||
status_ids: @status_ids,
|
||||
comment: @comment
|
||||
comment: @comment,
|
||||
uri: @options[:uri]
|
||||
)
|
||||
end
|
||||
|
||||
|
@ -13,13 +13,20 @@
|
||||
%strong= t 'relationships.status'
|
||||
%ul
|
||||
%li= filter_link_to t('generic.all'), status: nil
|
||||
%li= filter_link_to t('relationships.active'), status: 'active'
|
||||
%li= filter_link_to t('relationships.abandoned'), status: 'abandoned'
|
||||
%li= filter_link_to t('relationships.primary'), status: 'primary'
|
||||
%li= filter_link_to t('relationships.moved'), status: 'moved'
|
||||
|
||||
.filter-subset
|
||||
%strong= t 'relationships.activity'
|
||||
%ul
|
||||
%li= filter_link_to t('generic.all'), activity: nil
|
||||
%li= filter_link_to t('relationships.dormant'), activity: 'dormant'
|
||||
|
||||
= form_for(@form, url: relationships_path, method: :patch) do |f|
|
||||
= hidden_field_tag :page, params[:page] || 1
|
||||
= hidden_field_tag :relationship, params[:relationship]
|
||||
= hidden_field_tag :status, params[:status]
|
||||
= hidden_field_tag :activity, params[:activity]
|
||||
|
||||
.batch-table
|
||||
.batch-table__toolbar
|
||||
|
Reference in New Issue
Block a user