2018-08-18 11:19:57 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-11-11 15:09:58 +00:00
|
|
|
module EmailsHelper
|
2017-02-07 15:06:27 +00:00
|
|
|
include AppearancesHelper
|
|
|
|
|
2014-11-11 15:09:58 +00:00
|
|
|
# Google Actions
|
|
|
|
# https://developers.google.com/gmail/markup/reference/go-to-action
|
2014-11-12 10:59:57 +00:00
|
|
|
def email_action(url)
|
|
|
|
name = action_title(url)
|
|
|
|
if name
|
|
|
|
data = {
|
|
|
|
"@context" => "http://schema.org",
|
|
|
|
"@type" => "EmailMessage",
|
|
|
|
"action" => {
|
|
|
|
"@type" => "ViewAction",
|
|
|
|
"name" => name,
|
2017-05-03 11:22:03 +00:00
|
|
|
"url" => url
|
2014-11-12 10:59:57 +00:00
|
|
|
}
|
2014-11-11 15:09:58 +00:00
|
|
|
}
|
|
|
|
|
2014-11-12 10:59:57 +00:00
|
|
|
content_tag :script, type: 'application/ld+json' do
|
|
|
|
data.to_json.html_safe
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def action_title(url)
|
|
|
|
return unless url
|
2017-11-14 09:02:39 +00:00
|
|
|
|
2017-02-22 17:46:57 +00:00
|
|
|
%w(merge_requests issues commit).each do |action|
|
2014-11-12 10:59:57 +00:00
|
|
|
if url.split("/").include?(action)
|
|
|
|
return "View #{action.humanize.singularize}"
|
|
|
|
end
|
2014-11-11 15:09:58 +00:00
|
|
|
end
|
2015-11-25 12:53:02 +00:00
|
|
|
|
|
|
|
nil
|
2014-11-11 15:09:58 +00:00
|
|
|
end
|
2015-01-16 13:38:53 +00:00
|
|
|
|
2019-01-15 14:21:37 +00:00
|
|
|
def sanitize_name(name)
|
|
|
|
if name =~ URI::DEFAULT_PARSER.regexp[:URI_REF]
|
|
|
|
name.tr('.', '_')
|
|
|
|
else
|
|
|
|
name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-04-27 04:04:33 +00:00
|
|
|
def password_reset_token_valid_time
|
|
|
|
valid_hours = Devise.reset_password_within / 60 / 60
|
|
|
|
if valid_hours >= 24
|
|
|
|
unit = 'day'
|
|
|
|
valid_length = (valid_hours / 24).floor
|
|
|
|
else
|
|
|
|
unit = 'hour'
|
|
|
|
valid_length = valid_hours.floor
|
|
|
|
end
|
|
|
|
|
|
|
|
pluralize(valid_length, unit)
|
|
|
|
end
|
|
|
|
|
2017-02-07 15:06:27 +00:00
|
|
|
def header_logo
|
2018-04-02 14:27:12 +00:00
|
|
|
if current_appearance&.header_logo?
|
2017-02-17 09:05:13 +00:00
|
|
|
image_tag(
|
2018-12-25 08:24:00 +00:00
|
|
|
current_appearance.header_logo_path,
|
2017-02-17 09:05:13 +00:00
|
|
|
style: 'height: 50px'
|
|
|
|
)
|
2017-02-07 15:06:27 +00:00
|
|
|
else
|
|
|
|
image_tag(
|
|
|
|
image_url('mailers/gitlab_header_logo.gif'),
|
2017-07-24 17:36:52 +00:00
|
|
|
size: '55x50',
|
|
|
|
alt: 'GitLab'
|
2017-02-07 15:06:27 +00:00
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2017-05-10 15:38:37 +00:00
|
|
|
|
|
|
|
def email_default_heading(text)
|
|
|
|
content_tag :h1, text, style: [
|
|
|
|
"font-family:'Helvetica Neue',Helvetica,Arial,sans-serif",
|
|
|
|
'color:#333333',
|
|
|
|
'font-size:18px',
|
|
|
|
'font-weight:400',
|
|
|
|
'line-height:1.4',
|
|
|
|
'padding:0',
|
|
|
|
'margin:0',
|
|
|
|
'text-align:center'
|
|
|
|
].join(';')
|
|
|
|
end
|
2017-12-28 17:25:02 +00:00
|
|
|
|
2019-05-16 11:59:02 +00:00
|
|
|
def closure_reason_text(closed_via, format: nil)
|
|
|
|
case closed_via
|
|
|
|
when MergeRequest
|
|
|
|
merge_request = MergeRequest.find(closed_via[:id]).present
|
|
|
|
|
2019-08-08 19:29:45 +00:00
|
|
|
return "" unless Ability.allowed?(@recipient, :read_merge_request, merge_request)
|
|
|
|
|
2019-05-16 11:59:02 +00:00
|
|
|
case format
|
|
|
|
when :html
|
2019-06-04 09:56:32 +00:00
|
|
|
merge_request_link = link_to(merge_request.to_reference, merge_request.web_url)
|
|
|
|
_("via merge request %{link}").html_safe % { link: merge_request_link }
|
2019-05-16 11:59:02 +00:00
|
|
|
else
|
|
|
|
# If it's not HTML nor text then assume it's text to be safe
|
2019-06-04 09:56:32 +00:00
|
|
|
_("via merge request %{link}") % { link: "#{merge_request.to_reference} (#{merge_request.web_url})" }
|
2019-05-16 11:59:02 +00:00
|
|
|
end
|
|
|
|
when String
|
|
|
|
# Technically speaking this should be Commit but per
|
2019-09-18 14:02:45 +00:00
|
|
|
# https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/15610#note_163812339
|
2019-05-16 11:59:02 +00:00
|
|
|
# we can't deserialize Commit without custom serializer for ActiveJob
|
2019-08-08 19:29:45 +00:00
|
|
|
return "" unless Ability.allowed?(@recipient, :download_code, @project)
|
|
|
|
|
2019-06-04 09:56:32 +00:00
|
|
|
_("via %{closed_via}") % { closed_via: closed_via }
|
2019-05-16 11:59:02 +00:00
|
|
|
else
|
|
|
|
""
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-12-04 21:07:31 +00:00
|
|
|
# "You are receiving this email because #{reason} on #{gitlab_host}."
|
2017-12-28 17:25:02 +00:00
|
|
|
def notification_reason_text(reason)
|
2019-12-04 21:07:31 +00:00
|
|
|
gitlab_host = Gitlab.config.gitlab.host
|
|
|
|
|
|
|
|
case reason
|
|
|
|
when NotificationReason::OWN_ACTIVITY
|
|
|
|
_("You're receiving this email because of your activity on %{host}.") % { host: gitlab_host }
|
|
|
|
when NotificationReason::ASSIGNED
|
|
|
|
_("You're receiving this email because you have been assigned an item on %{host}.") % { host: gitlab_host }
|
|
|
|
when NotificationReason::MENTIONED
|
|
|
|
_("You're receiving this email because you have been mentioned on %{host}.") % { host: gitlab_host }
|
|
|
|
else
|
|
|
|
_("You're receiving this email because of your account on %{host}.") % { host: gitlab_host }
|
|
|
|
end
|
2017-12-28 17:25:02 +00:00
|
|
|
end
|
2018-12-13 11:15:48 +00:00
|
|
|
|
|
|
|
def create_list_id_string(project, list_id_max_length = 255)
|
|
|
|
project_path_as_domain = project.full_path.downcase
|
|
|
|
.split('/').reverse.join('/')
|
|
|
|
.gsub(%r{[^a-z0-9\/]}, '-')
|
|
|
|
.gsub(%r{\/+}, '.')
|
|
|
|
.gsub(/(\A\.+|\.+\z)/, '')
|
|
|
|
|
|
|
|
max_domain_length = list_id_max_length - Gitlab.config.gitlab.host.length - project.id.to_s.length - 2
|
|
|
|
|
|
|
|
if max_domain_length < 3
|
|
|
|
return project.id.to_s + "..." + Gitlab.config.gitlab.host
|
|
|
|
end
|
|
|
|
|
|
|
|
if project_path_as_domain.length > max_domain_length
|
|
|
|
project_path_as_domain = project_path_as_domain.slice(0, max_domain_length)
|
|
|
|
|
|
|
|
last_dot_index = project_path_as_domain[0..-2].rindex(".")
|
|
|
|
last_dot_index ||= max_domain_length - 2
|
|
|
|
|
|
|
|
project_path_as_domain = project_path_as_domain.slice(0, last_dot_index).concat("..")
|
|
|
|
end
|
|
|
|
|
|
|
|
project.id.to_s + "." + project_path_as_domain + "." + Gitlab.config.gitlab.host
|
|
|
|
end
|
2019-02-20 15:18:15 +00:00
|
|
|
|
|
|
|
def html_header_message
|
|
|
|
return unless show_header?
|
|
|
|
|
|
|
|
render_message(:header_message, style: '')
|
|
|
|
end
|
|
|
|
|
|
|
|
def html_footer_message
|
|
|
|
return unless show_footer?
|
|
|
|
|
|
|
|
render_message(:footer_message, style: '')
|
|
|
|
end
|
|
|
|
|
|
|
|
def text_header_message
|
|
|
|
return unless show_header?
|
|
|
|
|
|
|
|
strip_tags(render_message(:header_message, style: ''))
|
|
|
|
end
|
|
|
|
|
|
|
|
def text_footer_message
|
|
|
|
return unless show_footer?
|
|
|
|
|
|
|
|
strip_tags(render_message(:footer_message, style: ''))
|
|
|
|
end
|
|
|
|
|
2020-08-20 15:10:18 +00:00
|
|
|
def say_hi(user)
|
|
|
|
_('Hi %{username}!') % { username: sanitize_name(user.name) }
|
|
|
|
end
|
|
|
|
|
2020-09-04 09:08:38 +00:00
|
|
|
def say_hello(user)
|
|
|
|
_('Hello, %{username}!') % { username: sanitize_name(user.name) }
|
|
|
|
end
|
|
|
|
|
2020-08-20 15:10:18 +00:00
|
|
|
def two_factor_authentication_disabled_text
|
|
|
|
_('Two-factor authentication has been disabled for your GitLab account.')
|
|
|
|
end
|
|
|
|
|
|
|
|
def re_enable_two_factor_authentication_text(format: nil)
|
|
|
|
url = profile_two_factor_auth_url
|
|
|
|
|
|
|
|
case format
|
|
|
|
when :html
|
2020-09-04 09:08:38 +00:00
|
|
|
settings_link_to = generate_link(_('two-factor authentication settings'), url).html_safe
|
2020-08-20 15:10:18 +00:00
|
|
|
_("If you want to re-enable two-factor authentication, visit the %{settings_link_to} page.").html_safe % { settings_link_to: settings_link_to }
|
|
|
|
else
|
|
|
|
_('If you want to re-enable two-factor authentication, visit %{two_factor_link}') %
|
|
|
|
{ two_factor_link: url }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-09-04 09:08:38 +00:00
|
|
|
def admin_changed_password_text(format: nil)
|
|
|
|
url = Gitlab.config.gitlab.url
|
|
|
|
|
|
|
|
case format
|
|
|
|
when :html
|
|
|
|
link_to = generate_link(url, url).html_safe
|
|
|
|
_('An administrator changed the password for your GitLab account on %{link_to}.').html_safe % { link_to: link_to }
|
|
|
|
else
|
|
|
|
_('An administrator changed the password for your GitLab account on %{link_to}.') % { link_to: url }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def contact_your_administrator_text
|
|
|
|
_('Please contact your administrator with any questions.')
|
|
|
|
end
|
|
|
|
|
2020-09-21 12:09:34 +00:00
|
|
|
def change_reviewer_notification_text(new_reviewers, previous_reviewers, html_tag = nil)
|
|
|
|
new = new_reviewers.any? ? users_to_sentence(new_reviewers) : s_('ChangeReviewer|Unassigned')
|
|
|
|
old = previous_reviewers.any? ? users_to_sentence(previous_reviewers) : nil
|
|
|
|
|
|
|
|
if html_tag.present?
|
|
|
|
new = content_tag(html_tag, new)
|
|
|
|
old = content_tag(html_tag, old) if old.present?
|
|
|
|
end
|
|
|
|
|
|
|
|
if old.present?
|
|
|
|
s_('ChangeReviewer|Reviewer changed from %{old} to %{new}').html_safe % { old: old, new: new }
|
|
|
|
else
|
|
|
|
s_('ChangeReviewer|Reviewer changed to %{new}').html_safe % { new: new }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-02-20 15:18:15 +00:00
|
|
|
private
|
|
|
|
|
2020-09-21 12:09:34 +00:00
|
|
|
def users_to_sentence(users)
|
|
|
|
sanitize_name(users.map(&:name).to_sentence)
|
|
|
|
end
|
|
|
|
|
2020-09-04 09:08:38 +00:00
|
|
|
def generate_link(text, url)
|
|
|
|
link_to(text, url, target: :_blank, rel: 'noopener noreferrer')
|
|
|
|
end
|
|
|
|
|
2019-02-20 15:18:15 +00:00
|
|
|
def show_footer?
|
|
|
|
email_header_and_footer_enabled? && current_appearance&.show_footer?
|
|
|
|
end
|
|
|
|
|
|
|
|
def show_header?
|
|
|
|
email_header_and_footer_enabled? && current_appearance&.show_header?
|
|
|
|
end
|
|
|
|
|
|
|
|
def email_header_and_footer_enabled?
|
|
|
|
current_appearance&.email_header_and_footer_enabled?
|
|
|
|
end
|
2014-11-11 15:09:58 +00:00
|
|
|
end
|
2019-09-13 13:26:31 +00:00
|
|
|
|
|
|
|
EmailsHelper.prepend_if_ee('EE::EmailsHelper')
|