Created
September 29, 2012 12:27
-
-
Save takumikinjo/3803851 to your computer and use it in GitHub Desktop.
Register users and memberships to Redmine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Register users and memberships to Redmine. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
login | project_identifier | role_id | |
---|---|---|---|
taro | root | 3 | |
jiro | sub | 4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
login | password | lastname | firstname | 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