osm 0.1.17 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -42,6 +42,27 @@ module Osm
42
42
  id
43
43
  end
44
44
 
45
+ # Get a list of attributes which have changed
46
+ # @return Array[String] the names of attributes which have changed
47
+ def changed_attributes
48
+ attributes.keys.select{ |k| attributes[k] != @original_attributes[k] }
49
+ end
50
+
51
+ # Reset the list of attributes which have changed
52
+ def reset_changed_attributes
53
+ @original_attributes = attributes
54
+ end
55
+
56
+
57
+ # Override initialize to set @orig_attributes
58
+ old_initialize = instance_method(:initialize)
59
+ define_method :initialize do |*args|
60
+ ret_val = old_initialize.bind(self).call(*args)
61
+ @original_attributes = attributes
62
+ return ret_val
63
+ end
64
+
65
+
45
66
  private
46
67
  # Wrap cache calls
47
68
  def self.cache_read(api, key)
@@ -67,47 +88,116 @@ module Osm
67
88
  end
68
89
 
69
90
 
70
- # Get access permission for an API user
71
- # @param [Osm::Api] The api to use to make the request
72
- # @param [Fixnum, nil] section_id to get permissions for, if nil a Hash of all section's permissions is returned
91
+ # Raise an exception if the user does not have access to a section
92
+ # @param [Osm::Api] api The api to use to make the request
93
+ # @param [Osm::Section, Fixnum, #to_i] section The Section (or its ID) the permission is required on
94
+ # @!macro options_get
95
+ # @raise [Osm::Forbidden] If the Api user can not access the section
96
+ def self.require_access_to_section(api, section, options={})
97
+ unless api.get_user_permissions(options).keys.include?(section.to_i)
98
+ raise Osm::Forbidden, "You do not have access to that section"
99
+ end
100
+ end
101
+
102
+ # Check if the user has access to a section
103
+ # @param [Osm::Api] api The api to use to make the request
104
+ # @param [Osm::Section, Fixnum, #to_i] section The Section (or its ID) the permission is required on
105
+ # @!macro options_get
106
+ def self.can_access_section?(api, section, options={})
107
+ api.get_user_permissions(options).keys.include?(section.to_i)
108
+ end
109
+
110
+ # Raise an exception if the user does not have the relevant permission
111
+ # @param [Osm::Api] api The api to use to make the request
112
+ # @param [Symbol] to What action is required to be done (e.g. :read or :write)
113
+ # @param [Symbol] on What the OSM permission is required on (e.g. :member or :programme)
114
+ # @param [Osm::Section, Fixnum, #to_i] section The Section (or its ID) the permission is required on
115
+ # @!macro options_get
116
+ # @raise [Osm::Forbidden] If the Api user does not have the required permission
117
+ def self.require_permission(api, to, on, section, options={})
118
+ section_id = section.to_i
119
+
120
+ # Check user's permissions in OSM
121
+ permissions = api.get_user_permissions(options)
122
+ permissions = permissions[section_id] || {}
123
+ permissions = permissions[on] || []
124
+ unless permissions.include?(to)
125
+ raise Osm::Forbidden, "Your OSM user does not have permission to #{to} on #{on} for #{Osm::Section.get(api, section_id, options).try(:name)}"
126
+ end
127
+
128
+ # Check what the user gave our API
129
+ permissions = Osm::ApiAccess.get_ours(api, section_id, options).permissions
130
+ permissions = permissions[on] || []
131
+ unless permissions.include?(to)
132
+ raise Osm::Forbidden, "You have not granted the #{to} permissions on #{on} to the #{api.api_name} API for #{Osm::Section.get(api, section_id, options).try(:name)}"
133
+ end
134
+ end
135
+
136
+ # Raise an exception if the user does not have the relevant permission
137
+ # @param [Osm::Api] api The api to use to make the request
138
+ # @param [Symbol] level The OSM subscription level required (e.g. :gold)
139
+ # @param [Osm::Section, Fixnum, #to_i] section The Section (or its ID) the subscription is required on
73
140
  # @!macro options_get
74
- # @return [Hash] the permissions Hash
75
- def self.get_user_permissions(api, section_id=nil, options={})
76
- key = ['permissions', api.user_id]
77
- permissions = (!options[:no_cache] && cache_exist?(api, key)) ? cache_read(api, key) : Osm::Section.fetch_user_permissions(api)
78
- permissions ||= {}
79
- return section_id.nil? ? (permissions || {}) : (permissions[section_id] || {})
80
- end
81
-
82
- # Get an access permission for an API user
83
- # @param [Osm::Api] The api to use to make the request
84
- # @param [Fixnum, nil] section_id to get permissions for, if nil a Hash of all section's permissions is returned
85
- # @param [Symbol] permission
141
+ # @raise [Osm::Forbidden] If the Section does not have the required OSM Subscription (or higher)
142
+ def self.require_subscription(api, level, section, options={})
143
+ section = Osm::Section.get(api, section, options) if section.is_a?(Fixnum)
144
+ if level.is_a?(Symbol) # Convert to Fixnum
145
+ case level
146
+ when :bronze
147
+ level = 1
148
+ when :silver
149
+ level = 2
150
+ when :gold
151
+ level = 3
152
+ else
153
+ level = 0
154
+ end
155
+ end
156
+ if section.nil? || section.subscription_level < level
157
+ raise Osm::Forbidden, "Insufficent OSM subscription level (#{level} required for #{section.name})"
158
+ end
159
+ end
160
+
161
+ # Raise an exception if the user does not have the relevant permission
162
+ # @param [Osm::Api] api The api to use to make the request
163
+ # @param [Symbol] to What action is required to be done (e.g. :read or :write)
164
+ # @param [Symbol] on What the OSM permission is required on (e.g. :member or :programme)
165
+ # @param [Osm::Section, Fixnum, #to_i] section The Section (or its ID) the permission is required on
86
166
  # @!macro options_get
87
- # @return [Array<Symbol>] the actions the user can perform for the provided permission
88
- def self.get_user_permission(api, section_id, permission, options={})
89
- permissions = get_user_permissions(api, section_id, options)[permission]
90
- return (permissions || [])
167
+ def self.require_ability_to(api, to, on, section, options={})
168
+ require_permission(api, to, on, section, options)
169
+ require_subscription(api, :silver, section, options) if [:register, :contact, :events, :flexi].include?(on)
170
+ require_subscription(api, :gold, section, options) if [:finance].include?(on)
91
171
  end
92
172
 
93
173
 
94
- # Set access permission for an API user
95
- # @param [Osm::Api] The api to use to make the request
96
- # @param [Fixnum, nil] section_id to set permissions for, if nil the Hash of all section's permissions is set
97
- # @param [Hash] permissions the permissions Hash
98
- def self.set_user_permissions(api, section_id=nil, permissions)
99
- key = ['permissions', api.user_id]
100
- if section_id
101
- permissions = get_user_permissions(api).merge(section_id => permissions)
174
+ # Get a list of items given a list of item IDs
175
+ # @param [Osm::Api] api The api to use to make the request
176
+ # @param [Array<Fixnum>] ids The ids of the items to get
177
+ # @param [String] key The key for getting an item from the cache (the key [key, id] is generated)
178
+ # @param [Array] argumentss The arguments to pass to get_all
179
+ # @!macro options_get
180
+ # @param [Symbol] get_all_method The method to get all items (either :get_all or :get_for_section)
181
+ # @return [Array] An array of the items
182
+ def self.get_from_ids(api, ids, key, arguments=[], options, get_all_method)
183
+ raise ArgumentError, "get_al_method is invalid" unless [:get_all, :get_for_section].include?(get_all_method)
184
+ items = Array.new
185
+ ids.each do |id|
186
+ if cache_exist?(api, [key, id])
187
+ items.push cache_read(api, [*key, id])
188
+ else
189
+ # At least this one item is not in the cache - we might as well refresh the lot
190
+ return self.send(get_all_method, api, *arguments, options.merge(:no_cache => true))
191
+ end
102
192
  end
103
- cache_write(api, key, permissions)
193
+ return items
104
194
  end
105
195
 
106
196
 
107
197
  # Make selected class methods instance methods too
108
198
  %w{
109
- cache_read cache_write cache_exist? cache_delete
110
- get_user_permissions get_user_permission set_user_permission
199
+ cache_read cache_write cache_exist? cache_delete require_access_to_section
200
+ can_access_section? require_permission require_subscription require_ability_to
111
201
  }.each do |method_name|
112
202
  define_method method_name do |*options|
113
203
  self.class.send(method_name, *options)
@@ -4,16 +4,17 @@ module Osm
4
4
 
5
5
  # Get register structure
6
6
  # @param [Osm::Api] api The api to use to make the request
