Compare commits

...

12 Commits

Author SHA1 Message Date
Christian Schmidt
38bf54875f
Merge 8e39cbf54f into 4c0e44ebbe 2024-10-03 17:07:16 +00:00
Claire
4c0e44ebbe
Fix recently-broken admin interface buttons (#32240)
Some checks are pending
Check i18n / check-i18n (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
CSS Linting / lint (push) Waiting to run
Haml Linting / lint (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.1) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / Libvips tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / Libvips tests (3.1) (push) Blocked by required conditions
Ruby Testing / Libvips tests (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.1) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.1, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
2024-10-03 16:12:15 +00:00
Christian Schmidt
8e39cbf54f Merge remote-tracking branch 'upstream/main' into default-time-zone
# Conflicts:
#	app/mailers/notification_mailer.rb
2024-09-25 21:16:02 +02:00
Christian Schmidt
2ed5984bb8 Merge remote-tracking branch 'upstream/main' into default-time-zone
# Conflicts:
#	app/mailers/admin_mailer.rb
#	spec/mailers/notification_mailer_spec.rb
#	spec/support/examples/mailers.rb
2024-09-24 17:45:12 +02:00
Christian Schmidt
46536de358 Merge remote-tracking branch 'upstream/main' into default-time-zone
# Conflicts:
#	app/mailers/notification_mailer.rb
2024-09-19 17:17:34 +02:00
Christian Schmidt
0c0acc245a Merge remote-tracking branch 'upstream/main' into default-time-zone 2024-09-19 16:31:41 +02:00
Christian Schmidt
ccd65dc0e2 Avoid repeating timestamp 2024-09-17 18:28:47 +02:00
Christian Schmidt
b1b937aaba Store default in config.x 2024-09-17 18:18:23 +02:00
Christian Schmidt
c89ee2f5b4 with_user to with_user_settings 2024-09-16 21:28:38 +02:00
Christian Schmidt
7dd97dead4 Preview with user account 2024-09-16 21:24:43 +02:00
Christian Schmidt
5d7e12b72d Move time zone logic into mailers 2024-09-12 18:35:06 +02:00
Christian Schmidt
0854edefb7 Set default time zone via env 2024-09-07 16:23:46 +02:00
29 changed files with 126 additions and 108 deletions

View File

@ -19,10 +19,6 @@ code {
margin-bottom: 24px;
}
form.button_to {
display: inline-block;
}
.fade-out-top {
position: relative;
overflow: hidden;

View File

@ -16,7 +16,7 @@ class AdminMailer < ApplicationMailer
def new_report(report)
@report = report
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance, id: @report.id)
end
end
@ -24,7 +24,7 @@ class AdminMailer < ApplicationMailer
def new_appeal(appeal)
@appeal = appeal
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance, username: @appeal.account.username)
end
end
@ -32,7 +32,7 @@ class AdminMailer < ApplicationMailer
def new_pending_account(user)
@account = user.account
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance, username: @account.username)
end
end
@ -42,7 +42,7 @@ class AdminMailer < ApplicationMailer
@tags = tags
@statuses = statuses
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance)
end
end
@ -50,7 +50,7 @@ class AdminMailer < ApplicationMailer
def new_software_updates
@software_updates = SoftwareUpdate.all.to_a.sort_by(&:gem_version)
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance)
end
end
@ -58,13 +58,13 @@ class AdminMailer < ApplicationMailer
def new_critical_software_updates
@software_updates = SoftwareUpdate.where(urgent: true).to_a.sort_by(&:gem_version)
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance)
end
end
def auto_close_registrations
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(instance: @instance)
end
end
@ -73,6 +73,7 @@ class AdminMailer < ApplicationMailer
def process_params
@me = params[:recipient]
@user = @me.user
end
def set_instance

View File

@ -11,8 +11,10 @@ class ApplicationMailer < ActionMailer::Base
protected
def locale_for_account(account, &block)
I18n.with_locale(account.user_locale || I18n.default_locale, &block)
def with_user_settings(user, &block)
I18n.with_locale(user.locale || I18n.default_locale) do
Time.use_zone(user.time_zone || Rails.configuration.x.default_time_zone, &block)
end
end
def set_autoreply_headers!

View File

@ -22,13 +22,13 @@ class NotificationMailer < ApplicationMailer
def mention
return if @status.blank?
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(name: @status.account.acct)
end
end
def follow
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(name: @account.acct)
end
end
@ -36,7 +36,7 @@ class NotificationMailer < ApplicationMailer
def favourite
return if @status.blank?
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(name: @account.acct)
end
end
@ -44,13 +44,13 @@ class NotificationMailer < ApplicationMailer
def reblog
return if @status.blank?
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(name: @account.acct)
end
end
def follow_request
locale_for_account(@me) do
with_user_settings(@user) do
mail subject: default_i18n_subject(name: @account.acct)
end
end

View File

@ -20,7 +20,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
with_user_settings(@resource) do
mail to: @resource.unconfirmed_email.presence || @resource.email,
subject: I18n.t(@resource.pending_reconfirmation? ? 'devise.mailer.reconfirmation_instructions.subject' : 'devise.mailer.confirmation_instructions.subject', instance: @instance),
template_name: @resource.pending_reconfirmation? ? 'reconfirmation_instructions' : 'confirmation_instructions'
@ -33,7 +33,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -43,7 +43,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -53,7 +53,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -63,7 +63,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -73,7 +73,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -83,7 +83,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -93,7 +93,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -103,7 +103,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: default_devise_subject
end
end
@ -114,7 +114,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: I18n.t('devise.mailer.webauthn_credential.added.subject')
end
end
@ -125,7 +125,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale(use_current_locale: true)) do
with_user_settings(@resource, use_current_locale: true) do
mail subject: I18n.t('devise.mailer.webauthn_credential.deleted.subject')
end
end
@ -141,7 +141,7 @@ class UserMailer < Devise::Mailer
@has_active_relationships = @resource.account.active_relationships.exists?
@has_statuses = @resource.account.statuses.exists?
I18n.with_locale(locale) do
with_user_settings(@resource) do
mail subject: default_i18n_subject
end
end
@ -152,7 +152,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
with_user_settings(@resource) do
mail subject: default_i18n_subject
end
end
@ -162,7 +162,7 @@ class UserMailer < Devise::Mailer
@warning = warning
@statuses = @warning.statuses.includes(:account, :preloadable_poll, :media_attachments, active_mentions: [:account])
I18n.with_locale(locale) do
with_user_settings(@resource) do
mail subject: I18n.t("user_mailer.warning.subject.#{@warning.action}", acct: "@#{user.account.local_username_and_domain}")
end
end
@ -171,7 +171,7 @@ class UserMailer < Devise::Mailer
@resource = user
@appeal = appeal
I18n.with_locale(locale) do
with_user_settings(@resource) do
mail subject: default_i18n_subject(date: l(@appeal.created_at))
end
end
@ -180,7 +180,7 @@ class UserMailer < Devise::Mailer
@resource = user
@appeal = appeal
I18n.with_locale(locale) do
with_user_settings(@resource) do
mail subject: default_i18n_subject(date: l(@appeal.created_at))
end
end
@ -190,9 +190,10 @@ class UserMailer < Devise::Mailer
@remote_ip = remote_ip
@user_agent = user_agent
@detection = Browser.new(user_agent)
@timestamp = timestamp.to_time.utc
I18n.with_locale(locale) do
with_user_settings(@resource) do
@timestamp = timestamp.in_time_zone
mail subject: default_i18n_subject
end
end
@ -202,9 +203,10 @@ class UserMailer < Devise::Mailer
@remote_ip = remote_ip
@user_agent = user_agent
@detection = Browser.new(user_agent)
@timestamp = timestamp.to_time.utc
I18n.with_locale(locale) do
with_user_settings(@resource) do
@timestamp = timestamp.in_time_zone
mail subject: default_i18n_subject
end
end
@ -219,7 +221,9 @@ class UserMailer < Devise::Mailer
@instance = Rails.configuration.x.local_domain
end
def locale(use_current_locale: false)
@resource.locale.presence || (use_current_locale && I18n.locale) || I18n.default_locale
def with_user_settings(user, use_current_locale: false, &block)
I18n.with_locale(user.locale || (use_current_locale && I18n.locale) || I18n.default_locale) do
Time.use_zone(user.time_zone || Rails.configuration.x.default_time_zone, &block)
end
end
end

View File

@ -4,8 +4,8 @@
%p.muted-hint= deletion_request.present? ? t('admin.accounts.remote_suspension_reversible_hint_html', date: content_tag(:strong, l(deletion_request.due_at.to_date))) : t('admin.accounts.remote_suspension_irreversible')
- else
%p.muted-hint= deletion_request.present? ? t('admin.accounts.suspension_reversible_hint_html', date: content_tag(:strong, l(deletion_request.due_at.to_date))) : t('admin.accounts.suspension_irreversible')
= button_to t('admin.accounts.undo_suspension'), unsuspend_admin_account_path(account.id), class: :button if can?(:unsuspend, account)
= button_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), class: :button if can?(:redownload, account) && account.suspension_origin_remote?
= link_to t('admin.accounts.undo_suspension'), unsuspend_admin_account_path(account.id), method: :post, class: 'button' if can?(:unsuspend, account)
= link_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), method: :post, class: 'button' if can?(:redownload, account) && account.suspension_origin_remote?
- if deletion_request.present? && can?(:destroy, account)
= link_to t('admin.accounts.delete'), admin_account_path(account.id), method: :delete, class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure') }
- else
@ -14,28 +14,28 @@
- if account.local? && account.user_approved?
= link_to t('admin.accounts.warn'), new_admin_account_action_path(account.id, type: 'none'), class: 'button' if can?(:warn, account)
- if account.user_disabled?
= button_to t('admin.accounts.enable'), enable_admin_account_path(account.id), class: :button if can?(:enable, account.user)
= link_to t('admin.accounts.enable'), enable_admin_account_path(account.id), method: :post, class: 'button' if can?(:enable, account.user)
- elsif can?(:disable, account.user)
= link_to t('admin.accounts.disable'), new_admin_account_action_path(account.id, type: 'disable'), class: 'button'
- if account.sensitized?
= button_to t('admin.accounts.undo_sensitized'), unsensitive_admin_account_path(account.id), class: :button if can?(:unsensitive, account)
= link_to t('admin.accounts.undo_sensitized'), unsensitive_admin_account_path(account.id), method: :post, class: 'button' if can?(:unsensitive, account)
- elsif !account.local? || account.user_approved?
= link_to t('admin.accounts.sensitive'), new_admin_account_action_path(account.id, type: 'sensitive'), class: 'button' if can?(:sensitive, account)
- if account.silenced?
= button_to t('admin.accounts.undo_silenced'), unsilence_admin_account_path(account.id), class: :button if can?(:unsilence, account)
= link_to t('admin.accounts.undo_silenced'), unsilence_admin_account_path(account.id), method: :post, class: 'button' if can?(:unsilence, account)
- elsif !account.local? || account.user_approved?
= link_to t('admin.accounts.silence'), new_admin_account_action_path(account.id, type: 'silence'), class: 'button' if can?(:silence, account)
- if account.local?
- if account.user_pending?
= button_to t('admin.accounts.approve'), approve_admin_account_path(account.id), data: { confirm: t('admin.accounts.are_you_sure') }, class: :button if can?(:approve, account.user)
= button_to t('admin.accounts.reject'), reject_admin_account_path(account.id), data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:reject, account.user)
= link_to t('admin.accounts.approve'), approve_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' if can?(:approve, account.user)
= link_to t('admin.accounts.reject'), reject_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:reject, account.user)
- if !account.user_confirmed? && can?(:confirm, account.user)
= button_to t('admin.accounts.confirm'), admin_account_confirmation_path(account.id), class: :button
= link_to t('admin.accounts.confirm'), admin_account_confirmation_path(account.id), method: :post, class: 'button'
- if (!account.local? || account.user_approved?) && can?(:suspend, account)
= link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(account.id, type: 'suspend'), class: 'button'
%div
- if account.local?
- if !account.memorial? && account.user_approved? && can?(:memorialize, account)
= button_to t('admin.accounts.memorialize'), memorialize_admin_account_path(account.id), data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive'
= link_to t('admin.accounts.memorialize'), memorialize_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive'
- elsif can?(:redownload, account)
= button_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), class: :button
= link_to t('admin.accounts.redownload'), redownload_admin_account_path(account.id), method: :post, class: 'button'

View File

@ -30,7 +30,7 @@
= render 'admin/accounts/counters', account: @account
- if @account.local? && @account.user.nil?
= button_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), class: :button if can?(:unblock_email, @account) && CanonicalEmailBlock.exists?(reference_account_id: @account.id)
= link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.exists?(reference_account_id: @account.id)
- else
.table-wrapper
%table.table.inline-table

View File

@ -21,7 +21,7 @@
- if @instance.domain_allow
= link_to t('admin.domain_allows.undo'), admin_domain_allow_path(@instance.domain_allow), class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure'), method: :delete }
- else
= button_to t('admin.domain_allows.add_new'), admin_domain_allows_path(domain_allow: { domain: @instance.domain }), class: :button
= link_to t('admin.domain_allows.add_new'), admin_domain_allows_path(domain_allow: { domain: @instance.domain }), class: 'button', method: :post
- else
%p= t('admin.instances.content_policies.description_html')
@ -40,7 +40,7 @@
%td= @instance.domain_block.policies.map { |policy| t(policy, scope: 'admin.instances.content_policies.policies') }.join(' · ')
= link_to t('admin.domain_blocks.edit'), edit_admin_domain_block_path(@instance.domain_block), class: 'button'
= button_to t('admin.domain_blocks.undo'), admin_domain_block_path(@instance.domain_block), class: :button, data: { confirm: t('admin.accounts.are_you_sure'), method: :delete }
= link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@instance.domain_block), class: 'button', data: { confirm: t('admin.accounts.are_you_sure'), method: :delete }
- else
= link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @instance.domain), class: 'button'
@ -70,16 +70,16 @@
- if @instance.unavailable?
%span.negative-hint
= t('admin.instances.availability.failure_threshold_reached', date: l(@instance.unavailable_domain.created_at.to_date))
= button_to t('admin.instances.delivery.restart'), restart_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure') }
= link_to t('admin.instances.delivery.restart'), restart_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post }
- elsif @instance.exhausted_deliveries_days.empty?
%span.positive-hint
= t('admin.instances.availability.no_failures_recorded')
= button_to t('admin.instances.delivery.stop'), stop_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure') }
= link_to t('admin.instances.delivery.stop'), stop_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post }
- else
%span.negative-hint
= t('admin.instances.availability.failures_recorded', count: @instance.delivery_failure_tracker.days)
%span= button_to t('admin.instances.delivery.clear'), clear_delivery_errors_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure') } unless @instance.exhausted_deliveries_days.empty?
%span= button_to t('admin.instances.delivery.stop'), stop_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure') }
%span= link_to t('admin.instances.delivery.clear'), clear_delivery_errors_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post } unless @instance.exhausted_deliveries_days.empty?
%span= link_to t('admin.instances.delivery.stop'), stop_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post }
- if @instance.purgeable?
%p= t('admin.instances.purge_description_html')

View File

