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_header_logo_type, #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


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

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


205
206
207
208
209
210
211
212
213
214
215
# File 'app/helpers/emails_helper.rb', line 205

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

#closure_reason_text(closed_via, format: nil) ⇒ Object


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

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


217
218
219
# File 'app/helpers/emails_helper.rb', line 217

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

#create_list_id_string(project, list_id_max_length = 255) ⇒ Object


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'app/helpers/emails_helper.rb', line 131

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
14
15
16
17
18
19
20
21
22
23
24
25
# File 'app/helpers/emails_helper.rb', line 8

def email_action(url)
  name = action_title(url)
  if name
    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
end

#email_default_heading(text) ⇒ Object


75
76
77
78
79
80
81
82
83
84
85
86
# File 'app/helpers/emails_helper.rb', line 75

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

#header_logoObject


60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/helpers/emails_helper.rb', line 60

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

162
163
164
165
166
# File 'app/helpers/emails_helper.rb', line 162

def html_footer_message
  return unless show_footer?

  render_message(:footer_message, style: '')
end

#html_header_messageObject


156
157
158
159
160
# File 'app/helpers/emails_helper.rb', line 156

def html_header_message
  return unless show_header?

  render_message(:header_message, style: '')
end

#notification_reason_text(reason) ⇒ Object

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


116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'app/helpers/emails_helper.rb', line 116

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


47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/helpers/emails_helper.rb', line 47

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


192
193
194
195
196
197
198
199
200
201
202
203
# File 'app/helpers/emails_helper.rb', line 192

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

#sanitize_name(name) ⇒ Object


39
40
41
42
43
44
45
# File 'app/helpers/emails_helper.rb', line 39

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

#say_hello(user) ⇒ Object


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

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

#say_hi(user) ⇒ Object


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

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

174
175
176
177
178
# File 'app/helpers/emails_helper.rb', line 174

def text_footer_message
  return unless show_footer?

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

#text_header_messageObject


168
169
170
171
172
# File 'app/helpers/emails_helper.rb', line 168

def text_header_message
  return unless show_header?

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

#two_factor_authentication_disabled_textObject


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

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