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.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -0
  3. data/app/assets/images/biovision/base/placeholders/image.svg +1 -1
  4. data/app/assets/images/biovision/base/placeholders/region_image.svg +1 -0
  5. data/app/assets/stylesheets/biovision/base/admin.scss +226 -31
  6. data/app/assets/stylesheets/biovision/base/biovision.scss +45 -104
  7. data/app/assets/stylesheets/biovision/base/buttons.scss +3 -2
  8. data/app/assets/stylesheets/biovision/base/default.scss +66 -45
  9. data/app/assets/stylesheets/biovision/base/default_admin.scss +10 -0
  10. data/app/assets/stylesheets/biovision/base/default_application.scss +8 -0
  11. data/app/assets/stylesheets/biovision/base/filters.scss +4 -4
  12. data/app/assets/stylesheets/biovision/base/layout.scss +113 -0
  13. data/app/assets/stylesheets/biovision/base/message-box.scss +3 -3
  14. data/app/assets/stylesheets/biovision/base/regions.scss +9 -0
  15. data/app/assets/stylesheets/biovision/base/tootik.scss +6 -6
  16. data/app/assets/stylesheets/biovision/base/track.scss +7 -6
  17. data/app/assets/stylesheets/biovision/base/users.scss +64 -0
  18. data/app/controllers/admin/login_attempts_controller.rb +6 -0
  19. data/app/controllers/admin/privileges_controller.rb +37 -1
  20. data/app/controllers/admin/regions_controller.rb +37 -0
  21. data/app/controllers/admin/users_controller.rb +2 -2
  22. data/app/controllers/authentication_controller.rb +27 -26
  23. data/app/controllers/concerns/authentication.rb +20 -0
  24. data/app/controllers/my/confirmations_controller.rb +8 -3
  25. data/app/controllers/my/login_attempts_controller.rb +9 -0
  26. data/app/controllers/my/profiles_controller.rb +10 -2
  27. data/app/controllers/my/tokens_controller.rb +20 -0
  28. data/app/controllers/regions_controller.rb +73 -0
  29. data/app/helpers/biovision_regions_helper.rb +22 -0
  30. data/app/mailers/application_mailer.rb +5 -0
  31. data/app/mailers/user_mailer.rb +8 -0
  32. data/app/models/central_region.rb +49 -0
  33. data/app/models/concerns/required_unique_name.rb +1 -1
  34. data/app/models/concerns/required_unique_slug.rb +1 -1
  35. data/app/models/login_attempt.rb +24 -0
  36. data/app/models/privilege.rb +176 -1
  37. data/app/models/region.rb +100 -0
  38. data/app/models/user.rb +118 -1
  39. data/app/models/user_privilege.rb +52 -1
  40. data/app/services/code_manager/confirmation.rb +1 -1
  41. data/app/services/user_bouncer.rb +37 -0
  42. data/app/uploaders/header_image_uploader.rb +50 -0
  43. data/app/uploaders/region_image_uploader.rb +53 -0
  44. data/app/views/admin/agents/entity/_preview.jbuilder +8 -0
  45. data/app/views/admin/codes/index.html.erb +1 -1
  46. data/app/views/admin/editable_pages/index.html.erb +1 -1
  47. data/app/views/admin/index/index.html.erb +4 -0
  48. data/app/views/admin/login_attempts/_nav_item.html.erb +6 -0
  49. data/app/views/admin/login_attempts/entity/_in_list.html.erb +16 -0
  50. data/app/views/admin/login_attempts/included/_agents.jbuilder +3 -0
  51. data/app/views/admin/login_attempts/included/_users.jbuilder +3 -0
  52. data/app/views/admin/login_attempts/index.html.erb +16 -0
  53. data/app/views/admin/login_attempts/index.jbuilder +28 -0
  54. data/app/views/admin/privilege_groups/index.html.erb +1 -1
  55. data/app/views/admin/privileges/_toggleable.html.erb +7 -0
  56. data/app/views/admin/privileges/entity/_in_list.html.erb +1 -0
  57. data/app/views/admin/privileges/entity/_region.html.erb +12 -0
  58. data/app/views/admin/privileges/regions.jbuilder +10 -0
  59. data/app/views/admin/privileges/show.html.erb +2 -0
  60. data/app/views/admin/regions/_nav_item.html.erb +2 -0
  61. data/app/views/admin/regions/_toggleable.html.erb +7 -0
  62. data/app/views/admin/regions/entity/_in_list.html.erb +32 -0
  63. data/app/views/admin/regions/index.html.erb +22 -0
  64. data/app/views/admin/regions/show.html.erb +95 -0
  65. data/app/views/admin/tokens/index.html.erb +1 -1
  66. data/app/views/admin/users/_search.html.erb +1 -1
  67. data/app/views/admin/users/entity/_preview.jbuilder +12 -0
  68. data/app/views/admin/users/entity/_privilege.html.erb +23 -7
  69. data/app/views/admin/users/entity/_privilege_tree.html.erb +2 -2
  70. data/app/views/admin/users/privileges.html.erb +47 -12
  71. data/app/views/admin/users/show.html.erb +17 -1
  72. data/app/views/admin/users/tokens.html.erb +1 -1
  73. data/app/views/authentication/new.html.erb +1 -2
  74. data/app/views/layouts/admin/_footer.html.erb +8 -0
  75. data/app/views/layouts/application/_footer.html.erb +5 -0
  76. data/app/views/layouts/application/_header.html.erb +9 -0
  77. data/app/views/layouts/application/header/_authentication.html.erb +7 -0
  78. data/app/views/layouts/application/header/_logo.html.erb +3 -0
  79. data/app/views/layouts/application/header/_navigation.html.erb +0 -0
  80. data/app/views/layouts/application/header/authentication/_links.html.erb +4 -0
  81. data/app/views/layouts/application/header/authentication/_plate.html.erb +4 -0
  82. data/app/views/layouts/mailer.html.erb +13 -0
  83. data/app/views/layouts/mailer.text.erb +1 -0
  84. data/app/views/my/confirmations/show.html.erb +11 -1
  85. data/app/views/my/index/index.html.erb +6 -4
  86. data/app/views/{admin/tokens → my/login_attempts}/_list.html.erb +1 -1
  87. data/app/views/my/login_attempts/_nav_item.html.erb +6 -0
  88. data/app/views/my/login_attempts/entity/_in_list.html.erb +13 -0
  89. data/app/views/my/login_attempts/included/_agents.jbuilder +7 -0
  90. data/app/views/my/login_attempts/index.html.erb +13 -0
  91. data/app/views/my/login_attempts/index.jbuilder +22 -0
  92. data/app/views/my/profiles/_nav_item.html.erb +6 -0
  93. data/app/views/my/profiles/new/_form.html.erb +49 -23
  94. data/app/views/my/profiles/new.html.erb +2 -2
  95. data/app/views/{admin/codes → my/tokens}/_list.html.erb +1 -1
  96. data/app/views/my/tokens/_nav_item.html.erb +6 -0
  97. data/app/views/my/tokens/_toggleable.html.erb +7 -0
  98. data/app/views/my/tokens/entity/_in_list.html.erb +18 -0
  99. data/app/views/my/tokens/index.html.erb +13 -0
  100. data/app/views/privileges/_form.html.erb +7 -0
  101. data/app/views/regions/_form.html.erb +73 -0
  102. data/app/views/regions/edit.html.erb +20 -0
  103. data/app/views/regions/new.html.erb +17 -0
  104. data/app/views/shared/_counters.html.erb +0 -0
  105. data/app/views/shared/_pagination.jbuilder +9 -0
  106. data/app/views/{admin/editable_pages → shared/admin}/_list.html.erb +2 -2
  107. data/app/views/user_mailer/login_attempt.html.erb +7 -0
  108. data/config/locales/common-ru.yml +5 -0
  109. data/config/locales/editable-pages-ru.yml +1 -1
  110. data/config/locales/regions-ru.yml +62 -0
  111. data/config/locales/users-ru.yml +48 -6
  112. data/config/routes.rb +19 -2
  113. data/db/migrate/20170301000201_create_regions.rb +32 -0
  114. data/db/migrate/20170302000001_create_users.rb +1 -0
  115. data/db/migrate/20170302000101_create_privileges.rb +2 -0
  116. data/db/migrate/20170302000102_create_user_privileges.rb +1 -0
  117. data/db/migrate/20170302000103_create_privilege_groups.rb +1 -0
  118. data/db/migrate/20170302000104_create_privilege_group_privileges.rb +4 -0
  119. data/db/migrate/20170629120000_create_login_attempts.rb +19 -0
  120. data/lib/biovision/base/engine.rb +6 -0
  121. data/lib/biovision/base/privilege_methods.rb +21 -3
  122. data/lib/biovision/base/version.rb +1 -1
  123. data/lib/tasks/{biovision/agents.rake → agents.rake} +0 -0
  124. data/lib/tasks/{biovision/browsers.rake → browsers.rake} +0 -0
  125. data/lib/tasks/{biovision/codes.rake → codes.rake} +0 -0
  126. data/lib/tasks/regions.rake +70 -0
  127. data/lib/tasks/{biovision/tokens.rake → tokens.rake} +0 -0
  128. data/lib/tasks/{biovision/users.rake → users.rake} +0 -0
  129. metadata +75 -17
  130. data/app/assets/stylesheets/biovision/base/fonts.scss +0 -9
  131. data/app/controllers/concerns/biovision/admin/privileges.rb +0 -34
  132. data/app/models/concerns/biovision/privilege_base.rb +0 -143
  133. data/app/models/concerns/biovision/user_base.rb +0 -124
  134. data/app/models/concerns/biovision/user_privilege_base.rb +0 -46
  135. data/app/views/admin/privilege_groups/_list.html.erb +0 -11
  136. data/app/views/authentication/_info.html.erb +0 -8
@@ -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
- registration_form: "Форма регистрации"
302
- you_accept_terms_of_service: "Регистрируясь на сайте, вы принимаете пользовательское соглашение."
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
- contact: "Контактные данные"
323
- about: "Кратко о себе"
324
- stand_in_life: "Жизненная позиция"
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
- put 'users/:user_id' => :add_user, as: :user, defaults: { format: :json }
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
@@ -6,6 +6,12 @@ module Biovision
6
6
  include Biovision::Base::BaseMethods
7
7
  end
8
8
  end
9
+
10
+ config.to_prepare do
11
+ Dir.glob(Rails.root + 'app/decorators/**/*_decorator*.rb').each do |c|
12
+ require_dependency(c)
13
+ end
14
+ end
9
15
  end
10
16
 
11
17
  require 'kaminari'
@@ -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
- def current_user_has_privilege?(privilege_name)
12
- ::UserPrivilege.user_has_privilege?(current_user, privilege_name)
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
@@ -1,5 +1,5 @@
1
1
  module Biovision
2
2
  module Base
3
- VERSION = '0.5.170614'
3
+ VERSION = '0.7.170709'
4
4
  end
5
5
  end
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