7
- # @param [Osm::Section, Fixnum] section the section (or its ID) to get the structure for
8
- # @param [Osm::Term, Fixnum, nil] section the term (or its ID) to get the structure for, passing nil causes the current term to be used
7
+ # @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to get the structure for
8
+ # @param [Osm::Term, Fixnum, #to_i, nil] term The term (or its ID) to get the structure for, passing nil causes the current term to be used
9
9
  # @!macro options_get
10
10
  # @return [Array<Osm::Register::Field>] representing the fields of the register
11
11
  def self.get_structure(api, section, term=nil, options={})
12
+ Osm::Model.require_ability_to(api, :read, :register, section, options)
12
13
  section_id = section.to_i
13
14
  term_id = term.nil? ? Osm::Term.get_current_term_for_section(api, section).id : term.to_i
14
15
  cache_key = ['register_structure', section_id, term_id]
15
16
 
16
- if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key) && Osm::Model.get_user_permission(api, section_id, :register).include?(:read)
17
+ if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key)
17
18
  return Osm::Model.cache_read(api, cache_key)
18
19
  end
19
20
 
@@ -40,16 +41,17 @@ module Osm
40
41
 
41
42
  # Get register attendance
42
43
  # @param [Osm::Api] api The api to use to make the request
43
- # @param [Osm::Section, Fixnum] section the section (or its ID) to get the register for
44
- # @param [Osm::Term, Fixnum, nil] section the term (or its ID) to get the register for, passing nil causes the current term to be used
44
+ # @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to get the register for
45
+ # @param [Osm::Term, Fixnum, #to_i, nil] term The term (or its ID) to get the register for, passing nil causes the current term to be used
45
46
  # @!macro options_get
46
47
  # @return [Array<Register::Attendance>] representing the attendance of each member
47
48
  def self.get_attendance(api, section, term=nil, options={})
49
+ Osm::Model.require_ability_to(api, :read, :register, section, options)
48
50
  section_id = section.to_i
49
51
  term_id = term.nil? ? Osm::Term.get_current_term_for_section(api, section).id : term.to_i
50
52
  cache_key = ['register_attendance', section_id, term_id]
51
53
 
52
- if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key) && Osm::Model.get_user_permission(api, section_id, :register).include?(:read)
54
+ if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key)
53
55
  return Osm::Model.cache_read(api, cache_key)
54
56
  end
55
57
 
@@ -83,19 +85,26 @@ module Osm
83
85
  # @param [Hash] data
84
86
  # @option data [Osm::Api] :api The api to use to make the request
85
87
  # @option data [Osm::Section] :section the section to update the register for
86
- # @option data [Osm::Term, Fixnum, nil] :term the term (or its ID) to get the register for, passing nil causes the current term to be used
88
+ # @option data [Osm::Term, #to_i, nil] :term The term (or its ID) to get the register for, passing nil causes the current term to be used
87
89
  # @option data [Osm::Evening, DateTime, Date] :evening the evening to update the register on
88
90
  # @option data [String] :attendance what to mark the attendance as, one of "Yes", "No" or "Absent"
89
91
  # @option data [Fixnum, Array<Fixnum>, Osm::Member, Array<Osm::Member>] :members the members (or their ids) to update
90
92
  # @option data [Array<Hash>] :completed_badge_requirements (optional) the badge requirements to mark as completed, selected from the Hash returned by the get_badge_requirements_for_evening method
91
93
  # @return [Boolean] whether the update succedded
94
+ # @raise [Osm::ArgumentIsInvalid] If data[:attendance] is not "Yes", "No" or "Absent"
95
+ # @raise [Osm::ArgumentIsInvalid] If data[:section] is missing
96
+ # @raise [Osm::ArgumentIsInvalid] If data[:evening] is missing
97
+ # @raise [Osm::ArgumentIsInvalid] If data[:members] is missing
98
+ # @raise [Osm::ArgumentIsInvalid] If data[:api] is missing
92
99
  def self.update_attendance(data={})
93
- raise ArgumentIsInvalid, ':attendance is invalid' unless ['Yes', 'No', 'Absent'].include?(data[:attendance])
94
- raise ArgumentIsInvalid, ':section is missing' if data[:section].nil?
95
- raise ArgumentIsInvalid, ':evening is missing' if data[:evening].nil?
96
- raise ArgumentIsInvalid, ':members is missing' if data[:members].nil?
97
-
100
+ raise Osm::ArgumentIsInvalid, ':attendance is invalid' unless ['Yes', 'No', 'Absent'].include?(data[:attendance])
101
+ raise Osm::ArgumentIsInvalid, ':section is missing' if data[:section].nil?
102
+ raise Osm::ArgumentIsInvalid, ':evening is missing' if data[:evening].nil?
103
+ raise Osm::ArgumentIsInvalid, ':members is missing' if data[:members].nil?
104
+ raise Osm::ArgumentIsInvalid, ':api is missing' if data[:api].nil?
98
105
  api = data[:api]
106
+ Osm::Model.require_ability_to(api, :write, :register, data[:section])
107
+
99
108
  term_id = data[:term].nil? ? Osm::Term.get_current_term_for_section(api, section).id : data[:term].to_i
100
109
 
101
110
  data[:members] = [*data[:members]].map{ |member| (member.is_a?(Fixnum) ? member : member.id).to_s } # Make sure it's an Array of Strings
@@ -136,7 +145,7 @@ module Osm
136
145
 
137
146
  # @!method initialize
138
147
  # Initialize a new RegisterField
139
- # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
148
+ # @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
140
149
 
141
150
  end # Class Register::Field
142
151
 
@@ -178,7 +187,7 @@ module Osm
178
187
 
179
188
  # @!method initialize
180
189
  # Initialize a new registerData
181
- # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
190
+ # @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
182
191
 
183
192
  end # Class Register::Data
184
193
 
@@ -12,7 +12,7 @@ module Osm
12
12
  # @!attribute [rw] group_name
13
13
  # @return [String] the group name
14
14
  # @!attribute [rw] subscription_level
15
- # @return [Symbol] what subscription the section has to OSM (:bronze, :silver or :gold)
15
+ # @return [Fixnum] what subscription the section has to OSM (1-bronze, 2-silver, 3-gold)
16
16
  # @!attribute [rw] subscription_expires
17
17
  # @return [Date] when the section's subscription to OSM expires
18
18
  # @!attribute [rw] type
@@ -66,7 +66,7 @@ module Osm
66
66
  attribute :name, :type => String
67
67
  attribute :group_id, :type => Integer
68
68
  attribute :group_name, :type => String
69
- attribute :subscription_level, :default => :unknown
69
+ attribute :subscription_level, :default => 1
70
70
  attribute :subscription_expires, :type => Date
71
71
  attribute :type, :default => :unknown
72
72
  attribute :column_names, :default => {}
@@ -120,7 +120,7 @@ module Osm
120
120
  validates_presence_of :mobile_fields, :unless => Proc.new { |a| a.mobile_fields == {} }
121
121
  validates_presence_of :flexi_records, :unless => Proc.new { |a| a.flexi_records == [] }
122
122
 
123
- validates_inclusion_of :subscription_level, :in => [:bronze, :silver, :gold, :unknown], :message => 'is not a valid level'
123
+ validates_inclusion_of :subscription_level, :in => (1..3), :message => 'is not a valid subscription level'
124
124
  validates_inclusion_of :gocardless, :in => [true, false]
125
125
  validates_inclusion_of :myscout_events, :in => [true, false]
126
126
  validates_inclusion_of :myscout_badges, :in => [true, false]
@@ -138,34 +138,32 @@ module Osm
138
138
 
139
139
  # @!method initialize
140
140
  # Initialize a new Section
141
- # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
141
+ # @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
142
142
 
143
143
 
144
144
  # Get the user's sections
145
- # @param [Osm::Api] The api to use to make the request
145
+ # @param [Osm::Api] api The api to use to make the request
146
146
  # @!macro options_get
147
147
  # @return [Array<Osm::Section>]
148
148
  def self.get_all(api, options={})
149
149
  cache_key = ['sections', api.user_id]
150
- subscription_levels = {
151
- 1 => :bronze,
152
- 2 => :silver,
153
- 3 => :gold,
154
- }
155
150
 
156
151
  if !options[:no_cache] && cache_exist?(api, cache_key)
157
- return cache_read(api, cache_key)
152
+ ids = cache_read(api, cache_key)
153
+ return get_from_ids(api, ids, 'section', options, :get_all)
158
154
  end
159
155
 
160
156
  data = api.perform_query('api.php?action=getUserRoles')
161
157
 
162
158
  result = Array.new
159
+ ids = Array.new
163
160
  permissions = Hash.new
164
161
  data.each do |role_data|
165
162
  unless role_data['section'].eql?('discount') # It's not an actual section
166
163
  section_data = role_data['sectionConfig'].is_a?(String) ? ActiveSupport::JSON.decode(role_data['sectionConfig']) : role_data['sectionConfig']
167
164
  myscout_data = section_data['portal'] || {}
168
165
  section_data['portalExpires'] ||= {}
166
+ section_id = Osm::to_i_or_nil(role_data['sectionid'])
169
167
 
170
168
  # Make sense of flexi records
171
169
  fr_data = []
@@ -176,16 +174,17 @@ module Osm
176
174
  # Expect item to be: {:name=>String, :extraid=>Fixnum}
177
175
  # Sometimes get item as: [String, {"name"=>String, "extraid"=>Fixnum}]
178
176
  record_data = record_data[1] if record_data.is_a?(Array)
179
- flexi_records.push FlexiRecord.new(
177
+ flexi_records.push Osm::FlexiRecord.new(
180
178
  :id => Osm::to_i_or_nil(record_data['extraid']),
181
179
  :name => record_data['name'],
180
+ :section_id => section_id,
182
181
  )
183
182
  end
184
183
 
185
184
  section = new(
186
- :id => Osm::to_i_or_nil(role_data['sectionid']),
185
+ :id => section_id,
187
186
  :name => role_data['sectionname'],
188
- :subscription_level => (subscription_levels[section_data['subscription_level']] || :unknown),
187
+ :subscription_level => Osm::to_i_or_nil(section_data['subscription_level']),
189
188
  :subscription_expires => Osm::parse_date(section_data['subscription_expires']),
190
189
  :type => !section_data['sectionType'].nil? ? section_data['sectionType'].to_sym : (!section_data['section'].nil? ? section_data['section'].to_sym : :unknown),
191
190
  :num_scouts => section_data['numscouts'],
@@ -216,27 +215,30 @@ module Osm
216
215
  )
217
216
 
218
217
  result.push section
218
+ ids.push section.id
219
219
  cache_write(api, ['section', section.id], section)
220
- permissions.merge!(section.id => make_permissions_hash(role_data['permissions']))
220
+ permissions.merge!(section.id => Osm.make_permissions_hash(role_data['permissions']))
221
221
  end
222
222
  end
223
223
 
224
- set_user_permissions(api, get_user_permissions(api).merge(permissions))
225
- cache_write(api, cache_key, result)
224
+ permissions.each do |s_id, perms|
225
+ api.set_user_permissions(s_id, perms)
226
+ end
227
+ cache_write(api, cache_key, ids)
226
228
  return result
227
229
  end
228
230
 
229
231
 
230
232
  # Get a section
231
- # @param [Osm::Api] The api to use to make the request
232
- # @param [Fixnum] section_id the section id of the required section
233
+ # @param [Osm::Api] api The api to use to make the request
234
+ # @param [Fixnum] section_id The section id of the required section
233
235
  # @!macro options_get
234
236
  # @return nil if an error occured or the user does not have access to that section
235
237
  # @return [Osm::Section]
236
238
  def self.get(api, section_id, options={})
237
239
  cache_key = ['section', section_id]
238
240
 
239
- if !options[:no_cache] && cache_exist?(api, cache_key) && get_user_permissions(api).keys.include?(section_id)
241
+ if !options[:no_cache] && cache_exist?(api, cache_key) && can_access_section?(api, section_id)
240
242
  return cache_read(api, cache_key)
241
243
  end
242
244
 
@@ -250,39 +252,15 @@ module Osm
250
252
  end
251
253
 
252
254
 
253
- # Get API user's permissions
254
- # @param [Osm::Api] The api to use to make the request
255
- # @!macro options_get
256
- # @return nil if an error occured or the user does not have access to that section
257
- # @return [Hash] {section_id => permissions_hash}
258
- def self.fetch_user_permissions(api, options={})
259
- cache_key = ['permissions', api.user_id]
260
-
261
- if !options[:no_cache] && cache_exist?(api, cache_key)
262
- return cache_read(api, cache_key)
263
- end
264
-
265
- data = api.perform_query('api.php?action=getUserRoles')
266
-
267
- all_permissions = Hash.new
268
- data.each do |item|
269
- unless item['section'].eql?('discount') # It's not an actual section
270
- all_permissions.merge!(Osm::to_i_or_nil(item['sectionid']) => make_permissions_hash(item['permissions']))
271
- end
272
- end
273
- cache_write(api, cache_key, all_permissions)
274
- return all_permissions
275
- end
276
-
277
-
278
255
  # Get the section's notepad from OSM
279
- # @param [Osm::Api] The api to use to make the request
256
+ # @param [Osm::Api] api The api to use to make the request
280
257
  # @!macro options_get
281
258
  # @return [String] the section's notepad
282
259
  def get_notepad(api, options={})
260
+ require_access_to_section(api, self, options)
283
261
  cache_key = ['notepad', id]
284
262
 
285
- if !options[:no_cache] && cache_exist?(api, cache_key) && get_user_permissions(api).keys.include?(id)
263
+ if !options[:no_cache] && cache_exist?(api, cache_key) && can_access_section?(api, section_id)
286
264
  return cache_read(api, cache_key)
287
265
  end
288
266
 
@@ -303,6 +281,7 @@ module Osm
303
281
  # @param [String] content The content of the notepad
304
282
  # @return [Boolean] whether the notepad was sucessfully updated
305
283
  def set_notepad(api, content)
284
+ require_access_to_section(api, self)
306
285
  data = api.perform_query("users.php?action=updateNotepad&sectionid=#{id}", {'value' => content})
307
286
 
308
287
  if data.is_a?(Hash) && data['ok'] # Success
@@ -314,15 +293,16 @@ module Osm
314
293
 
315
294
 
316
295
  # Get badge stock levels
317
- # @param [Osm::Api] The api to use to make the request
318
- # @param [Osm::Term, Fixnum, nil] section the term (or its ID) to get the stock levels for, passing nil causes the current term to be used
296
+ # @param [Osm::Api] api The api to use to make the request
297
+ # @param [Osm::Term, Fixnum, #to_i, nil] term The term (or its ID) to get the stock levels for, passing nil causes the current term to be used
319
298
  # @!macro options_get
320
299
  # @return Hash
321
300
  def get_badge_stock(api, term=nil, options={})
301
+ require_ability_to(api, :read, :badge, self, options)
322
302
  term_id = term.nil? ? Osm::Term.get_current_term_for_section(api, self).id : term.to_i
323
303
  cache_key = ['badge_stock', id, term_id]
324
304
 
325
- if !options[:no_cache] && cache_exist?(api, cache_key) && get_user_permission(api, self, :badge).include?(:read)
305
+ if !options[:no_cache] && cache_exist?(api, cache_key)
326
306
  return cache_read(api, cache_key)
327
307
  end
328
308
 
@@ -366,6 +346,16 @@ module Osm
366
346
  end
367
347
  end
368
348
 
349
+ # Get the name for the section's subscription level
350
+ # @return [String, nil] the name of the subscription level (nil if no name exists)
351
+ def subscription_level_name
352
+ return {
353
+ 1 => 'Bronze',
354
+ 2 => 'Silver',
355
+ 3 => 'Gold',
356
+ }[subscription_level]
357
+ end
358
+
369
359
  def <=>(another)
370
360
  begin
371
361
  compare_group_name = group_name <=> another.group_name
@@ -389,56 +379,6 @@ module Osm
389
379
  end
390
380
  end
391
381
 
392
-
393
- private
394
- def self.make_permissions_hash(permissions)
395
- return {} unless permissions.is_a?(Hash)
396
-
397
- permissions_map = {
398
- 10 => [:read],
399
- 20 => [:read, :write],
400
- 100 => [:read, :write, :administer],
401
- }
402
-
403
- return permissions.inject({}) do |new_hash, (key, value)|
404
- new_hash[key.to_sym] = (permissions_map[value.to_i] || [])
405
- new_hash
406
- end
407
- end
408
-
409
-
410
- class FlexiRecord
411
- include ::ActiveAttr::MassAssignmentSecurity
412
- include ::ActiveAttr::Model
413
-
414
- # @!attribute [rw] id
415
- # @return [Fixnum] the aid of the flexi-record
416
- # @!attribute [rw] name
417
- # @return [String] the name given to the flexi-record
418
-
419
- attribute :id, :type => Integer
420
- attribute :name, :type => String
421
-
422
- attr_accessible :id, :name
423
-
424
- validates_numericality_of :id, :only_integer=>true, :greater_than=>0
425
- validates_presence_of :name
426
-
427
-
428
- # @!method initialize
429
- # Initialize a new FlexiRecord
430
- # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
431
-
432
- def <=>(another)
433
- begin
434
- return self.name <=> another.name
435
- rescue NoMethodError
436
- return 1
437
- end
438
- end
439
-
440
- end # Class Section::FlexiRecord
441
-
442
382
  end # Class Section
443
383
 
444
384
  end # Module