Module: PrivatePerson::Permitted

Defined in:
lib/private_person/models/permitted.rb

Instance Method Summary collapse

Instance Method Details

#acts_as_permittedObject



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/private_person/models/permitted.rb', line 3

def acts_as_permitted
  class_eval do
    def is_permitted?(permissor, permissible)
      if permissible.nil?
        raise 'Called is_permitted? on nil. Does not compute. Preparing to self destruct.'
      end
      unless Permission.by_permissible(permissible).blocked.empty?
        return false
      end
      wildcards = permissions_by(permissor).by_wildcard(permissible.class.name).legitimate
      if wildcards.present?
        return true
      end
      permissions = permissions_by(permissor).by_permissible(permissible).legitimate
      if permissions.present?
        return true
      end
      return false
    end

    def permissions_by(permissor)
      Permission.by_permissor(permissor).by_relationship_type(relationship_to(permissor))
    end

    def relationship_to(permissor)
      # First make sure we're not a new user
      if self.new_record?
        return 'public'
      end
      # Next check for an efficient method
      for relationship_method in permissor.class.of
        is_method = ('is_' + relationship_method.to_s.singularize + '_of?').to_sym
        if respond_to?(is_method) and self.send(is_method, permissor)
          return relationship_method.to_s
        end
      end
      # Then check for a slow method
      for relationship_method in permissor.class.of
        relationship_members = permissor.send(relationship_method.to_sym)
        if relationship_members.present? and relationship_members.exists?(:id => self.id)
          return relationship_method.to_s
        end
      end
      return 'public'
    end
  end
end