Module: EmailsHelper

Includes:
AppearancesHelper
Included in:
Notify
Defined in:
app/helpers/emails_helper.rb

Instance Method Summary collapse

Methods included from AppearancesHelper

#brand_header_logo, #brand_image, #brand_new_project_guidelines, #brand_profile_image_guidelines, #brand_text, #brand_title, #current_appearance, #default_brand_title, #footer_message, #header_message

Methods included from Gitlab::Utils::StrongMemoize

#clear_memoization, #strong_memoize, #strong_memoized?

Methods included from MarkupHelper

#asciidoc?, #cross_project_reference, #first_line_in_markdown, #gitlab_markdown?, #link_to_html, #link_to_markdown, #link_to_markdown_field, #markdown, #markdown_field, #markup, #markup?, #markup_unsafe, #plain?, #render_wiki_content

Instance Method Details

#action_title(url) ⇒ Object


15
16
17
18
19
20
21
22
23
24
25
# File 'app/helpers/emails_helper.rb', line 15

def action_title(url)
  return unless url

  %w(merge_requests issues commit).each do |action|
    if url.split("/").include?(action)
      return "View #{action.humanize.singularize}"
    end
  end

  nil
end

#admin_changed_password_text(format: nil) ⇒ Object


226
227
228
229
230
231
232
233
234
235
236
# File 'app/helpers/emails_helper.rb', line 226

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

#change_reviewer_notification_text(new_reviewers, previous_reviewers, html_tag = nil) ⇒ Object


283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
# File 'app/helpers/emails_helper.rb', line 283

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 = (html_tag, new)
    old = (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

#closure_reason_text(closed_via, format: nil) ⇒ Object


92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'app/helpers/emails_helper.rb', line 92

def closure_reason_text(closed_via, format: nil)
  case closed_via
  when MergeRequest
    merge_request = MergeRequest.find(closed_via[:id]).present

    return "" unless Ability.allowed?(@recipient, :read_merge_request, merge_request)

    case format
    when :html
      merge_request_link = link_to(merge_request.to_reference, merge_request.web_url)
      _("via merge request %{link}").html_safe % { link: merge_request_link }
    else
      # If it's not HTML nor text then assume it's text to be safe
      _("via merge request %{link}") % { link: "#{merge_request.to_reference} (#{merge_request.web_url})" }
    end
  when String
    # Technically speaking this should be Commit but per
    # https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/15610#note_163812339
    # we can't deserialize Commit without custom serializer for ActiveJob
    return "" unless Ability.allowed?(@recipient, :download_code, @project)

    _("via %{closed_via}") % { closed_via: closed_via }
  else
    ""
  end
end

#contact_your_administrator_textObject


279
280
281
# File 'app/helpers/emails_helper.rb', line 279

def contact_your_administrator_text
  _('Please contact your administrator with any questions.')
end

#create_list_id_string(project, list_id_max_length = 255) ⇒ Object


135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'app/helpers/emails_helper.rb', line 135

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

#email_action(url) ⇒ Object


8
9
10
11
12
13
# File 'app/helpers/emails_helper.rb', line 8

def email_action(url)
  name = action_title(url)
  return unless name

  gmail_goto_action(name, url)
end

#email_default_heading(text) ⇒ Object


79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/helpers/emails_helper.rb', line 79

def email_default_heading(text)
   :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

#gmail_goto_action(name, url) ⇒ Object


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'app/helpers/emails_helper.rb', line 27

def gmail_goto_action(name, url)
  data = {
    "@context" => "http://schema.org",
    "@type" => "EmailMessage",
    "action" => {
      "@type" => "ViewAction",
      "name" => name,
      "url" => url
    }
  }

   :script, type: 'application/ld+json' do
    data.to_json.html_safe
  end
end

249
250
251
252
253
254
255
256
257
258
259
# File 'app/helpers/emails_helper.rb', line 249

def group_membership_expiration_changed_link(member, group, format: nil)
  url = group_group_members_url(group, search: member.user.username)

  case format
  when :html
    link_to = generate_link('group membership', url).html_safe
    _('For additional information, review your %{link_to} or contact your group owner.').html_safe % { link_to: link_to }
  else
    _('For additional information, review your group membership: %{link_to} or contact your group owner.') % { link_to: url }
  end
end

#group_membership_expiration_changed_text(member, group) ⇒ Object


238
239
240
241
242
243
244
245
246
247
# File 'app/helpers/emails_helper.rb', line 238

def group_membership_expiration_changed_text(member, group)
  if member.expires?
    days = (member.expires_at - Date.today).to_i
    days_formatted = pluralize(days, 'day')

    _('Your %{group} membership will now expire in %{days}.') % { group: group.human_name, days: days_formatted }
  else
    _('Your membership in %{group} no longer expires.') % { group: group.human_name }
  end
end

#header_logoObject


64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/helpers/emails_helper.rb', line 64

def 
  if current_appearance&.header_logo?
    image_tag(
      current_appearance.header_logo_path,
      style: 'height: 50px'
    )
  else
    image_tag(
      image_url('mailers/gitlab_logo.png'),
      size: '55x55',
      alt: 'GitLab'
    )
  end
end

166
167
168
169
170
# File 'app/helpers/emails_helper.rb', line 166

def html_footer_message
  return unless show_footer?

  render_message(:footer_message, style: '')
end

#html_header_messageObject


160
161
162
163
164
# File 'app/helpers/emails_helper.rb', line 160

def html_header_message
  return unless show_header?

  render_message(:header_message, style: '')
end

267
268
269
270
271
272
273
274
275
276
277
# File 'app/helpers/emails_helper.rb', line 267

def instance_access_request_link(user, format: nil)
  url = admin_user_url(user)

  case format
  when :html
    user_page = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: url }
    _("Click %{link_start}here%{link_end} to view the request.").html_safe % { link_start: user_page, link_end: '</a>'.html_safe }
  else
    _('Click %{link_to} to view the request.') % { link_to: url }
  end
