lesli 5.0.1 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/config/lesli_manifest.js +7 -4
- data/app/assets/fonts/lesli/Domine/Domine-VariableFont_wght.ttf +0 -0
- data/app/assets/fonts/lesli/Domine/OFL.txt +2 -0
- data/app/assets/javascripts/lesli/users/passwords.js +776 -0
- data/app/assets/javascripts/lesli/users/registrations.js +776 -0
- data/app/assets/javascripts/lesli/users/sessions.js +776 -1
- data/app/assets/stylesheets/lesli/users/passwords.scss +5 -6
- data/app/assets/stylesheets/lesli/users/registrations.scss +5 -6
- data/app/assets/stylesheets/lesli/users/sessions.scss +5 -10
- data/app/controllers/lesli/application_lesli_controller.rb +0 -1
- data/app/controllers/lesli/interfaces/application/logger.rb +9 -9
- data/app/controllers/lesli/roles_controller.rb +43 -0
- data/{lib/sass/lesli/devise/registrations.scss.erb → app/controllers/lesli/users_controller.rb} +18 -23
- data/app/controllers/users/registrations_controller.rb +137 -58
- data/app/helpers/lesli/assets_helper.rb +2 -2
- data/app/helpers/lesli/general_helper.rb +1 -1
- data/app/helpers/lesli/navigation_helper.rb +7 -10
- data/app/helpers/lesli/system_helper.rb +1 -1
- data/app/lib/lesli/system.rb +7 -3
- data/app/mailers/lesli/application_lesli_mailer.rb +199 -0
- data/app/mailers/lesli/application_mailer.rb +7 -0
- data/app/mailers/lesli/devise_mailer.rb +33 -0
- data/app/models/concerns/user_guard.rb +3 -4
- data/app/models/lesli/account.rb +29 -0
- data/{lib/sass/lesli/pages/passes.scss → app/models/lesli/descriptor.rb} +14 -8
- data/app/models/lesli/role.rb +90 -0
- data/app/models/lesli/system_controller.rb +1 -0
- data/app/models/lesli/user/detail.rb +55 -0
- data/{lib/sass/lesli/pages/otps.scss → app/models/lesli/user/role.rb} +13 -9
- data/app/models/lesli/user.rb +4 -3
- data/app/services/lesli/role_service.rb +45 -0
- data/app/services/lesli/user_service.rb +69 -0
- data/app/views/devise/passwords/new.html.erb +72 -12
- data/app/views/devise/registrations/new.html.erb +146 -28
- data/app/views/devise/sessions/new.html.erb +11 -78
- data/app/views/devise/shared/_links.html.erb +96 -25
- data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +23 -0
- data/app/views/lesli/emails/user_mailer/invitation.html.erb +23 -0
- data/app/views/lesli/layouts/application-devise.html.erb +1 -1
- data/app/views/lesli/layouts/application-public.html.erb +2 -2
- data/app/views/lesli/layouts/mailer.html.erb +13 -0
- data/app/views/lesli/layouts/mailer.text.erb +1 -0
- data/app/views/lesli/partials/_application-lesli-header.html.erb +27 -41
- data/app/views/lesli/partials/_application-lesli-javascript.html.erb +10 -6
- data/app/views/lesli/partials/_application-public-javascript.html.erb +12 -8
- data/{lib/sass/lesli/devise/confirmations.scss.erb → app/views/lesli/wrappers/_application-devise-simple.erb} +30 -46
- data/app/views/lesli/wrappers/{_application-auth.html.erb → _application-devise.html.erb} +15 -0
- data/config/initializers/{lesli_defaults.rb → lesli.rb} +4 -2
- data/config/locales/translations.en.yml +7 -0
- data/config/locales/translations.es.yml +7 -0
- data/config/routes.rb +22 -17
- data/db/migrate/v1.0/0010000210_create_lesli_roles.rb +1 -1
- data/db/{tables/0010003010_create_user_details.rb → migrate/v1.0/0010003010_create_lesli_user_details.rb} +6 -6
- data/db/{tables/0010003510_create_user_roles.rb → migrate/v1.0/0010003410_create_lesli_user_roles.rb} +4 -4
- data/db/{tables/0010005010_create_descriptors.rb → migrate/v1.0/0010005010_create_lesli_descriptors.rb} +5 -6
- data/db/{tables/0010005110_create_descriptor_privileges.rb → migrate/v1.0/0010005110_create_lesli_descriptor_privileges.rb} +8 -7
- data/db/{tables/0010005210_create_descriptor_activities.rb → migrate/v1.0/0010005210_create_lesli_descriptor_activities.rb} +6 -8
- data/db/seeds.rb +0 -2
- data/lib/lesli/engine.rb +25 -2
- data/lib/lesli/routing.rb +26 -0
- data/lib/lesli/version.rb +2 -2
- data/lib/lesli.rb +1 -0
- data/lib/{sass/lesli/pages/mfas.scss → mailer_previews/devise_mailer_preview.rb} +12 -6
- data/lib/sass/lesli/bulma/loader.scss +3 -0
- data/lib/sass/lesli/elements/header.scss +1 -1
- data/lib/sass/lesli/fonts/families.scss +3 -3
- data/lib/sass/lesli/layouts/application-container.scss +4 -0
- data/lib/sass/lesli/{devise/passwords.scss.erb → pages/devise-simple.scss} +38 -38
- data/lib/sass/lesli/{templates → pages}/devise.scss +4 -26
- data/lib/sass/lesli/settings/variables.scss +1 -1
- data/lib/sass/lesli/templates/application.scss +8 -4
- data/lib/sass/lesli/templates/dashboards.scss +8 -0
- data/lib/sass/lesli/templates/public.scss +2 -3
- data/lib/tasks/lesli/controllers.rake +33 -0
- data/lib/tasks/lesli/db.rake +88 -0
- data/lib/tasks/lesli/git.rake +74 -0
- data/lib/tasks/lesli_tasks.rake +70 -20
- data/lib/vue/devise/registrations.js +10 -15
- data/lib/vue/layouts/application-container.vue +10 -2
- data/lib/vue/layouts/application-header.vue +10 -3
- data/lib/vue/stores/account.js +113 -0
- data/lib/vue/stores/role.js +243 -0
- data/lib/vue/stores/translations.json +86 -0
- data/lib/vue/stores/user.js +102 -0
- data/lib/{sass/lesli/devise/sessions.scss → vue/translation.js} +14 -5
- data/lib/webpack/base.js +2 -2
- data/lib/webpack/core.js +2 -0
- data/readme.md +74 -55
- metadata +196 -51
- data/app/assets/fonts/lesli/Domine/Domine-Bold.ttf +0 -0
- data/app/assets/fonts/lesli/Domine/Domine-Regular.ttf +0 -0
- data/app/assets/stylesheets/lesli/users/devise.scss +0 -32
- data/app/controllers/lesli/profiles_controller.rb +0 -60
- data/app/helpers/lesli/profiles_helper.rb +0 -4
- data/app/models/lesli/profile.rb +0 -4
- data/app/views/lesli/devise/sessions/_form.html.erb +0 -17
- data/app/views/lesli/devise/sessions/_session.html.erb +0 -2
- data/app/views/lesli/devise/sessions/edit.html.erb +0 -10
- data/app/views/lesli/devise/sessions/index.html.erb +0 -14
- data/app/views/lesli/devise/sessions/new.html.erb +0 -9
- data/app/views/lesli/devise/sessions/show.html.erb +0 -10
- data/app/views/lesli/profiles/_form.html.erb +0 -17
- data/app/views/lesli/profiles/_profile.html.erb +0 -2
- data/app/views/lesli/profiles/edit.html.erb +0 -10
- data/app/views/lesli/profiles/index.html.erb +0 -14
- data/app/views/lesli/profiles/new.html.erb +0 -9
- data/app/views/lesli/profiles/show.html.erb +0 -10
- data/lib/sass/lesli/pages/dashboards.scss +0 -57
- data/lib/tasks/db.rb +0 -76
- data/lib/vue/stores/profile.js +0 -90
- data/lib/vue/stores/workflow2.js +0 -345
- data/lib/vue/stores/workflows/actions.js +0 -327
- data/lib/vue/stores/workflows/associations.js +0 -130
- data/lib/vue/stores/workflows/checks.js +0 -210
- /data/lib/vue/stores/{announcements.js → entities/announcements.js} +0 -0
- /data/lib/vue/stores/{dashboard.js → entities/dashboard.js} +0 -0
- /data/lib/vue/stores/{workflow.js → entities/workflow.js} +0 -0
- /data/lib/vue/stores/{cloud-bell → panels}/notification.js +0 -0
- /data/lib/vue/stores/{firebase.js → services/firebase.js} +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class ApplicationLesliMailer < ActionMailer::Base
|
|
35
|
+
|
|
36
|
+
# Set a dynamic template according to the engine that is sending the email
|
|
37
|
+
# this is equivalent to: default template_path: -> { "engine_name/emails" }
|
|
38
|
+
=begin
|
|
39
|
+
default(
|
|
40
|
+
|
|
41
|
+
from: -> {
|
|
42
|
+
|
|
43
|
+
instance = Rails.application.config.lesli.dig(:instance)
|
|
44
|
+
|
|
45
|
+
# add custom email name for emails sent from www.lesli.cloud
|
|
46
|
+
if instance[:code] == 'lesli_cloud'
|
|
47
|
+
return email_address_with_name(
|
|
48
|
+
Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from),
|
|
49
|
+
"Lesli"
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from)
|
|
54
|
+
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
template_path: -> {
|
|
58
|
+
|
|
59
|
+
instance = Rails.application.config.lesli.dig(:instance)
|
|
60
|
+
|
|
61
|
+
# get class that is executing the mailer
|
|
62
|
+
module_info = self.class.name.split("::")
|
|
63
|
+
|
|
64
|
+
# mailers from engines
|
|
65
|
+
if module_info.length > 1
|
|
66
|
+
return "#{ instance[:code] }/emails/#{(module_info[0].underscore)}/#{ module_info[1].underscore }"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# mailers from core
|
|
70
|
+
return "#{ instance[:code] }/emails/#{ module_info[0].underscore }"
|
|
71
|
+
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
)
|
|
75
|
+
=end
|
|
76
|
+
#after_action :log_mail_requests
|
|
77
|
+
|
|
78
|
+
default(template_path: "lesli/emails/devise_mailer")
|
|
79
|
+
|
|
80
|
+
def initialize
|
|
81
|
+
|
|
82
|
+
super
|
|
83
|
+
|
|
84
|
+
# some @email data is defined on: LesliMails/src/partials/data.html
|
|
85
|
+
@custom = {}
|
|
86
|
+
@email = {}
|
|
87
|
+
@data = {}
|
|
88
|
+
@app = {}
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
protected
|
|
93
|
+
|
|
94
|
+
def email(data={}, to:, subject:, template_name:)
|
|
95
|
+
|
|
96
|
+
@app[:host] = default_url_options[:host]
|
|
97
|
+
@data = @data.merge(data)
|
|
98
|
+
|
|
99
|
+
mail(
|
|
100
|
+
to: to,
|
|
101
|
+
subject: subject,
|
|
102
|
+
template_name: template_name
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
private
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def build_data_from_params(params, data={})
|
|
111
|
+
|
|
112
|
+
# make custom data available in mailer method and mailer template
|
|
113
|
+
@data = @data.merge(data)
|
|
114
|
+
|
|
115
|
+
build_app_from_params(params)
|
|
116
|
+
|
|
117
|
+
build_customization_from_params(params)
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def build_app_from_params(params)
|
|
122
|
+
|
|
123
|
+
@app[:host] = default_url_options[:host]
|
|
124
|
+
# @app[:company] = {
|
|
125
|
+
# id: 0,
|
|
126
|
+
# name: "",
|
|
127
|
+
# tag_line: "",
|
|
128
|
+
# }
|
|
129
|
+
|
|
130
|
+
# return if params[:user].blank? || params[:user].class.name != "User"
|
|
131
|
+
|
|
132
|
+
# @app[:company] = {
|
|
133
|
+
# id: params[:user].account.id,
|
|
134
|
+
# name: params[:user].account.company_name,
|
|
135
|
+
# tag_line: params[:user].account.company_tag_line,
|
|
136
|
+
# }
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def build_customization_from_params(params)
|
|
141
|
+
|
|
142
|
+
instance = Rails.application.config.lesli.dig(:instance)
|
|
143
|
+
|
|
144
|
+
# lesli is the code used for the core. If there are no builder engines,
|
|
145
|
+
# the instance namespace is "/"
|
|
146
|
+
instance_path = ""
|
|
147
|
+
instance_path = "#{instance[:code]}/" if instance[:code] != "lesli"
|
|
148
|
+
|
|
149
|
+
# using cdn logos by default (testing feature)
|
|
150
|
+
# @custom[:logo] = "#{instance_path}brand/app-logo.svg"
|
|
151
|
+
@custom[:logo] = "https://cdn.lesli.tech/leslicloud/brand/app-logo.png"
|
|
152
|
+
|
|
153
|
+
return if params[:user].blank? || params[:user].class.name != "User"
|
|
154
|
+
|
|
155
|
+
custom_logo = nil # params[:user].account.files.where(file_type: "app_logo").last
|
|
156
|
+
|
|
157
|
+
if custom_logo
|
|
158
|
+
@custom[:logo] = custom_logo.attachment.url if custom_logo.attachment_identifier
|
|
159
|
+
@custom[:logo] = custom_logo.attachment_public.url if custom_logo.attachment_public_identifier
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def build_recipients_from_users(users)
|
|
165
|
+
if users.is_a?(Array)
|
|
166
|
+
users.map { |user| email_address_with_name(user.email, user.full_name) }
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def build_recipients_from_contacts(contacts)
|
|
171
|
+
if contacts.is_a?(Array)
|
|
172
|
+
contacts.map { |contact| email_address_with_name(contact[:email], contact[:name]) }
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def build_recipients_from_emails()
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def log_mail_requests title="email_sent", payload=nil
|
|
180
|
+
|
|
181
|
+
if payload.blank?
|
|
182
|
+
payload = {
|
|
183
|
+
subject: self.message.subject,
|
|
184
|
+
to: self.message.to
|
|
185
|
+
}
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# TODO: Save template path and view used within the email
|
|
189
|
+
Account::Log.log_email(
|
|
190
|
+
"#{self.class.to_s}/#{self.action_name}",
|
|
191
|
+
self.action_name,
|
|
192
|
+
title,
|
|
193
|
+
payload
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
end
|
|
199
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Lesli
|
|
2
|
+
class DeviseMailer < ApplicationLesliMailer
|
|
3
|
+
def confirmation_instructions(record, token, opts = {})
|
|
4
|
+
|
|
5
|
+
# defaults for new accounts/users
|
|
6
|
+
email_template = "confirmation_instructions"
|
|
7
|
+
email_subject = I18n.t("core.users/confirmations.mailer_email_verification")
|
|
8
|
+
|
|
9
|
+
# # custom email and subject if user is changin his email address
|
|
10
|
+
# if !record.unconfirmed_email.blank?
|
|
11
|
+
# email_template = "update_email_confirmation_instructions"
|
|
12
|
+
# email_subject = I18n.t("core.users/confirmations.mailer_confirmation_instructions_subject")
|
|
13
|
+
# end
|
|
14
|
+
|
|
15
|
+
# Depending on wheter there is a new user or they are changing their email,
|
|
16
|
+
# one or another field will be used
|
|
17
|
+
email_recipient = record.unconfirmed_email || record.email
|
|
18
|
+
|
|
19
|
+
# email custom data
|
|
20
|
+
params = {
|
|
21
|
+
url: "/confirmation?confirmation_token=#{token}"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# send email
|
|
25
|
+
email(
|
|
26
|
+
params,
|
|
27
|
+
to: email_recipient,
|
|
28
|
+
subject: email_subject,
|
|
29
|
+
template_name: email_template
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -17,7 +17,7 @@ GNU General Public License for more details.
|
|
|
17
17
|
You should have received a copy of the GNU General Public License
|
|
18
18
|
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
19
|
|
|
20
|
-
Lesli · Ruby on Rails Development
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
21
|
|
|
22
22
|
Made with ♥ by https://www.lesli.tech
|
|
23
23
|
Building a better future, one line of code at a time.
|
|
@@ -28,7 +28,6 @@ Building a better future, one line of code at a time.
|
|
|
28
28
|
|
|
29
29
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
30
|
// ·
|
|
31
|
-
|
|
32
31
|
=end
|
|
33
32
|
|
|
34
33
|
|
|
@@ -41,12 +40,12 @@ module UserGuard
|
|
|
41
40
|
def max_object_level_permission
|
|
42
41
|
|
|
43
42
|
# get the max object level permission from roles assigned to the user
|
|
44
|
-
level = self.roles.
|
|
43
|
+
level = self.roles.maximum(:object_level_permission)
|
|
45
44
|
|
|
46
45
|
# if user has no roles assigned, we return the lowest role available
|
|
47
46
|
# NOTE: This should not be possible due the user needs a role to login
|
|
48
47
|
unless level
|
|
49
|
-
return (self.account.roles.
|
|
48
|
+
return (self.account.roles.minimum(:object_level_permission))
|
|
50
49
|
end
|
|
51
50
|
|
|
52
51
|
# return the level found
|
data/app/models/lesli/account.rb
CHANGED
|
@@ -73,5 +73,34 @@ module Lesli
|
|
|
73
73
|
|
|
74
74
|
# required a name for the lesli account
|
|
75
75
|
validates :company_name, :presence => true
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# initializers for new accounts
|
|
79
|
+
after_create :initialize_account
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def initialize_account
|
|
83
|
+
|
|
84
|
+
# create initial descriptors
|
|
85
|
+
descriptor_owner = self.descriptors.find_or_create_by(name: "owner")
|
|
86
|
+
descriptor_sysadmin = self.descriptors.find_or_create_by(name: "sysadmin")
|
|
87
|
+
descriptor_profile = self.descriptors.find_or_create_by(name: "profile")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# create default roles for the new account
|
|
91
|
+
owner = self.roles.create({ name: "owner", active: true, object_level_permission: 2147483647 })
|
|
92
|
+
|
|
93
|
+
# platform administrator role
|
|
94
|
+
sysadmin = self.roles.create({ name: "sysadmin", active: true, object_level_permission: 100000 })
|
|
95
|
+
|
|
96
|
+
# access only to user profile
|
|
97
|
+
limited = self.roles.create({ name: "limited", active: true, object_level_permission: 10, path_default: "/administration/profile" })
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# assign descriptors with appropriate privileges
|
|
101
|
+
#owner.descriptors.create(:descriptor => descriptor_owner)
|
|
102
|
+
#sysadmin.descriptors.create(:descriptor => descriptor_sysadmin)
|
|
103
|
+
#limited.descriptors.create(:descriptor => descriptor_profile)
|
|
104
|
+
end
|
|
76
105
|
end
|
|
77
106
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
=begin
|
|
2
2
|
|
|
3
3
|
Lesli
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ GNU General Public License for more details.
|
|
|
17
17
|
You should have received a copy of the GNU General Public License
|
|
18
18
|
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
19
|
|
|
20
|
-
Lesli · Ruby on Rails SaaS
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
21
|
|
|
22
22
|
Made with ♥ by https://www.lesli.tech
|
|
23
23
|
Building a better future, one line of code at a time.
|
|
@@ -27,9 +27,15 @@ Building a better future, one line of code at a time.
|
|
|
27
27
|
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
28
|
|
|
29
29
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
-
// ·
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class Descriptor < ApplicationLesliRecord
|
|
35
|
+
belongs_to :account
|
|
36
|
+
#has_many :privileges
|
|
37
|
+
#has_many :role_descriptors
|
|
38
|
+
|
|
39
|
+
validates :name, presence: true
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class Role < ApplicationLesliRecord
|
|
35
|
+
|
|
36
|
+
belongs_to :account
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# Role resources
|
|
40
|
+
has_many :activities
|
|
41
|
+
has_many :descriptors, dependent: :delete_all
|
|
42
|
+
has_many :privileges, class_name: "Role::Privilege", dependent: :delete_all
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# initializers for new roles
|
|
46
|
+
after_create :after_create_role
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# validations
|
|
50
|
+
validates :name, presence: :true
|
|
51
|
+
validates :object_level_permission, presence: :true
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def after_create_role
|
|
55
|
+
|
|
56
|
+
# generate a unique code for the role
|
|
57
|
+
role_code = name
|
|
58
|
+
.downcase # string to lowercase
|
|
59
|
+
.gsub(/[^0-9A-Za-z\s\-\_]/, '') # remove special characters from string
|
|
60
|
+
.gsub(/-/, '_') # replace dashes with underscore
|
|
61
|
+
.gsub(/\s+/, '_') # replace spaces or spaces with single dash
|
|
62
|
+
|
|
63
|
+
# transform UTF-8 characters to ASCI (ex: name in german)
|
|
64
|
+
role_code = I18n.transliterate(role_code) + id.to_s
|
|
65
|
+
|
|
66
|
+
self.update_attribute("code", role_code)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# @return [Boolean]
|
|
71
|
+
# @description Returns if a role is assigned to users.
|
|
72
|
+
def has_users?
|
|
73
|
+
User::Role.where(role: self).count > 0
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @return [void]
|
|
77
|
+
# @param current_user [::User] The user that deleted the role
|
|
78
|
+
# @param [Role] The role that was deleted
|
|
79
|
+
# @description Creates an activity for this role indicating that someone deleted it
|
|
80
|
+
# Example
|
|
81
|
+
# role = Role.find(1)
|
|
82
|
+
# Role.log_activity_destroy(User.find(1), role)
|
|
83
|
+
def self.log_activity_destroy(current_user, role)
|
|
84
|
+
role.activities.create(
|
|
85
|
+
user_creator: current_user,
|
|
86
|
+
category: "action_destroy"
|
|
87
|
+
)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -39,6 +39,7 @@ module Lesli
|
|
|
39
39
|
# get a matrix of controllers and actions
|
|
40
40
|
c = SystemController.joins(:actions).select(
|
|
41
41
|
"lesli_system_controllers.engine as engine",
|
|
42
|
+
"lesli_system_controllers.route as route",
|
|
42
43
|
"lesli_system_controllers.reference as controller",
|
|
43
44
|
"lesli_system_controllers.name as controller_name",
|
|
44
45
|
"lesli_system_controllers.id as controller_id",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class User::Detail < ApplicationLesliRecord
|
|
35
|
+
belongs_to :user
|
|
36
|
+
|
|
37
|
+
#before_save :validate_work_region
|
|
38
|
+
|
|
39
|
+
enum salutation: {
|
|
40
|
+
mr: "mr",
|
|
41
|
+
ms: "ms",
|
|
42
|
+
mrs: "mrs"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected
|
|
46
|
+
|
|
47
|
+
def validate_work_region
|
|
48
|
+
return true unless work_region
|
|
49
|
+
return true if Account::Location.find_by_id(work_region)
|
|
50
|
+
|
|
51
|
+
errors.add(:base, :work_region_invalid)
|
|
52
|
+
throw :abort
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
=begin
|
|
2
2
|
|
|
3
3
|
Lesli
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ GNU General Public License for more details.
|
|
|
17
17
|
You should have received a copy of the GNU General Public License
|
|
18
18
|
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
19
|
|
|
20
|
-
Lesli · Ruby on Rails SaaS
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
21
|
|
|
22
22
|
Made with ♥ by https://www.lesli.tech
|
|
23
23
|
Building a better future, one line of code at a time.
|
|
@@ -27,10 +27,14 @@ Building a better future, one line of code at a time.
|
|
|
27
27
|
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
28
|
|
|
29
29
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
-
// ·
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class User::Role < ApplicationLesliRecord
|
|
35
|
+
belongs_to :user
|
|
36
|
+
belongs_to :role
|
|
37
|
+
has_many :roles
|
|
38
|
+
#has_many :privileges, through: :roles
|
|
39
|
+
end
|
|
40
|
+
end
|
data/app/models/lesli/user.rb
CHANGED
|
@@ -57,9 +57,10 @@ module Lesli
|
|
|
57
57
|
has_many :activities, class_name: "User::Activity"
|
|
58
58
|
|
|
59
59
|
# users can have many roles and too many privileges through the roles
|
|
60
|
-
has_many :user_roles,
|
|
61
|
-
has_many :roles,
|
|
62
|
-
has_many :privileges, through: :roles
|
|
60
|
+
has_many :user_roles, class_name: "Lesli::User::Role"
|
|
61
|
+
has_many :roles, class_name: "Lesli::Role", through: :user_roles, source: :role
|
|
62
|
+
#has_many :privileges, through: :roles
|
|
63
|
+
|
|
63
64
|
|
|
64
65
|
# devise implementation
|
|
65
66
|
devise :database_authenticatable,
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class RoleService < ApplicationLesliService
|
|
35
|
+
|
|
36
|
+
# Return a list of roles that the user is able to work with
|
|
37
|
+
# according to object level permission
|
|
38
|
+
def list params
|
|
39
|
+
current_user.account.roles
|
|
40
|
+
.where("object_level_permission <= ?", current_user.max_object_level_permission)
|
|
41
|
+
.order(object_level_permission: :desc, name: :asc)
|
|
42
|
+
.select(:id, :name, :object_level_permission)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class UserService < Lesli::ApplicationLesliService
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Return a list of users that belongs to the account of the current_user
|
|
38
|
+
# this list is meant to be used in selectors, autocomplets, etc
|
|
39
|
+
def list params=nil
|
|
40
|
+
#users = current_user.account.users
|
|
41
|
+
users = Lesli::Account.first.users
|
|
42
|
+
|
|
43
|
+
if params[:role].present?
|
|
44
|
+
# add simple quotes to the roles so the sql can manage the query
|
|
45
|
+
roles = params[:role].split(",").map { |role| "'#{role}'" }.join(", ")
|
|
46
|
+
users = users.joins("
|
|
47
|
+
inner join (
|
|
48
|
+
select
|
|
49
|
+
ur.users_id, string_agg(r.\"name\", ', ') role_names
|
|
50
|
+
from user_roles ur
|
|
51
|
+
join roles r
|
|
52
|
+
on r.id = ur.role_id
|
|
53
|
+
and r.name in ( #{ roles } )
|
|
54
|
+
where ur.deleted_at is null
|
|
55
|
+
group by ur.users_id
|
|
56
|
+
) roles on roles.users_id = users.id
|
|
57
|
+
")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
users.order(name: :asc).select(
|
|
61
|
+
:id,
|
|
62
|
+
:email,
|
|
63
|
+
"CONCAT_WS(' ', first_name, last_name) as name",
|
|
64
|
+
:alias
|
|
65
|
+
).as_json
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|