@ -34,4 +34,4 @@
= paginate @invites
- if policy(:invite).deactivate_all?
= button_to t('admin.invites.deactivate_all'), deactivate_all_admin_invites_path, data: { confirm: t('admin.accounts.are_you_sure') }, class: :button
= link_to t('admin.invites.deactivate_all'), deactivate_all_admin_invites_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button'

View File

@ -2,7 +2,7 @@
.report-actions
.report-actions__item
.report-actions__item__button
= button_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(report), class: :button
= link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(report), method: :post, class: 'button'
.report-actions__item__description
= t('admin.reports.actions.resolve_description_html')
- if statuses.any? { |status| (status.with_media? || status.with_preview_card?) && !status.discarded? }

View File

@ -3,9 +3,9 @@
- content_for :heading_actions do
- if @report.unresolved?
= button_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), class: :button
= link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), method: :post, class: 'button'
- else
= button_to t('admin.reports.mark_as_unresolved'), reopen_admin_report_path(@report), class: :button
= link_to t('admin.reports.mark_as_unresolved'), reopen_admin_report_path(@report), method: :post, class: 'button'
- unless @report.account.local? || @report.target_account.local?
.flash-message= t('admin.reports.forwarded_replies_explanation')

View File

@ -3,8 +3,8 @@
- content_for :heading_actions do
- if @appeal.persisted?
= button_to t('disputes.strikes.approve_appeal'), approve_admin_disputes_appeal_path(@appeal), class: :button if can?(:approve, @appeal)
= button_to t('disputes.strikes.reject_appeal'), reject_admin_disputes_appeal_path(@appeal), class: 'button button--destructive' if can?(:reject, @appeal)
= link_to t('disputes.strikes.approve_appeal'), approve_admin_disputes_appeal_path(@appeal), method: :post, class: 'button' if can?(:approve, @appeal)
= link_to t('disputes.strikes.reject_appeal'), reject_admin_disputes_appeal_path(@appeal), method: :post, class: 'button button--destructive' if can?(:reject, @appeal)
- if @strike.overruled?
%p.hint

View File

@ -28,4 +28,4 @@
= link_to a.remote_url, a.remote_url
%p.email-status-footer
= link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}")
= link_to l(status.created_at, format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}")

View File

@ -46,7 +46,7 @@
%p.muted-hint= t('exports.archive_takeout.hint_html')
- if policy(:backup).create?
%p= button_to t('exports.archive_takeout.request'), settings_export_path, class: :button
%p= link_to t('exports.archive_takeout.request'), settings_export_path, class: 'button', method: :post
- unless @backups.empty?
%hr.spacer/

View File

@ -6,4 +6,4 @@
%hr.spacer/
= button_to t('otp_authentication.setup'), settings_otp_authentication_path, class: 'block-button'
= link_to t('otp_authentication.setup'), settings_otp_authentication_path, data: { method: :post }, class: 'block-button'

View File

@ -2,7 +2,7 @@
= t('settings.two_factor_authentication')
- content_for :heading_actions do
= button_to t('two_factor_authentication.disable'), disable_settings_two_factor_authentication_methods_path, class: 'button button--destructive'
= link_to t('two_factor_authentication.disable'), disable_settings_two_factor_authentication_methods_path, class: 'button button--destructive', method: :post
%p.hint
%span.positive-hint
@ -38,4 +38,4 @@
%hr.spacer/
.simple_form
= button_to t('two_factor_authentication.generate_recovery_codes'), settings_two_factor_authentication_recovery_codes_path, class: 'block-button'
= link_to t('two_factor_authentication.generate_recovery_codes'), settings_two_factor_authentication_recovery_codes_path, data: { method: :post }, class: 'block-button'

View File

@ -7,6 +7,6 @@
%tr
%td.email-inner-card-td.email-prose
%p= t 'user_mailer.appeal_approved.explanation',
appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone),
strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone)
appeal_date: l(@appeal.created_at, format: :with_time_zone),
strike_date: l(@appeal.strike.created_at, format: :with_time_zone)
= render 'application/mailer/button', text: t('user_mailer.appeal_approved.action'), url: root_url

