osm 0.0.26 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/CHANGELOG.md +57 -0
  2. data/README.md +13 -7
  3. data/lib/osm.rb +47 -22
  4. data/lib/osm/activity.rb +52 -57
  5. data/lib/osm/api.rb +115 -1031
  6. data/lib/osm/api_access.rb +73 -36
  7. data/lib/osm/due_badges.rb +27 -12
  8. data/lib/osm/evening.rb +118 -55
  9. data/lib/osm/event.rb +275 -17
  10. data/lib/osm/flexi_record.rb +131 -0
  11. data/lib/osm/grouping.rb +37 -15
  12. data/lib/osm/member.rb +100 -41
  13. data/lib/osm/model.rb +95 -0
  14. data/lib/osm/register.rb +177 -0
  15. data/lib/osm/section.rb +163 -71
  16. data/lib/osm/term.rb +135 -21
  17. data/spec/osm/activity_spec.rb +7 -4
  18. data/spec/osm/api_access_spec.rb +44 -36
  19. data/spec/osm/api_spec.rb +32 -1147
  20. data/spec/osm/due_badges_spec.rb +8 -1
  21. data/spec/osm/evening_spec.rb +119 -54
  22. data/spec/osm/event_spec.rb +363 -13
  23. data/spec/osm/flexi_record_spec.rb +128 -0
  24. data/spec/osm/grouping_spec.rb +9 -5
  25. data/spec/osm/member_spec.rb +111 -36
  26. data/spec/osm/model_spec.rb +140 -0
  27. data/spec/osm/osm_spec.rb +7 -31
  28. data/spec/osm/register_spec.rb +103 -0
  29. data/spec/osm/section_spec.rb +208 -92
  30. data/spec/osm/term_spec.rb +164 -28
  31. data/spec/spec_helper.rb +22 -0
  32. data/version.rb +1 -1
  33. metadata +22 -29
  34. data/lib/osm/event_attendance.rb +0 -55
  35. data/lib/osm/flexi_record_data.rb +0 -51
  36. data/lib/osm/flexi_record_field.rb +0 -42
  37. data/lib/osm/register_data.rb +0 -64
  38. data/lib/osm/register_field.rb +0 -42
  39. data/lib/osm/role.rb +0 -133
  40. data/spec/osm/api_strangeness_spec.rb +0 -83
  41. data/spec/osm/event_attendance_spec.rb +0 -34
  42. data/spec/osm/flexi_record_data_spec.rb +0 -40
  43. data/spec/osm/flexi_record_field_spec.rb +0 -23
  44. data/spec/osm/register_data_spec.rb +0 -35
  45. data/spec/osm/register_field_spec.rb +0 -24
  46. data/spec/osm/role_spec.rb +0 -118
