Merge commit 'f05fb51ecb
' into kb_migration
This commit is contained in:
commit
d4bec28e1e
9 changed files with 40 additions and 15 deletions
|
@ -555,7 +555,7 @@ class Status extends ImmutablePureComponent {
|
|||
expanded={!status.get('hidden')}
|
||||
onExpandedToggle={this.handleExpandedToggle}
|
||||
onTranslate={this.handleTranslate}
|
||||
collapsable
|
||||
collapsible
|
||||
onCollapsedToggle={this.handleCollapsedToggle}
|
||||
/>
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ class StatusContent extends React.PureComponent {
|
|||
onExpandedToggle: PropTypes.func,
|
||||
onTranslate: PropTypes.func,
|
||||
onClick: PropTypes.func,
|
||||
collapsable: PropTypes.bool,
|
||||
collapsible: PropTypes.bool,
|
||||
onCollapsedToggle: PropTypes.func,
|
||||
languages: ImmutablePropTypes.map,
|
||||
intl: PropTypes.object,
|
||||
|
@ -112,10 +112,10 @@ class StatusContent extends React.PureComponent {
|
|||
}
|
||||
|
||||
if (status.get('collapsed', null) === null && onCollapsedToggle) {
|
||||
const { collapsable, onClick } = this.props;
|
||||
const { collapsible, onClick } = this.props;
|
||||
|
||||
const collapsed =
|
||||
collapsable
|
||||
collapsible
|
||||
&& onClick
|
||||
&& node.clientHeight > MAX_HEIGHT
|
||||
&& status.get('spoiler_text').length === 0;
|
||||
|
|
|
@ -165,7 +165,7 @@ class Conversation extends ImmutablePureComponent {
|
|||
onClick={this.handleClick}
|
||||
expanded={!lastStatus.get('hidden')}
|
||||
onExpandedToggle={this.handleShowMore}
|
||||
collapsable
|
||||
collapsible
|
||||
/>
|
||||
|
||||
{lastStatus.get('media_attachments').size > 0 && (
|
||||
|
|
|
@ -71,6 +71,7 @@ const messages = defineMessages({
|
|||
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },
|
||||
revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
|
||||
hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },
|
||||
statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {{attachmentCount} attachments}}' },
|
||||
detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
|
||||
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
|
||||
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
|
||||
|
@ -168,13 +169,14 @@ const truncate = (str, num) => {
|
|||
}
|
||||
};
|
||||
|
||||
const titleFromStatus = status => {
|
||||
const titleFromStatus = (intl, status) => {
|
||||
const displayName = status.getIn(['account', 'display_name']);
|
||||
const username = status.getIn(['account', 'username']);
|
||||
const prefix = displayName.trim().length === 0 ? username : displayName;
|
||||
const user = displayName.trim().length === 0 ? username : displayName;
|
||||
const text = status.get('search_index');
|
||||
const attachmentCount = status.get('media_attachments').size;
|
||||
|
||||
return `${prefix}: "${truncate(text, 30)}"`;
|
||||
return text ? `${user}: "${truncate(text, 30)}"` : intl.formatMessage(messages.statusTitleWithAttachments, { user, attachmentCount });
|
||||
};
|
||||
|
||||
class Status extends ImmutablePureComponent {
|
||||
|
@ -695,7 +697,7 @@ class Status extends ImmutablePureComponent {
|
|||
</ScrollContainer>
|
||||
|
||||
<Helmet>
|
||||
<title>{titleFromStatus(status)}</title>
|
||||
<title>{titleFromStatus(intl, status)}</title>
|
||||
<meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />
|
||||
</Helmet>
|
||||
</Column>
|
||||
|
|
|
@ -3732,6 +3732,10 @@
|
|||
"defaultMessage": "Show less for all",
|
||||
"id": "status.show_less_all"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "{user} posted {attachmentCount, plural, one {an attachment} other {{attachmentCount} attachments}}",
|
||||
"id": "status.title.with_attachments"
|
||||
},
|
||||
{
|
||||
"defaultMessage": "Detailed conversation view",
|
||||
"id": "status.detailed_status"
|
||||
|
|
|
@ -611,6 +611,7 @@
|
|||
"status.show_more": "Show more",
|
||||
"status.show_more_all": "Show more for all",
|
||||
"status.show_original": "Show original",
|
||||
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {{attachmentCount} attachments}}",
|
||||
"status.translate": "Translate",
|
||||
"status.translated_from_with": "Translated from {lang} using {provider}",
|
||||
"status.uncached_media_warning": "Not available",
|
||||
|
|
|
@ -597,6 +597,7 @@
|
|||
"status.show_more": "Mostrar más",
|
||||
"status.show_more_all": "Mostrar más para todo",
|
||||
"status.show_original": "Mostrar original",
|
||||
"status.title.with_attachments": "{user} publicó {attachmentCount, plural, one {un archivo adjunto} other {{attachmentCount} archivos adjuntos}}",
|
||||
"status.translate": "Traducir",
|
||||
"status.translated_from_with": "Traducido del {lang} usando {provider}",
|
||||
"status.uncached_media_warning": "No disponible",
|
||||
|
|
|
@ -57,6 +57,7 @@ module Mastodon
|
|||
option :role
|
||||
option :reattach, type: :boolean
|
||||
option :force, type: :boolean
|
||||
option :approve, type: :boolean
|
||||
desc 'create USERNAME', 'Create a new user account'
|
||||
long_desc <<-LONG_DESC
|
||||
Create a new user account with a given USERNAME and an
|
||||
|
@ -72,6 +73,8 @@ module Mastodon
|
|||
account is still in use by someone else, you can supply
|
||||
the --force option to delete the old record and reattach the
|
||||
username to the new account anyway.
|
||||
|
||||
With the --approve option, the account will be approved.
|
||||
LONG_DESC
|
||||
def create(username)
|
||||
role_id = nil
|
||||
|
@ -89,7 +92,7 @@ module Mastodon
|
|||
|
||||
account = Account.new(username: username)
|
||||
password = SecureRandom.hex
|
||||
user = User.new(email: options[:email], password: password, agreement: true, approved: true, role_id: role_id, confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true)
|
||||
user = User.new(email: options[:email], password: password, agreement: true, role_id: role_id, confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true)
|
||||
|
||||
if options[:reattach]
|
||||
account = Account.find_local(username) || Account.new(username: username)
|
||||
|
@ -112,6 +115,8 @@ module Mastodon
|
|||
user.confirm!
|
||||
end
|
||||
|
||||
user.approve! if options[:approve]
|
||||
|
||||
say('OK', :green)
|
||||
say("New password: #{password}")
|
||||
else
|
||||
|
|
|
@ -35,13 +35,25 @@ RSpec.describe ReblogService, type: :service do
|
|||
end
|
||||
|
||||
context 'when the reblogged status is discarded in the meantime' do
|
||||
let(:status) { Fabricate(:status, account: alice, visibility: :public) }
|
||||
let(:status) { Fabricate(:status, account: alice, visibility: :public, text: 'discard-status-text') }
|
||||
|
||||
# Add a callback to discard the status being reblogged after the
|
||||
# validations pass but before the database commit is executed.
|
||||
before do
|
||||
# Update the in-database attribute without reflecting the change in
|
||||
# the object. This cannot simulate all race conditions, but it is
|
||||
# pretty close.
|
||||
Status.where(id: status.id).update_all(deleted_at: Time.now.utc) # rubocop:disable Rails/SkipsModelValidations
|
||||
Status.class_eval do
|
||||
before_save :discard_status
|
||||
def discard_status
|
||||
Status
|
||||
.where(id: reblog_of_id)
|
||||
.where(text: 'discard-status-text')
|
||||
.update_all(deleted_at: Time.now.utc) # rubocop:disable Rails/SkipsModelValidations
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Remove race condition simulating `discard_status` callback.
|
||||
after do
|
||||
Status._save_callbacks.delete(:discard_status)
|
||||
end
|
||||
|
||||
it 'raises an exception' do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue