osm 0.1.17 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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