@@ -0,0 +1,177 @@
1
+ module Osm
2
+
3
+ class Register
4
+
5
+ # Get register structure
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
9
+ # @!macro options_get
10
+ # @return [Array<Osm::Register::Field>] representing the fields of the register
11
+ def self.get_structure(api, section, term=nil, options={})
12
+ section_id = section.to_i
13
+ term_id = term.nil? ? Osm::Term.get_current_term_for_section(api, section).id : term.to_i
14
+ cache_key = ['register_structure', section_id, term_id]
15
+
16
+ if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key) && Osm::Model.get_user_permissions(api, section_id)[:register].include?(:read)
17
+ return Osm::Model.cache_read(api, cache_key)
18
+ end
19
+
20
+ data = api.perform_query("users.php?action=registerStructure&sectionid=#{section_id}&termid=#{term_id}")
21
+
22
+ structure = []
23
+ data.each do |item|
24
+ item['rows'].each do |row|
25
+ structure.push Field.new(
26
+ :id => row['field'],
27
+ :name => row['name'],
28
+ :tooltip => row['tooltip'],
29
+ )
30
+ end
31
+ end
32
+ Osm::Model.cache_write(api, cache_key, structure)
33
+
34
+ return structure
35
+ end
36
+
37
+ # Get register attendance
38
+ # @param [Osm::Api] api The api to use to make the request
39
+ # @param [Osm::Section, Fixnum] section the section (or its ID) to get the register for
40
+ # @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
41
+ # @!macro options_get
42
+ # @return [Array<Register::Attendance>] representing the attendance of each member
43
+ def self.get_attendance(api, section, term=nil, options={})
44
+ section_id = section.to_i
45
+ term_id = term.nil? ? Osm::Term.get_current_term_for_section(api, section).id : term.to_i
46
+ cache_key = ['register_attendance', section_id, term_id]
47
+
48
+ if !options[:no_cache] && Osm::Model.cache_exist?(api, cache_key) && Osm::Model.get_user_permissions(api, section_id)[:register].include?(:read)
49
+ return Osm::Model.cache_read(api, cache_key)
50
+ end
51
+
52
+ data = api.perform_query("users.php?action=register&sectionid=#{section_id}&termid=#{term_id}")
53
+
54
+ data = data['items']
55
+ to_return = []
56
+ data.each do |item|
57
+ to_return.push Osm::Register::Attendance.new(
58
+ :member_id => Osm::to_i_or_nil(item['scoutid']),
59
+ :grouping_id => Osm::to_i_or_nil(item ['patrolid']),
60
+ :section_id => Osm::to_i_or_nil(item['sectionid']),
61
+ :first_name => item['firstname'],
62
+ :last_name => item['lastname'],
63
+ :total => item['total'].to_i,
64
+ :attendance => item.select { |key, value| key.to_s.match(Osm::OSM_DATE_REGEX) }.
65
+ inject({}){ |new_hash,(date, attendance)| new_hash[Date.strptime(date, Osm::OSM_DATE_FORMAT)] = attendance; new_hash },
66
+ )
67
+ end
68
+ Osm::Model.cache_write(api, cache_key, to_return)
69
+ return to_return
70
+ end
71
+
72
+ # Update attendance for an evening in OSM
73
+ # @param [Hash] data
74
+ # @option data [Osm::Api] :api The api to use to make the request
75
+ # @option data [Osm::Section] :section the section to update the register for
76
+ # @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
77
+ # @option data [Osm::Evening, DateTime, Date] :evening the evening to update the register on
78
+ # @option data [String] :attendance what to mark the attendance as, one of "Yes", "No" or "Absent"
79
+ # @option data [Fixnum, Array<Fixnum>, Osm::Member, Array<Osm::Member>] :members the members (or their ids) to update
80
+ # @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
81
+ # @return [Boolean] wether the update succedded
82
+ def self.update_attendance(data={})
83
+ raise ArgumentIsInvalid, ':attendance is invalid' unless ['Yes', 'No', 'Absent'].include?(data[:attendance])
84
+ raise ArgumentIsInvalid, ':section is missing' if data[:section].nil?
85
+ raise ArgumentIsInvalid, ':evening is missing' if data[:evening].nil?
86
+ raise ArgumentIsInvalid, ':members is missing' if data[:members].nil?
87
+
88
+ api = data[:api]
89
+ term_id = data[:term].nil? ? Osm::Term.get_current_term_for_section(api, section).id : data[:term].to_i
90
+
91
+ data[:members] = [*data[:members]].map{ |member| (member.is_a?(Fixnum) ? member : member.id).to_s } # Make sure it's an Array of Strings
92
+
93
+ response = api.perform_query("users.php?action=registerUpdate&sectionid=#{data[:section].id}&termid=#{term_id}", {
94
+ 'scouts' => data[:members].inspect,
95
+ 'selectedDate' => data[:evening].strftime(Osm::OSM_DATE_FORMAT),
96
+ 'present' => data[:attendance],
97
+ 'section' => data[:section].type,
98
+ 'sectionid' => data[:section].id,
99
+ 'completedBadges' => (data[:completed_badge_requirements] || []).to_json
100
+ })
101
+
102
+ # The cached attendance will be out of date - remove them
103
+ Osm::Model.cache_delete(api, ['register_attendance', data[:section].id, term_id])
104
+
105
+ return response.is_a?(Array)
106
+ end
107
+
108
+
109
+ class Field < Osm::Model
110
+ # @!attribute [rw] id
111
+ # @return [String] OSM identifier for the field
112
+ # @!attribute [rw] name
113
+ # @return [String] Human readable name for the field
114
+ # @!attribute [rw] tooltip
115
+ # @return [String] Tooltip for the field
116
+
117
+ attribute :id, :type => String
118
+ attribute :name, :type => String
119
+ attribute :tooltip, :type => String, :default => ''
120
+
121
+ attr_accessible :id, :name, :tooltip
122
+
123
+ validates_presence_of :id
124
+ validates_presence_of :name
125
+ validates_presence_of :tooltip, :allow_blank => true
126
+
127
+ # @!method initialize
128
+ # Initialize a new RegisterField
129
+ # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
130
+
131
+ end # Class Register::Field
132
+
133
+
134
+ class Attendance < Osm::Model
135
+ # @!attribute [rw] member_id
136
+ # @return [Fixnum] The OSM ID for the member
137
+ # @!attribute [rw] grouping_id
138
+ # @return [Fixnum] The OSM ID for the member's grouping
139
+ # @!attribute [rw] section_id
140
+ # @return [Fixnum] The OSM ID for the member's section
141
+ # @!attribute [rw] first_name
142
+ # @return [String] The member's first name
143
+ # @!attribute [rw] last_name
144
+ # @return [String] The member's last name
145
+ # @!attribute [rw] total
146
+ # @return [FixNum] Total
147
+ # @!attribute [rw] attendance
148
+ # @return [Hash] The data for each field - keys are the date, values one of 'Yes' (present), 'No' (known absence) or nil (absent)
149
+
150
+ attribute :member_id, :type => Integer
151
+ attribute :grouping_id, :type => Integer
152
+ attribute :section_id, :type => Integer
153
+ attribute :first_name, :type => String
154
+ attribute :last_name, :type => String
155
+ attribute :total, :type => Integer
156
+ attribute :attendance, :default => {}
157
+
158
+ attr_accessible :member_id, :first_name, :last_name, :section_id, :grouping_id, :total, :attendance
159
+
160
+ validates_numericality_of :member_id, :only_integer=>true, :greater_than=>0
161
+ validates_numericality_of :grouping_id, :only_integer=>true, :greater_than_or_equal_to=>-2
162
+ validates_numericality_of :section_id, :only_integer=>true, :greater_than=>0
163
+ validates_numericality_of :total, :only_integer=>true, :greater_than_or_equal_to=>0
164
+ validates_presence_of :first_name
165
+ validates_presence_of :last_name
166
+
167
+ validates :attendance, :hash => {:key_type => Date, :value_in => ['Yes', 'No', nil]}
168
+
169
+ # @!method initialize
170
+ # Initialize a new registerData
171
+ # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
172
+
173
+ end # Class Register::Data
174
+
175
+ end # Class Register
176
+
177
+ end # Module
@@ -1,15 +1,16 @@
1
1
  module Osm
