153 lines
3.3 KiB
Ruby
153 lines
3.3 KiB
Ruby
# -*- encoding : utf-8 -*-
|
|
class Collaborator
|
|
include ActiveModel::Conversion
|
|
include ActiveModel::Validations
|
|
include ActiveModel::Serializers::JSON
|
|
include ActiveModel::MassAssignmentSecurity
|
|
extend ActiveModel::Naming
|
|
|
|
attr_accessor :role, :actor, :project, :relation
|
|
attr_reader :id, :actor_id, :actor_type, :actor_name, :project_id
|
|
|
|
attr_accessible :role
|
|
|
|
delegate :new_record?, :to => :relation
|
|
|
|
class << self
|
|
def find_by_project(project)
|
|
res = []
|
|
project.relations.each do |r|
|
|
res << from_relation(r) unless project.owner_id == r.actor_id and project.owner_type == r.actor_type
|
|
end
|
|
return res
|
|
end
|
|
|
|
def find(id)
|
|
return self.from_relation(Relation.find(id)) || nil
|
|
end
|
|
|
|
def create(args)
|
|
c = self.new(args)
|
|
return c.save ? c : false
|
|
end
|
|
|
|
def create!(args)
|
|
c = self.new(args)
|
|
c.save!
|
|
return c
|
|
end
|
|
end
|
|
|
|
def initialize(args = {})
|
|
args.to_options!
|
|
acc_options = args.select{ |(k, v)| k.in? [:actor, :project, :relation] }
|
|
acc_options.each_pair do |name, value|
|
|
send("#{name}=", value)
|
|
end
|
|
|
|
if args[:project_id].present?
|
|
@project = Project.find(args[:project_id])
|
|
end
|
|
if args[:actor_id].present? and args[:actor_type].present?
|
|
@actor = args[:actor_type].classify.constantize.find(args[:actor_id])
|
|
end
|
|
|
|
relation.role = args[:role] if args[:role].present? #if @relation.present? and args[:role].present?
|
|
end
|
|
|
|
def update_attributes(attributes, options = {})
|
|
sanitize_for_mass_assignment(attributes, options[:as]).each_pair do |k, v|
|
|
send("#{k}=", v)
|
|
end
|
|
save
|
|
end
|
|
|
|
def relation=(model)
|
|
@relation = model
|
|
@actor = @relation.actor
|
|
@project = @relation.target
|
|
end
|
|
|
|
def id
|
|
relation.try(:id)
|
|
end
|
|
|
|
def actor_id
|
|
@actor.try(:id)
|
|
end
|
|
|
|
def actor_type
|
|
@actor.class.to_s.underscore
|
|
end
|
|
|
|
def actor_name
|
|
if @actor.present?
|
|
@actor.instance_of?(User) ? "#{@actor.uname}#{ @actor.try(:name) and !@actor.name.empty? ? " (#{@actor.name})" : ''}" : @actor.uname
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def project_id
|
|
@project.try(:id)
|
|
end
|
|
|
|
def role
|
|
relation.try(:role)
|
|
end
|
|
|
|
def role=(arg)
|
|
relation.role = arg
|
|
end
|
|
|
|
def save
|
|
relation.try(:save)
|
|
end
|
|
|
|
def save!
|
|
relation.try(:save!)
|
|
end
|
|
|
|
def destroy
|
|
relation.try(:destroy)
|
|
end
|
|
|
|
def attributes
|
|
%w{ id actor_id actor_type actor_name project_id role}.inject({}) do |h, e|
|
|
h.merge(e => send(e))
|
|
end
|
|
end
|
|
|
|
def persisted?
|
|
false
|
|
end
|
|
|
|
protected
|
|
|
|
class << self
|
|
|
|
def from_relation(relation)
|
|
return nil unless relation.present?
|
|
return self.new(:relation => relation)
|
|
end
|
|
|
|
end
|
|
|
|
def relation
|
|
return @relation if @relation.present? and @relation.actor == @actor and @relation.target == @project
|
|
|
|
if @actor.present? and @project.present?
|
|
@relation = Relation.by_actor(@actor).by_target(@project).limit(1).first
|
|
@relation ||= Relation.new(:actor_id => @actor.id, :actor_type => @actor.class.to_s,
|
|
:target_id => @project.id, :target_type => 'Project')
|
|
else
|
|
@relation = Relation.new
|
|
@relation.actor = @actor
|
|
@relation.target = @project
|
|
end
|
|
@relation
|
|
end
|
|
|
|
end
|
|
Collaborator.include_root_in_json = false
|