anoubis 1.0.0
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +38 -0
- data/app/controllers/anoubis/application_controller.rb +78 -0
- data/app/controllers/anoubis/core/application_controller.rb +343 -0
- data/app/controllers/anoubis/core/data/actions.rb +962 -0
- data/app/controllers/anoubis/core/data/callbacks.rb +68 -0
- data/app/controllers/anoubis/core/data/convert.rb +407 -0
- data/app/controllers/anoubis/core/data/defaults.rb +217 -0
- data/app/controllers/anoubis/core/data/get.rb +531 -0
- data/app/controllers/anoubis/core/data/load.rb +89 -0
- data/app/controllers/anoubis/core/data/set.rb +49 -0
- data/app/controllers/anoubis/core/data/setup.rb +104 -0
- data/app/controllers/anoubis/core/data_controller.rb +28 -0
- data/app/controllers/anoubis/core/index/actions.rb +53 -0
- data/app/controllers/anoubis/core/index/callbacks.rb +23 -0
- data/app/controllers/anoubis/core/index_controller.rb +36 -0
- data/app/controllers/anoubis/etc/base.rb +52 -0
- data/app/controllers/anoubis/etc/data.rb +89 -0
- data/app/controllers/anoubis/etc/field.rb +468 -0
- data/app/controllers/anoubis/etc/field_options.rb +83 -0
- data/app/controllers/anoubis/etc/field_order.rb +51 -0
- data/app/controllers/anoubis/etc/filter.rb +251 -0
- data/app/controllers/anoubis/etc/menu.rb +101 -0
- data/app/controllers/anoubis/etc/model.rb +67 -0
- data/app/controllers/anoubis/etc/tab_item.rb +91 -0
- data/app/controllers/anoubis/etc.rb +8 -0
- data/app/controllers/anoubis/export.rb +47 -0
- data/app/controllers/anoubis/output/autocomplete.rb +30 -0
- data/app/controllers/anoubis/output/basic.rb +86 -0
- data/app/controllers/anoubis/output/data.rb +101 -0
- data/app/controllers/anoubis/output/delete.rb +41 -0
- data/app/controllers/anoubis/output/edit.rb +55 -0
- data/app/controllers/anoubis/output/frame.rb +227 -0
- data/app/controllers/anoubis/output/login.rb +71 -0
- data/app/controllers/anoubis/output/menu.rb +220 -0
- data/app/controllers/anoubis/output/update.rb +43 -0
- data/app/controllers/anoubis/sso/client/application_controller.rb +139 -0
- data/app/controllers/anoubis/sso/client/data/actions.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/callbacks.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/convert.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/defaults.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/get.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/load.rb +26 -0
- data/app/controllers/anoubis/sso/client/data/set.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/setup.rb +5 -0
- data/app/controllers/anoubis/sso/client/data_controller.rb +21 -0
- data/app/controllers/anoubis/sso/client/index/actions.rb +79 -0
- data/app/controllers/anoubis/sso/client/index/callbacks.rb +13 -0
- data/app/controllers/anoubis/sso/client/index_controller.rb +18 -0
- data/app/controllers/anoubis/sso/server/application_controller.rb +49 -0
- data/app/controllers/anoubis/sso/server/login_controller.rb +342 -0
- data/app/controllers/anoubis/sso/server/user_controller.rb +142 -0
- data/app/controllers/anoubis/tenant/application_controller.rb +54 -0
- data/app/controllers/anoubis/tenant/data/actions.rb +11 -0
- data/app/controllers/anoubis/tenant/data/callbacks.rb +11 -0
- data/app/controllers/anoubis/tenant/data/convert.rb +11 -0
- data/app/controllers/anoubis/tenant/data/defaults.rb +11 -0
- data/app/controllers/anoubis/tenant/data/get.rb +11 -0
- data/app/controllers/anoubis/tenant/data/load.rb +52 -0
- data/app/controllers/anoubis/tenant/data/set.rb +11 -0
- data/app/controllers/anoubis/tenant/data/setup.rb +11 -0
- data/app/controllers/anoubis/tenant/data_controller.rb +28 -0
- data/app/controllers/anoubis/tenant/index/actions.rb +191 -0
- data/app/controllers/anoubis/tenant/index/callbacks.rb +11 -0
- data/app/controllers/anoubis/tenant/index_controller.rb +38 -0
- data/app/controllers/anoubis/tenants_controller.rb +7 -0
- data/app/controllers/anoubis/users_controller.rb +7 -0
- data/app/jobs/anoubis/application_job.rb +6 -0
- data/app/mailers/anoubis/application_mailer.rb +8 -0
- data/app/models/anoubis/application_record.rb +45 -0
- data/app/models/anoubis/core/application_record.rb +250 -0
- data/app/models/anoubis/core/locales.rb +27 -0
- data/app/models/anoubis/sso/client/application_record.rb +3 -0
- data/app/models/anoubis/sso/client/group.rb +19 -0
- data/app/models/anoubis/sso/client/group_menu.rb +109 -0
- data/app/models/anoubis/sso/client/menu.rb +145 -0
- data/app/models/anoubis/sso/client/user.rb +81 -0
- data/app/models/anoubis/sso/client/user_group.rb +32 -0
- data/app/models/anoubis/sso/server/system.rb +36 -0
- data/app/models/anoubis/sso/server/user.rb +79 -0
- data/app/models/anoubis/tenant/application_record.rb +41 -0
- data/app/models/anoubis/tenant/group.rb +95 -0
- data/app/models/anoubis/tenant/group_locale.rb +19 -0
- data/app/models/anoubis/tenant/group_menu.rb +84 -0
- data/app/models/anoubis/tenant/menu.rb +156 -0
- data/app/models/anoubis/tenant/menu_locale.rb +27 -0
- data/app/models/anoubis/tenant/system.rb +127 -0
- data/app/models/anoubis/tenant/system_locale.rb +19 -0
- data/app/models/anoubis/tenant/system_menu.rb +51 -0
- data/app/models/anoubis/tenant/tenant.rb +107 -0
- data/app/models/anoubis/tenant/tenant_system.rb +19 -0
- data/app/models/anoubis/tenant/user.rb +225 -0
- data/app/models/anoubis/tenant/user_group.rb +32 -0
- data/app/services/anoubis/core_service.rb +16 -0
- data/app/services/anoubis/session_service.rb +17 -0
- data/app/validators/presence_in_tenant_validator.rb +20 -0
- data/config/initializers/mime_type.rb +1 -0
- data/config/locales/en.yml +120 -0
- data/config/locales/ru.yml +245 -0
- data/config/routes.rb +74 -0
- data/db/migrate/20181018085843_create_tenants.rb +13 -0
- data/db/migrate/20181018111217_create_systems.rb +10 -0
- data/db/migrate/20181018111713_create_tenant_systems.rb +11 -0
- data/db/migrate/20181018111925_create_groups.rb +13 -0
- data/db/migrate/20181018112151_create_users.rb +25 -0
- data/db/migrate/20181018115737_add_title_to_users.rb +10 -0
- data/db/migrate/20181022060211_create_menus.rb +18 -0
- data/db/migrate/20181115055245_create_group_menus.rb +12 -0
- data/db/migrate/20181115060830_create_system_menus.rb +11 -0
- data/db/migrate/20181122062131_create_user_groups.rb +11 -0
- data/db/migrate/20181221060727_create_menu_locales.rb +14 -0
- data/db/migrate/20181225062303_create_system_locales.rb +11 -0
- data/db/migrate/20181225062339_create_group_locales.rb +11 -0
- data/db/seeds.rb +268 -0
- data/lib/anoubis/engine.rb +13 -0
- data/lib/anoubis/version.rb +5 -0
- data/lib/anoubis.rb +213 -0
- data/lib/tasks/anubis_tasks.rake +10 -0
- data/lib/tasks/sessions/clear_sessions.rake +10 -0
- data/spec/anubis_spec.rb +5 -0
- data/spec/controllers/anoubis/index_controller_spec.rb +77 -0
- data/spec/dummy/Rakefile +3 -0
- data/spec/dummy/app/assets/config/manifest.js +2 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +33 -0
- data/spec/dummy/bin/update +28 -0
- data/spec/dummy/config/application.rb +14 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/spec/dummy/config/database.yml +54 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +85 -0
- data/spec/dummy/config/environments/test.rb +46 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cors.rb +16 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +33 -0
- data/spec/dummy/config/puma.rb +34 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config/storage.yml +34 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/db/schema.rb +167 -0
- data/spec/dummy/db/seeds.rb +1 -0
- data/spec/factories/anubis_group_locales.rb +7 -0
- data/spec/factories/anubis_group_menus.rb +7 -0
- data/spec/factories/anubis_groups.rb +6 -0
- data/spec/factories/anubis_menu_locales.rb +9 -0
- data/spec/factories/anubis_menus.rb +6 -0
- data/spec/factories/anubis_system_locales.rb +7 -0
- data/spec/factories/anubis_system_menus.rb +6 -0
- data/spec/factories/anubis_systems.rb +5 -0
- data/spec/factories/anubis_tenants.rb +7 -0
- data/spec/factories/anubis_users.rb +10 -0
- data/spec/integration/navigation_test.rb +7 -0
- data/spec/models/anoubis/group_locale_spec.rb +25 -0
- data/spec/models/anoubis/group_menu_spec.rb +50 -0
- data/spec/models/anoubis/group_spec.rb +52 -0
- data/spec/models/anoubis/menu_locale_spec.rb +31 -0
- data/spec/models/anoubis/menu_spec.rb +48 -0
- data/spec/models/anoubis/system_locale_spec.rb +20 -0
- data/spec/models/anoubis/system_menu_spec.rb +49 -0
- data/spec/models/anoubis/system_spec.rb +53 -0
- data/spec/models/anoubis/tenant_spec.rb +67 -0
- data/spec/models/anoubis/user_spec.rb +57 -0
- data/spec/rails_helper.rb +32 -0
- data/spec/requests/anoubis/users_request_spec.rb +5 -0
- data/spec/spec_helper.rb +13 -0
- metadata +408 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Main User model. Stores inforation about all users that can access to the portal.
|
|
3
|
+
class Anubis::Tenant::User < ApplicationRecord
|
|
4
|
+
# @!attribute patronymic
|
|
5
|
+
# @return [String] user's patronymic
|
|
6
|
+
|
|
7
|
+
# @!attribute login
|
|
8
|
+
# @return [String] user's full login with {Tenant#ident} suffix.
|
|
9
|
+
|
|
10
|
+
has_secure_password
|
|
11
|
+
|
|
12
|
+
# Redefines default table name
|
|
13
|
+
self.table_name = 'users'
|
|
14
|
+
|
|
15
|
+
before_validation :before_validation_anubis_user_on_create, on: :create
|
|
16
|
+
before_validation :before_validation_anubis_user_on_update, on: :update
|
|
17
|
+
before_save :before_save_anubis_user
|
|
18
|
+
before_destroy :before_destroy_anubis_user
|
|
19
|
+
after_destroy :after_destroy_anubis_user
|
|
20
|
+
|
|
21
|
+
# Email must be valid email address
|
|
22
|
+
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
|
|
23
|
+
|
|
24
|
+
# @!attribute email
|
|
25
|
+
# @return [String] user's email
|
|
26
|
+
validates :email, presence: true, length: { maximum: 50 }, format: { with: VALID_EMAIL_REGEX }
|
|
27
|
+
validates :email, uniqueness: { case_sensitive: true, scope: [:tenant_id] }, if: :email_unique
|
|
28
|
+
|
|
29
|
+
# @!attribute name
|
|
30
|
+
# @return [String] user's name
|
|
31
|
+
validates :name, length: { maximum: 100 }
|
|
32
|
+
validates :name, presence: true, if: :name_presence
|
|
33
|
+
|
|
34
|
+
# @!attribute surname
|
|
35
|
+
# @return [String] user's surname
|
|
36
|
+
validates :surname, length: { maximum: 100 }
|
|
37
|
+
validates :surname, presence: true, if: :name_presence
|
|
38
|
+
|
|
39
|
+
validates :password, length: { in: 5..30 }, on: [:create]
|
|
40
|
+
validates :password, length: { in: 5..30 }, on: [:update], if: :password_changed?
|
|
41
|
+
validates :password_confirmation, length: { in: 5..30 }, on: [:create]
|
|
42
|
+
validates :password_confirmation, length: { in: 5..30 }, on: [:update], if: :password_changed?
|
|
43
|
+
|
|
44
|
+
# @!attribute auth_key
|
|
45
|
+
# @return [String] user's auth key. Variable is used for storing key to restore password or confirm email.
|
|
46
|
+
validates :auth_key, length: { maximum: 32 }
|
|
47
|
+
|
|
48
|
+
# @!attribute auth_key
|
|
49
|
+
# @return [Integer] user's session timeout. Default vaule is 3600
|
|
50
|
+
validates :timeout, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 0}
|
|
51
|
+
|
|
52
|
+
# @!attribute uuid_bin
|
|
53
|
+
# @return [Blob] user's binary representation of UUID
|
|
54
|
+
validates :uuid_bin, uniqueness: { case_sensitive: false, scope: [:tenant_id] }
|
|
55
|
+
|
|
56
|
+
# @!attribute status
|
|
57
|
+
# @return ['enabled', 'disabled'] the status of menu element.
|
|
58
|
+
# - 'enabled' --- user is enabled and can login to system.
|
|
59
|
+
# - 'disabled' --- user is disabled and can't login to system.
|
|
60
|
+
# - 'pending' --- user isn't confirmed.
|
|
61
|
+
enum status: {enabled: 0, disabled: 1, pending: 2}
|
|
62
|
+
|
|
63
|
+
# @!attribute uuid
|
|
64
|
+
# @return [String] user's UUID
|
|
65
|
+
attr_accessor :uuid
|
|
66
|
+
|
|
67
|
+
# @!attribute groups_access
|
|
68
|
+
# @return [Array] array of user access groups
|
|
69
|
+
attr_accessor :groups_access
|
|
70
|
+
|
|
71
|
+
# @!attribute tenant
|
|
72
|
+
# @return [Tenant] the tenant that owns this user.
|
|
73
|
+
belongs_to :tenant, class_name: 'Anubis::Tenant::Tenant'
|
|
74
|
+
has_many :user_groups, class_name: 'Anubis::Tenant::UserGroup'
|
|
75
|
+
|
|
76
|
+
has_one_attached :avatar
|
|
77
|
+
|
|
78
|
+
##
|
|
79
|
+
# Is called before validation when new user is being created. Checks user parameters before create new user.
|
|
80
|
+
# Generates new UUID. Sets default system parameters for first user.
|
|
81
|
+
def before_validation_anubis_user_on_create
|
|
82
|
+
self.uuid = self.new_uuid
|
|
83
|
+
if self.id
|
|
84
|
+
if self.id == 1
|
|
85
|
+
self.password = 'admin'
|
|
86
|
+
self.password_confirmation = 'admin'
|
|
87
|
+
self.status = 0
|
|
88
|
+
self.tenant_id = 1
|
|
89
|
+
self.timeout = 3600
|
|
90
|
+
return true
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
validate_anubis_user true
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# Is called before validation when user is being updated. Checks user parameters before create new user.
|
|
98
|
+
# Generates new UUID. Sets default system parameters for first user.
|
|
99
|
+
def before_validation_anubis_user_on_update
|
|
100
|
+
validate_anubis_user false
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
# Validates users element. Sets default missing parameters. Prevents changing tenant for existing user.
|
|
105
|
+
# @param is_new [Boolean] sets into true when user is being created
|
|
106
|
+
def validate_anubis_user(is_new)
|
|
107
|
+
self.locale = 'ru-RU' if !self.locale
|
|
108
|
+
self.timeout = 3600 if !self.timeout
|
|
109
|
+
self.tenant_id = self.tenant_id_was if !is_new # Can't change tenant for existing user
|
|
110
|
+
self.status = 0 if self.id == 1 # Can't disable Main Administrator
|
|
111
|
+
|
|
112
|
+
if !password.blank?
|
|
113
|
+
if password != password_confirmation
|
|
114
|
+
errors.add(:password, I18n.t('users.errors.different_passwords'))
|
|
115
|
+
errors.add(:password_confirmation, I18n.t('users.errors.different_passwords'))
|
|
116
|
+
return false
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
return true
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
##
|
|
124
|
+
# Is called before user will be stored in database. Changes {#login} and {#email} values to lower case.
|
|
125
|
+
# Deletes user cache in Redis database when user's parameters has been changed.
|
|
126
|
+
def before_save_anubis_user
|
|
127
|
+
self.timezone = 'GMT' if !self.timezone
|
|
128
|
+
self.email = self.email.downcase
|
|
129
|
+
self.login = self.email+'.'+self.tenant.ident
|
|
130
|
+
self.redis.del(self.redis_prefix + 'user:' + self.uuid) if self.redis
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
##
|
|
134
|
+
# Checks if password has been changed
|
|
135
|
+
# @return [Boolean] return true if password has been changed
|
|
136
|
+
def password_changed?
|
|
137
|
+
!password.blank?
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
##
|
|
141
|
+
# Is called before delete user from database. Destroys all access groups for this user
|
|
142
|
+
def before_destroy_anubis_user
|
|
143
|
+
if self.id == 1
|
|
144
|
+
errors.add(:base, I18n.t('users.errors.cant_destroy_tenant_admin'))
|
|
145
|
+
throw(:abort, __method__)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
Anubis::Tenant::UserGroup.where(user_id: self.id).delete_all
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
##
|
|
152
|
+
# Is called after user was deleted from database. Also deletes all cache for this user from Redis database.
|
|
153
|
+
def after_destroy_anubis_user
|
|
154
|
+
if self.redis
|
|
155
|
+
self.redis.del self.uuid
|
|
156
|
+
self.redis.keys(self.uuid+'_*').each do |data|
|
|
157
|
+
self.redis.del data
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
##
|
|
163
|
+
# UUID representations in string format
|
|
164
|
+
# @return [String] string representaion of user UUID
|
|
165
|
+
def uuid
|
|
166
|
+
self.bin_to_uuid self.uuid_bin
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
##
|
|
170
|
+
# Sets UUID into binary format
|
|
171
|
+
# @param value [String] string representation of UUID
|
|
172
|
+
def uuid=(value)
|
|
173
|
+
self.uuid_bin = self.uuid_to_bin value
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
##
|
|
177
|
+
# Excludes password from json output and uuid_bin from
|
|
178
|
+
# @param options [Hash] additional options
|
|
179
|
+
def to_json(options={})
|
|
180
|
+
options[:except] ||= [:password_digest, :uuid_bin]
|
|
181
|
+
super(options)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
##
|
|
185
|
+
# Returns user model system title
|
|
186
|
+
# @return [String] user system title
|
|
187
|
+
def sys_title
|
|
188
|
+
self.title
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
##
|
|
192
|
+
# Attach groups to user json outputs
|
|
193
|
+
def as_json(options={})
|
|
194
|
+
h = super(options)
|
|
195
|
+
h[:groups_access] = []
|
|
196
|
+
self.user_groups.each do |ug|
|
|
197
|
+
h[:groups_access].push ug.group.full_ident
|
|
198
|
+
end
|
|
199
|
+
h
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
##
|
|
203
|
+
# Array of user access group
|
|
204
|
+
def groups_access
|
|
205
|
+
@groups_access ||= get_groups_access
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
##
|
|
209
|
+
# Generate user access groups
|
|
210
|
+
def get_groups_access
|
|
211
|
+
h = []
|
|
212
|
+
self.user_groups.each do |ug|
|
|
213
|
+
h[:groups_access].push ug.group.full_ident
|
|
214
|
+
end
|
|
215
|
+
h
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def name_presence
|
|
219
|
+
true
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def email_unique
|
|
223
|
+
true
|
|
224
|
+
end
|
|
225
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
##
|
|
2
|
+
# UserGroup model. It links User and Group models.
|
|
3
|
+
class Anoubis::Tenant::UserGroup < ApplicationRecord
|
|
4
|
+
self.table_name = 'user_groups'
|
|
5
|
+
|
|
6
|
+
before_update :before_update_user_group
|
|
7
|
+
after_create :after_modify_user_group
|
|
8
|
+
after_destroy :after_modify_user_group
|
|
9
|
+
|
|
10
|
+
belongs_to :group, class_name: 'Anoubis::Tenant::Group'
|
|
11
|
+
validates :group, presence: true, uniqueness: { scope: [:user_id] }
|
|
12
|
+
belongs_to :user, class_name: 'Anoubis::Tenant::User'
|
|
13
|
+
validates :user, presence: true, uniqueness: { scope: [:group_id] }
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Can't change elements
|
|
17
|
+
def before_update_user_group
|
|
18
|
+
self.user_id = self.user_id_was if self.user_id_changed?
|
|
19
|
+
self.group_id = self.group_id_was if self.group_id_changed?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# Delete all redis keys of menu for defined user
|
|
24
|
+
def after_modify_user_group
|
|
25
|
+
if self.redis
|
|
26
|
+
self.redis.keys(self.redis_prefix + self.user.uuid.to_s + '_*').each do |data|
|
|
27
|
+
self.redis.del data
|
|
28
|
+
end
|
|
29
|
+
self.redis.del self.redis_prefix + self.user.uuid.to_s
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class Anubis::SessionService < Anubis::CoreService
|
|
2
|
+
def initialize
|
|
3
|
+
super
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def clear
|
|
7
|
+
self.redis.scan_each(:match => self.redis_prefix + 'session:*') do |key|
|
|
8
|
+
begin
|
|
9
|
+
data = JSON.parse redis.get(key), { symbolize_names: true }
|
|
10
|
+
rescue
|
|
11
|
+
data = {}
|
|
12
|
+
end
|
|
13
|
+
data[:ttl] = Time.now - 1.day unless data.key? :ttl
|
|
14
|
+
self.redis.del(key) if data[:ttl] < Time.now
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class PresenceInTenantValidator < ActiveModel::EachValidator
|
|
2
|
+
def validate_each(record, attribute, value)
|
|
3
|
+
if value
|
|
4
|
+
if value.class.to_s.index 'ActiveRecord_Associations_CollectionProxy'
|
|
5
|
+
value.each do |dat|
|
|
6
|
+
if record.tenant_id != dat.tenant_id
|
|
7
|
+
record.errors.add(attribute, :not_in_tenant, message: I18n.t('activerecord.errors.models.'+record.model_name.i18n_key.to_s+'.attributes.'+attribute.to_s+'.not_in_tenant', :default => ['activerecord.errors.messages.not_in_tenant'.to_sym]))
|
|
8
|
+
return
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
else
|
|
12
|
+
if record.tenant_id != value.tenant_id
|
|
13
|
+
record.errors.add(attribute, :not_in_tenant, message: I18n.t('activerecord.errors.models.'+record.model_name.i18n_key.to_s+'.attributes.'+attribute.to_s+'.not_in_tenant', :default => ['activerecord.errors.messages.not_in_tenant'.to_sym]))
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
else
|
|
17
|
+
record.errors.add(attribute, :blank, message: I18n.t('activerecord.errors.models.'+record.model_name.i18n_key.to_s+'.attributes.'+attribute.to_s+'.blank', :default => ['activerecord.errors.messages.blank'.to_sym]))
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
en:
|
|
2
|
+
success: Successful
|
|
3
|
+
errors:
|
|
4
|
+
no_api_version: API version not defined
|
|
5
|
+
invalid_locale: Invalid locale
|
|
6
|
+
access_not_allowed: Access not allowed
|
|
7
|
+
authentication_required: Authentication required
|
|
8
|
+
session_expired: Session expired
|
|
9
|
+
invalid_login_parameters: Invalid login parameters. Required 'login' and 'password'.
|
|
10
|
+
invalid_login_or_password: Invalid login or password
|
|
11
|
+
invalid_menu_output: Invalid menu output
|
|
12
|
+
internal_error: Internal error
|
|
13
|
+
update_error: Error updating data on server
|
|
14
|
+
delete_error: Error deleting data on server
|
|
15
|
+
incorrect_parameters: Incorrect request parameters
|
|
16
|
+
field_error: field error
|
|
17
|
+
install:
|
|
18
|
+
menu:
|
|
19
|
+
anoubis/admin:
|
|
20
|
+
title: Administration
|
|
21
|
+
page_title: System administration
|
|
22
|
+
anoubis/tenants:
|
|
23
|
+
title: Tenants
|
|
24
|
+
page_title: Tenants management
|
|
25
|
+
short_title: Tenants
|
|
26
|
+
anoubis/users:
|
|
27
|
+
title: Users
|
|
28
|
+
page_title: Users management
|
|
29
|
+
short_title: Users
|
|
30
|
+
|
|
31
|
+
anoubis:
|
|
32
|
+
default_tab: Default
|
|
33
|
+
default_tab_hint: This is default tab
|
|
34
|
+
install:
|
|
35
|
+
groups:
|
|
36
|
+
admin: Administrators
|
|
37
|
+
user: Users
|
|
38
|
+
|
|
39
|
+
tenant_title: System Tenant
|
|
40
|
+
system_title: Main System
|
|
41
|
+
admins_group: Administrators
|
|
42
|
+
admin_name: Administrator
|
|
43
|
+
admin_surname: Main
|
|
44
|
+
table:
|
|
45
|
+
buttons:
|
|
46
|
+
edit: "Edit: %{title}"
|
|
47
|
+
delete: "Delete: %{title}"
|
|
48
|
+
form:
|
|
49
|
+
titles:
|
|
50
|
+
edit: "Edit element: %{title}"
|
|
51
|
+
new: "Add new element"
|
|
52
|
+
|
|
53
|
+
tenants:
|
|
54
|
+
errors:
|
|
55
|
+
cant_change_ident: of system tetnant can't be changed
|
|
56
|
+
cant_destroy: System tetant can't be destroyed
|
|
57
|
+
has_childs: Tenant has child users or systems access
|
|
58
|
+
systems:
|
|
59
|
+
errors:
|
|
60
|
+
cant_change_ident: of main system can't be changed
|
|
61
|
+
cant_destroy: Main system can't be destroyed
|
|
62
|
+
has_childs: System has child groups
|
|
63
|
+
groups:
|
|
64
|
+
errors:
|
|
65
|
+
cant_change_admin_ident: of admin group can't be changed
|
|
66
|
+
cant_destroy_admin_group: Admin group of main system can't be destroyed
|
|
67
|
+
cant_destroy_group_with_users: Can't destroy group with users in it
|
|
68
|
+
users:
|
|
69
|
+
errors:
|
|
70
|
+
different_passwords: must be identical
|
|
71
|
+
cant_destroy_tenant_admin: Main Administrator can't be destroyed
|
|
72
|
+
menus:
|
|
73
|
+
errors:
|
|
74
|
+
has_childs: This menu has child sub menu
|
|
75
|
+
group_menus:
|
|
76
|
+
errors:
|
|
77
|
+
no_access: System of this group has no access to this menu
|
|
78
|
+
|
|
79
|
+
activerecord:
|
|
80
|
+
attributes:
|
|
81
|
+
anoubis/tenant/tenant:
|
|
82
|
+
title: Title
|
|
83
|
+
ident: Identifier
|
|
84
|
+
anoubis/tenant/system:
|
|
85
|
+
title: Title
|
|
86
|
+
ident: Identifier
|
|
87
|
+
anoubis/tenant/group:
|
|
88
|
+
title: Title
|
|
89
|
+
ident: Identifier
|
|
90
|
+
anoubis/tenant/user:
|
|
91
|
+
login: Login
|
|
92
|
+
email: Email
|
|
93
|
+
name: Name
|
|
94
|
+
surname: Surname
|
|
95
|
+
timezone: Timezone
|
|
96
|
+
password: Password
|
|
97
|
+
password_confirmation: Password confirmation
|
|
98
|
+
phone: Phone
|
|
99
|
+
auth_key: Authorization key
|
|
100
|
+
recover_key: Recovery key
|
|
101
|
+
status: Status
|
|
102
|
+
tenant: Tenant
|
|
103
|
+
timeout: Session timeout
|
|
104
|
+
anoubis/tenant/user_group:
|
|
105
|
+
group: Group
|
|
106
|
+
group_id: Group
|
|
107
|
+
user: User
|
|
108
|
+
anoubis/tenant/tenant_system:
|
|
109
|
+
tenant: Tenant
|
|
110
|
+
system: System
|
|
111
|
+
anoubis/tenant/menu:
|
|
112
|
+
mode: Path
|
|
113
|
+
action: Action
|
|
114
|
+
page_size: Page Size
|
|
115
|
+
position: Position
|
|
116
|
+
anoubis/tenant/menu_locale:
|
|
117
|
+
title: Title
|
|
118
|
+
page_title: Page Title
|
|
119
|
+
short_title: Short Title
|
|
120
|
+
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
ru:
|
|
2
|
+
all: Все
|
|
3
|
+
success: Успешное завершение
|
|
4
|
+
actions:
|
|
5
|
+
edit: "Редактировать: %{title}"
|
|
6
|
+
delete: "Удалить: %{title}"
|
|
7
|
+
errors:
|
|
8
|
+
no_api_version: Не указана версия API
|
|
9
|
+
invalid_locale: Некорректная версия локали
|
|
10
|
+
access_not_allowed: Доступ запрещен
|
|
11
|
+
authentication_required: Требуется авторизация пользователя
|
|
12
|
+
session_expired: Сессия завершена
|
|
13
|
+
invalid_login_parameters: Некорректные параметры входа. Требуется задать 'login' и 'password'.
|
|
14
|
+
invalid_login_or_password: Некорректный логин или пароль.
|
|
15
|
+
invalid_menu_output: Некорректный вывод меню
|
|
16
|
+
internal_error: Внутренняя ошибка сервера
|
|
17
|
+
update_error: Ошибка обновления данных на сервере
|
|
18
|
+
delete_error: Ошибка удаления данных на сервере
|
|
19
|
+
incorrect_parameters: Некорректные параметры запроса
|
|
20
|
+
field_error: ошибка поля
|
|
21
|
+
install:
|
|
22
|
+
menu:
|
|
23
|
+
anoubis/admin:
|
|
24
|
+
title: Управление
|
|
25
|
+
page_title: Управление системой
|
|
26
|
+
anoubis/tenants:
|
|
27
|
+
title: Тенанты
|
|
28
|
+
page_title: Управление тенантами
|
|
29
|
+
short_title: Тенанты
|
|
30
|
+
anoubis/users:
|
|
31
|
+
title: Пользователи
|
|
32
|
+
page_title: Управление пользователями
|
|
33
|
+
short_title: Пользователи
|
|
34
|
+
|
|
35
|
+
anoubis:
|
|
36
|
+
core:
|
|
37
|
+
success: Завершено корректно
|
|
38
|
+
errors:
|
|
39
|
+
incorrect_system: Некорректная система
|
|
40
|
+
incorrect_parameters: Некорректные параметры
|
|
41
|
+
error_changing_data: Ошибка изменения данных
|
|
42
|
+
|
|
43
|
+
default_tab: Основная
|
|
44
|
+
default_tab_hint: Это основная вкладка
|
|
45
|
+
months:
|
|
46
|
+
main:
|
|
47
|
+
- Январь
|
|
48
|
+
- Февраль
|
|
49
|
+
- Март
|
|
50
|
+
- Апрель
|
|
51
|
+
- Май
|
|
52
|
+
- Июнь
|
|
53
|
+
- Июль
|
|
54
|
+
- Август
|
|
55
|
+
- Сентябрь
|
|
56
|
+
- Октябрь
|
|
57
|
+
- Ноябрь
|
|
58
|
+
- Декабрь
|
|
59
|
+
second:
|
|
60
|
+
- Января
|
|
61
|
+
- Февраля
|
|
62
|
+
- Марта
|
|
63
|
+
- Апреля
|
|
64
|
+
- Мая
|
|
65
|
+
- Июня
|
|
66
|
+
- Июля
|
|
67
|
+
- Августа
|
|
68
|
+
- Сентября
|
|
69
|
+
- Октября
|
|
70
|
+
- Ноября
|
|
71
|
+
- Декабря
|
|
72
|
+
short:
|
|
73
|
+
- янв
|
|
74
|
+
- фев
|
|
75
|
+
- мар
|
|
76
|
+
- апр
|
|
77
|
+
- май
|
|
78
|
+
- июн
|
|
79
|
+
- июл
|
|
80
|
+
- авг
|
|
81
|
+
- сен
|
|
82
|
+
- окт
|
|
83
|
+
- ноя
|
|
84
|
+
- дек
|
|
85
|
+
install:
|
|
86
|
+
groups:
|
|
87
|
+
admin: Администраторы
|
|
88
|
+
user: Пользователи
|
|
89
|
+
|
|
90
|
+
tenant_title: Основной тенант
|
|
91
|
+
system_title: Основная система
|
|
92
|
+
admins_group: Администраторы
|
|
93
|
+
admin_name: Администратор
|
|
94
|
+
admin_surname: Главный
|
|
95
|
+
table:
|
|
96
|
+
buttons:
|
|
97
|
+
edit: "Редактировать: %{title}"
|
|
98
|
+
delete: "Удалить: %{title}"
|
|
99
|
+
form:
|
|
100
|
+
titles:
|
|
101
|
+
edit: "Редактирование элемента: %{title}"
|
|
102
|
+
show: "Просмотр элемента: %{title}"
|
|
103
|
+
new: "Добавление нового элемента"
|
|
104
|
+
|
|
105
|
+
tenants:
|
|
106
|
+
errors:
|
|
107
|
+
cant_change_ident: основного тенанта изменить нельзя
|
|
108
|
+
cant_destroy: Невозможно удалить основной тенант
|
|
109
|
+
has_childs: Тенант содержит пользователей или имеет доступ к системам
|
|
110
|
+
systems:
|
|
111
|
+
errors:
|
|
112
|
+
cant_change_ident: основной системы изменить нельзя
|
|
113
|
+
cant_destroy: Невозможно удалить основную систему
|
|
114
|
+
has_childs: Система содержит группы
|
|
115
|
+
groups:
|
|
116
|
+
errors:
|
|
117
|
+
cant_change_admin_ident: группы администрирования изменить нельзя
|
|
118
|
+
cant_destroy_admin_group: Группа администраторов основной системы не может быть удалена
|
|
119
|
+
cant_destroy_group_with_users: Нельзя удалить группу содержащую пользователей
|
|
120
|
+
users:
|
|
121
|
+
errors:
|
|
122
|
+
different_passwords: должен быть идентичным
|
|
123
|
+
cant_destroy_tenant_admin: Главный Администратор не может быть удален
|
|
124
|
+
menus:
|
|
125
|
+
errors:
|
|
126
|
+
has_childs: Меню имеет вложенные пункты меню
|
|
127
|
+
group_menus:
|
|
128
|
+
errors:
|
|
129
|
+
no_access: Система которой принадлежит группа не имеет доступа к данному пункту меню
|
|
130
|
+
|
|
131
|
+
activerecord:
|
|
132
|
+
options:
|
|
133
|
+
anoubis/locale:
|
|
134
|
+
ru: Русский
|
|
135
|
+
en: Английский
|
|
136
|
+
kz: Казахский
|
|
137
|
+
anoubis/group_menu:
|
|
138
|
+
access:
|
|
139
|
+
not: Не определен
|
|
140
|
+
read: Чтение
|
|
141
|
+
write: Запись
|
|
142
|
+
disabled: Блокирован
|
|
143
|
+
attributes:
|
|
144
|
+
anoubis/tenant:
|
|
145
|
+
title: Название
|
|
146
|
+
ident: Идентификатор
|
|
147
|
+
anoubis/system:
|
|
148
|
+
title: Название
|
|
149
|
+
ident: Идентификатор
|
|
150
|
+
anoubis/group:
|
|
151
|
+
title: Название
|
|
152
|
+
ident: Идентификатор
|
|
153
|
+
anoubis/user:
|
|
154
|
+
login: Логин
|
|
155
|
+
email: Электронный адрес
|
|
156
|
+
name: Имя
|
|
157
|
+
surname: Фамилия
|
|
158
|
+
timezone: Временная зона
|
|
159
|
+
password: Пароль
|
|
160
|
+
password_confirmation: Повтор пароля
|
|
161
|
+
phone: Телефон
|
|
162
|
+
auth_key: Ключ авторизации
|
|
163
|
+
recover_key: Ключ восстановления
|
|
164
|
+
status: Статус
|
|
165
|
+
tenant: Тенант
|
|
166
|
+
timeout: Время завершения сессии
|
|
167
|
+
anoubis/user_group:
|
|
168
|
+
group: Группа
|
|
169
|
+
group_id: Группа
|
|
170
|
+
user: Пользователь
|
|
171
|
+
anoubis/tenant_system:
|
|
172
|
+
tenant: Тенант
|
|
173
|
+
system: Система
|
|
174
|
+
anoubis/menu:
|
|
175
|
+
mode: Путь
|
|
176
|
+
action: Действие
|
|
177
|
+
page_size: Количество строк таблицы
|
|
178
|
+
position: Позиция
|
|
179
|
+
anoubis/menu_locale:
|
|
180
|
+
title: Название
|
|
181
|
+
page_title: Заголовок страницы
|
|
182
|
+
short_title: Короткое название
|
|
183
|
+
|
|
184
|
+
errors:
|
|
185
|
+
messages:
|
|
186
|
+
not_in_tenant: отсутсвует в тенанте
|
|
187
|
+
required: должен существовать
|
|
188
|
+
too_short:
|
|
189
|
+
one: "должен быть длиннее одного символа"
|
|
190
|
+
other: "должен быть больше %{count} символов"
|
|
191
|
+
too_long:
|
|
192
|
+
one: "должен быть длиннее одного символа"
|
|
193
|
+
other: "должен быть короче %{count} символов"
|
|
194
|
+
invalid: некорректен
|
|
195
|
+
record_invalid: некорректен
|
|
196
|
+
taken: уже существует
|
|
197
|
+
blank: не может быть пустым
|
|
198
|
+
not_an_integer: должен быть целым числом
|
|
199
|
+
not_a_number: должен быть вещественным числом
|
|
200
|
+
greater_than_or_equal_to: "должен быть больше или равен %{count}"
|
|
201
|
+
less_than_or_equal_to: "должен быть меньше или равен %{count}"
|
|
202
|
+
inclusion: "значение не попадает в список"
|
|
203
|
+
|
|
204
|
+
models:
|
|
205
|
+
anoubis/tenant/tenant:
|
|
206
|
+
attributes:
|
|
207
|
+
title:
|
|
208
|
+
too_short: "должно быть больше %{count} символов"
|
|
209
|
+
too_long: "должно быть короче %{count} символов"
|
|
210
|
+
anoubis/tenant/system:
|
|
211
|
+
attributes:
|
|
212
|
+
title:
|
|
213
|
+
too_short: "должно быть больше %{count} символов"
|
|
214
|
+
too_long: "должно быть короче %{count} символов"
|
|
215
|
+
anoubis/tenant/user_group:
|
|
216
|
+
attributes:
|
|
217
|
+
group:
|
|
218
|
+
required: должна существовать
|
|
219
|
+
anoubis/tenant/user:
|
|
220
|
+
attributes:
|
|
221
|
+
name:
|
|
222
|
+
too_long: "должно быть короче %{count} символов"
|
|
223
|
+
surname:
|
|
224
|
+
blank: не может быть пустой
|
|
225
|
+
too_long: "должна быть короче %{count} символов"
|
|
226
|
+
timeout:
|
|
227
|
+
not_a_number: "должно быть целым числом"
|
|
228
|
+
greater_than_or_equal_to: "должно быть больше или равно %{count}"
|
|
229
|
+
|
|
230
|
+
anoubis/tenant/tenant_system:
|
|
231
|
+
attributes:
|
|
232
|
+
system:
|
|
233
|
+
required: должна существовать
|
|
234
|
+
anoubis/tenant/menu:
|
|
235
|
+
attributes:
|
|
236
|
+
position:
|
|
237
|
+
not_a_number: должна быть целым числом
|
|
238
|
+
page_size:
|
|
239
|
+
greater_than_or_equal_to: "должно быть больше или равно %{count}"
|
|
240
|
+
anoubis/tenant/menu_locale:
|
|
241
|
+
attributes:
|
|
242
|
+
title:
|
|
243
|
+
too_short: "должно быть больше %{count} символов"
|
|
244
|
+
too_long: "должно быть короче %{count} символов"
|
|
245
|
+
|