View File

@ -2,6 +2,6 @@
===
<%= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone), strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) %>
<%= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at, format: :with_time_zone), strike_date: l(@appeal.strike.created_at, format: :with_time_zone) %>
=> <%= root_url %>

View File

@ -7,6 +7,6 @@
%tr
%td.email-inner-card-td.email-prose
%p= t 'user_mailer.appeal_rejected.explanation',
appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone),
strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone)
appeal_date: l(@appeal.created_at, format: :with_time_zone),
strike_date: l(@appeal.strike.created_at, format: :with_time_zone)
= render 'application/mailer/button', text: t('user_mailer.appeal_approved.action'), url: root_url

View File

@ -2,6 +2,6 @@
===
<%= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone), strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) %>
<%= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at, format: :with_time_zone), strike_date: l(@appeal.strike.created_at, format: :with_time_zone) %>
=> <%= root_url %>

View File

@ -18,7 +18,7 @@
platform: t("sessions.platforms.#{@detection.platform.id}", default: @detection.platform.id.to_s)
%br/
%strong #{t('sessions.date')}:
= l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone)
= l(@timestamp, format: :with_time_zone)
= render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url
%p= t 'user_mailer.failed_2fa.further_actions_html',
action: link_to(t('user_mailer.suspicious_sign_in.change_password'), edit_user_registration_url)

View File

@ -8,7 +8,7 @@
<%= t('sessions.ip') %>: <%= @remote_ip %>
<%= t('sessions.browser') %>: <%= t('sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")) %>
<%= l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) %>
<%= l(@timestamp, format: :with_time_zone) %>
<%= t 'user_mailer.failed_2fa.further_actions_html', action: t('user_mailer.suspicious_sign_in.change_password') %>

View File

@ -18,7 +18,7 @@
platform: t("sessions.platforms.#{@detection.platform.id}", default: @detection.platform.id.to_s)
%br/
%strong #{t('sessions.date')}:
= l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone)
= l(@timestamp, format: :with_time_zone)
= render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url
%p= t 'user_mailer.suspicious_sign_in.further_actions_html',
action: link_to(t('user_mailer.suspicious_sign_in.change_password'), edit_user_registration_url)

View File

@ -8,7 +8,7 @@
<%= t('sessions.ip') %>: <%= @remote_ip %>
<%= t('sessions.browser') %>: <%= t('sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")) %>
<%= l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) %>
<%= l(@timestamp, format: :with_time_zone) %>
<%= t 'user_mailer.suspicious_sign_in.further_actions_html', action: t('user_mailer.suspicious_sign_in.change_password') %>

View File

@ -0,0 +1,6 @@
# frozen_string_literal: true
# Raise if invalid zone is specified
Rails.application.configure do
config.x.default_time_zone = Time.find_zone!(ENV.fetch('DEFAULT_TIME_ZONE', 'UTC')).name
end

View File

@ -16,8 +16,8 @@ RSpec.describe NotificationMailer do
let(:receiver) { Fabricate(:user, account_attributes: { username: 'alice' }) }
let(:sender) { Fabricate(:account, username: 'bob') }
let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status') }
let(:own_status) { Fabricate(:status, account: receiver.account, text: 'The body of the own status') }
let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status', created_at: '2021-01-01 01:01Z') }
let(:own_status) { Fabricate(:status, account: receiver.account, text: 'The body of the own status', created_at: '2022-02-02 02:02Z') }
describe 'mention' do
let(:mention) { Mention.create!(account: receiver.account, status: foreign_status) }
@ -25,6 +25,7 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(receiver.account).mention }
include_examples 'localized subject', 'notification_mailer.mention.subject', name: 'bob'
include_examples 'timestamp in time zone', '2021-01-01 01:01Z'.to_datetime
it 'renders the email' do
expect(mail)
@ -63,6 +64,7 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(own_status.account).favourite }
include_examples 'localized subject', 'notification_mailer.favourite.subject', name: 'bob'
include_examples 'timestamp in time zone', '2022-02-02 02:02Z'.to_datetime
it 'renders the email' do
expect(mail)
@ -83,6 +85,7 @@ RSpec.describe NotificationMailer do
let(:mail) { prepared_mailer_for(own_status.account).reblog }
include_examples 'localized subject', 'notification_mailer.reblog.subject', name: 'bob'
include_examples 'timestamp in time zone', '2022-02-02 02:02Z'.to_datetime
it 'renders the email' do
expect(mail)

View File

@ -5,36 +5,36 @@
class AdminMailerPreview < ActionMailer::Preview
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_report
def new_report
AdminMailer.with(recipient: Account.first).new_report(Report.first)
AdminMailer.with(recipient: User.first.account).new_report(Report.first)
end
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_appeal
def new_appeal
AdminMailer.with(recipient: Account.first).new_appeal(Appeal.first)
AdminMailer.with(recipient: User.first.account).new_appeal(Appeal.first)
end
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_pending_account
def new_pending_account
AdminMailer.with(recipient: Account.first).new_pending_account(User.pending.first)
AdminMailer.with(recipient: User.first.account).new_pending_account(User.pending.first)
end
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_trends
def new_trends
AdminMailer.with(recipient: Account.first).new_trends(PreviewCard.joins(:trend).limit(3), Tag.limit(3), Status.joins(:trend).where(reblog_of_id: nil).limit(3))
AdminMailer.with(recipient: User.first.account).new_trends(PreviewCard.joins(:trend).limit(3), Tag.limit(3), Status.joins(:trend).where(reblog_of_id: nil).limit(3))
end
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_software_updates
def new_software_updates
AdminMailer.with(recipient: Account.first).new_software_updates
AdminMailer.with(recipient: User.first.account).new_software_updates
end
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_critical_software_updates
def new_critical_software_updates
AdminMailer.with(recipient: Account.first).new_critical_software_updates
AdminMailer.with(recipient: User.first.account).new_critical_software_updates
end
# Preview this email at http://localhost:3000/rails/mailers/admin_mailer/auto_close_registrations
def auto_close_registrations
AdminMailer.with(recipient: Account.first).auto_close_registrations
AdminMailer.with(recipient: User.first.account).auto_close_registrations
end
end

View File

