Skip to content

Instantly share code, notes, and snippets.

@takumikinjo
Created September 29, 2012 12:27
Show Gist options
  • Save takumikinjo/3803851 to your computer and use it in GitHub Desktop.
Save takumikinjo/3803851 to your computer and use it in GitHub Desktop.
Register users and memberships to Redmine
Register users and memberships to Redmine.
login project_identifier role_id
taro root 3
jiro sub 4
# A wrapper of activeresource to register uses and memberships.
#
# Type this to start redmine.rb.
#
# pry -I. -rredmine
#
# Available commands(methods) are below.
#
# load_users_from_csv(csv_file)
#
# e.g.: load_users_from_csv 'users.csv'
#
# load_membership_from_csv(csv_file)
#
# e.g.: load_users_from_csv 'memberships.csv'
#
# delete_all_users_without_admin
require 'csv'
require 'rubygems'
require 'active_resource'
module ActiveResource
class Base
self.format = :xml
self.site = 'http://localhost/'
self.user = 'admin'
self.password = 'admin'
def remote_errors
instance_variable_get(:@remote_errors)
end
end
end
class User < ActiveResource::Base
def self.all_without_admin(*args)
self.all.select do |user|
user.login != "admin"
end
end
end
class Project < ActiveResource::Base
class Membership < ActiveResource::Base
self.site = 'http://localhost/projects/:project_id'
end
def memberships(scope=:all)
Membership.find(scope, params:{project_id:self.id})
end
def membership(id)
memberships(id)
end
end
class Membership < ActiveResource::Base
end
class Role < ActiveResource::Base
end
def delete_all_users_without_admin
User.all_without_admin.each do |user|
user.destroy
end
end
# * csv_path - csv file path users defined in
#
# csv file has below columns
#
# login, password, firstname, lastname, mail
def load_users_from_csv(csv_path, skip_firstline=true)
results = []
CSV.foreach(csv_path) do |row|
if skip_firstline
skip_firstline = false
next
end
login, password, lastname, firstname, mail, admin = row
user = User.new(login:login,
password:password,
firstname:firstname,
lastname:lastname,
mail:mail,
admin:admin,
language:'ja')
begin
user.save
rescue => e
results << {login:login, message:e.message}
else
results << {login:login, message:(user.remote_errors ? user.remote_errors.message : "")}
end
end
results
end
def projects(project_identifier)
(@project_dict ||= Project.all.inject({}) { |dict, project|
dict[project.identifier] = project.id
dict
})[project_identifier] || project_identifier
end
def create_membership_dict_from_csv(csv_path, skip_firstline=true)
dict = {}
CSV.foreach(csv_path) do |row|
if skip_firstline
skip_firstline = false
next
end
login, project_identifier, role_id = row
project_id = projects(project_identifier)
dict[project_id] ||= {}
dict[project_id][login] ||= []
dict[project_id][login] << role_id
end
dict
end
def delete_memberships(project_id, user_id)
Project.find(project_id).memberships.select { |membership|
membership.user.id.to_s == user_id.to_s
}.collect{ |membership|
Membership.find(membership.id).destroy
}
end
def load_membership_dict(membership_dict)
results = []
membership_dict.each do |project_id, users|
users.each do |login, role_ids|
user = User.find(:first,params:{name:login})
user_id = user ? user.id : nil
delete_memberships(project_id, user_id)
membership = Project::Membership.new(project_id:project_id, user_id:user_id, role_ids:role_ids)
membership.save
results << {user:login, project_id:project_id, membership:membership}
end
end
results
end
def load_membership_from_csv(csv_path)
load_membership_dict(create_membership_dict_from_csv(csv_path))
end
login password lastname firstname email admin
taro taro 山田 太郎 [email protected] 1
jiro jiro 山田 次郎 [email protected] 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment