merged cont.
[opensuse:yast-rest-service.git] / webservice / lib / base_model / mass_assignment.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 module BaseModel
20   # == Mass Assignment module
21   # Adds ability to load instance variables from hash
22   # It allow whitelisting and blacklisting variables which should not be
23   # overwritten. It respect common behavior in ActiveResource and ActiveRecord.
24   # For mass loading see ActiveResource::Base#load
25   # For whitelisting details see ActiveRecord::Base.attr_accessible
26   # For blacklisting details see ActiveRecord::Base.attr_protected
27   #
28   # Example:
29   #   class C
30   #     include BaseModel::MassAssignment
31   #
32   #     attr_accessor :attr1, attr2, :internal
33   #
34   #     attr_protected :internal
35   #
36   #     def instantiate(attr={})
37   #         load attr
38   #     end
39   #   end
40   module MassAssignment
41     # loads hash to instance variables, where keys is names of variables and 
42     # hash value is variables values
43     # it has same behavior as ActiveResource::Base#load
44     def load(attributes)
45       attributes.each do |k,v|
46         whitelist = self.class.accessible_attributes
47         next if whitelist && !(whitelist.include?(k.to_sym))
48         blacklist = self.class.protected_attributes
49         next if blacklist && blacklist.include?(k.to_sym)
50         instance_variable_set("@#{k.to_s}",v)
51       end
52                         self
53     end
54
55     def self.included(base)
56       base.send(:extend,ClassMethods)
57     end
58
59     module ClassMethods
60
61       # Defines attributes which should be loaded by mass assignment.
62       # By default is used all attributes
63       # For disable using loading non-whitelisted attributes use
64       # without parameters
65       # param args is variable number of symbols which identify variables
66       def attr_accessible ( *args )
67         @attr_accessible ||= []
68         @attr_accessible.concat args
69       end
70
71       # Gets list of allowed attributes. If result is nil, then is allowed is
72       # all attributes which is not protected.
73       def accessible_attributes
74         @attr_accessible
75       end
76
77       # Defines attributes which cannot be loaded by mass assignment.
78       # By default all attributes is not protected.
79       # Note only used if whitelist is not specified by attr_accessible
80       # param args is variable number of symbols which identify variables
81       def attr_protected ( *args )
82         @attr_protected ||= []
83         @attr_protected.concat args
84       end
85
86       # Gets list of protected attributes. If result is nil, then no attributes is protected.
87       def protected_attributes
88         @attr_protected
89       end
90     end
91   end
92 end