class Reactor::Tools::WorkflowGenerator

Attributes

correctors[R]
editors[R]
groups[R]
obj[R]
users[R]
workflow_name[R]

Public Class Methods

new(options) click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 6
def initialize(options)
  @editors    = options[:editors]
  @correctors = options[:correctors]
  @users      = @editors + @correctors
  @groups     = personal_groups(@users)
  @class_name = options[:obj_class] || generate_obj_class_name
  @workflow_name  = options[:workflow_name] || generate_workflow_name
  @obj_name   = options[:obj_name] || generate_obj_name
end

Public Instance Methods

destroy!() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 27
def destroy!
  destroy_objs
  destroy_obj_class
  destroy_workflow
  destroy_users
  destroy_groups
  destroy_signatures
end
generate!() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 16
def generate!
  create_groups
  create_users
  create_signatures
  create_workflow
  create_obj_class
  create_obj
  set_permissions
  start_workflow
end
personal_group(user) click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 36
def personal_group(user)
  "#{user}_group"
end

Protected Instance Methods

create_groups() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 50
def create_groups
  @groups.each do |group|
    if Reactor::Cm::Group.exists?(group)
      Reactor::Cm::Group.get(group)
    else
      Reactor::Cm::Group.create(:name => group)
    end
  end
end
create_obj() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 119
def create_obj
  @obj = Reactor::Cm::Obj.create(@obj_name, '/', @class_name)
  @obj.set(:workflowName, @workflow_name)
  @obj.save!
end
create_obj_class() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 111
def create_obj_class
  @obj_class  = if Reactor::Cm::ObjClass.exists?(@class_name)
    Reactor::Cm::ObjClass.get(@class_name)
  else
    Reactor::Cm::ObjClass.create(@class_name, 'publication')
  end
end
create_signatures() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 72
def create_signatures
  # hash storing users as keys and attribute names as values
  @signatures = {}
  @users.each do |user|
    signature = personal_signature(user)
    if Reactor::Cm::Attribute.exists?(signature)
      #Reactor::Cm::Attribute.get(signature)
      @signatures[user] = signature
    else
      Reactor::Cm::Attribute.create(signature, 'signature')
      @signatures[user] = signature
    end
  end
end
create_users() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 60
def create_users
  @users.each do |user|
    if Reactor::Cm::User::Internal.exists?(user)
      internal_user = Reactor::Cm::User::Internal.get(user)
    else
      internal_user = Reactor::Cm::User::Internal.create(user, personal_group(user))
    end

    internal_user.change_password('thepasswordispassword')
  end
end
create_workflow() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 87
def create_workflow
  if Reactor::Cm::Workflow.exists?(@workflow_name)
    @workflow = Reactor::Cm::Workflow.get(@workflow_name)
  else
    @workflow = Reactor::Cm::Workflow.create(@workflow_name)
  end

  # set up workflow steps
  @workflow.edit_groups = personal_groups(@editors)

  serialized_signatures = []
  @correctors.each do |corrector|
    signature = {
      :group => personal_group(corrector),
      :attribute => @signatures[corrector]
    }
    serialized_signatures << signature
  end
  @workflow.signatures = serialized_signatures

  @workflow.save!
  @workflow.reload
end
destroy_groups() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 164
def destroy_groups
  @groups.each do |group|
    Reactor::Cm::Group.get(group).delete!
  end
end
destroy_obj_class() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 150
def destroy_obj_class
  @obj_class.delete!
end
destroy_objs() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 146
def destroy_objs
  RailsConnector::AbstractObj.where(obj_class: @class_name).each(&:destroy)
end
destroy_signatures() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 170
def destroy_signatures
  @signatures.values.each do |attribute|
    Reactor::Cm::Attribute.get(attribute).delete!
  end
end
destroy_users() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 158
def destroy_users
  @users.each do |user|
    Reactor::Cm::User::Internal.get(user).delete!
  end
end
destroy_workflow() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 154
def destroy_workflow
  @workflow.delete!
end
generate_obj_class_name() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 184
def generate_obj_class_name
  "GeneratedObjClass#{generate_token}"
end
generate_obj_name() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 180
def generate_obj_name
  "generated_obj#{generate_token}"
end
generate_token() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 188
def generate_token
  characters = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a
  token = 8.times.map { characters[rand(characters.length)] }.join
end
generate_workflow_name() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 176
def generate_workflow_name
  "GeneratedWorkflow#{generate_token}"
end
personal_groups(users) click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 46
def personal_groups(users)
  users.map {|user| personal_group(user) }
end
personal_signature(user) click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 42
def personal_signature(user)
  "#{user}_signature"
end
set_permissions() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 125
def set_permissions
  # get RC object
  @rc_obj = RailsConnector::AbstractObj.find(@obj.obj_id)

  # use nice API to set permissions
  @groups.each do |group|
    @rc_obj.permission.grant(:read, group)
    @rc_obj.permission.grant(:write, group)
  end

  # Allow Dirk to release the object
  @rc_obj.permission.grant(:root, personal_group(@correctors.last))
end
start_workflow() click to toggle source
# File lib/reactor/tools/workflow_generator.rb, line 139
def start_workflow
  @obj.release!
  Reactor::Sudo.su(@editors.first) do
    @obj.edit!
  end
end