diff --git a/CHANGELOG.md b/CHANGELOG.md index ab0c2f91d..d45d77edf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,14 @@ - Added tooltip concerning images insertion while configuring the about page - Ability for admins to configure the maximum visibility for availabilities reservation +- Administrators isolation in a special group - Fix a bug: admins cannot see all availabilities for spaces in reservation calendar when a user is selected - Fix a bug: missing translation after payment in english and portuguese - Fix a bug: invalid notification when sending monetary coupon to users +- Fix a bug: unable to delete group "standard" - Updated puma for compatibility with openSSL > 1.0 - Documented installation on ArchLinux -- [TODO DEPLOY] `rake db:seed` +- [TODO DEPLOY] `rake db:seed` then `rake fablab:fix:migrate_admins_group` ## v2.5.10 2017 August 16 diff --git a/app/assets/javascripts/controllers/admin/members.coffee.erb b/app/assets/javascripts/controllers/admin/members.coffee.erb index 79d4ea3fe..86df205b0 100644 --- a/app/assets/javascripts/controllers/admin/members.coffee.erb +++ b/app/assets/javascripts/controllers/admin/members.coffee.erb @@ -25,7 +25,7 @@ class MembersController ## Retrieve the profiles groups (eg. students ...) Group.query (groups) -> - $scope.groups = groups + $scope.groups = groups.filter (g) -> g.slug != 'admins' ## Retrieve the list the available trainings Training.query().$promise.then (data)-> diff --git a/app/assets/javascripts/controllers/admin/plans.coffee.erb b/app/assets/javascripts/controllers/admin/plans.coffee.erb index 588718641..4c4486728 100644 --- a/app/assets/javascripts/controllers/admin/plans.coffee.erb +++ b/app/assets/javascripts/controllers/admin/plans.coffee.erb @@ -13,7 +13,7 @@ class PlanController ## groups list - $scope.groups = groups + $scope.groups = groups.filter (g) -> g.slug != 'admins' ## users with role 'partner', notifiables for a partner plan $scope.partners = partners.users diff --git a/app/assets/javascripts/controllers/admin/pricing.coffee.erb b/app/assets/javascripts/controllers/admin/pricing.coffee.erb index c77e181e4..53bd9a78d 100644 --- a/app/assets/javascripts/controllers/admin/pricing.coffee.erb +++ b/app/assets/javascripts/controllers/admin/pricing.coffee.erb @@ -17,7 +17,7 @@ Application.Controllers.controller "EditPricingController", ["$scope", "$state", $scope.plans = plans ## List of groups (eg. normal, student ...) - $scope.groups = groups + $scope.groups = groups.filter (g) -> g.slug != 'admins' ## Associate free machine hours with subscriptions $scope.machineCredits = machineCreditsPromise diff --git a/app/assets/javascripts/controllers/plans.coffee.erb b/app/assets/javascripts/controllers/plans.coffee.erb index 4396d03e9..f4f428e33 100644 --- a/app/assets/javascripts/controllers/plans.coffee.erb +++ b/app/assets/javascripts/controllers/plans.coffee.erb @@ -8,7 +8,7 @@ Application.Controllers.controller "PlansIndexController", ["$scope", "$rootScop ### PUBLIC SCOPE ### ## list of groups - $scope.groups = groupsPromise + $scope.groups = groupsPromise.filter (g) -> g.slug != 'admins' ## default : do not show the group changing form ## group ID of the current/selected user @@ -18,7 +18,7 @@ Application.Controllers.controller "PlansIndexController", ["$scope", "$rootScop ## list of plans, classified by group $scope.plansClassifiedByGroup = [] - for group in groupsPromise + for group in $scope.groups groupObj = { id: group.id, name: group.name, plans: [] } for plan in plansPromise groupObj.plans.push(plan) if plan.group_id == group.id diff --git a/app/assets/templates/admin/groups/index.html.erb b/app/assets/templates/admin/groups/index.html.erb index 498c29c1c..27207c90d 100644 --- a/app/assets/templates/admin/groups/index.html.erb +++ b/app/assets/templates/admin/groups/index.html.erb @@ -23,7 +23,7 @@ -
+
diff --git a/app/assets/templates/admin/open_api_clients/index.html.erb b/app/assets/templates/admin/open_api_clients/index.html.erb index d478f5c9b..8f4e3bf70 100644 --- a/app/assets/templates/admin/open_api_clients/index.html.erb +++ b/app/assets/templates/admin/open_api_clients/index.html.erb @@ -44,13 +44,13 @@ {{ 'name' | translate }} - {{ 'calls_count' | translate }} + {{ 'calls_count' | translate }} {{ 'token' | translate }} {{ 'created_at' | translate }} - + diff --git a/app/assets/templates/dashboard/settings.html.erb b/app/assets/templates/dashboard/settings.html.erb index ed3b13fd1..87721459e 100644 --- a/app/assets/templates/dashboard/settings.html.erb +++ b/app/assets/templates/dashboard/settings.html.erb @@ -22,7 +22,12 @@ {{getUserGroup().name}} - +
diff --git a/app/controllers/api/admins_controller.rb b/app/controllers/api/admins_controller.rb index 175d6b4e5..8ddaa49c9 100644 --- a/app/controllers/api/admins_controller.rb +++ b/app/controllers/api/admins_controller.rb @@ -12,8 +12,8 @@ class API::AdminsController < API::ApiController @admin = User.new(admin_params.merge(password: generated_password)) @admin.send :set_slug - # we associate any random group to the admin as it is mandatory for users but useless for admins - @admin.group = Group.first + # we associate the admin group to prevent linking any other 'normal' group (which won't be deletable afterwards) + @admin.group = Group.find_by(slug: 'admins') # if the authentication is made through an SSO, generate a migration token unless AuthProvider.active.providable_type == DatabaseProvider.name diff --git a/app/controllers/api/groups_controller.rb b/app/controllers/api/groups_controller.rb index 6d68167c3..50aa41dff 100644 --- a/app/controllers/api/groups_controller.rb +++ b/app/controllers/api/groups_controller.rb @@ -2,7 +2,12 @@ class API::GroupsController < API::ApiController before_action :authenticate_user!, except: :index def index - @groups = Group.all + if current_user and current_user.is_admin? + @groups = Group.all + else + @groups = Group.where.not(slug: 'admins') + end + end def create diff --git a/config/locales/en.yml b/config/locales/en.yml index 8c0778602..36f41010d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -357,3 +357,7 @@ en: # initial price's category for events, created to replace the old "reduced amount" property reduced_fare: "Reduced fare" reduced_fare_if_you_are_under_25_student_or_unemployed: "Reduced fare if you are under 25, student or unemployed." + + group: + # name of the user's group for administrators + admins: 'Administrators' \ No newline at end of file diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c17571e4d..aa9b8c0e8 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -356,4 +356,8 @@ fr: price_category: # catégorie initiale de prix pour les évènements, en remplacement de l'ancienne propriété "montant réduit" reduced_fare: "Tarif réduit" - reduced_fare_if_you_are_under_25_student_or_unemployed: "Tarif réduit si vous avez moins de 25 ans, que vous êtes étudiant ou demandeur d'emploi." \ No newline at end of file + reduced_fare_if_you_are_under_25_student_or_unemployed: "Tarif réduit si vous avez moins de 25 ans, que vous êtes étudiant ou demandeur d'emploi." + + group: + # nom du groupe utilisateur pour les administrateurs + admins: 'Administrateurs' \ No newline at end of file diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 5d351b54d..6db56287e 100755 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -357,3 +357,7 @@ pt: # initial price's category for events, created to replace the old "reduced amount" property reduced_fare: "Tarifa reduzida" reduced_fare_if_you_are_under_25_student_or_unemployed: "Tarifa reduzida se tiver menos de 25 anos, estudante ou desempregado." + + group: + # name of the user's group for administrators + admins: 'Administradores' \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index 372d18c04..a76ff5499 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -15,8 +15,8 @@ ActiveRecord::Schema.define(version: 20170227114634) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - enable_extension "pg_trgm" enable_extension "unaccent" + enable_extension "pg_trgm" create_table "abuses", force: :cascade do |t| t.integer "signaled_id" @@ -32,14 +32,14 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "abuses", ["signaled_type", "signaled_id"], name: "index_abuses_on_signaled_type_and_signaled_id", using: :btree create_table "addresses", force: :cascade do |t| - t.string "address", limit: 255 - t.string "street_number", limit: 255 - t.string "route", limit: 255 - t.string "locality", limit: 255 - t.string "country", limit: 255 - t.string "postal_code", limit: 255 + t.string "address" + t.string "street_number" + t.string "route" + t.string "locality" + t.string "country" + t.string "postal_code" t.integer "placeable_id" - t.string "placeable_type", limit: 255 + t.string "placeable_type" t.datetime "created_at" t.datetime "updated_at" end @@ -55,9 +55,9 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "assets", force: :cascade do |t| t.integer "viewable_id" - t.string "viewable_type", limit: 255 - t.string "attachment", limit: 255 - t.string "type", limit: 255 + t.string "viewable_type" + t.string "attachment" + t.string "type" t.datetime "created_at" t.datetime "updated_at" end @@ -74,11 +74,11 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "availabilities", force: :cascade do |t| t.datetime "start_at" t.datetime "end_at" - t.string "available_type", limit: 255 + t.string "available_type" t.datetime "created_at" t.datetime "updated_at" t.integer "nb_total_places" - t.boolean "destroying", default: false + t.boolean "destroying", default: false end create_table "availability_tags", force: :cascade do |t| @@ -92,7 +92,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "availability_tags", ["tag_id"], name: "index_availability_tags_on_tag_id", using: :btree create_table "categories", force: :cascade do |t| - t.string "name", limit: 255 + t.string "name" t.datetime "created_at" t.datetime "updated_at" t.string "slug" @@ -101,7 +101,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "categories", ["slug"], name: "index_categories_on_slug", unique: true, using: :btree create_table "components", force: :cascade do |t| - t.string "name", limit: 255, null: false + t.string "name", null: false end create_table "coupons", force: :cascade do |t| @@ -119,7 +119,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "credits", force: :cascade do |t| t.integer "creditable_id" - t.string "creditable_type", limit: 255 + t.string "creditable_type" t.integer "plan_id" t.integer "hours" t.datetime "created_at" @@ -160,7 +160,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "event_themes", ["slug"], name: "index_event_themes_on_slug", unique: true, using: :btree create_table "events", force: :cascade do |t| - t.string "title", limit: 255 + t.string "title" t.text "description" t.datetime "created_at" t.datetime "updated_at" @@ -198,10 +198,10 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "exports", ["user_id"], name: "index_exports_on_user_id", using: :btree create_table "friendly_id_slugs", force: :cascade do |t| - t.string "slug", limit: 255, null: false - t.integer "sluggable_id", null: false + t.string "slug", null: false + t.integer "sluggable_id", null: false t.string "sluggable_type", limit: 50 - t.string "scope", limit: 255 + t.string "scope" t.datetime "created_at" end @@ -211,17 +211,17 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "friendly_id_slugs", ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type", using: :btree create_table "groups", force: :cascade do |t| - t.string "name", limit: 255 + t.string "name" t.datetime "created_at" t.datetime "updated_at" - t.string "slug", limit: 255 + t.string "slug" end add_index "groups", ["slug"], name: "index_groups_on_slug", unique: true, using: :btree create_table "invoice_items", force: :cascade do |t| t.integer "invoice_id" - t.string "stp_invoice_item_id", limit: 255 + t.string "stp_invoice_item_id" t.integer "amount" t.datetime "created_at" t.datetime "updated_at" @@ -234,17 +234,17 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "invoices", force: :cascade do |t| t.integer "invoiced_id" - t.string "invoiced_type", limit: 255 - t.string "stp_invoice_id", limit: 255 + t.string "invoiced_type" + t.string "stp_invoice_id" t.integer "total" t.datetime "created_at" t.datetime "updated_at" t.integer "user_id" - t.string "reference", limit: 255 - t.string "avoir_mode", limit: 255 + t.string "reference" + t.string "avoir_mode" t.datetime "avoir_date" t.integer "invoice_id" - t.string "type", limit: 255 + t.string "type" t.boolean "subscription_to_expire" t.text "description" t.integer "wallet_amount" @@ -258,17 +258,17 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "invoices", ["wallet_transaction_id"], name: "index_invoices_on_wallet_transaction_id", using: :btree create_table "licences", force: :cascade do |t| - t.string "name", limit: 255, null: false + t.string "name", null: false t.text "description" end create_table "machines", force: :cascade do |t| - t.string "name", limit: 255, null: false + t.string "name", null: false t.text "description" t.text "spec" t.datetime "created_at" t.datetime "updated_at" - t.string "slug", limit: 255 + t.string "slug" end add_index "machines", ["slug"], name: "index_machines_on_slug", unique: true, using: :btree @@ -284,14 +284,14 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "notifications", force: :cascade do |t| t.integer "receiver_id" t.integer "attached_object_id" - t.string "attached_object_type", limit: 255 + t.string "attached_object_type" t.integer "notification_type_id" - t.boolean "is_read", default: false + t.boolean "is_read", default: false t.datetime "created_at" t.datetime "updated_at" t.string "receiver_type" - t.boolean "is_send", default: false - t.jsonb "meta_data", default: {} + t.boolean "is_send", default: false + t.jsonb "meta_data", default: {} end add_index "notifications", ["notification_type_id"], name: "index_notifications_on_notification_type_id", using: :btree @@ -360,20 +360,20 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "organizations", ["profile_id"], name: "index_organizations_on_profile_id", using: :btree create_table "plans", force: :cascade do |t| - t.string "name", limit: 255 + t.string "name" t.integer "amount" - t.string "interval", limit: 255 + t.string "interval" t.integer "group_id" - t.string "stp_plan_id", limit: 255 + t.string "stp_plan_id" t.datetime "created_at" t.datetime "updated_at" - t.integer "training_credit_nb", default: 0 - t.boolean "is_rolling", default: true + t.integer "training_credit_nb", default: 0 + t.boolean "is_rolling", default: true t.text "description" t.string "type" t.string "base_name" - t.integer "ui_weight", default: 0 - t.integer "interval_count", default: 1 + t.integer "ui_weight", default: 0 + t.integer "interval_count", default: 1 t.string "slug" end @@ -402,11 +402,11 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "profiles", force: :cascade do |t| t.integer "user_id" - t.string "first_name", limit: 255 - t.string "last_name", limit: 255 + t.string "first_name" + t.string "last_name" t.boolean "gender" t.date "birthday" - t.string "phone", limit: 255 + t.string "phone" t.text "interest" t.text "software_mastered" t.datetime "created_at" @@ -436,7 +436,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do t.integer "project_id" t.datetime "created_at" t.datetime "updated_at" - t.string "title", limit: 255 + t.string "title" t.integer "step_nb" end @@ -447,27 +447,27 @@ ActiveRecord::Schema.define(version: 20170227114634) do t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" - t.boolean "is_valid", default: false - t.string "valid_token", limit: 255 + t.boolean "is_valid", default: false + t.string "valid_token" end add_index "project_users", ["project_id"], name: "index_project_users_on_project_id", using: :btree add_index "project_users", ["user_id"], name: "index_project_users_on_user_id", using: :btree create_table "projects", force: :cascade do |t| - t.string "name", limit: 255 + t.string "name" t.text "description" t.datetime "created_at" t.datetime "updated_at" t.integer "author_id" t.text "tags" t.integer "licence_id" - t.string "state", limit: 255 - t.string "slug", limit: 255 + t.string "state" + t.string "slug" t.datetime "published_at" end - add_index "projects", ["slug"], name: "index_projects_on_slug", using: :btree + add_index "projects", ["slug"], name: "index_projects_on_slug", unique: true, using: :btree create_table "projects_components", force: :cascade do |t| t.integer "project_id" @@ -507,19 +507,19 @@ ActiveRecord::Schema.define(version: 20170227114634) do t.datetime "created_at" t.datetime "updated_at" t.integer "reservable_id" - t.string "reservable_type", limit: 255 - t.string "stp_invoice_id", limit: 255 + t.string "reservable_type" + t.string "stp_invoice_id" t.integer "nb_reserve_places" end - add_index "reservations", ["reservable_id", "reservable_type"], name: "index_reservations_on_reservable_id_and_reservable_type", using: :btree + add_index "reservations", ["reservable_type", "reservable_id"], name: "index_reservations_on_reservable_type_and_reservable_id", using: :btree add_index "reservations", ["stp_invoice_id"], name: "index_reservations_on_stp_invoice_id", using: :btree add_index "reservations", ["user_id"], name: "index_reservations_on_user_id", using: :btree create_table "roles", force: :cascade do |t| - t.string "name", limit: 255 + t.string "name" t.integer "resource_id" - t.string "resource_type", limit: 255 + t.string "resource_type" t.datetime "created_at" t.datetime "updated_at" end @@ -593,18 +593,18 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "statistic_fields", force: :cascade do |t| t.integer "statistic_index_id" - t.string "key", limit: 255 - t.string "label", limit: 255 + t.string "key" + t.string "label" t.datetime "created_at" t.datetime "updated_at" - t.string "data_type", limit: 255 + t.string "data_type" end add_index "statistic_fields", ["statistic_index_id"], name: "index_statistic_fields_on_statistic_index_id", using: :btree create_table "statistic_graphs", force: :cascade do |t| t.integer "statistic_index_id" - t.string "chart_type", limit: 255 + t.string "chart_type" t.integer "limit" t.datetime "created_at" t.datetime "updated_at" @@ -613,17 +613,17 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "statistic_graphs", ["statistic_index_id"], name: "index_statistic_graphs_on_statistic_index_id", using: :btree create_table "statistic_indices", force: :cascade do |t| - t.string "es_type_key", limit: 255 - t.string "label", limit: 255 + t.string "es_type_key" + t.string "label" t.datetime "created_at" t.datetime "updated_at" - t.boolean "table", default: true - t.boolean "ca", default: true + t.boolean "table", default: true + t.boolean "ca", default: true end create_table "statistic_sub_types", force: :cascade do |t| - t.string "key", limit: 255 - t.string "label", limit: 255 + t.string "key" + t.string "label" t.datetime "created_at" t.datetime "updated_at" end @@ -640,8 +640,8 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "statistic_types", force: :cascade do |t| t.integer "statistic_index_id" - t.string "key", limit: 255 - t.string "label", limit: 255 + t.string "key" + t.string "label" t.boolean "graph" t.datetime "created_at" t.datetime "updated_at" @@ -659,7 +659,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do create_table "subscriptions", force: :cascade do |t| t.integer "plan_id" t.integer "user_id" - t.string "stp_subscription_id", limit: 255 + t.string "stp_subscription_id" t.datetime "created_at" t.datetime "updated_at" t.datetime "expired_at" @@ -678,7 +678,7 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree create_table "themes", force: :cascade do |t| - t.string "name", limit: 255, null: false + t.string "name", null: false end create_table "tickets", force: :cascade do |t| @@ -693,13 +693,13 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "tickets", ["reservation_id"], name: "index_tickets_on_reservation_id", using: :btree create_table "trainings", force: :cascade do |t| - t.string "name", limit: 255 + t.string "name" t.datetime "created_at" t.datetime "updated_at" t.integer "nb_total_places" - t.string "slug", limit: 255 + t.string "slug" t.text "description" - t.boolean "public_page", default: true + t.boolean "public_page", default: true end add_index "trainings", ["slug"], name: "index_trainings_on_slug", unique: true, using: :btree @@ -754,32 +754,32 @@ ActiveRecord::Schema.define(version: 20170227114634) do add_index "user_trainings", ["user_id"], name: "index_user_trainings_on_user_id", using: :btree create_table "users", force: :cascade do |t| - t.string "email", limit: 255, default: "", null: false - t.string "encrypted_password", limit: 255, default: "", null: false - t.string "reset_password_token", limit: 255 + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip", limit: 255 - t.string "last_sign_in_ip", limit: 255 - t.string "confirmation_token", limit: 255 + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.string "confirmation_token" t.datetime "confirmed_at" t.datetime "confirmation_sent_at" - t.string "unconfirmed_email", limit: 255 - t.integer "failed_attempts", default: 0, null: false - t.string "unlock_token", limit: 255 + t.string "unconfirmed_email" + t.integer "failed_attempts", default: 0, null: false + t.string "unlock_token" t.datetime "locked_at" t.datetime "created_at" t.datetime "updated_at" - t.boolean "is_allow_contact", default: true + t.boolean "is_allow_contact", default: true t.integer "group_id" - t.string "stp_customer_id", limit: 255 - t.string "username", limit: 255 - t.string "slug", limit: 255 - t.boolean "is_active", default: true - t.boolean "invoicing_disabled", default: false + t.string "stp_customer_id" + t.string "username" + t.string "slug" + t.boolean "is_active", default: true + t.boolean "invoicing_disabled", default: false t.string "provider" t.string "uid" t.string "auth_token" diff --git a/db/seeds.rb b/db/seeds.rb index 253e39d8e..e61e5ae9d 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -82,9 +82,13 @@ if Group.count == 0 ]) end +unless Group.find_by(slug: 'admins') + Group.create! name: I18n.t('group.admins'), slug: 'admins' +end + # Create the default admin if none exists yet if Role.where(name: 'admin').joins(:users).count === 0 - admin = User.new(username: 'admin', email: ENV["ADMIN_EMAIL"], password: ENV["ADMIN_PASSWORD"], password_confirmation: Rails.application.secrets.admin_password, group_id: Group.first.id, profile_attributes: {first_name: 'admin', last_name: 'admin', gender: true, phone: '0123456789', birthday: Time.now}) + admin = User.new(username: 'admin', email: ENV["ADMIN_EMAIL"], password: ENV["ADMIN_PASSWORD"], password_confirmation: Rails.application.secrets.admin_password, group_id: Group.find_by(slug: 'admins').id, profile_attributes: {first_name: 'admin', last_name: 'admin', gender: true, phone: '0123456789', birthday: Time.now}) admin.add_role 'admin' admin.save! end diff --git a/lib/tasks/fablab/fix.rake b/lib/tasks/fablab/fix.rake index aff34d4e1..23eaa049b 100644 --- a/lib/tasks/fablab/fix.rake +++ b/lib/tasks/fablab/fix.rake @@ -47,5 +47,15 @@ namespace :fablab do end end end + + task migrate_admins_group: :environment do + admins = Group.find_by(slug: 'admins') + User.all.each do |user| + if user.is_admin? + user.group = admins + user.save! + end + end + end end end