anoubis 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|