biovision-base 0.5.170614 → 0.7.170709
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -0
- data/app/assets/images/biovision/base/placeholders/image.svg +1 -1
- data/app/assets/images/biovision/base/placeholders/region_image.svg +1 -0
- data/app/assets/stylesheets/biovision/base/admin.scss +226 -31
- data/app/assets/stylesheets/biovision/base/biovision.scss +45 -104
- data/app/assets/stylesheets/biovision/base/buttons.scss +3 -2
- data/app/assets/stylesheets/biovision/base/default.scss +66 -45
- data/app/assets/stylesheets/biovision/base/default_admin.scss +10 -0
- data/app/assets/stylesheets/biovision/base/default_application.scss +8 -0
- data/app/assets/stylesheets/biovision/base/filters.scss +4 -4
- data/app/assets/stylesheets/biovision/base/layout.scss +113 -0
- data/app/assets/stylesheets/biovision/base/message-box.scss +3 -3
- data/app/assets/stylesheets/biovision/base/regions.scss +9 -0
- data/app/assets/stylesheets/biovision/base/tootik.scss +6 -6
- data/app/assets/stylesheets/biovision/base/track.scss +7 -6
- data/app/assets/stylesheets/biovision/base/users.scss +64 -0
- data/app/controllers/admin/login_attempts_controller.rb +6 -0
- data/app/controllers/admin/privileges_controller.rb +37 -1
- data/app/controllers/admin/regions_controller.rb +37 -0
- data/app/controllers/admin/users_controller.rb +2 -2
- data/app/controllers/authentication_controller.rb +27 -26
- data/app/controllers/concerns/authentication.rb +20 -0
- data/app/controllers/my/confirmations_controller.rb +8 -3
- data/app/controllers/my/login_attempts_controller.rb +9 -0
- data/app/controllers/my/profiles_controller.rb +10 -2
- data/app/controllers/my/tokens_controller.rb +20 -0
- data/app/controllers/regions_controller.rb +73 -0
- data/app/helpers/biovision_regions_helper.rb +22 -0
- data/app/mailers/application_mailer.rb +5 -0
- data/app/mailers/user_mailer.rb +8 -0
- data/app/models/central_region.rb +49 -0
- data/app/models/concerns/required_unique_name.rb +1 -1
- data/app/models/concerns/required_unique_slug.rb +1 -1
- data/app/models/login_attempt.rb +24 -0
- data/app/models/privilege.rb +176 -1
- data/app/models/region.rb +100 -0
- data/app/models/user.rb +118 -1
- data/app/models/user_privilege.rb +52 -1
- data/app/services/code_manager/confirmation.rb +1 -1
- data/app/services/user_bouncer.rb +37 -0
- data/app/uploaders/header_image_uploader.rb +50 -0
- data/app/uploaders/region_image_uploader.rb +53 -0
- data/app/views/admin/agents/entity/_preview.jbuilder +8 -0
- data/app/views/admin/codes/index.html.erb +1 -1
- data/app/views/admin/editable_pages/index.html.erb +1 -1
- data/app/views/admin/index/index.html.erb +4 -0
- data/app/views/admin/login_attempts/_nav_item.html.erb +6 -0
- data/app/views/admin/login_attempts/entity/_in_list.html.erb +16 -0
- data/app/views/admin/login_attempts/included/_agents.jbuilder +3 -0
- data/app/views/admin/login_attempts/included/_users.jbuilder +3 -0
- data/app/views/admin/login_attempts/index.html.erb +16 -0
- data/app/views/admin/login_attempts/index.jbuilder +28 -0
- data/app/views/admin/privilege_groups/index.html.erb +1 -1
- data/app/views/admin/privileges/_toggleable.html.erb +7 -0
- data/app/views/admin/privileges/entity/_in_list.html.erb +1 -0
- data/app/views/admin/privileges/entity/_region.html.erb +12 -0
- data/app/views/admin/privileges/regions.jbuilder +10 -0
- data/app/views/admin/privileges/show.html.erb +2 -0
- data/app/views/admin/regions/_nav_item.html.erb +2 -0
- data/app/views/admin/regions/_toggleable.html.erb +7 -0
- data/app/views/admin/regions/entity/_in_list.html.erb +32 -0
- data/app/views/admin/regions/index.html.erb +22 -0
- data/app/views/admin/regions/show.html.erb +95 -0
- data/app/views/admin/tokens/index.html.erb +1 -1
- data/app/views/admin/users/_search.html.erb +1 -1
- data/app/views/admin/users/entity/_preview.jbuilder +12 -0
- data/app/views/admin/users/entity/_privilege.html.erb +23 -7
- data/app/views/admin/users/entity/_privilege_tree.html.erb +2 -2
- data/app/views/admin/users/privileges.html.erb +47 -12
- data/app/views/admin/users/show.html.erb +17 -1
- data/app/views/admin/users/tokens.html.erb +1 -1
- data/app/views/authentication/new.html.erb +1 -2
- data/app/views/layouts/admin/_footer.html.erb +8 -0
- data/app/views/layouts/application/_footer.html.erb +5 -0
- data/app/views/layouts/application/_header.html.erb +9 -0
- data/app/views/layouts/application/header/_authentication.html.erb +7 -0
- data/app/views/layouts/application/header/_logo.html.erb +3 -0
- data/app/views/layouts/application/header/_navigation.html.erb +0 -0
- data/app/views/layouts/application/header/authentication/_links.html.erb +4 -0
- data/app/views/layouts/application/header/authentication/_plate.html.erb +4 -0
- data/app/views/layouts/mailer.html.erb +13 -0
- data/app/views/layouts/mailer.text.erb +1 -0
- data/app/views/my/confirmations/show.html.erb +11 -1
- data/app/views/my/index/index.html.erb +6 -4
- data/app/views/{admin/tokens → my/login_attempts}/_list.html.erb +1 -1
- data/app/views/my/login_attempts/_nav_item.html.erb +6 -0
- data/app/views/my/login_attempts/entity/_in_list.html.erb +13 -0
- data/app/views/my/login_attempts/included/_agents.jbuilder +7 -0
- data/app/views/my/login_attempts/index.html.erb +13 -0
- data/app/views/my/login_attempts/index.jbuilder +22 -0
- data/app/views/my/profiles/_nav_item.html.erb +6 -0
- data/app/views/my/profiles/new/_form.html.erb +49 -23
- data/app/views/my/profiles/new.html.erb +2 -2
- data/app/views/{admin/codes → my/tokens}/_list.html.erb +1 -1
- data/app/views/my/tokens/_nav_item.html.erb +6 -0
- data/app/views/my/tokens/_toggleable.html.erb +7 -0
- data/app/views/my/tokens/entity/_in_list.html.erb +18 -0
- data/app/views/my/tokens/index.html.erb +13 -0
- data/app/views/privileges/_form.html.erb +7 -0
- data/app/views/regions/_form.html.erb +73 -0
- data/app/views/regions/edit.html.erb +20 -0
- data/app/views/regions/new.html.erb +17 -0
- data/app/views/shared/_counters.html.erb +0 -0
- data/app/views/shared/_pagination.jbuilder +9 -0
- data/app/views/{admin/editable_pages → shared/admin}/_list.html.erb +2 -2
- data/app/views/user_mailer/login_attempt.html.erb +7 -0
- data/config/locales/common-ru.yml +5 -0
- data/config/locales/editable-pages-ru.yml +1 -1
- data/config/locales/regions-ru.yml +62 -0
- data/config/locales/users-ru.yml +48 -6
- data/config/routes.rb +19 -2
- data/db/migrate/20170301000201_create_regions.rb +32 -0
- data/db/migrate/20170302000001_create_users.rb +1 -0
- data/db/migrate/20170302000101_create_privileges.rb +2 -0
- data/db/migrate/20170302000102_create_user_privileges.rb +1 -0
- data/db/migrate/20170302000103_create_privilege_groups.rb +1 -0
- data/db/migrate/20170302000104_create_privilege_group_privileges.rb +4 -0
- data/db/migrate/20170629120000_create_login_attempts.rb +19 -0
- data/lib/biovision/base/engine.rb +6 -0
- data/lib/biovision/base/privilege_methods.rb +21 -3
- data/lib/biovision/base/version.rb +1 -1
- data/lib/tasks/{biovision/agents.rake → agents.rake} +0 -0
- data/lib/tasks/{biovision/browsers.rake → browsers.rake} +0 -0
- data/lib/tasks/{biovision/codes.rake → codes.rake} +0 -0
- data/lib/tasks/regions.rake +70 -0
- data/lib/tasks/{biovision/tokens.rake → tokens.rake} +0 -0
- data/lib/tasks/{biovision/users.rake → users.rake} +0 -0
- metadata +75 -17
- data/app/assets/stylesheets/biovision/base/fonts.scss +0 -9
- data/app/controllers/concerns/biovision/admin/privileges.rb +0 -34
- data/app/models/concerns/biovision/privilege_base.rb +0 -143
- data/app/models/concerns/biovision/user_base.rb +0 -124
- data/app/models/concerns/biovision/user_privilege_base.rb +0 -46
- data/app/views/admin/privilege_groups/_list.html.erb +0 -11
- data/app/views/authentication/_info.html.erb +0 -8
data/config/locales/users-ru.yml
CHANGED
@@ -28,6 +28,7 @@ ru:
|
|
28
28
|
privilege_group: "Группа привилегий"
|
29
29
|
privilege_group_privilege: "Привилегия в группе привилегий"
|
30
30
|
user_privilege: "Привилегия у пользователя"
|
31
|
+
login_attempt: "Попытка входа"
|
31
32
|
errors:
|
32
33
|
models:
|
33
34
|
user:
|
@@ -93,6 +94,7 @@ ru:
|
|
93
94
|
privilege:
|
94
95
|
parent_id: "Родительская категория"
|
95
96
|
priority: "Порядок сортировки"
|
97
|
+
regional: "Региональная"
|
96
98
|
name: "Название"
|
97
99
|
slug: "Идентификатор"
|
98
100
|
description: "Описание"
|
@@ -108,6 +110,9 @@ ru:
|
|
108
110
|
privilege_group_privilege:
|
109
111
|
privilege: "Привилегия"
|
110
112
|
privilege_group: "Группа привилегий"
|
113
|
+
login_attempt:
|
114
|
+
user: "Пользователь"
|
115
|
+
password: "Пароль"
|
111
116
|
admin:
|
112
117
|
users:
|
113
118
|
nav_item:
|
@@ -174,11 +179,23 @@ ru:
|
|
174
179
|
show:
|
175
180
|
title: "Группа привилегий «%{name}»"
|
176
181
|
privileges: "Привилегии"
|
182
|
+
login_attempts:
|
183
|
+
index:
|
184
|
+
title: "Попытки входа, страница %{page}"
|
185
|
+
heading: "Попытки входа пользователей"
|
186
|
+
nav_item:
|
187
|
+
text: "Попытки входа"
|
188
|
+
description: "Неудачные попытки входа пользователей"
|
177
189
|
authentication:
|
190
|
+
nav_item:
|
191
|
+
log_in: "Вход"
|
192
|
+
join: "Регистрация"
|
193
|
+
logout: "Выйти"
|
178
194
|
info:
|
179
195
|
logout: "Выйти"
|
180
196
|
new:
|
181
197
|
title: "Вход"
|
198
|
+
heading: "Вход"
|
182
199
|
breadcrumbs: "Вход"
|
183
200
|
users:
|
184
201
|
create:
|
@@ -294,20 +311,28 @@ ru:
|
|
294
311
|
no_code: "Кода подтверждения нет?"
|
295
312
|
send_code: "Отправить код подтверждения"
|
296
313
|
profiles:
|
314
|
+
nav_item:
|
315
|
+
text: "Мой профиль"
|
316
|
+
description: "Просмотр и редактирование вашего профиля"
|
297
317
|
new:
|
298
318
|
title: "Регистрация"
|
319
|
+
heading: "Регистрация"
|
299
320
|
form:
|
300
321
|
i_am_bot: "НЕ ОТМЕЧАЙТЕ эту галочку"
|
301
|
-
|
302
|
-
|
322
|
+
consent: "Принимаю пользовательское соглашение и даю своё согласие на обработку персональных данных"
|
323
|
+
guidelines:
|
324
|
+
screen_name: "Только латинские буквы, цифры и знаки подчёркивания. От 1 до 30 символов."
|
325
|
+
password: "Выберите надёжный пароль, который нельзя легко подобрать."
|
326
|
+
password_confirmation: "Повторите пароль, чтобы убедиться, что вы не ошиблись в наборе."
|
327
|
+
email: "Введите почту для обратной связи и на случай сброса пароля."
|
303
328
|
create:
|
304
329
|
success: "Вы зарегистрировались и вошли"
|
330
|
+
are_you_bot: "Не нужно было отмечать галочку."
|
305
331
|
update:
|
306
332
|
success: "Профиль успешно изменён"
|
307
333
|
show:
|
308
334
|
title: "Мой профиль"
|
309
335
|
heading: "Мой профиль"
|
310
|
-
description: "Просмотр и редактирование вашего профиля"
|
311
336
|
edit:
|
312
337
|
title: "Редактирование профиля"
|
313
338
|
form:
|
@@ -319,6 +344,23 @@ ru:
|
|
319
344
|
leave_blank_if_necessary: "Если не будете менять пароль, оставьте эти поля пустыми."
|
320
345
|
new_password: "Новый пароль"
|
321
346
|
update: "Обновить данные"
|
322
|
-
|
323
|
-
|
324
|
-
|
347
|
+
tokens:
|
348
|
+
nav_item:
|
349
|
+
text: "Жетоны доступа (сессии)"
|
350
|
+
description: "Управление сессионными жетонами"
|
351
|
+
index:
|
352
|
+
title: "Жетоны, страница %{page}"
|
353
|
+
heading: "Жетоны доступа (сессии)"
|
354
|
+
login_attempts:
|
355
|
+
nav_item:
|
356
|
+
text: "Попытки входа"
|
357
|
+
description: "Попытки входа в ваш аккаунт"
|
358
|
+
index:
|
359
|
+
title: "Попытки входа в мой аккаунт, страница %{page}"
|
360
|
+
heading: "Попытки входа в мой аккаунт"
|
361
|
+
user_mailer:
|
362
|
+
login_attempt:
|
363
|
+
subject: "Кто-то пытается войти от вашего имени"
|
364
|
+
greeting: "Здравствуйте, %{name}"
|
365
|
+
message: "Кто-то бесуспешно пытается войти от вашего имени. В целях безопасности возможность входа заблокирована на 15 минут."
|
366
|
+
you_can_recover_password: "Если это вы забыли свой пароль, его можно восстановить по этой ссылке"
|
data/config/routes.rb
CHANGED
@@ -37,6 +37,14 @@ Rails.application.routes.draw do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
resources :regions, only: [:index, :show] do
|
41
|
+
member do
|
42
|
+
post 'toggle', defaults: { format: :json }
|
43
|
+
put 'lock', defaults: { format: :json }
|
44
|
+
delete 'lock', action: :unlock, defaults: { format: :json }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
40
48
|
resources :privileges, only: [:index, :show] do
|
41
49
|
member do
|
42
50
|
put 'lock', defaults: { format: :json }
|
@@ -44,8 +52,7 @@ Rails.application.routes.draw do
|
|
44
52
|
post 'priority', defaults: { format: :json }
|
45
53
|
post 'toggle', defaults: { format: :json }
|
46
54
|
get 'users'
|
47
|
-
|
48
|
-
delete 'users/:user_id' => :remove_user, defaults: { format: :json }
|
55
|
+
get 'regions', defaults: { format: :json }
|
49
56
|
end
|
50
57
|
end
|
51
58
|
resources :privilege_groups, only: [:index, :show] do
|
@@ -69,6 +76,8 @@ Rails.application.routes.draw do
|
|
69
76
|
post 'authenticate'
|
70
77
|
end
|
71
78
|
end
|
79
|
+
|
80
|
+
resources :login_attempts, only: [:index]
|
72
81
|
end
|
73
82
|
|
74
83
|
namespace :my do
|
@@ -76,6 +85,12 @@ Rails.application.routes.draw do
|
|
76
85
|
|
77
86
|
resource :profile, except: [:destroy]
|
78
87
|
resource :confirmation, :recovery, only: [:show, :create, :update]
|
88
|
+
resources :tokens, only: [:index] do
|
89
|
+
member do
|
90
|
+
post 'toggle', defaults: { format: :json }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
resources :login_attempts, only: [:index]
|
79
94
|
end
|
80
95
|
|
81
96
|
resources :agents, :browsers, except: [:index, :show]
|
@@ -87,6 +102,8 @@ Rails.application.routes.draw do
|
|
87
102
|
|
88
103
|
resources :metrics, only: [:edit, :update]
|
89
104
|
|
105
|
+
resources :regions, except: [:index, :show]
|
106
|
+
|
90
107
|
resources :privileges, except: [:index, :show]
|
91
108
|
resources :privilege_groups, except: [:index, :show]
|
92
109
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class CreateRegions < ActiveRecord::Migration[5.1]
|
2
|
+
def up
|
3
|
+
unless Region.table_exists?
|
4
|
+
create_table :regions do |t|
|
5
|
+
t.timestamps
|
6
|
+
t.integer :parent_id
|
7
|
+
t.integer :users_count, default: 0, null: false
|
8
|
+
t.boolean :visible, default: true, null: false
|
9
|
+
t.boolean :locked, default: false, null: false
|
10
|
+
t.float :latitude
|
11
|
+
t.float :longitude
|
12
|
+
t.string :slug, null: false
|
13
|
+
t.string :long_slug, null: false
|
14
|
+
t.string :name, null: false
|
15
|
+
t.string :short_name
|
16
|
+
t.string :locative
|
17
|
+
t.string :image
|
18
|
+
t.string :header_image
|
19
|
+
t.string :parents_cache, default: '', null: false
|
20
|
+
t.integer :children_cache, array: true, default: [], null: false
|
21
|
+
end
|
22
|
+
|
23
|
+
add_foreign_key :regions, :regions, column: :parent_id, on_update: :cascade, on_delete: :cascade
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def down
|
28
|
+
if Region.table_exists?
|
29
|
+
drop_table :regions
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -3,6 +3,7 @@ class CreateUsers < ActiveRecord::Migration[5.0]
|
|
3
3
|
unless User.table_exists?
|
4
4
|
create_table :users do |t|
|
5
5
|
t.timestamps
|
6
|
+
t.references :region, foreign_key: true, on_update: :cascade, on_delete: :nullify
|
6
7
|
t.references :agent, foreign_key: true, on_update: :cascade, on_delete: :nullify
|
7
8
|
t.inet :ip
|
8
9
|
t.integer :inviter_id
|
@@ -6,6 +6,7 @@ class CreatePrivileges < ActiveRecord::Migration[5.0]
|
|
6
6
|
t.integer :parent_id
|
7
7
|
t.boolean :locked, default: false, null: false
|
8
8
|
t.boolean :deleted, default: false, null: false
|
9
|
+
t.boolean :regional, default: false, null: false
|
9
10
|
t.integer :priority, limit: 2, default: 1, null: false
|
10
11
|
t.integer :users_count, default: 0, null: false
|
11
12
|
t.string :parents_cache, default: '', null: false
|
@@ -23,6 +24,7 @@ class CreatePrivileges < ActiveRecord::Migration[5.0]
|
|
23
24
|
Privilege.create!(slug: 'metrics_manager', name: 'Аналитик метрик')
|
24
25
|
Privilege.create!(slug: 'moderator', name: 'Модератор')
|
25
26
|
Privilege.create!(slug: 'chief_editor', name: 'Главный редактор')
|
27
|
+
Privilege.create!(slug: 'region_manager', name: 'Управляющий регионом', regional: true)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -3,6 +3,7 @@ class CreateUserPrivileges < ActiveRecord::Migration[5.0]
|
|
3
3
|
unless UserPrivilege.table_exists?
|
4
4
|
create_table :user_privileges do |t|
|
5
5
|
t.timestamps
|
6
|
+
t.references :region, foreign_key: true, on_update: :cascade, on_delete: :cascade
|
6
7
|
t.references :user, foreign_key: true, null: false, on_update: :cascade, on_delete: :cascade
|
7
8
|
t.references :privilege, foreign_key: true, null: false, on_update: :cascade, on_delete: :cascade
|
8
9
|
end
|
@@ -10,6 +10,7 @@ class CreatePrivilegeGroups < ActiveRecord::Migration[5.0]
|
|
10
10
|
|
11
11
|
add_index :privilege_groups, :slug, unique: true
|
12
12
|
|
13
|
+
PrivilegeGroup.create(slug: 'region_managers', name: 'Управляющие регионами')
|
13
14
|
PrivilegeGroup.create(slug: 'editors', name: 'Редакторы')
|
14
15
|
PrivilegeGroup.create(slug: 'editorial_office', name: 'Члены редакции')
|
15
16
|
end
|
@@ -13,6 +13,10 @@ class CreatePrivilegeGroupPrivileges < ActiveRecord::Migration[5.0]
|
|
13
13
|
group = PrivilegeGroup.find_by(slug: 'editorial_office')
|
14
14
|
group.add_privilege(Privilege.find_by(slug: 'chief_editor'))
|
15
15
|
group.add_privilege(Privilege.find_by(slug: 'moderator'))
|
16
|
+
|
17
|
+
group = PrivilegeGroup.find_by(slug: 'region_managers')
|
18
|
+
group.add_privilege(Privilege.find_by(slug: 'administrator'))
|
19
|
+
group.add_privilege(Privilege.find_by(slug: 'region_manager'))
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateLoginAttempts < ActiveRecord::Migration[5.1]
|
2
|
+
def up
|
3
|
+
unless LoginAttempt.table_exists?
|
4
|
+
create_table :login_attempts do |t|
|
5
|
+
t.timestamps
|
6
|
+
t.references :user, foreign_key: true, null: false, on_update: :casacde, on_delete: :cascade
|
7
|
+
t.references :agent, foreign_key: true, on_update: :cascade, on_delete: :nullify
|
8
|
+
t.inet :ip
|
9
|
+
t.string :password, default: '', null: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def down
|
15
|
+
if LoginAttempt.table_exists?
|
16
|
+
drop_table :login_attempts
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -5,11 +5,17 @@ module Biovision
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
helper_method :current_user_has_privilege?, :current_user_in_group?
|
8
|
+
helper_method :current_region
|
9
|
+
end
|
10
|
+
|
11
|
+
def current_region
|
12
|
+
@current_region ||= set_current_region
|
8
13
|
end
|
9
14
|
|
10
15
|
# @param [Symbol] privilege_name
|
11
|
-
|
12
|
-
|
16
|
+
# @param [Region] region
|
17
|
+
def current_user_has_privilege?(privilege_name, region = nil)
|
18
|
+
::UserPrivilege.user_has_privilege?(current_user, privilege_name, region)
|
13
19
|
end
|
14
20
|
|
15
21
|
# @param [Symbol] group_name
|
@@ -21,7 +27,7 @@ module Biovision
|
|
21
27
|
|
22
28
|
# @param [Symbol] privilege_name
|
23
29
|
def require_privilege(privilege_name)
|
24
|
-
return if current_user_has_privilege?(privilege_name)
|
30
|
+
return if current_user_has_privilege?(privilege_name, current_region)
|
25
31
|
handle_http_401("Current user has no privilege #{privilege_name}")
|
26
32
|
end
|
27
33
|
|
@@ -30,6 +36,18 @@ module Biovision
|
|
30
36
|
return if current_user_in_group?(group_name)
|
31
37
|
handle_http_401("Current user is not in group #{group_name}")
|
32
38
|
end
|
39
|
+
|
40
|
+
def set_current_region
|
41
|
+
region_slug = param_from_request(:region_slug)
|
42
|
+
if region_slug.blank?
|
43
|
+
region_slug = request.subdomains.first
|
44
|
+
end
|
45
|
+
if region_slug.blank?
|
46
|
+
@current_region = CentralRegion.new
|
47
|
+
else
|
48
|
+
@current_region = Region.find_by(long_slug: region_slug) || CentralRegion.new
|
49
|
+
end
|
50
|
+
end
|
33
51
|
end
|
34
52
|
end
|
35
53
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,70 @@
|
|
1
|
+
namespace :regions do
|
2
|
+
desc 'Load regions from YAML with deleting old data'
|
3
|
+
task load: :environment do
|
4
|
+
file_path = "#{Rails.root}/tmp/import/regions.yml"
|
5
|
+
media_dir = "#{Rails.root}/tmp/import/regions"
|
6
|
+
ignored = %w(image header_image)
|
7
|
+
if File.exists? file_path
|
8
|
+
puts 'Deleting old regions...'
|
9
|
+
Region.destroy_all
|
10
|
+
puts 'Done. Importing...'
|
11
|
+
File.open file_path, 'r' do |file|
|
12
|
+
YAML.load(file).each do |id, data|
|
13
|
+
attributes = data.reject { |key| ignored.include?(key) }
|
14
|
+
entity = Region.new id: id
|
15
|
+
entity.assign_attributes(attributes)
|
16
|
+
if data.key?('image')
|
17
|
+
image_file = "#{media_dir}/image/#{id}/#{data['image']}"
|
18
|
+
if File.exists?(image_file)
|
19
|
+
entity.image = Pathname.new(image_file).open
|
20
|
+
end
|
21
|
+
end
|
22
|
+
if data.key?('header_image')
|
23
|
+
image_file = "#{media_dir}/header_image/#{id}/#{data['header_image']}"
|
24
|
+
if File.exists?(image_file)
|
25
|
+
entity.header_image = Pathname.new(image_file).open
|
26
|
+
end
|
27
|
+
end
|
28
|
+
entity.save!
|
29
|
+
print "\r#{id} "
|
30
|
+
end
|
31
|
+
puts
|
32
|
+
end
|
33
|
+
Region.connection.execute "select setval('regions_id_seq', (select max(id) from regions));"
|
34
|
+
puts "Done. We have #{Region.count} regions now"
|
35
|
+
else
|
36
|
+
puts "Cannot find file #{file_path}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'Dump regions to YAML'
|
41
|
+
task dump: :environment do
|
42
|
+
file_path = "#{Rails.root}/tmp/export/regions.yml"
|
43
|
+
media_dir = "#{Rails.root}/tmp/export/regions"
|
44
|
+
ignored = %w(id users_count image header_image)
|
45
|
+
File.open file_path, 'w' do |file|
|
46
|
+
Region.order('id asc').each do |entity|
|
47
|
+
print "\r#{entity.id} "
|
48
|
+
file.puts "#{entity.id}:"
|
49
|
+
entity.attributes.reject { |a, v| ignored.include?(a) || v.nil? }.each do |attribute, value|
|
50
|
+
file.puts " #{attribute}: #{value.inspect}"
|
51
|
+
end
|
52
|
+
unless entity.image.blank?
|
53
|
+
image_name = "#{entity.long_slug}#{File.extension(File.basename(entity.image.path))}"
|
54
|
+
image_dir = "#{media_dir}/image/#{entity.id}"
|
55
|
+
FileUtils.mkdir_p(image_dir) unless Dir.exists?(image_dir)
|
56
|
+
FileUtils.copy(entity.image.path, "#{image_dir}/#{image_name}")
|
57
|
+
file.puts " image: #{image_name.inspect}"
|
58
|
+
end
|
59
|
+
unless entity.header_image.blank?
|
60
|
+
image_name = "#{entity.long_slug}#{File.extension(File.basename(entity.header_image.path))}"
|
61
|
+
image_dir = "#{media_dir}/header_image/#{entity.id}"
|
62
|
+
FileUtils.mkdir_p(image_dir) unless Dir.exists?(image_dir)
|
63
|
+
FileUtils.copy(entity.header_image.path, "#{image_dir}/#{image_name}")
|
64
|
+
file.puts " header_image: #{image_name.inspect}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
puts
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
File without changes
|
File without changes
|