osm 0.0.26 → 0.1.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.
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