2
2
 
3
- class Section
3
+ class Section < Osm::Model
4
4
  class FlexiRecord; end # Ensure the constant exists for the validators
5
5
 
6
- include ::ActiveAttr::MassAssignmentSecurity
7
- include ::ActiveAttr::Model
8
-
9
6
  # @!attribute [rw] id
10
7
  # @return [Fixnum] the id for the section
11
8
  # @!attribute [rw] name
12
9
  # @return [String] the section name
10
+ # @!attribute [rw] group_id
11
+ # @return [Fixnum] the id for the group
12
+ # @!attribute [rw] group_name
13
+ # @return [String] the group name
13
14
  # @!attribute [rw] subscription_level
14
15
  # @return [Symbol] what subscription the section has to OSM (:bronze, :silver or :gold)
15
16
  # @!attribute [rw] subscription_expires
@@ -28,11 +29,11 @@ module Osm
28
29
  # @return [Hash] which columns are shown in the OSM mobile app
29
30
  # @!attribute [rw] flexi_records
30
31
  # @return [Array<FlexiRecord>] list of the extra records the section has
31
- # @!attribute [rw] role
32
- # @return [Osm::Role] the role linking the user to this section
33
32
 
34
33
  attribute :id, :type => Integer
35
34
  attribute :name, :type => String
35
+ attribute :group_id, :type => Integer
36
+ attribute :group_name, :type => String
36
37
  attribute :subscription_level, :default => :unknown
37
38
  attribute :subscription_expires, :type => Date
38
39
  attribute :type, :default => :unknown
@@ -42,12 +43,15 @@ module Osm
42
43
  attribute :intouch_fields, :default => {}
43
44
  attribute :mobile_fields, :default => {}
44
45
  attribute :flexi_records, :default => []
45
- attribute :role
46
46
 
47
- attr_accessible :id, :name, :subscription_level, :subscription_expires, :type, :num_scouts, :column_names, :fields, :intouch_fields, :mobile_fields, :flexi_records, :role
47
+ attr_accessible :id, :name, :group_id, :group_name, :subscription_level, :subscription_expires, :type,
48
+ :num_scouts, :column_names, :fields, :intouch_fields, :mobile_fields, :flexi_records
48
49
 
49
50
  validates_numericality_of :id, :only_integer=>true, :greater_than=>0, :allow_nil => true
51
+ validates_numericality_of :group_id, :only_integer=>true, :greater_than=>0, :allow_nil => true
50
52
  validates_numericality_of :num_scouts, :only_integer=>true, :greater_than_or_equal_to=>0
53
+ validates_presence_of :name
54
+ validates_presence_of :group_name
51
55
  validates_presence_of :subscription_level
52
56
  validates_presence_of :subscription_expires
53
57
  validates_presence_of :type
@@ -56,14 +60,13 @@ module Osm
56
60
  validates_presence_of :intouch_fields, :unless => Proc.new { |a| a.intouch_fields == {} }
57
61
  validates_presence_of :mobile_fields, :unless => Proc.new { |a| a.mobile_fields == {} }
58
62
  validates_presence_of :flexi_records, :unless => Proc.new { |a| a.flexi_records == [] }
59
- validates_presence_of :role
60
63
 
61
64
  validates_inclusion_of :subscription_level, :in => [:bronze, :silver, :gold, :unknown], :message => 'is not a valid level'
62
65
 
63
66
  validates :column_names, :hash => {:key_type => Symbol, :value_type => String}
64
- validates :fields, :hash => {:key_type => Symbol, :value_type => String}
65
- validates :intouch_fields, :hash => {:key_type => Symbol, :value_type => String}
66
- validates :mobile_fields, :hash => {:key_type => Symbol, :value_type => String}
67
+ validates :fields, :hash => {:key_type => Symbol, :value_in => [true, false]}
68
+ validates :intouch_fields, :hash => {:key_type => Symbol, :value_in => [true, false]}
69
+ validates :mobile_fields, :hash => {:key_type => Symbol, :value_in => [true, false]}
67
70
 
68
71
 
69
72
  # @!method initialize
@@ -71,40 +74,137 @@ module Osm
71
74
  # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
72
75
 
73
76
 
