Last active 1 month ago

veryroundbird's Avatar veryroundbird revised this gist 1 month ago. Go to revision

2 files changed, 79 insertions

admin.rb(file created)

@@ -0,0 +1,2 @@
1 + # replace line 17 with this:
2 + devise :pwned_password if Rails.env.production?

create_admin.rb(file created)

@@ -0,0 +1,77 @@
1 + # Run this script and follow the onscreen instructions:
2 + # bundle exec rails r script/create_admin.rb
3 +
4 + require "csv"
5 +
6 + include Rails.application.routes.url_helpers
7 +
8 + # Base URL
9 + default_url_options[:host] = ArchiveConfig.APP_URL
10 +
11 + def multi_gets(all_text = +"")
12 + until (text = gets) == "\n"
13 + all_text << text
14 + end
15 + all_text.chomp
16 + end
17 + puts "======== This is the #{Rails.env} environment. ========"
18 + puts <<~PROMPT
19 + Paste or enter admins, one per line, in the format
20 +
21 + USERNAME, EMAIL, PASSWORD, ROLE
22 +
23 + or
24 +
25 + USERNAME, EMAIL, PASSWORD, ROLE, ROLE, ROLE
26 +
27 + where
28 +
29 + - USERNAME is their username without the admin- prefix (spaces will be removed). e.g. if you put in "carly" the username will end up as "admin-carly"
30 + - EMAIL is whatever their email is
31 + - PASSWORD is a password of at least ten characters
32 + - EMAIL/PASSWORD/ROLE can be left blank to skip updating email/roles of existing admins
33 + - for dev you probably just want to make a superadmin
34 + - ROLE is one of:
35 +
36 + #{Admin::VALID_ROLES.sort.map { |r| " #{r}" }.join("\n")}
37 +
38 + then two line breaks to end:
39 +
40 + PROMPT
41 +
42 + list = CSV.parse(multi_gets)
43 +
44 + admins = []
45 + list.each do |user|
46 + login = user[0].gsub(/\s+/, "")
47 + email = user[1]&.strip
48 + password = user[2]&.strip
49 + roles = user.drop(3).compact.map(&:strip).map(&:downcase)
50 +
51 + a = Admin.find_or_initialize_by(login: "admin-#{login}")
52 + success_message = a.new_record? ? "Created and notified" : "Updated"
53 + a.email = email if email.present?
54 + a.roles = roles if roles.present?
55 +
56 + # Set their password if that's set
57 + if password.present?
58 + a.password = password
59 + a.password_confirmation = password
60 + end
61 +
62 + puts "==== #{a.login}"
63 + if a.save
64 + puts success_message
65 + admins << a
66 + else
67 + puts a.errors.full_messages
68 + end
69 + puts
70 + end
71 +
72 + admins.sort_by!(&:created_at)
73 + admins.each do |admin|
74 + role_description = admin.roles.map { |r| I18n.t("activerecord.attributes.admin/role.#{r}") }.sort.join(", ")
75 + role_description = "UPDATE WITH USER COMMITTEE" if role_description.blank?
76 + puts "|-\n| #{admin.created_at.strftime('%Y-%m-%d')} || #{admin.login} || #{role_description}"
77 + end
Newer Older