end

#instance_access_request_text(user, format: nil) ⇒ Object


261
262
263
264
265
# File 'app/helpers/emails_helper.rb', line 261

def instance_access_request_text(user, format: nil)
  gitlab_host = Gitlab.config.gitlab.host

  _('%{username} has asked for a GitLab account on your instance %{host}:') % { username: sanitize_name(user.name), host: gitlab_host }
end

#new_email_address_added_text(email) ⇒ Object


209
210
211
# File 'app/helpers/emails_helper.rb', line 209

def new_email_address_added_text(email)
  _('A new email address has been added to your GitLab account: %{email}') % { email: email }
end

#notification_reason_text(reason) ⇒ Object

“You are receiving this email because #reason on #gitlab_host.”


120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'app/helpers/emails_helper.rb', line 120

def notification_reason_text(reason)
  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
end

#password_reset_token_valid_timeObject


51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/helpers/emails_helper.rb', line 51

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

#re_enable_two_factor_authentication_text(format: nil) ⇒ Object


196
197
198
199
200
201
202
203
204
205
206
207
# File 'app/helpers/emails_helper.rb', line 196

def re_enable_two_factor_authentication_text(format: nil)
  url = profile_two_factor_auth_url

  case format
  when :html
    settings_link_to = generate_link(_('two-factor authentication settings'), url).html_safe
    _("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

#remove_email_address_text(format: nil) ⇒ Object


213
214
215
216
217
218
219
220
221
222
223
224
# File 'app/helpers/emails_helper.rb', line 213

def remove_email_address_text(format: nil)
  url = profile_emails_url

  case format
  when :html
    settings_link_to = generate_link(_('email address settings'), url).html_safe
    _("If you want to remove this email address, visit the %{settings_link_to} page.").html_safe % { settings_link_to: settings_link_to }
  else
    _('If you want to remove this email address, visit %{profile_link}') %
      { profile_link: url }
  end
end

#sanitize_name(name) ⇒ Object


43
44
45
46
47
48
49
# File 'app/helpers/emails_helper.rb', line 43

def sanitize_name(name)
  if name =~ URI::DEFAULT_PARSER.regexp[:URI_REF]
    name.tr('.', '_')
  else
    name
  end
end

#say_hello(user) ⇒ Object


188
189
190
# File 'app/helpers/emails_helper.rb', line 188

def say_hello(user)
  _('Hello, %{username}!') % { username: sanitize_name(user.name) }
end

#say_hi(user) ⇒ Object


184
185
186
# File 'app/helpers/emails_helper.rb', line 184

def say_hi(user)
  _('Hi %{username}!') % { username: sanitize_name(user.name) }
end

178
179
180
181
182
# File 'app/helpers/emails_helper.rb', line 178

def text_footer_message
  return unless show_footer?

  strip_tags(render_message(:footer_message, style: ''))
end

#text_header_messageObject


172
173
174
175
176
# File 'app/helpers/emails_helper.rb', line 172

def text_header_message
  return unless show_header?

  strip_tags(render_message(:header_message, style: ''))
end

#two_factor_authentication_disabled_textObject


192
193
194
# File 'app/helpers/emails_helper.rb', line 192

def two_factor_authentication_disabled_text
  _('Two-factor authentication has been disabled for your GitLab account.')
end