74
- # Initialize a new Sections from api data
75
- # @param [Fixnum] id the section ID used by the API to refer to this section
76
- # @param [String] name the name given to the sction in OSM
77
- # @param [Hash] data the hash of data for the object returned by the API
78
- # @param [Osm::Role] role the Osm::Role linked with this section
79
- def self.from_api(id, name, data, role)
80
- subscription_levels = [:bronze, :silver, :gold]
81
- subscription_level = data['subscription_level'].to_i - 1
82
-
83
- attributes = {
84
- :id => Osm::to_i_or_nil(id),
85
- :name => name,
86
- :subscription_level => (subscription_levels[subscription_level] unless subscription_level < 0) || :unknown,
87
- :subscription_expires => data['subscription_expires'] ? Date.parse(data['subscription_expires'], 'yyyy-mm-dd') : nil,
88
- :type => !data['sectionType'].nil? ? data['sectionType'].to_sym : :unknown,
89
- :num_scouts => data['numscouts'],
90
- :column_names => data['columnNames'].is_a?(Hash) ? Osm::symbolize_hash(data['columnNames']) : {},
91
- :fields => data['fields'].is_a?(Hash) ? Osm::symbolize_hash(data['fields']) : {},
92
- :intouch_fields => data['intouch'].is_a?(Hash) ? Osm::symbolize_hash(data['intouch']) : {},
93
- :mobile_fields => data['mobFields'].is_a?(Hash) ? Osm::symbolize_hash(data['mobFields']) : {},
94
- :role => role,
95
- :flexi_records => [],
77
+ # Get the user's sections
78
+ # @param [Osm::Api] The api to use to make the request
79
+ # @!macro options_get
80
+ # @return [Array<Osm::Section>]
81
+ def self.get_all(api, options={})
82
+ cache_key = ['sections', api.user_id]
83
+ subscription_levels = {
84
+ 1 => :bronze,
85
+ 2 => :silver,
86
+ 3 => :gold,
96
87
  }
97
88
 
98
- # Populate arrays
99
- fr = []
100
- fr = data['extraRecords'] if data['extraRecords'].is_a?(Array)
101
- fr = data['extraRecords'].values if data['extraRecords'].is_a?(Hash)
102
- fr.each do |record_data|
103
- attributes[:flexi_records].push FlexiRecord.from_api(record_data)
89
+ if !options[:no_cache] && cache_exist?(api, cache_key)
90
+ return cache_read(api, cache_key)
91
+ end
92
+
93
+ data = api.perform_query('api.php?action=getUserRoles')
94
+
95
+ result = Array.new
96
+ permissions = Hash.new
97
+ data.each do |role_data|
98
+ section_data = ActiveSupport::JSON.decode(role_data['sectionConfig'])
99
+
100
+ # Make sense of flexi records
101
+ fr_data = []
102
+ flexi_records = []
103
+ fr_data = section_data['extraRecords'] if section_data['extraRecords'].is_a?(Array)
104
+ fr_data = section_data['extraRecords'].values if section_data['extraRecords'].is_a?(Hash)
105
+ fr_data.each do |record_data|
106
+ # Expect item to be: {:name=>String, :extraid=>Fixnum}
107
+ # Sometimes get item as: [String, {"name"=>String, "extraid"=>Fixnum}]
108
+ record_data = record_data[1] if record_data.is_a?(Array)
109
+ flexi_records.push FlexiRecord.new(
110
+ :id => Osm::to_i_or_nil(record_data['extraid']),
111
+ :name => record_data['name'],
112
+ )
113
+ end
114
+
115
+ section = new(
116
+ :id => Osm::to_i_or_nil(role_data['sectionid']),
117
+ :name => role_data['sectionname'],
118
+ :subscription_level => (subscription_levels[section_data['subscription_level']] || :unknown),
119
+ :subscription_expires => Osm::parse_date(section_data['subscription_expires']),
120
+ :type => !section_data['sectionType'].nil? ? section_data['sectionType'].to_sym : :unknown,
121
+ :num_scouts => section_data['numscouts'],
122
+ :column_names => section_data['columnNames'].is_a?(Hash) ? Osm::symbolize_hash(section_data['columnNames']) : {},
123
+ :fields => section_data['fields'].is_a?(Hash) ? Osm::symbolize_hash(section_data['fields']) : {},
124
+ :intouch_fields => section_data['intouch'].is_a?(Hash) ? Osm::symbolize_hash(section_data['intouch']) : {},
125
+ :mobile_fields => section_data['mobFields'].is_a?(Hash) ? Osm::symbolize_hash(section_data['mobFields']) : {},
126
+ :flexi_records => flexi_records.sort,
127
+ :group_id => role_data['groupid'],
128
+ :group_name => role_data['groupname'],
129
+ )
130
+
131
+ result.push section
132
+ cache_write(api, ['section', section.id], section)
133
+ permissions.merge!(section.id => make_permissions_hash(role_data['permissions']))
134
+ end
135
+
136
+ set_user_permissions(api, get_user_permissions(api).merge(permissions))
137
+ cache_write(api, cache_key, result)
138
+ return result
139
+ end
140
+
141
+
142
+ # Get a section
143
+ # @param [Osm::Api] The api to use to make the request
144
+ # @param [Fixnum] section_id the section id of the required section
145
+ # @!macro options_get
146
+ # @return nil if an error occured or the user does not have access to that section
147
+ # @return [Osm::Section]
148
+ def self.get(api, section_id, options={})
149
+ cache_key = ['section', section_id]
150
+
151
+ if !options[:no_cache] && cache_exist?(api, cache_key) && get_user_permissions(api).keys.include?(section_id)
152
+ return cache_read(api, cache_key)
104
153
  end
105
- attributes[:flexi_records].sort
106
154
 
107
- new(attributes)
155
+ sections = get_all(api, options)
156
+ return nil unless sections.is_a? Array
157
+
158
+ sections.each do |section|
159
+ return section if section.id == section_id
160
+ end
161
+ return nil
162
+ end
163
+
164
+
165
+ # Get API user's permissions
166
+ # @param [Osm::Api] The api to use to make the request
167
+ # @!macro options_get
168
+ # @return nil if an error occured or the user does not have access to that section
169
+ # @return [Hash] {section_id => permissions_hash}
170
+ def self.fetch_user_permissions(api, options={})
171
+ cache_key = ['permissions', api.user_id]
172
+
173
+ if !options[:no_cache] && cache_exist?(api, cache_key)
174
+ return cache_read(api, cache_key)
175
+ end
176
+
177
+ data = api.perform_query('api.php?action=getUserRoles')
178
+
179
+ all_permissions = Hash.new
180
+ data.each do |item|
181
+ all_permissions.merge!(Osm::to_i_or_nil(item['sectionid']) => make_permissions_hash(item['permissions']))
182
+ end
183
+ cache_write(api, cache_key, all_permissions)
184
+ return all_permissions
185
+ end
186
+
187
+ # Get the section's notepads
188
+ # @param [Osm::Api] The api to use to make the request
189
+ # @!macro options_get
190
+ # @return [String] the section's notepad
191
+ def get_notepad(api, options={})
192
+ cache_key = ['notepad', id]
193
+
194
+ if !options[:no_cache] && self.class.cache_exist?(api, cache_key) && get_user_permissions(api).keys.include?(section_id)
195
+ return self.class.cache_read(api, cache_key)
196
+ end
197
+
198
+ notepads = api.perform_query('api.php?action=getNotepads')
199
+ return '' unless notepads.is_a?(Hash)
200
+
201
+ notepad = ''
202
+ notepads.each do |key, value|
203
+ self.class.cache_write(api, ['notepad', key.to_i], value)
204
+ notepad = value if key.to_i == id
205
+ end
206
+
207
+ return notepad
108
208
  end
109
209
 
110
210
  # Check if this section is one of the youth sections
@@ -140,7 +240,14 @@ module Osm
140
240
 
141
241
  def <=>(another)
142
242
  begin
143
- return self.role <=> another.role
243
+ compare_group_name = group_name <=> another.group_name
244
+ return compare_group_name unless compare_group_name == 0
245
+
246
+ return 0 if section.type == another.type
247
+ [:beavers, :cubs, :scouts, :explorers, :waiting, :adults].each do |type|
248
+ return -1 if section.type == type
249
+ return 1 if another.type == type
250
+ end
144
251
  rescue NoMethodError
145
252
  return 1
146
253
  end
@@ -153,23 +260,22 @@ module Osm
153
260
  return false
154
261
  end
155
262
  end
156
-
157
- def inspect
158
- attribute_descriptions = attributes.merge('role' => (role.nil? ? nil : role.inspect_without_section(self)))
159
- return_inspect(attribute_descriptions)
160
- end
161
-
162
- def inspect_without_role(exclude_role)
163
- attribute_descriptions = (role == exclude_role) ? attributes.merge('role' => 'SET') : attributes
164
- return_inspect(attribute_descriptions)
165
- end
166
263
 
167
264
 
168
265
  private
169
- def return_inspect(attribute_descriptions)
170
- attribute_descriptions.sort.map { |key, value| "#{key}: #{key.eql?('role') ? value : value.inspect}" }.join(", ")
171
- separator = " " unless attribute_descriptions.empty?
172
- "#<#{self.class.name}#{separator}#{attribute_descriptions}>"
266
+ def self.make_permissions_hash(permissions)
267
+ return {} unless permissions.is_a?(Hash)
268
+
269
+ permissions_map = {
270
+ 10 => [:read],
271
+ 20 => [:read, :write],
272
+ 100 => [:read, :write, :administer],
273
+ }
274
+
275
+ return permissions.inject({}) do |new_hash, (key, value)|
276
+ new_hash[key.to_sym] = (permissions_map[value] || [])
277
+ new_hash
278
+ end
173
279
  end
174
280
 
175
281
 
@@ -195,20 +301,6 @@ module Osm
195
301
  # Initialize a new FlexiRecord
196
302
  # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
197
303
 
198
-
199
- # Initialize a new FlexiRecord from api data
200
- # @param [Hash] data the hash of data provided by the API
201
- def self.from_api(data)
202
- # Expect item to be: {:name=>String, :extraid=>Fixnum}
203
- # Sometimes get item as: [String, {"name"=>String, "extraid"=>Fixnum}]
204
- data = data[1] if data.is_a?(Array)
205
-
206
- new({
207
- :id => Osm::to_i_or_nil(data['extraid']),
208
- :name => data['name'],
209
- })
210
- end
211
-
212
304
  def <=>(another)
213
305
  begin
214
306
  return self.name <=> another.name