@ -3,14 +3,14 @@
require 'rails_helper'
RSpec.describe UserMailer do
let(:receiver) { Fabricate(:user) }
timestamp = Time.now.utc - 5.minutes
let(:receiver) { Fabricate(:user, locale: nil) }
describe '#confirmation_instructions' do
let(:mail) { described_class.confirmation_instructions(receiver, 'spec') }
it 'renders confirmation instructions' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('devise.mailer.confirmation_instructions.title')))
@ -45,8 +45,6 @@ RSpec.describe UserMailer do
let(:mail) { described_class.reset_password_instructions(receiver, 'spec') }
it 'renders reset password instructions' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('devise.mailer.reset_password_instructions.title')))
@ -61,8 +59,6 @@ RSpec.describe UserMailer do
let(:mail) { described_class.password_change(receiver) }
it 'renders password change notification' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('devise.mailer.password_change.title')))
@ -76,8 +72,6 @@ RSpec.describe UserMailer do
let(:mail) { described_class.email_changed(receiver) }
it 'renders email change notification' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('devise.mailer.email_changed.title')))
@ -92,8 +86,6 @@ RSpec.describe UserMailer do
let(:mail) { described_class.warning(receiver, strike) }
it 'renders warning notification' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('user_mailer.warning.title.suspend', acct: receiver.account.acct)))
@ -106,8 +98,6 @@ RSpec.describe UserMailer do
let(:mail) { described_class.webauthn_credential_deleted(receiver, credential) }
it 'renders webauthn credential deleted notification' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('devise.mailer.webauthn_credential.deleted.title')))
@ -120,12 +110,9 @@ RSpec.describe UserMailer do
describe '#suspicious_sign_in' do
let(:ip) { '192.168.0.1' }
let(:agent) { 'NCSA_Mosaic/2.0 (Windows 3.1)' }
let(:timestamp) { Time.now.utc }
let(:mail) { described_class.suspicious_sign_in(receiver, ip, agent, timestamp) }
it 'renders suspicious sign in notification' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('user_mailer.suspicious_sign_in.explanation')))
@ -133,17 +120,15 @@ RSpec.describe UserMailer do
include_examples 'localized subject',
'user_mailer.suspicious_sign_in.subject'
include_examples 'timestamp in time zone', timestamp
end
describe '#failed_2fa' do
let(:ip) { '192.168.0.1' }
let(:agent) { 'NCSA_Mosaic/2.0 (Windows 3.1)' }
let(:timestamp) { Time.now.utc }
let(:mail) { described_class.failed_2fa(receiver, ip, agent, timestamp) }
it 'renders failed 2FA notification' do
receiver.update!(locale: nil)
expect(mail)
.to be_present
.and(have_body_text(I18n.t('user_mailer.failed_2fa.explanation')))
@ -151,10 +136,11 @@ RSpec.describe UserMailer do
include_examples 'localized subject',
'user_mailer.failed_2fa.subject'
include_examples 'timestamp in time zone', timestamp
end
describe '#appeal_approved' do
let(:appeal) { Fabricate(:appeal, account: receiver.account, approved_at: Time.now.utc) }
let(:appeal) { Fabricate(:appeal, account: receiver.account, created_at: timestamp, approved_at: Time.now.utc) }
let(:mail) { described_class.appeal_approved(receiver, appeal) }
it 'renders appeal_approved notification' do
@ -163,10 +149,12 @@ RSpec.describe UserMailer do
.and(have_subject(I18n.t('user_mailer.appeal_approved.subject', date: I18n.l(appeal.created_at))))
.and(have_body_text(I18n.t('user_mailer.appeal_approved.title')))
end
include_examples 'timestamp in time zone', timestamp
end
describe '#appeal_rejected' do
let(:appeal) { Fabricate(:appeal, account: receiver.account, rejected_at: Time.now.utc) }
let(:appeal) { Fabricate(:appeal, account: receiver.account, created_at: timestamp, rejected_at: Time.now.utc) }
let(:mail) { described_class.appeal_rejected(receiver, appeal) }
it 'renders appeal_rejected notification' do
@ -175,6 +163,8 @@ RSpec.describe UserMailer do
.and(have_subject(I18n.t('user_mailer.appeal_rejected.subject', date: I18n.l(appeal.created_at))))
.and(have_body_text(I18n.t('user_mailer.appeal_rejected.title')))
end
include_examples 'timestamp in time zone', timestamp
end
describe '#two_factor_enabled' do

View File

@ -13,6 +13,22 @@ RSpec.shared_examples 'localized subject' do |*args, **kwrest|
end
end
RSpec.shared_examples 'timestamp in time zone' do |at|
it 'displays timestamp in time zone of the receiver' do
time_zone = 'Europe/Berlin'
receiver.update!(time_zone: time_zone)
expect(mail)
.to have_body_text(at.in_time_zone(time_zone).strftime(I18n.t('time.formats.with_time_zone')))
end
it 'displays timestamp in default time zone if the time zone of the receiver is unavailable' do
allow(Rails.configuration.x).to receive(:default_time_zone).and_return('Europe/Athens')
receiver.update!(time_zone: nil)
expect(mail).to have_body_text(at.in_time_zone('Europe/Athens').strftime(I18n.t('time.formats.with_time_zone')))
end
end
RSpec::Matchers.define :have_thread_headers do
match(notify_expectation_failures: true) do |mail|
expect(mail)