mno-enterprise-core 3.0.7 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/mno_enterprise/login-background.jpg +0 -0
- data/app/assets/stylesheets/mno_enterprise/mail.css +27 -0
- data/app/helpers/mno_enterprise/application_helper.rb +14 -0
- data/app/helpers/mno_enterprise/impersonate_helper.rb +1 -1
- data/app/models/mno_enterprise/app.rb +2 -1
- data/app/models/mno_enterprise/base_resource.rb +1 -2
- data/app/models/mno_enterprise/impac/dashboard.rb +3 -1
- data/app/models/mno_enterprise/impac/kpi.rb +1 -1
- data/app/models/mno_enterprise/impac/widget.rb +1 -1
- data/app/models/mno_enterprise/org_invite.rb +2 -1
- data/app/models/mno_enterprise/tenant.rb +2 -4
- data/app/models/mno_enterprise/user.rb +6 -0
- data/app/pdf/mno_enterprise/invoice_pdf.rb +29 -12
- data/app/views/system_notifications/confirmation-instructions.html.erb +26 -0
- data/app/views/system_notifications/confirmation-instructions.text.erb +10 -0
- data/app/views/system_notifications/delete-request-instructions.html.erb +31 -0
- data/app/views/system_notifications/delete-request-instructions.text.erb +15 -0
- data/app/views/system_notifications/organization-invite-existing-user.html.erb +30 -0
- data/app/views/system_notifications/organization-invite-existing-user.text.erb +13 -0
- data/app/views/system_notifications/organization-invite-new-user.html.erb +30 -0
- data/app/views/system_notifications/organization-invite-new-user.text.erb +14 -0
- data/app/views/system_notifications/reconfirmation-instructions.html.erb +27 -0
- data/app/views/system_notifications/reconfirmation-instructions.text.erb +10 -0
- data/app/views/system_notifications/registration-instructions.html.erb +27 -0
- data/app/views/system_notifications/registration-instructions.text.erb +9 -0
- data/app/views/system_notifications/reset-password-instructions.html.erb +27 -0
- data/app/views/system_notifications/reset-password-instructions.text.erb +11 -0
- data/app/views/system_notifications/unlock-instructions.html.erb +27 -0
- data/app/views/system_notifications/unlock-instructions.text.erb +10 -0
- data/config/initializers/audit_log.rb +2 -0
- data/config/locales/templates/dashboard/organization/en.yml +2 -0
- data/config/locales/views/auth/registrations/en.yml +1 -1
- data/lib/devise/hooks/impersonatable.rb +14 -0
- data/lib/devise_extension.rb +9 -2
- data/lib/generators/mno_enterprise/install/templates/config/application.yml +6 -2
- data/lib/generators/mno_enterprise/install/templates/config/initializers/mno_enterprise.rb +6 -1
- data/lib/generators/mno_enterprise/install/templates/config/settings.yml +2 -0
- data/lib/generators/mno_enterprise/install/templates/config/settings/uat.yml +2 -2
- data/lib/generators/mno_enterprise/install/templates/stylesheets/main.less +4 -0
- data/lib/her_extension/model/relation.rb +0 -13
- data/lib/mandrill_client.rb +13 -41
- data/lib/mno_enterprise/concerns/models/ability.rb +12 -0
- data/lib/mno_enterprise/concerns/models/organization.rb +5 -2
- data/lib/mno_enterprise/core.rb +21 -8
- data/lib/mno_enterprise/mail_adapters/adapter.rb +51 -0
- data/lib/mno_enterprise/mail_adapters/mandrill_adapter.rb +39 -0
- data/lib/mno_enterprise/mail_adapters/smtp_adapter.rb +21 -0
- data/lib/mno_enterprise/mail_adapters/sparkpost_adapter.rb +56 -0
- data/lib/mno_enterprise/mail_adapters/test_adapter.rb +21 -0
- data/lib/mno_enterprise/mail_client.rb +28 -0
- data/lib/mno_enterprise/smtp_client.rb +32 -0
- data/lib/mno_enterprise/testing_support/factories/apps.rb +1 -2
- data/lib/mno_enterprise/testing_support/factories/impac/kpis.rb +1 -0
- data/lib/mno_enterprise/testing_support/factories/tenant.rb +1 -7
- data/lib/mno_enterprise/testing_support/mno_enterprise_api_test_helper.rb +1 -2
- data/lib/mno_enterprise/version.rb +1 -1
- data/spec/lib/her_extension/model/relation_spec.rb +0 -71
- data/spec/lib/mandrill_client_spec.rb +27 -42
- data/spec/lib/mno_enterprise/mail_adapters/adapter_spec.rb +29 -0
- data/spec/lib/mno_enterprise/mail_adapters/mandrill_adapter_spec.rb +53 -0
- data/spec/lib/mno_enterprise/mail_adapters/smtp_adapter_spec.rb +29 -0
- data/spec/lib/mno_enterprise/mail_adapters/sparkpost_adapter_spec.rb +60 -0
- data/spec/lib/mno_enterprise/mail_client_spec.rb +9 -0
- data/spec/lib/mno_enterprise/smtp_client_spec.rb +39 -0
- data/spec/models/mno_enterprise/ability_spec.rb +21 -0
- data/spec/models/mno_enterprise/base_resource_spec.rb +0 -22
- metadata +76 -24
- data/lib/her_extension/middleware/mnoe_raise_error.rb +0 -21
- data/lib/her_extension/model/associations/belongs_to_association.rb +0 -25
@@ -0,0 +1,14 @@
|
|
1
|
+
Hi there
|
2
|
+
=================================================================
|
3
|
+
|
4
|
+
You have been invited by <%= @info[:ref_full_name] %> to join <%= @info[:organization] %> on our platform!. You can automatically create your account on our platform and join <%= @info[:organization] %> by clicking on the link below:
|
5
|
+
<%= @info[:confirmation_link] %>
|
6
|
+
|
7
|
+
<% if @info[:team]? %>
|
8
|
+
By accepting this invite you will automatically join the <%= @info[:team] %> team.
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
|
12
|
+
Regards,
|
13
|
+
The Marketplace team
|
14
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi <%= @info[:first_name] %></p>
|
13
|
+
|
14
|
+
<p>You have asked to change your email address in the platform. Please confirm this new email address by clicking on the following link</p>
|
15
|
+
|
16
|
+
<a href="<%= @info[:confirmation_link] %>">Confirm my new email address</a>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
Regards,<br/>
|
20
|
+
The Marketplace team
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p class="footer">
|
24
|
+
<%= @info[:company] %>
|
25
|
+
</p>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Hi <%= @info[:first_name] %>
|
2
|
+
=================================================================
|
3
|
+
|
4
|
+
You have asked to change your email address in the platform. Please confirm this new email address by clicking on the following link
|
5
|
+
|
6
|
+
<%= @info[:confirmation_link] %>
|
7
|
+
|
8
|
+
|
9
|
+
Regards,
|
10
|
+
The Marketplace team
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi there,</p>
|
13
|
+
|
14
|
+
<p>You have been invited to create an account on our platform! You can do so by clicking on the link below:</p>
|
15
|
+
|
16
|
+
<a href="<%= @info[:registration_link] %>">Create my account</a>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
Regards,<br/>
|
20
|
+
The Marketplace team
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p class="footer">
|
24
|
+
<%= @info[:company] %>
|
25
|
+
</p>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi <%= @info[:first_name] %></p>
|
13
|
+
|
14
|
+
<p>You can reset your password by clicking on the following link</p>
|
15
|
+
|
16
|
+
<a href="<%= @info[:reset_password_link] %>">Reset my password</a>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
Regards,<br/>
|
20
|
+
The Marketplace team
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p class="footer">
|
24
|
+
<%= @info[:company] %>
|
25
|
+
</p>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Hi <%= @info[:first_name] %>
|
2
|
+
=================================================================
|
3
|
+
|
4
|
+
You can reset your password by clicking on the following link
|
5
|
+
|
6
|
+
To reset password, please follow this link : <%= @info[:reset_password_link] %>
|
7
|
+
|
8
|
+
|
9
|
+
Regards,
|
10
|
+
The Marketplace team
|
11
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi <%= @info[:first_name] %></p>
|
13
|
+
|
14
|
+
<p>You can unlock your account by clicking on the following link</p>
|
15
|
+
|
16
|
+
<a href="<%= @info[:unlock_link] %>">Unlock my account</a>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
Regards,<br/>
|
20
|
+
The Marketplace team
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p class="footer">
|
24
|
+
<%= @info[:company] %>
|
25
|
+
</p>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -77,6 +77,8 @@ en:
|
|
77
77
|
edit: Edit
|
78
78
|
remove: Remove
|
79
79
|
invite_modal:
|
80
|
+
title_name: "Edit Member: {{name}} {{surname}}"
|
81
|
+
title_email: "Edit Member: {{email}}"
|
80
82
|
description: Enter the email addresses of the people you want to invite in your company
|
81
83
|
example: "One address per line, e.g.:"
|
82
84
|
disclaimer: Please note that for security reasons unaccepted invites will automatically expire after 3 days.
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Allow unconfirmed user to be impersonated
|
2
|
+
# We override User#confirmation_required? when impersonating
|
3
|
+
Warden::Manager.prepend_after_set_user do |record, warden, options|
|
4
|
+
impersonator_id = warden.env['rack.session'][:impersonator_user_id]
|
5
|
+
|
6
|
+
if impersonator_id
|
7
|
+
class <<record
|
8
|
+
# Callback to overwrite if confirmation is required or not.
|
9
|
+
def confirmation_required?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/devise_extension.rb
CHANGED
@@ -2,6 +2,9 @@ require 'devise'
|
|
2
2
|
require 'devise/models/password_expirable'
|
3
3
|
require 'devise/extension_routes'
|
4
4
|
|
5
|
+
# Hook for impersonation
|
6
|
+
require 'devise/hooks/impersonatable'
|
7
|
+
|
5
8
|
module Devise
|
6
9
|
# Should the password expire (e.g 3.months)
|
7
10
|
mattr_accessor :expire_password_after
|
@@ -27,6 +30,10 @@ end
|
|
27
30
|
# modules
|
28
31
|
Devise.add_module :password_expirable, controller: :password_expirable, model: 'devise/models/password_expirable', route: :password_expired
|
29
32
|
|
30
|
-
|
31
|
-
|
33
|
+
module DeviseExtension
|
34
|
+
class Engine < ::Rails::Engine
|
35
|
+
ActiveSupport.on_load(:action_controller) do
|
36
|
+
include DeviseExtension::Controllers::Helpers
|
37
|
+
end
|
38
|
+
end
|
32
39
|
end
|
@@ -4,8 +4,12 @@
|
|
4
4
|
tenant_id: my_tenant_id
|
5
5
|
tenant_key: my_tenant_access_key
|
6
6
|
|
7
|
-
# Emailing platform
|
8
|
-
#
|
7
|
+
# Emailing platform
|
8
|
+
# MANDRILL_API_KEY: changeme
|
9
|
+
# SPARKPOST_API_KEY: changeme
|
9
10
|
|
10
11
|
# Rails secret key
|
11
12
|
SECRET_KEY_BASE: <%= SecureRandom.hex(64) %>
|
13
|
+
|
14
|
+
# Google Tag Manager
|
15
|
+
google_tag_container: GTM-TH3MLB
|
@@ -28,6 +28,11 @@ MnoEnterprise.configure do |config|
|
|
28
28
|
# Defaulted to Maestrano Enterprise demo account
|
29
29
|
# config.mandrill_key = 'some-mandrill-api-key'
|
30
30
|
|
31
|
+
# Adapter used to send emails
|
32
|
+
# Default to :mandrill
|
33
|
+
# config.mail_adapter = :mandrill
|
34
|
+
# config.mail_adapter = :sparkpost
|
35
|
+
|
31
36
|
# Support email address
|
32
37
|
config.support_email = 'support@example.com'
|
33
38
|
|
@@ -64,7 +69,7 @@ MnoEnterprise.configure do |config|
|
|
64
69
|
# Third Party Plugins
|
65
70
|
#===============================================
|
66
71
|
# Google Tag Manager
|
67
|
-
|
72
|
+
config.google_tag_container = ENV['google_tag_container']
|
68
73
|
|
69
74
|
#===============================================
|
70
75
|
# API Configuration
|
@@ -19,6 +19,10 @@
|
|
19
19
|
//--------------------------------------------
|
20
20
|
@import "../../../frontend/src/app/stylesheets/variables";
|
21
21
|
|
22
|
+
// Import custom fonts
|
23
|
+
//--------------------------------------------
|
24
|
+
@import "../../../frontend/src/fonts/font-faces";
|
25
|
+
|
22
26
|
// Import published theme previewer style
|
23
27
|
//--------------------------------------------
|
24
28
|
// Comment this line if you do not plan to use
|
@@ -26,25 +26,12 @@ module Her
|
|
26
26
|
# Use filter instead of raw parameters
|
27
27
|
def where(params = {})
|
28
28
|
return self if !params || params.empty?
|
29
|
-
# If a value is an empty array, it'll be excluded when calling params.to_query, so convert it to nil instead
|
30
|
-
params.each { |k, v| params[k] = v.presence if v.is_a?(Array) }
|
31
|
-
|
32
29
|
self.params[:filter] ||= {}
|
33
30
|
self.params[:filter].merge!(params)
|
34
31
|
self
|
35
32
|
end
|
36
33
|
alias all where
|
37
34
|
|
38
|
-
# Patch to unwrap filter when creating
|
39
|
-
def first_or_create(attributes = {})
|
40
|
-
fetch.first || create((@params.delete(:filter) || {}).merge(attributes))
|
41
|
-
end
|
42
|
-
|
43
|
-
# Patch to unwrap filter when creating
|
44
|
-
def first_or_initialize(attributes = {})
|
45
|
-
fetch.first || build((@params.delete(:filter) || {}).merge(attributes))
|
46
|
-
end
|
47
|
-
|
48
35
|
# E.g:
|
49
36
|
# Product.order_by('created_at.desc','name.asc')
|
50
37
|
def order_by(*args)
|
data/lib/mandrill_client.rb
CHANGED
@@ -1,58 +1,30 @@
|
|
1
1
|
# An interface to the Mandrill API
|
2
|
-
#
|
3
|
-
#
|
2
|
+
# @example
|
3
|
+
# MandrillClient.send_template(template_name(string), template_content(array), message(hash))
|
4
|
+
# @deprecated Please use {MnoEnterprise::MailClient}
|
4
5
|
module MandrillClient
|
5
6
|
class << self
|
6
|
-
|
7
|
-
# Store the list of mandrill emails that are pending
|
8
|
-
# to be sent
|
9
|
-
# Only used for testing
|
10
|
-
# E.g: expect { some_action }.to change(MandrillClient.base_deliveries,:count).by(1)
|
11
|
-
def base_deliveries
|
12
|
-
@base_deliveries ||= []
|
13
|
-
end
|
14
|
-
|
15
|
-
# Check whether mailers are in test mode or not
|
16
|
-
# Emails should not be sent in test mode
|
17
|
-
def test?
|
18
|
-
(Rails.configuration.action_mailer.delivery_method || '').to_sym == :test
|
19
|
-
end
|
20
|
-
|
21
7
|
# Return a mandrill client configured with the right API key
|
8
|
+
# @deprecated Use MnoEnterprise::MailClient
|
22
9
|
def client
|
23
10
|
@client ||= Mandrill::API.new(MnoEnterprise.mandrill_key)
|
24
11
|
end
|
25
12
|
|
26
13
|
# Send the provided template with options
|
27
|
-
#
|
14
|
+
#
|
15
|
+
# @example MandrillClient.send_template(template_name(string), template_content(array), message(hash))
|
16
|
+
# @deprecated Use MnoEnterprise::MailClient
|
28
17
|
def send_template(*args)
|
29
|
-
|
30
|
-
|
31
|
-
else
|
32
|
-
self.client.messages.send_template(*args)
|
33
|
-
end
|
18
|
+
warn '[DEPRECATION] `MandrillClient` is deprecated. Please use `MnoEnterprise::MailClient` instead.'
|
19
|
+
MnoEnterprise::MailClient.adapter.send_template(*args)
|
34
20
|
end
|
35
21
|
|
36
22
|
# A simpler version of send_template
|
37
23
|
#
|
38
|
-
#
|
39
|
-
# template: name of a mandrill template
|
40
|
-
# from: hash describing the sender. E.g.: { name: "John", email: "john.doe@maestrano.com" }
|
41
|
-
# to: Array or hash describing the recipient. E.g.: { name: "Jack", email: "jack.doe@maestrano.com" }
|
42
|
-
# vars: Mandrill email variables. E.g.: { link: "https://mywebsite.com/confirm_account" }
|
43
|
-
# opts: additional parameters to pass to mandrill. See: https://mandrillapp.com/api/docs/messages.ruby.html
|
44
|
-
#
|
24
|
+
# @deprecated Use MnoEnterprise::MailClient
|
45
25
|
def deliver(template,from,to,vars = {},opts = {})
|
46
|
-
|
47
|
-
|
48
|
-
message[:to] = [to].flatten.map { |t| {name: t[:name], email: t[:email], type: (t[:type] || :to) } }
|
49
|
-
message[:global_merge_vars] = vars.map { |k,v| {name: k.to_s, content: v} }
|
50
|
-
|
51
|
-
# Merge additional mandrill options
|
52
|
-
message.merge!(opts)
|
53
|
-
|
54
|
-
self.send_template(template,[],message)
|
26
|
+
warn '[DEPRECATION] `MandrillClient` is deprecated. Please use `MnoEnterprise::MailClient` instead.'
|
27
|
+
MnoEnterprise::MailClient.deliver(template,from,to,vars,opts)
|
55
28
|
end
|
56
29
|
end
|
57
|
-
|
58
|
-
end
|
30
|
+
end
|
@@ -70,6 +70,11 @@ module MnoEnterprise::Concerns::Models::Ability
|
|
70
70
|
#===================================================
|
71
71
|
impac_abilities(user)
|
72
72
|
|
73
|
+
#===================================================
|
74
|
+
# Admin abilities
|
75
|
+
#===================================================
|
76
|
+
admin_abilities(user)
|
77
|
+
|
73
78
|
# Define abilities for the passed in user here. For example:
|
74
79
|
#
|
75
80
|
# user ||= User.new # guest user (not logged in)
|
@@ -105,4 +110,11 @@ module MnoEnterprise::Concerns::Models::Ability
|
|
105
110
|
end
|
106
111
|
end
|
107
112
|
end
|
113
|
+
|
114
|
+
# Abilities for admin user
|
115
|
+
def admin_abilities(user)
|
116
|
+
if user.admin_role == 'admin'
|
117
|
+
can :manage_app_instances, MnoEnterprise::Organization
|
118
|
+
end
|
119
|
+
end
|
108
120
|
end
|
@@ -69,8 +69,11 @@ module MnoEnterprise::Concerns::Models::Organization
|
|
69
69
|
#==================================================================
|
70
70
|
# Return the list of users + active invites
|
71
71
|
# TODO: specs
|
72
|
-
|
73
|
-
|
72
|
+
#
|
73
|
+
# @params [Boolean] show_staged Also displayed staged invites (ie: not sent)
|
74
|
+
def members(show_staged=false)
|
75
|
+
invites = show_staged ? self.org_invites.active_or_staged : self.org_invites.active
|
76
|
+
[self.users, invites].flatten
|
74
77
|
end
|
75
78
|
|
76
79
|
# Add a user to the organization with the provided role
|