osm 0.0.1.alpha
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.
- data/.gitignore +25 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE.rdoc +39 -0
- data/README.md +24 -0
- data/Rakefile +14 -0
- data/lib/osm.rb +71 -0
- data/lib/osm/activity.rb +45 -0
- data/lib/osm/api.rb +688 -0
- data/lib/osm/api_access.rb +43 -0
- data/lib/osm/due_badges.rb +53 -0
- data/lib/osm/event.rb +22 -0
- data/lib/osm/grouping.rb +17 -0
- data/lib/osm/member.rb +64 -0
- data/lib/osm/programme_activity.rb +18 -0
- data/lib/osm/programme_item.rb +58 -0
- data/lib/osm/role.rb +66 -0
- data/lib/osm/section.rb +63 -0
- data/lib/osm/term.rb +72 -0
- data/osm.gemspec +29 -0
- data/spec/osm/activity_spec.rb +64 -0
- data/spec/osm/api_access_spec.rb +54 -0
- data/spec/osm/api_spec.rb +561 -0
- data/spec/osm/api_strangeness_spec.rb +48 -0
- data/spec/osm/due_badges_spec.rb +57 -0
- data/spec/osm/event_spec.rb +32 -0
- data/spec/osm/grouping_spec.rb +19 -0
- data/spec/osm/member_spec.rb +98 -0
- data/spec/osm/osm_spec.rb +82 -0
- data/spec/osm/programme_activity_spec.rb +21 -0
- data/spec/osm/programme_item_spec.rb +64 -0
- data/spec/osm/role_spec.rb +111 -0
- data/spec/osm/section_spec.rb +199 -0
- data/spec/osm/term_spec.rb +162 -0
- data/spec/spec_helper.rb +58 -0
- data/version.rb +3 -0
- metadata +152 -0
data/.gitignore
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Because this is a gem, ignore Gemfile.lock:
|
2
|
+
|
3
|
+
Gemfile.lock
|
4
|
+
|
5
|
+
# And because this is Ruby, ignore the following
|
6
|
+
# (source: https://github.com/github/gitignore/blob/master/Ruby.gitignore):
|
7
|
+
|
8
|
+
*.gem
|
9
|
+
*.rbc
|
10
|
+
.bundle
|
11
|
+
.config
|
12
|
+
coverage
|
13
|
+
InstalledFiles
|
14
|
+
lib/bundler/man
|
15
|
+
pkg
|
16
|
+
rdoc
|
17
|
+
spec/reports
|
18
|
+
test/tmp
|
19
|
+
test/version_tmp
|
20
|
+
tmp
|
21
|
+
|
22
|
+
# YARD artifacts
|
23
|
+
.yardoc
|
24
|
+
_yardoc
|
25
|
+
doc/
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.rdoc
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
==Copyright
|
2
|
+
Copyright (c) 2011-2012, Robert Gauld. All rights reserved.
|
3
|
+
|
4
|
+
|
5
|
+
==License
|
6
|
+
This code can be used under the BSD License (reproduced below).
|
7
|
+
Commiters to the project give Robert Gauld the right to redistribute their commits
|
8
|
+
under the BSD license. Should the project be re-licensed and the commiter can not be
|
9
|
+
contacted either by the email address accompanying their commits or the project's community
|
10
|
+
then Robert Gauld shall have the right to re-license their commits on their behalf.
|
11
|
+
|
12
|
+
For the purposes of this project the community will be taken to include:
|
13
|
+
|
14
|
+
- GitHub (make sure you can be contacted through the user name making the commit)
|
15
|
+
- The Online Scout Manager forum
|
16
|
+
|
17
|
+
|
18
|
+
===BSD License
|
19
|
+
Redistribution and use in source and binary forms, with or without modification,
|
20
|
+
are permitted provided that the following conditions are met:
|
21
|
+
|
22
|
+
- Redistributions of source code must retain the above copyright notice,
|
23
|
+
this list of conditions and the following disclaimer.
|
24
|
+
- Redistributions in binary form must reproduce the above copyright notice,
|
25
|
+
this list of conditions and the following disclaimer in the documentation and/or
|
26
|
+
other materials provided with the distribution.
|
27
|
+
- Neither the name of the OSM Extender nor the names of its contributors
|
28
|
+
may be used to endorse or promote products derived from this software
|
29
|
+
without specific prior written permission.
|
30
|
+
|
31
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
32
|
+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
33
|
+
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
34
|
+
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
35
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
36
|
+
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
37
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
38
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
39
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
##Build State
|
2
|
+
This project uses continuous integration to help ensure that a quality product is delivered.
|
3
|
+
Travis CI monitors two branches (versions) of the code - Master (which is what gets released)
|
4
|
+
and Staging (which is what is currently being debugged ready for moving to master).
|
5
|
+
|
6
|
+
Master [](http://travis-ci.org/robertgauld/osm)
|
7
|
+
|
8
|
+
Staging [](http://travis-ci.org/robertgauld/osm)
|
9
|
+
|
10
|
+
|
11
|
+
## OSM
|
12
|
+
|
13
|
+
Use the [Online Scout Manager](https://www.onlinescoutmanager.co.uk) API.
|
14
|
+
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
Add to your Gemfile and run the `bundle` command to install it.
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
gem 'osm'
|
22
|
+
```
|
23
|
+
|
24
|
+
**Requires Ruby 1.9.2 or later.**
|
data/Rakefile
ADDED
data/lib/osm.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'version')
|
2
|
+
Dir[File.join(File.dirname(__FILE__) , 'osm', '*.rb')].each {|file| require file }
|
3
|
+
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
|
7
|
+
module Osm
|
8
|
+
|
9
|
+
class Error < Exception; end
|
10
|
+
class ConnectionError < Error; end
|
11
|
+
|
12
|
+
|
13
|
+
private
|
14
|
+
def self.make_array_of_symbols(array)
|
15
|
+
array.each_with_index do |item, index|
|
16
|
+
array[index] = item.to_sym
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.find_current_term_id(api, section_id, data={})
|
21
|
+
terms = api.get_terms(data)
|
22
|
+
|
23
|
+
# Return the term we are currently in
|
24
|
+
unless terms.nil?
|
25
|
+
terms.each do |term|
|
26
|
+
return term.id if (term.section_id == section_id) && term.current?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
raise Error.new('There is no current term for the section.')
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.make_datetime(date, time)
|
34
|
+
date = nil if date.nil? || date.empty?
|
35
|
+
time = nil if time.nil? || time.empty?
|
36
|
+
if (!date.nil? && !time.nil?)
|
37
|
+
begin
|
38
|
+
return DateTime.strptime((date + ' ' + time), '%Y-%m-%d %H:%M:%S')
|
39
|
+
rescue ArgumentError
|
40
|
+
return nil
|
41
|
+
end
|
42
|
+
elsif !date.nil?
|
43
|
+
begin
|
44
|
+
return DateTime.strptime(date, '%Y-%m-%d')
|
45
|
+
rescue ArgumentError
|
46
|
+
return nil
|
47
|
+
end
|
48
|
+
else
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.parse_date(date)
|
54
|
+
return nil if date.nil?
|
55
|
+
begin
|
56
|
+
return Date.strptime(date, '%Y-%m-%d')
|
57
|
+
rescue ArgumentError
|
58
|
+
return nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.to_i_or_nil(item)
|
63
|
+
return nil if item.nil?
|
64
|
+
begin
|
65
|
+
return item.to_i
|
66
|
+
rescue
|
67
|
+
return nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/lib/osm/activity.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Osm
|
2
|
+
|
3
|
+
class Activity
|
4
|
+
|
5
|
+
attr_reader :id, :version, :group_id, :user_id, :title, :description, :resources, :instructions, :running_time, :location, :shared, :rating, :editable, :deletable, :used, :versions, :sections, :tags, :files, :badges
|
6
|
+
|
7
|
+
# Initialize a new Activity using the hash returned by the API call
|
8
|
+
# @param data the hash of data for the object returned by the API
|
9
|
+
def initialize(data)
|
10
|
+
@id = data['details']['activityid'].to_i
|
11
|
+
@version = data['details']['version'].to_i
|
12
|
+
@group_id = data['details']['groupid'].to_i
|
13
|
+
@user_id = data['details']['userid'].to_i
|
14
|
+
@title = data['details']['title']
|
15
|
+
@description = data['details']['description']
|
16
|
+
@resources = data['details']['resources']
|
17
|
+
@instructions = data['details']['instructions']
|
18
|
+
@running_time = data['details']['runningtime'].to_i
|
19
|
+
@location = data['details']['location'].to_sym
|
20
|
+
@shared = data['details']['shared'].to_i
|
21
|
+
@rating = data['details']['rating'].to_i
|
22
|
+
@editable = data['editable']
|
23
|
+
@deletable = data['deletable']
|
24
|
+
@used = data['used'].to_i
|
25
|
+
@versions = data['versions']
|
26
|
+
@sections = Osm::make_array_of_symbols(data['sections'] || [])
|
27
|
+
@tags = data['tags'] || []
|
28
|
+
@files = data['files'] || []
|
29
|
+
@badges = data['badges'] || []
|
30
|
+
|
31
|
+
# Clean versions hashes
|
32
|
+
@versions.each do |version|
|
33
|
+
version.keys.each do |key|
|
34
|
+
version[(key.to_sym rescue key) || key] = version.delete(key)
|
35
|
+
end
|
36
|
+
version[:value] = version[:value].to_i
|
37
|
+
version[:user_id] = version[:userid].to_i
|
38
|
+
version.delete(:userid)
|
39
|
+
version[:selected] = (version[:selected] == 'selected')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/lib/osm/api.rb
ADDED
@@ -0,0 +1,688 @@
|
|
1
|
+
module Osm
|
2
|
+
|
3
|
+
class Api
|
4
|
+
|
5
|
+
@@default_cache_ttl = 30 * 60 # The default caching time for responses from OSM (in seconds)
|
6
|
+
# Some things will only be cached for half this time
|
7
|
+
# Whereas others will be cached for twice this time
|
8
|
+
# Most items however will be cached for this time
|
9
|
+
|
10
|
+
@@user_access = Hash.new
|
11
|
+
|
12
|
+
# Initialize a new API connection
|
13
|
+
# If passing user details then both must be passed
|
14
|
+
# @param userid (optional) osm userid of the user to act as
|
15
|
+
# @param secret (optional) osm secret of the user to act as
|
16
|
+
# @param site (optional) wether to use OSM (:scout) or OGM (:guide), defaults to the value set for the class
|
17
|
+
def initialize(userid=nil, secret=nil, site=@@api_site)
|
18
|
+
raise ArgumentError, 'You must pass a secret if you are passing a userid' if secret.nil? && !userid.nil?
|
19
|
+
raise ArgumentError, 'You must pass a userid if you are passing a secret' if userid.nil? && !secret.nil?
|
20
|
+
raise ArgumentError, 'site is invalid, if passed it should be either :scout or :guide' unless [:scout, :guide].include?(site)
|
21
|
+
|
22
|
+
@base_url = 'https://www.onlinescoutmanager.co.uk' if site == :scout
|
23
|
+
@base_url = 'http://www.onlineguidemanager.co.uk' if site == :guide
|
24
|
+
set_user(userid, secret)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Configure the API options used by all instances of the class
|
28
|
+
# @param options - a hash containing the following keys:
|
29
|
+
# * :api_id - the apiid given to you for using the OSM id
|
30
|
+
# * :api_token - the token which goes with the above api
|
31
|
+
# * :api_name - the name displayed in the External Access tab of OSM
|
32
|
+
# * :api_site - wether to use OSM (if :scout) or OGM (if :guide)
|
33
|
+
# * :default_cache_ttl (optional, default = 30 minutes) - The default TTL value for the cache, note that some items are cached for twice this time and others are cached for half this time.
|
34
|
+
def self.configure(options)
|
35
|
+
raise ArgumentError, ':api_id does not exist in options hash' if options[:api_id].nil?
|
36
|
+
raise ArgumentError, ':api_token does not exist in options hash' if options[:api_token].nil?
|
37
|
+
raise ArgumentError, ':api_name does not exist in options hash' if options[:api_name].nil?
|
38
|
+
raise ArgumentError, ':api_site does not exist in options hash or is invalid, this should be set to either :scout or :guide' unless [:scout, :guide].include?(options[:api_site])
|
39
|
+
raise ArgumentError, ':default_cache_ttl must be greater than 0' unless (options[:default_cache_ttl].nil? || options[:default_cache_ttl].to_i > 0)
|
40
|
+
|
41
|
+
@@api_id = options[:api_id]
|
42
|
+
@@api_token = options[:api_token]
|
43
|
+
@@api_name = options[:api_name]
|
44
|
+
@@api_site = options[:api_site]
|
45
|
+
@@default_cache_ttl = options[:default_cache_ttl].to_i unless options[:default_cache_ttl].nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get the API ID used in this class
|
49
|
+
# @returns the API ID
|
50
|
+
def self.api_id
|
51
|
+
return @@api_id
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get the API name displayed in the External Access tab of OSM
|
55
|
+
# @returns the API ID
|
56
|
+
def self.api_name
|
57
|
+
return @@api_name
|
58
|
+
end
|
59
|
+
|
60
|
+
# Get the userid and secret to be able to act as a certain user on the OSM system
|
61
|
+
# Also set's the 'current user'
|
62
|
+
# @param email the login email address of the user on OSM
|
63
|
+
# @param password the login password of the user on OSM
|
64
|
+
# @returns hash containing the following keys:
|
65
|
+
# * 'userid' - the userid to use in future requests
|
66
|
+
# * 'secret' - the secret to use in future requests
|
67
|
+
def authorize(email, password)
|
68
|
+
api_data = {
|
69
|
+
'email' => email,
|
70
|
+
'password' => password,
|
71
|
+
}
|
72
|
+
data = perform_query('users.php?action=authorise', api_data)
|
73
|
+
set_user(data['userid'], data['secret'])
|
74
|
+
return data
|
75
|
+
end
|
76
|
+
|
77
|
+
# Get the user's roles
|
78
|
+
# @param options (optional) a hash which may contain the following keys:
|
79
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
80
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
81
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
82
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
83
|
+
# @returns an array of Osm::Role objects
|
84
|
+
def get_roles(options={})
|
85
|
+
api_data = options[:api_data] || {}
|
86
|
+
|
87
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-roles-#{api_data[:userid] || @userid}")
|
88
|
+
return Rails.cache.read("OSMAPI-roles-#{api_data[:userid] || @userid}")
|
89
|
+
end
|
90
|
+
|
91
|
+
data = perform_query('api.php?action=getUserRoles', api_data)
|
92
|
+
|
93
|
+
result = Array.new
|
94
|
+
data.each do |item|
|
95
|
+
role = Osm::Role.new(item)
|
96
|
+
result.push role
|
97
|
+
Rails.cache.write("OSMAPI-section-#{role.section.id}", role.section, :expires_in => @@default_cache_ttl*2)
|
98
|
+
self.user_can_access :section, role.section.id, api_data
|
99
|
+
end
|
100
|
+
Rails.cache.write("OSMAPI-roles-#{api_data[:userid] || @userid}", result, :expires_in => @@default_cache_ttl*2)
|
101
|
+
|
102
|
+
return result
|
103
|
+
end
|
104
|
+
|
105
|
+
# Get the user's notepads
|
106
|
+
# @param options (optional) a hash which may contain the following keys:
|
107
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
108
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
109
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
110
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
111
|
+
# @returns a hash (keys are section IDs, values are a string)
|
112
|
+
def get_notepads(options={})
|
113
|
+
api_data = options[:api_data] || {}
|
114
|
+
|
115
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-notepads-#{api_data[:userid] || @userid}")
|
116
|
+
return Rails.cache.read("OSMAPI-notepads-#{api_data[:userid] || @userid}")
|
117
|
+
end
|
118
|
+
|
119
|
+
notepads = perform_query('api.php?action=getNotepads', api_data)
|
120
|
+
return {} unless notepads.is_a?(Hash)
|
121
|
+
|
122
|
+
data = {}
|
123
|
+
notepads.each do |key, value|
|
124
|
+
data[key.to_i] = value
|
125
|
+
Rails.cache.write("OSMAPI-notepad-#{key}", value, :expires_in => @@default_cache_ttl*2)
|
126
|
+
end
|
127
|
+
|
128
|
+
Rails.cache.write("OSMAPI-notepads-#{api_data[:userid] || @userid}", data, :expires_in => @@default_cache_ttl*2)
|
129
|
+
return data
|
130
|
+
end
|
131
|
+
|
132
|
+
# Get the notepad for a specified section
|
133
|
+
# @param section_id the section id of the required section
|
134
|
+
# @param options (optional) a hash which may contain the following keys:
|
135
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
136
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
137
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
138
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
139
|
+
# @returns nil if an error occured or the user does not have access to that section
|
140
|
+
# @returns a string otherwise
|
141
|
+
def get_notepad(section_id, options={})
|
142
|
+
api_data = options[:api_data] || {}
|
143
|
+
|
144
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-notepad-#{section_id}") && self.user_can_access?(:section, section_id, api_data)
|
145
|
+
return Rails.cache.read("OSMAPI-notepad-#{section_id}")
|
146
|
+
end
|
147
|
+
|
148
|
+
notepads = get_notepads(options)
|
149
|
+
return nil unless notepads.is_a? Hash
|
150
|
+
|
151
|
+
notepads.each_key do |key|
|
152
|
+
return notepads[key] if key == section_id
|
153
|
+
end
|
154
|
+
|
155
|
+
return nil
|
156
|
+
end
|
157
|
+
|
158
|
+
# Get the section (and its configuration)
|
159
|
+
# @param section_id the section id of the required section
|
160
|
+
# @param options (optional) a hash which may contain the following keys:
|
161
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
162
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
163
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
164
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
165
|
+
# @returns nil if an error occured or the user does not have access to that section
|
166
|
+
# @returns an Osm::SectionConfig object otherwise
|
167
|
+
def get_section(section_id, options={})
|
168
|
+
api_data = options[:api_data] || {}
|
169
|
+
|
170
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-section-#{section_id}") && self.user_can_access?(:section, section_id, api_data)
|
171
|
+
return Rails.cache.read("OSMAPI-section-#{section_id}")
|
172
|
+
end
|
173
|
+
|
174
|
+
roles = get_roles(options)
|
175
|
+
return nil unless roles.is_a? Array
|
176
|
+
|
177
|
+
roles.each do |role|
|
178
|
+
return role.section if role.section.id == section_id
|
179
|
+
end
|
180
|
+
|
181
|
+
return nil
|
182
|
+
end
|
183
|
+
|
184
|
+
# Get the groupings (e.g. patrols, sixes, lodges) for a given section
|
185
|
+
# @param section_id the section to get the programme for
|
186
|
+
# @param options (optional) a hash which may contain the following keys:
|
187
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
188
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
189
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
190
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
191
|
+
# @returns an array of Osm::Patrol objects
|
192
|
+
def get_groupings(section_id, options={})
|
193
|
+
api_data = options[:api_data] || {}
|
194
|
+
|
195
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-groupings-#{section_id}") && self.user_can_access?(:section, section_id, api_data)
|
196
|
+
return Rails.cache.read("OSMAPI-groupings-#{section_id}")
|
197
|
+
end
|
198
|
+
|
199
|
+
data = perform_query("users.php?action=getPatrols§ionid=#{section_id}", api_data)
|
200
|
+
|
201
|
+
result = Array.new
|
202
|
+
data['patrols'].each do |item|
|
203
|
+
grouping = Osm::Grouping.new(item)
|
204
|
+
result.push grouping
|
205
|
+
Rails.cache.write("OSMAPI-grouping-#{grouping.id}", grouping, :expires_in => @@default_cache_ttl*2)
|
206
|
+
self.user_can_access :grouping, grouping.id, api_data
|
207
|
+
end
|
208
|
+
Rails.cache.write("OSMAPI-groupings-#{section_id}", result, :expires_in => @@default_cache_ttl*2)
|
209
|
+
|
210
|
+
return result
|
211
|
+
end
|
212
|
+
|
213
|
+
# Get the terms that the OSM user can access
|
214
|
+
# @param options (optional) a hash which may contain the following keys:
|
215
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
216
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
217
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
218
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
219
|
+
# @returns an array of Osm::Term objects
|
220
|
+
def get_terms(options={})
|
221
|
+
api_data = options[:api_data] || {}
|
222
|
+
|
223
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-terms-#{api_data[:userid] || @userid}")
|
224
|
+
return Rails.cache.read("OSMAPI-terms-#{api_data[:userid] || @userid}")
|
225
|
+
end
|
226
|
+
|
227
|
+
data = perform_query('api.php?action=getTerms', api_data)
|
228
|
+
|
229
|
+
result = Array.new
|
230
|
+
data.each_key do |key|
|
231
|
+
data[key].each do |item|
|
232
|
+
term = Osm::Term.new(item)
|
233
|
+
result.push term
|
234
|
+
Rails.cache.write("OSMAPI-term-#{term.id}", term, :expires_in => @@default_cache_ttl*2)
|
235
|
+
self.user_can_access :term, term.id, api_data
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
Rails.cache.write("OSMAPI-terms-#{api_data[:userid] || @userid}", result, :expires_in => @@default_cache_ttl*2)
|
240
|
+
return result
|
241
|
+
end
|
242
|
+
|
243
|
+
# Get a term
|
244
|
+
# @param term_id the id of the required term
|
245
|
+
# @param options (optional) a hash which may contain the following keys:
|
246
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
247
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
248
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
249
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
250
|
+
# @returns nil if an error occured or the user does not have access to that term
|
251
|
+
# @returns an Osm::Term object otherwise
|
252
|
+
def get_term(term_id, options={})
|
253
|
+
api_data = options[:api_data] || {}
|
254
|
+
|
255
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-term-#{term_id}") && self.user_can_access?(:term, term_id, api_data)
|
256
|
+
return Rails.cache.read("OSMAPI-term-#{term_id}")
|
257
|
+
end
|
258
|
+
|
259
|
+
terms = get_terms(options)
|
260
|
+
return nil unless terms.is_a? Array
|
261
|
+
|
262
|
+
terms.each do |term|
|
263
|
+
return term if term.id == term_id
|
264
|
+
end
|
265
|
+
|
266
|
+
return nil
|
267
|
+
end
|
268
|
+
|
269
|
+
# Get the programme for a given term
|
270
|
+
# @param sectionid the section to get the programme for
|
271
|
+
# @param termid the term to get the programme for
|
272
|
+
# @param options (optional) a hash which may contain the following keys:
|
273
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
274
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
275
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
276
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
277
|
+
# @returns an array of Osm::ProgrammeItem objects
|
278
|
+
def get_programme(section_id, term_id, options={})
|
279
|
+
api_data = options[:api_data] || {}
|
280
|
+
|
281
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-programme-#{section_id}-#{term_id}") && self.user_can_access?(:programme, section_id, api_data)
|
282
|
+
return Rails.cache.read("OSMAPI-programme-#{section_id}-#{term_id}")
|
283
|
+
end
|
284
|
+
|
285
|
+
data = perform_query("programme.php?action=getProgramme§ionid=#{section_id}&termid=#{term_id}", api_data)
|
286
|
+
|
287
|
+
result = Array.new
|
288
|
+
data = {'items'=>[],'activities'=>{}} if data.is_a? Array
|
289
|
+
self.user_can_access(:programme, section_id, api_data) unless data.is_a? Array
|
290
|
+
items = data['items'] || []
|
291
|
+
activities = data['activities'] || {}
|
292
|
+
|
293
|
+
items.each do |item|
|
294
|
+
programme_item = Osm::ProgrammeItem.new(item, activities[item['eveningid']])
|
295
|
+
result.push programme_item
|
296
|
+
programme_item.activities.each do |activity|
|
297
|
+
self.user_can_access :activity, activity.activity_id, api_data
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
Rails.cache.write("OSMAPI-programme-#{section_id}-#{term_id}", result, :expires_in => @@default_cache_ttl)
|
302
|
+
return result
|
303
|
+
end
|
304
|
+
|
305
|
+
# Get activity details
|
306
|
+
# @param activity_id the activity ID
|
307
|
+
# @param version (optional) the version of the activity to retreive
|
308
|
+
# @param options (optional) a hash which may contain the following keys:
|
309
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
310
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
311
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
312
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
313
|
+
# @returns an Osm::Activity object
|
314
|
+
def get_activity(activity_id, version=nil, options={})
|
315
|
+
api_data = options[:api_data] || {}
|
316
|
+
|
317
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-activity-#{activity_id}-#{version}") && self.user_can_access?(:activity, activity_id, api_data)
|
318
|
+
return Rails.cache.read("OSMAPI-activity-#{activity_id}-#{version}")
|
319
|
+
end
|
320
|
+
|
321
|
+
data = nil
|
322
|
+
if version.nil?
|
323
|
+
data = perform_query("programme.php?action=getActivity&id=#{activity_id}", api_data)
|
324
|
+
else
|
325
|
+
data = perform_query("programme.php?action=getActivity&id=#{activity_id}&version=#{version}", api_data)
|
326
|
+
end
|
327
|
+
|
328
|
+
activity = Osm::Activity.new(data)
|
329
|
+
Rails.cache.write("OSMAPI-activity-#{activity_id}-#{nil}", activity, :expires_in => @@default_cache_ttl*2) if version.nil?
|
330
|
+
Rails.cache.write("OSMAPI-activity-#{activity_id}-#{activity.version}", activity, :expires_in => @@default_cache_ttl/2)
|
331
|
+
self.user_can_access :activity, activity.id, api_data
|
332
|
+
|
333
|
+
return activity
|
334
|
+
end
|
335
|
+
|
336
|
+
# Get member details
|
337
|
+
# @section_id the section to get details for
|
338
|
+
# @term_id (optional) the term to get details for, if it is omitted then the current term is used
|
339
|
+
# @param options (optional) a hash which may contain the following keys:
|
340
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
341
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
342
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
343
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
344
|
+
# @returns an array of Osm::Member objects
|
345
|
+
def get_members(section_id, term_id=nil, options={})
|
346
|
+
api_data = options[:api_data] || {}
|
347
|
+
term_id = Osm::find_current_term_id(self, section_id, api_data) if term_id.nil?
|
348
|
+
|
349
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-members-#{section_id}-#{term_id}") && self.user_can_access?(:member, section_id, api_data)
|
350
|
+
return Rails.cache.read("OSMAPI-members-#{section_id}-#{term_id}")
|
351
|
+
end
|
352
|
+
|
353
|
+
data = perform_query("users.php?action=getUserDetails§ionid=#{section_id}&termid=#{term_id}", api_data)
|
354
|
+
|
355
|
+
result = Array.new
|
356
|
+
data['items'].each do |item|
|
357
|
+
result.push Osm::Member.new(item)
|
358
|
+
end
|
359
|
+
self.user_can_access :member, section_id, api_data
|
360
|
+
Rails.cache.write("OSMAPI-members-#{section_id}-#{term_id}", result, :expires_in => @@default_cache_ttl)
|
361
|
+
|
362
|
+
return result
|
363
|
+
end
|
364
|
+
|
365
|
+
# Get API access details for a given section
|
366
|
+
# @param section_id the section to get details for
|
367
|
+
# @param options (optional) a hash which may contain the following keys:
|
368
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
369
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
370
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
371
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
372
|
+
# @returns an array of Osm::ApiAccess objects
|
373
|
+
def get_api_access(section_id, options={})
|
374
|
+
api_data = options[:api_data] || {}
|
375
|
+
|
376
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-api_access-#{api_data['userid'] || @userid}-#{section_id}")
|
377
|
+
return Rails.cache.read("OSMAPI-api_access-#{api_data['userid'] || @userid}-#{section_id}")
|
378
|
+
end
|
379
|
+
|
380
|
+
data = perform_query("users.php?action=getAPIAccess§ionid=#{section_id}", api_data)
|
381
|
+
|
382
|
+
result = Array.new
|
383
|
+
data['apis'].each do |item|
|
384
|
+
this_item = Osm::ApiAccess.new(item)
|
385
|
+
result.push this_item
|
386
|
+
self.user_can_access(:programme, section_id, api_data) if this_item.can_read?(:programme)
|
387
|
+
self.user_can_access(:member, section_id, api_data) if this_item.can_read?(:member)
|
388
|
+
self.user_can_access(:badge, section_id, api_data) if this_item.can_read?(:badge)
|
389
|
+
Rails.cache.write("OSMAPI-api_access-#{api_data['userid'] || @userid}-#{section_id}-#{this_item.id}", this_item, :expires_in => @@default_cache_ttl*2)
|
390
|
+
end
|
391
|
+
|
392
|
+
return result
|
393
|
+
end
|
394
|
+
|
395
|
+
# Get our API access details for a given section
|
396
|
+
# @param section_id the section to get details for
|
397
|
+
# @param options (optional) a hash which may contain the following keys:
|
398
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
399
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
400
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
401
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
402
|
+
# @returns an Osm::ApiAccess objects
|
403
|
+
def get_our_api_access(section_id, options={})
|
404
|
+
api_data = options[:api_data] || {}
|
405
|
+
|
406
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-api_access-#{api_data['userid'] || @userid}-#{section_id}-#{Osm::Api.api_id}")
|
407
|
+
return Rails.cache.read("OSMAPI-api_access-#{api_data['userid'] || @userid}-#{section_id}-#{Osm::Api.api_id}")
|
408
|
+
end
|
409
|
+
|
410
|
+
data = get_api_access(section_id, options)
|
411
|
+
found = nil
|
412
|
+
data.each do |item|
|
413
|
+
found = item if item.our_api?
|
414
|
+
end
|
415
|
+
|
416
|
+
return found
|
417
|
+
end
|
418
|
+
|
419
|
+
# Get events
|
420
|
+
# @section_id the section to get details for
|
421
|
+
# @param options (optional) a hash which may contain the following keys:
|
422
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
423
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
424
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
425
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
426
|
+
# @returns an array of Osm::Event objects
|
427
|
+
def get_events(section_id, options={})
|
428
|
+
api_data = options[:api_data] || {}
|
429
|
+
|
430
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-events-#{section_id}") && self.user_can_access?(:programme, section_id, api_data)
|
431
|
+
return Rails.cache.read("OSMAPI-events-#{section_id}")
|
432
|
+
end
|
433
|
+
|
434
|
+
data = perform_query("events.php?action=getEvents§ionid=#{section_id}", api_data)
|
435
|
+
|
436
|
+
result = Array.new
|
437
|
+
unless data['items'].nil?
|
438
|
+
data['items'].each do |item|
|
439
|
+
result.push Osm::Event.new(item)
|
440
|
+
end
|
441
|
+
end
|
442
|
+
self.user_can_access :programme, section_id, api_data
|
443
|
+
Rails.cache.write("OSMAPI-events-#{section_id}", result, :expires_in => @@default_cache_ttl)
|
444
|
+
|
445
|
+
return result
|
446
|
+
end
|
447
|
+
|
448
|
+
# Get due badges
|
449
|
+
# @section_id the section to get details for
|
450
|
+
# @param options (optional) a hash which may contain the following keys:
|
451
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
452
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
453
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
454
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
455
|
+
# @returns an Osm::DueBadges object
|
456
|
+
def get_due_badges(section_id, term_id=nil, options={})
|
457
|
+
api_data = options[:api_data] || {}
|
458
|
+
term_id = Osm::find_current_term_id(self, section_id, api_data) if term_id.nil?
|
459
|
+
|
460
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-due_badges-#{section_id}-#{term_id}") && self.user_can_access?(:badge, section_id, api_data)
|
461
|
+
return Rails.cache.read("OSMAPI-due_badges-#{section_id}-#{term_id}")
|
462
|
+
end
|
463
|
+
|
464
|
+
section_type = get_section(section_id, api_data).type.to_s
|
465
|
+
data = perform_query("challenges.php?action=outstandingBadges§ion=#{section_type}§ionid=#{section_id}&termid=#{term_id}", api_data)
|
466
|
+
|
467
|
+
data = Osm::DueBadges.new(data)
|
468
|
+
self.user_can_access :badge, section_id, api_data
|
469
|
+
Rails.cache.write("OSMAPI-due_badges-#{section_id}-#{term_id}", data, :expires_in => @@default_cache_ttl*2)
|
470
|
+
|
471
|
+
return data
|
472
|
+
end
|
473
|
+
|
474
|
+
# Get register structure
|
475
|
+
# @section_id the section to get details for
|
476
|
+
# @param options (optional) a hash which may contain the following keys:
|
477
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
478
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
479
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
480
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
481
|
+
# @returns an array of hashes representing the rows of the register
|
482
|
+
def get_register_structure(section_id, term_id=nil, options={})
|
483
|
+
api_data = options[:api_data] || {}
|
484
|
+
term_id = Osm::find_current_term_id(self, section_id, api_data) if term_id.nil?
|
485
|
+
|
486
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-register_structure-#{section_id}-#{term_id}") && self.user_can_access?(:register, section_id, api_data)
|
487
|
+
return Rails.cache.read("OSMAPI-register_structure-#{section_id}-#{term_id}")
|
488
|
+
end
|
489
|
+
|
490
|
+
data = perform_query("users.php?action=registerStructure§ionid=#{section_id}&termid=#{term_id}", api_data)
|
491
|
+
|
492
|
+
data.each do |item|
|
493
|
+
item.symbolize_keys!
|
494
|
+
item[:rows].each do |row|
|
495
|
+
row.symbolize_keys!
|
496
|
+
end
|
497
|
+
end
|
498
|
+
self.user_can_access :register, section_id, api_data
|
499
|
+
Rails.cache.write("OSMAPI-register_structure-#{section_id}-#{term_id}", data, :expires_in => @@default_cache_ttl/2)
|
500
|
+
|
501
|
+
return data
|
502
|
+
end
|
503
|
+
|
504
|
+
# Get register
|
505
|
+
# @section_id the section to get details for
|
506
|
+
# @param options (optional) a hash which may contain the following keys:
|
507
|
+
# * :no_cache - if true then the data will be retreived from OSM not the cache
|
508
|
+
# * :api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
509
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
510
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
511
|
+
# @returns an array of hashes representing the attendance of each member
|
512
|
+
def get_register(section_id, term_id=nil, options={})
|
513
|
+
api_data = options[:api_data] || {}
|
514
|
+
term_id = Osm::find_current_term_id(self, section_id, api_data) if term_id.nil?
|
515
|
+
|
516
|
+
if !options[:no_cache] && Rails.cache.exist?("OSMAPI-register-#{section_id}-#{term_id}") && self.user_can_access?(:register, section_id, api_data)
|
517
|
+
return Rails.cache.read("OSMAPI-register-#{section_id}-#{term_id}")
|
518
|
+
end
|
519
|
+
|
520
|
+
data = perform_query("users.php?action=register§ionid=#{section_id}&termid=#{term_id}", api_data)
|
521
|
+
|
522
|
+
data = data['items']
|
523
|
+
data.each do |item|
|
524
|
+
item.symbolize_keys!
|
525
|
+
item[:scoutid] = item[:scoutid].to_i
|
526
|
+
item[:sectionid] = item[:sectionid].to_i
|
527
|
+
item[:patrolid] = item[:patrolid].to_i
|
528
|
+
end
|
529
|
+
self.user_can_access :register, section_id, api_data
|
530
|
+
Rails.cache.write("OSMAPI-register-#{section_id}-#{term_id}", data, :expires_in => @@default_cache_ttl/2)
|
531
|
+
return data
|
532
|
+
end
|
533
|
+
|
534
|
+
# Create an evening in OSM
|
535
|
+
# @param section_id the id of the section to add the term to
|
536
|
+
# @param meeting_date the date of the meeting
|
537
|
+
# @param api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
538
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
539
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
540
|
+
# @returns a boolean representing if the operation suceeded or not
|
541
|
+
def create_evening(section_id, meeting_date, api_data={})
|
542
|
+
section_id = section_id.to_i
|
543
|
+
evening_api_data = {
|
544
|
+
'meetingdate' => meeting_date.strftime('%Y-%m-%d'),
|
545
|
+
'sectionid' => section_id,
|
546
|
+
'activityid' => -1
|
547
|
+
}
|
548
|
+
|
549
|
+
data = perform_query("programme.php?action=addActivityToProgramme", api_data.merge(evening_api_data))
|
550
|
+
|
551
|
+
# The cached programmes for the section will be out of date - remove them
|
552
|
+
get_terms(api_data).each do |term|
|
553
|
+
Rails.cache.delete("OSMAPI-programme-#{term.section_id}-#{term.id}") if term.section_id == section_id
|
554
|
+
end
|
555
|
+
|
556
|
+
return data.is_a?(Hash) && (data['result'] == 0)
|
557
|
+
end
|
558
|
+
|
559
|
+
# Update an evening in OSM
|
560
|
+
# @param programme_item is the Osm::ProgrammeItem object to update
|
561
|
+
# @param api_data (optional) a hash containing information to be sent to the server, it may contain the following keys:
|
562
|
+
# * 'userid' (optional) the OSM userid to make the request as, this will override one provided using the set_user method
|
563
|
+
# * 'secret' (optional) the OSM secret belonging to the above user
|
564
|
+
# @returns a boolean representing if the operation suceeded or not
|
565
|
+
def update_evening(programme_item, api_data={})
|
566
|
+
response = perform_query("programme.php?action=editEvening", api_data.merge({
|
567
|
+
'eveningid' => programme_item.evening_id,
|
568
|
+
'sectionid' => programme_item.section_id,
|
569
|
+
'meetingdate' => programme_item.meeting_date.try(:strftime, '%Y-%m-%d'),
|
570
|
+
'starttime' => programme_item.start_time,
|
571
|
+
'endtime' => programme_item.end_time,
|
572
|
+
'title' => programme_item.title,
|
573
|
+
'notesforparents' => programme_item.notes_for_parents,
|
574
|
+
'prenotes' => programme_item.pre_notes,
|
575
|
+
'postnotes' => programme_item.post_notes,
|
576
|
+
'games' => programme_item.games,
|
577
|
+
'leaders' => programme_item.leaders,
|
578
|
+
'activity' => programme_item.activities_for_saving,
|
579
|
+
'googlecalendar' => programme_item.google_calendar || '',
|
580
|
+
}))
|
581
|
+
|
582
|
+
# The cached programmes for the section will be out of date - remove them
|
583
|
+
get_terms(api_data).each do |term|
|
584
|
+
Rails.cache.delete("OSMAPI-programme-#{term.section_id}-#{term.id}") if term.section_id == programme_item.section_id
|
585
|
+
end
|
586
|
+
|
587
|
+
return response.is_a?(Hash) && (response['result'] == 0)
|
588
|
+
end
|
589
|
+
|
590
|
+
|
591
|
+
protected
|
592
|
+
# Set access permission for the current user on a resource stored in the cache
|
593
|
+
# @param resource_type a symbol representing the resource type (:section, :grouping, :term, :activity, :programme, :member, :badge, :register)
|
594
|
+
# @param resource_id the id of the resource being checked
|
595
|
+
# @param api_data the data hash used in accessing the api
|
596
|
+
# @param permission (optional, default true) wether the user can access the resource
|
597
|
+
def user_can_access(resource_type, resource_id, api_data, permission=true)
|
598
|
+
user = (api_data['userid'] || @userid).to_i
|
599
|
+
resource_id = resource_id.to_i
|
600
|
+
resource_type = resource_type.to_sym
|
601
|
+
|
602
|
+
@@user_access[user] = {} if @@user_access[user].nil?
|
603
|
+
@@user_access[user][resource_type] = {} if @@user_access[user][resource_type].nil?
|
604
|
+
|
605
|
+
@@user_access[user][resource_type][resource_id] = permission
|
606
|
+
end
|
607
|
+
|
608
|
+
# Get access permission for the current user on a resource stored in the cache
|
609
|
+
# @param resource_type a symbol representing the resource type (:section, :grouping, :term, :activity, :programme, :member, :badge, :register)
|
610
|
+
# @param resource_id the id of the resource being checked
|
611
|
+
# @param api_data the data hash used in accessing the api
|
612
|
+
# @returns true if the user can access the resource
|
613
|
+
# @returns false if the user can not access the resource
|
614
|
+
# @returns nil if the combination of user and resource has not been seen
|
615
|
+
def user_can_access?(resource_type, resource_id, api_data)
|
616
|
+
user = (api_data['userid'] || @userid).to_i
|
617
|
+
resource_id = resource_id.to_i
|
618
|
+
resource_type = resource_type.to_sym
|
619
|
+
|
620
|
+
return nil if @@user_access[user].nil?
|
621
|
+
return nil if @@user_access[user][resource_type].nil?
|
622
|
+
return @@user_access[user][resource_type][resource_id]
|
623
|
+
end
|
624
|
+
|
625
|
+
|
626
|
+
private
|
627
|
+
# Set the OSM user to make future requests as
|
628
|
+
# @param userid the OSM userid to use (get this using the authorize method)
|
629
|
+
# @param secret the OSM secret to use (get this using the authorize method)
|
630
|
+
def set_user(userid, secret)
|
631
|
+
@userid = userid
|
632
|
+
@secret = secret
|
633
|
+
end
|
634
|
+
|
635
|
+
# Make the query to the OSM API
|
636
|
+
# @param url the script on the remote server to invoke
|
637
|
+
# @param api_data (optional) a hash containing the values to be sent to the server
|
638
|
+
# @returns the parsed JSON returned by OSM
|
639
|
+
def perform_query(url, api_data={})
|
640
|
+
api_data['apiid'] = @@api_id
|
641
|
+
api_data['token'] = @@api_token
|
642
|
+
|
643
|
+
if api_data['userid'].nil? && api_data['secret'].nil?
|
644
|
+
unless @userid.nil? || @secret.nil?
|
645
|
+
api_data['userid'] = @userid
|
646
|
+
api_data['secret'] = @secret
|
647
|
+
end
|
648
|
+
end
|
649
|
+
|
650
|
+
if Rails.env.development?
|
651
|
+
puts "Making OSM API request to #{url}"
|
652
|
+
puts api_data.to_s
|
653
|
+
end
|
654
|
+
|
655
|
+
begin
|
656
|
+
result = HTTParty.post("#{@base_url}/#{url}", {:body => api_data})
|
657
|
+
rescue SocketError, TimeoutError, OpenSSL::SSL::SSLError
|
658
|
+
raise ConnectionError.new('A problem occured on the internet.')
|
659
|
+
end
|
660
|
+
raise ConnectionError.new("HTTP Status code was #{result.response.code}") if !result.response.code.eql?('200')
|
661
|
+
|
662
|
+
if Rails.env.development?
|
663
|
+
puts "Result from OSM request to #{url}"
|
664
|
+
puts result.response.body
|
665
|
+
end
|
666
|
+
|
667
|
+
raise Error.new(result.response.body) unless looks_like_json?(result.response.body)
|
668
|
+
decoded = ActiveSupport::JSON.decode(result.response.body)
|
669
|
+
osm_error = get_osm_error(decoded)
|
670
|
+
raise Error.new(osm_error) if osm_error
|
671
|
+
return decoded
|
672
|
+
end
|
673
|
+
|
674
|
+
def looks_like_json?(text)
|
675
|
+
(['[', '{'].include?(text[0]))
|
676
|
+
end
|
677
|
+
|
678
|
+
def get_osm_error(data)
|
679
|
+
return false unless data.is_a?(Hash)
|
680
|
+
to_return = data['error'] || data['err'] || false
|
681
|
+
to_return = false if to_return.blank?
|
682
|
+
puts "OSM API ERROR: #{to_return}" if Rails.env.development? && to_return
|
683
|
+
return to_return
|
684
|
+
end
|
685
|
+
|
686
|
+
end
|
687
|
+
|
688
|
+
end
|