survey-gizmo-ruby 4.1.0 → 5.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +108 -50
- data/lib/survey-gizmo-ruby.rb +12 -20
- data/lib/survey_gizmo/api/account_teams.rb +1 -6
- data/lib/survey_gizmo/api/answer.rb +59 -0
- data/lib/survey_gizmo/api/{survey_campaign.rb → campaign.rb} +4 -5
- data/lib/survey_gizmo/api/contact.rb +2 -7
- data/lib/survey_gizmo/api/email_message.rb +1 -6
- data/lib/survey_gizmo/api/option.rb +2 -7
- data/lib/survey_gizmo/api/page.rb +12 -8
- data/lib/survey_gizmo/api/question.rb +24 -12
- data/lib/survey_gizmo/api/response.rb +14 -5
- data/lib/survey_gizmo/api/survey.rb +29 -13
- data/lib/survey_gizmo/configuration.rb +61 -12
- data/lib/survey_gizmo/connection.rb +39 -0
- data/lib/survey_gizmo/faraday_middleware/parse_survey_gizmo.rb +75 -0
- data/lib/survey_gizmo/faraday_middleware/pester_survey_gizmo.rb +18 -0
- data/lib/survey_gizmo/multilingual_title.rb +1 -3
- data/lib/survey_gizmo/resource.rb +100 -104
- data/lib/survey_gizmo/version.rb +1 -2
- data/spec/configuration_spec.rb +1 -8
- data/spec/resource_spec.rb +114 -6
- data/spec/spec_helper.rb +7 -1
- data/spec/support/spec_shared_api_object.rb +11 -35
- data/spec/support/spec_shared_object_with_errors.rb +1 -1
- data/spec/support/test_resource_classes.rb +6 -7
- data/survey-gizmo-ruby.gemspec +5 -3
- metadata +44 -16
- data/lib/survey_gizmo/rest_response.rb +0 -91
- data/lib/survey_gizmo/survey_gizmo.rb +0 -15
- data/spec/survey-gizmo-ruby_spec.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49463d6fa875d93712a1da0951dac1e0053747ee
|
4
|
+
data.tar.gz: 339404fe4dae766bd04abc675cd7fbd34f244488
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38c186f0d5e12964b5b559aeb0c674c2291d1ade6f0518c7ed681e806cb3a56cb05d791b5f9374655cc81fe491853406c74d5dab72ba126aa668195963d4ca08
|
7
|
+
data.tar.gz: ea37139f7d8fdad647d2b38db73cef15a065b6b6098a05efbbd911e8dda70404b8979bb42e6fad9f1b9eeaa41f1df49e8ddb8e0f7f34708569255f1823ebd388
|
data/README.md
CHANGED
@@ -6,14 +6,22 @@ Currently supports SurveyGizmo API **v4** (default) and **v3**.
|
|
6
6
|
|
7
7
|
## Versions
|
8
8
|
|
9
|
+
### Major Changes in 5.x
|
10
|
+
|
11
|
+
* **BREAKING CHANGE**: `.all` returns an `Enumerator`, not an `Array`. This will break your code if you are using the return value of `.all` without iterating over it.
|
12
|
+
* **BREAKING CHANGE**: `SurveyCampaign` has been renamed `Campaign` to be in line with the other model names.
|
13
|
+
* FEATURE: `.all` will automatically paginate responses for you with the `:all_pages` option. There are also some built in methods like `Survey#responses` that will auto paginate.
|
14
|
+
* FEATURE: Built in retries. 1 retry with a 60 second backoff is the default but can be configured.
|
15
|
+
* FEATURE: `Response#parsed_answers` returns an array of `Answers` (new class) that are sane, stable Ruby objects instead of the sort of wild and wooly way SurveyGizmo has chosen to represent survey responses.
|
16
|
+
|
9
17
|
### Major Changes in 4.x
|
10
18
|
|
11
|
-
* BREAKING CHANGE
|
12
|
-
* BREAKING CHANGE
|
19
|
+
* **BREAKING CHANGE**: There is no more error tracking. If the API gives an error or bad response, an exception will be raised.
|
20
|
+
* **BREAKING CHANGE**: There is no more ```copy``` method
|
13
21
|
|
14
22
|
### Major Changes in 3.x
|
15
23
|
|
16
|
-
* BREAKING CHANGE
|
24
|
+
* **BREAKING CHANGE**: Configuration is completely different
|
17
25
|
* Important Change: Defaults to using the v4 SurveyGizmo API endpoint to take advantage of various API bug fixes (notably team ownership is broken in v3)
|
18
26
|
|
19
27
|
### Old versions
|
@@ -30,7 +38,7 @@ Currently supports SurveyGizmo API **v4** (default) and **v3**.
|
|
30
38
|
gem 'survey-gizmo-ruby'
|
31
39
|
```
|
32
40
|
|
33
|
-
##
|
41
|
+
## Configuration
|
34
42
|
|
35
43
|
```ruby
|
36
44
|
require 'survey-gizmo-ruby'
|
@@ -43,14 +51,58 @@ SurveyGizmo.configure do |config|
|
|
43
51
|
# Optional - Defaults to v4, but you can probably set to v3 safely if you suspect a bug in v4
|
44
52
|
config.api_version = 'v4'
|
45
53
|
|
54
|
+
# Optional - Set if you need to hit a different base URL (e.g. the .eu domain)
|
55
|
+
config.api_url = 'https://restapi.surveygizmo.eu'
|
56
|
+
|
46
57
|
# Optional - Defaults to 50, maximum 500. Setting too high may cause SurveyGizmo to start throwing timeouts.
|
47
58
|
config.results_per_page = 100
|
48
59
|
end
|
60
|
+
```
|
61
|
+
|
62
|
+
### Retries
|
63
|
+
|
64
|
+
The [Pester](https://github.com/lumoslabs/pester) gem is used to manage retry strategies. By default it will be configured to handle 1 retry with a 60 second timeout upon encountering basic net timeouts and rate limit errors, which is enough for most people's needs.
|
65
|
+
|
66
|
+
If, however, you want to specify more retries, a longer backoff, new classes to retry on, or otherwise get fancy with the retry strategy, you can configured Pester directly. SurveyGizmo API calls are executed in Pester's `survey_gizmo_ruby` environment, so anything you configure there will apply to all your requests.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# For example, to change the retry interval, max attempts, or exception classes to be retried:
|
70
|
+
Pester.configure do |config|
|
71
|
+
# Retry 10 times
|
72
|
+
config.environments[:survey_gizmo_ruby][:max_attempts] = 10
|
73
|
+
# Backoff for 2 minutes
|
74
|
+
config.environments[:survey_gizmo_ruby][:delay_interval] = 120
|
75
|
+
# Retry different exception classes
|
76
|
+
config.environments[:survey_gizmo_ruby][:retry_error_classes] = [MyExceptionClass, MyOtherExceptionClass]
|
77
|
+
end
|
78
|
+
|
79
|
+
# To set Pester to retry on ALL exception classes, do this (use with caution! Can include exceptions Rails likes to throw on SIGHUP)
|
80
|
+
Pester.configure do |config|
|
81
|
+
config.environments[:survey_gizmo_ruby][:retry_error_classes] = nil
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
## Usage
|
86
|
+
|
87
|
+
### Retrieving Data
|
49
88
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
89
|
+
`SurveyGizmo::API::Klass.first` returns a single instance of the resource.
|
90
|
+
|
91
|
+
`SurveyGizmo::API::Klass.all` returns an `Enumerator` you can use to loop through your results/questions/surveys etc. It will actually iterate through ALL your results (pagination will be handled for you) if you pass `all_pages: true`.
|
92
|
+
|
93
|
+
Because `.all` returns an `Enumerator`, you have to call `.to_a` or some other enumerable method to trigger actual API data retrieval.
|
94
|
+
```ruby
|
95
|
+
SurveyGizmo::API::Survey.all(all_pages: true) # => #<Enumerator: #<Enumerator::Generator>:each>
|
96
|
+
SurveyGizmo::API::Survey.all(all_pages: true).to_a # => [Survey, Survey, Survey, ...]
|
97
|
+
```
|
98
|
+
|
99
|
+
### Examples
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
# Iterate over your all surveys directly with the iterator
|
103
|
+
SurveyGizmo::API::Survey.all(all_pages: true).each { |survey| do_something_with(survey) }
|
104
|
+
# Iterate over the 1st page of your surveys
|
105
|
+
SurveyGizmo::API::Survey.all(page: 1).each { |survey| do_something_with(survey) }
|
54
106
|
|
55
107
|
# Retrieve the survey with id: 12345
|
56
108
|
survey = SurveyGizmo::API::Survey.first(id: 12345)
|
@@ -61,10 +113,10 @@ survey.server_has_new_results_since?(Time.now.utc - 2.days) # => true
|
|
61
113
|
survey.team_names # => ['Development', 'Test']
|
62
114
|
survey.belongs_to?('Development') # => true
|
63
115
|
|
64
|
-
#
|
65
|
-
questions = SurveyGizmo::API::Question.all(survey_id: survey.id, page_id: 1)
|
66
|
-
# Or just retrieve all questions for all pages of this survey
|
116
|
+
# Retrieve all questions for all pages of this survey
|
67
117
|
questions = survey.questions
|
118
|
+
# Strip out instruction, urlredirect, logic, media, and other non question "questions"
|
119
|
+
questions = survey.actual_questions
|
68
120
|
|
69
121
|
# Create a question for your survey. The returned object will be given an :id parameter by SG.
|
70
122
|
question = SurveyGizmo::API::Question.create(survey_id: survey.id, title: 'Do you like ruby?', type: 'checkbox')
|
@@ -74,34 +126,41 @@ question.save
|
|
74
126
|
# Destroy a question
|
75
127
|
question.destroy
|
76
128
|
|
77
|
-
#
|
78
|
-
responses
|
79
|
-
#
|
80
|
-
|
81
|
-
#
|
82
|
-
# for contact id 999. This example shows you how to use some of the gem's built in filters and
|
83
|
-
# filter generators as well as how to construct your own raw filter.
|
129
|
+
# Iterate over all your Responses
|
130
|
+
survey.responses.each { |response| do_something_with(response) }
|
131
|
+
# Use filters to limit results - this example will iterate over page 3 of completed, non test data
|
132
|
+
# SurveyResponses submitted within the past 3 days for contact 999. It demonstrates how to use some of the gem's
|
133
|
+
# built in filters/generators as well as how to construct a filter.
|
84
134
|
# See: http://apihelp.surveygizmo.com/help/article/link/filters for more info on filters
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
135
|
+
filters = [
|
136
|
+
SurveyGizmo::API::Response::NO_TEST_DATA,
|
137
|
+
SurveyGizmo::API::Response::ONLY_COMPLETED,
|
138
|
+
SurveyGizmo::API::Response.submitted_since_filter(Time.now - 72.hours),
|
139
|
+
{
|
140
|
+
field: 'contact_id',
|
141
|
+
operator: '=',
|
142
|
+
value: 999
|
143
|
+
}
|
144
|
+
]
|
145
|
+
survey.responses(page: 3, filters: filters).each { |response| do_stuff_with(response) }
|
146
|
+
|
147
|
+
# Parse the answer hash into a more usable format.
|
148
|
+
# Answers with keys but empty values will not be returned.
|
149
|
+
# "Other" text for some questions is parsed to Answer#other_text; all other answers to Answer#answer_text
|
150
|
+
# Custom table question answers have the question_pipe string parsed out to Answer#question_pipe.
|
151
|
+
# See http://apihelp.surveygizmo.com/help/article/link/surveyresponse-per-question for more info on answers
|
152
|
+
response.parsed_answers => # [#<SurveyGizmo::API::Answer @survey_id=12345, @question_id=1, @option_id=2, @answer_text='text'>]
|
153
|
+
|
154
|
+
# Retrieve all answers from all responses to all surveys, write rows to your database
|
155
|
+
SurveyGizmo::API::Survey.all(all_pages: true).each do |survey|
|
156
|
+
survey.responses.each do |response|
|
157
|
+
response.parsed_answers.each do |answer|
|
158
|
+
MyLocalSurveyGizmoResponseModel.create(answer.to_hash)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
99
162
|
```
|
100
163
|
|
101
|
-
## On API Timeouts
|
102
|
-
|
103
|
-
API timeouts are a regular occurrence with the SurveyGizmo API. At Lumos Labs we use our own [Pester gem](https://github.com/lumoslabs/pester) to manage retry strategies. It might work for you.
|
104
|
-
|
105
164
|
## Debugging
|
106
165
|
|
107
166
|
The GIZMO_DEBUG environment variable will trigger full printouts of SurveyGizmo's HTTP responses and variable introspection for almost everything.
|
@@ -114,7 +173,7 @@ bundle exec rails whatever
|
|
114
173
|
|
115
174
|
## Adding API Objects
|
116
175
|
|
117
|
-
Currently, the following API objects are included in the gem: `Survey`, `Question`, `Option`, `Page`, `Response`, `EmailMessage`, `
|
176
|
+
Currently, the following API objects are included in the gem: `Survey`, `Question`, `Option`, `Page`, `Response`, `EmailMessage`, `Campaign`, `Contact`, `AccountTeams`. If you want to use something that isn't included you can easily write a class that handles it. Here's an example of the how to do so:
|
118
177
|
|
119
178
|
```ruby
|
120
179
|
class SomeObject
|
@@ -128,15 +187,16 @@ class SomeObject
|
|
128
187
|
attribute :type, String
|
129
188
|
attribute :created_on, DateTime
|
130
189
|
|
131
|
-
#
|
132
|
-
|
133
|
-
route '/something'
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
190
|
+
# define the paths used to retrieve/set info
|
191
|
+
# if the routing is such that :get, :update, and :delete only append /:id to the main route, do this
|
192
|
+
@route = '/something'
|
193
|
+
# but if the class needs special routing, specify each method route with a hash:
|
194
|
+
@route = {
|
195
|
+
get: '/something/:id',
|
196
|
+
update: '/something/weird/:id',
|
197
|
+
create: '/something',
|
198
|
+
delete: /something/delete/:id'
|
199
|
+
}
|
140
200
|
end
|
141
201
|
```
|
142
202
|
|
@@ -154,14 +214,12 @@ The [Virtus](https://github.com/solnic/virtus) gem is included to handle the att
|
|
154
214
|
|
155
215
|
## Desirable/Missing Features
|
156
216
|
|
217
|
+
* Better specs with VCR/Webmock
|
218
|
+
* OAuth authentication
|
157
219
|
* Better foreign language support
|
158
|
-
* Use Faraday instead of Httparty (partied too hard)
|
159
|
-
* Better specs with VCR/Webmock would be nice.
|
160
220
|
* There are several API objects that are available and not included in this gem. AccountTeams, for instance, has some skeleton code but is untested.
|
161
|
-
* OAuth authentication ability.
|
162
221
|
|
163
222
|
# Copyright
|
164
223
|
|
165
224
|
Copyright (c) 2012 RipTheJacker. See LICENSE.txt for
|
166
225
|
further details.
|
167
|
-
|
data/lib/survey-gizmo-ruby.rb
CHANGED
@@ -1,27 +1,19 @@
|
|
1
|
-
require 'active_support/
|
2
|
-
require 'active_support/core_ext/
|
1
|
+
require 'active_support/concern'
|
2
|
+
require 'active_support/core_ext/array'
|
3
3
|
require 'active_support/core_ext/hash'
|
4
|
+
require 'active_support/core_ext/module'
|
4
5
|
require 'active_support/core_ext/object/blank'
|
5
|
-
require 'active_support/
|
6
|
+
require 'active_support/core_ext/string'
|
6
7
|
require 'active_support/time_with_zone'
|
8
|
+
|
7
9
|
require 'awesome_print'
|
8
10
|
require 'digest/md5'
|
9
|
-
require '
|
11
|
+
require 'faraday'
|
12
|
+
require 'faraday_middleware'
|
13
|
+
require 'logger'
|
14
|
+
require 'pester'
|
10
15
|
require 'virtus'
|
11
16
|
|
12
|
-
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require 'survey_gizmo/multilingual_title'
|
16
|
-
require 'survey_gizmo/resource'
|
17
|
-
require 'survey_gizmo/rest_response'
|
18
|
-
|
19
|
-
require 'survey_gizmo/api/account_teams'
|
20
|
-
require 'survey_gizmo/api/contact'
|
21
|
-
require 'survey_gizmo/api/email_message'
|
22
|
-
require 'survey_gizmo/api/option'
|
23
|
-
require 'survey_gizmo/api/page'
|
24
|
-
require 'survey_gizmo/api/question'
|
25
|
-
require 'survey_gizmo/api/response'
|
26
|
-
require 'survey_gizmo/api/survey'
|
27
|
-
require 'survey_gizmo/api/survey_campaign'
|
17
|
+
path = File.join(File.expand_path(File.dirname(__FILE__)), 'survey_gizmo')
|
18
|
+
Dir["#{path}/*.rb"].each { |f| require f }
|
19
|
+
Dir["#{path}/**/*.rb"].each { |f| require f }
|
@@ -13,12 +13,7 @@ module SurveyGizmo
|
|
13
13
|
attribute :default_role, String
|
14
14
|
attribute :status, String
|
15
15
|
|
16
|
-
route '/accountteams
|
17
|
-
route '/accountteams', via: :create
|
18
|
-
|
19
|
-
def to_param_options
|
20
|
-
{ id: self.id }
|
21
|
-
end
|
16
|
+
@route = '/accountteams'
|
22
17
|
end
|
23
18
|
end
|
24
19
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module SurveyGizmo
|
2
|
+
module API
|
3
|
+
class Answer
|
4
|
+
include Virtus.model
|
5
|
+
|
6
|
+
attribute :key, String
|
7
|
+
attribute :value, String
|
8
|
+
attribute :survey_id, Integer
|
9
|
+
attribute :response_id, Integer
|
10
|
+
attribute :question_id, Integer
|
11
|
+
attribute :option_id, Integer
|
12
|
+
attribute :submitted_at, DateTime
|
13
|
+
attribute :answer_text, String
|
14
|
+
attribute :other_text, String
|
15
|
+
attribute :question_pipe, String
|
16
|
+
|
17
|
+
def initialize(attrs = {})
|
18
|
+
self.attributes = attrs
|
19
|
+
|
20
|
+
case key
|
21
|
+
when /\[question\((\d+)\),\s*option\((\d+|"\d+-other")\)\]/
|
22
|
+
@question_id, @option_id = $1, $2
|
23
|
+
|
24
|
+
if @option_id =~ /other/
|
25
|
+
@option_id.delete!('-other"')
|
26
|
+
self.other_text = value
|
27
|
+
end
|
28
|
+
when /\[question\((\d+)\),\s*question_pipe\("(.*)"\)\]/
|
29
|
+
@question_id = $1
|
30
|
+
@question_pipe = $2
|
31
|
+
when /\[question\((\d+)\)\]/
|
32
|
+
@question_id = $1
|
33
|
+
else
|
34
|
+
fail "Can't recognize pattern for #{attrs[:key]} => #{attrs[:value]} - you may have to parse your answers manually."
|
35
|
+
end
|
36
|
+
|
37
|
+
self.question_id = @question_id.to_i
|
38
|
+
if @option_id
|
39
|
+
fail "Bad option_id #{option_id}!" if option_id.to_i == 0 && option_id != '0'
|
40
|
+
self.option_id = @option_id.to_i
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Strips out the answer_text when there is a valid option_id
|
45
|
+
def to_hash
|
46
|
+
{
|
47
|
+
response_id: response_id,
|
48
|
+
question_id: question_id,
|
49
|
+
option_id: option_id,
|
50
|
+
question_pipe: question_pipe,
|
51
|
+
submitted_at: submitted_at,
|
52
|
+
survey_id: survey_id,
|
53
|
+
other_text: other_text,
|
54
|
+
answer_text: option_id || other_text ? nil : answer_text
|
55
|
+
}.reject { |k,v| v.nil? }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module SurveyGizmo; module API
|
2
2
|
# @see SurveyGizmo::Resource::ClassMethods
|
3
|
-
class
|
3
|
+
class Campaign
|
4
4
|
include SurveyGizmo::Resource
|
5
5
|
|
6
6
|
attribute :id, Integer
|
@@ -23,11 +23,10 @@ module SurveyGizmo; module API
|
|
23
23
|
attribute :surveycampaign, Integer
|
24
24
|
attribute :copy, Boolean
|
25
25
|
|
26
|
-
route '/survey/:survey_id/surveycampaign
|
27
|
-
route '/survey/:survey_id/surveycampaign', via: :create
|
26
|
+
@route = '/survey/:survey_id/surveycampaign'
|
28
27
|
|
29
|
-
def
|
30
|
-
|
28
|
+
def contacts(conditions = {})
|
29
|
+
Contact.all(conditions.merge(children_params).merge(all_pages: !conditions[:page]))
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end; end
|
@@ -36,11 +36,6 @@ module SurveyGizmo; module API
|
|
36
36
|
attribute :scustomfield9, String
|
37
37
|
attribute :scustomfield10, String
|
38
38
|
|
39
|
-
route '/survey/:survey_id/surveycampaign/:campaign_id/contact
|
40
|
-
route '/survey/:survey_id/surveycampaign/:campaign_id/contact', via: :create
|
41
|
-
|
42
|
-
def to_param_options
|
43
|
-
{ id: self.id, survey_id: self.survey_id, campaign_id: self.campaign_id }
|
44
|
-
end
|
39
|
+
@route = '/survey/:survey_id/surveycampaign/:campaign_id/contact'
|
45
40
|
end
|
46
|
-
end; end
|
41
|
+
end; end
|
@@ -20,11 +20,6 @@ module SurveyGizmo; module API
|
|
20
20
|
attribute :datecreated, DateTime
|
21
21
|
attribute :datemodified, DateTime
|
22
22
|
|
23
|
-
route '/survey/:survey_id/surveycampaign/:campaign_id/emailmessage
|
24
|
-
route '/survey/:survey_id/surveycampaign/:campaign_id/emailmessage', :via => :create
|
25
|
-
|
26
|
-
def to_param_options
|
27
|
-
{ id: self.id, survey_id: self.survey_id, campaign_id: self.campaign_id }
|
28
|
-
end
|
23
|
+
@route = '/survey/:survey_id/surveycampaign/:campaign_id/emailmessage'
|
29
24
|
end
|
30
25
|
end; end
|
@@ -11,11 +11,6 @@ module SurveyGizmo; module API
|
|
11
11
|
attribute :value, String
|
12
12
|
attribute :properties, Hash
|
13
13
|
|
14
|
-
route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption'
|
15
|
-
route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption/:id', via: [:get, :update, :delete]
|
16
|
-
|
17
|
-
def to_param_options
|
18
|
-
{ id: self.id, survey_id: self.survey_id, page_id: self.page_id, question_id: self.question_id }
|
19
|
-
end
|
14
|
+
@route = '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption'
|
20
15
|
end
|
21
|
-
end; end
|
16
|
+
end; end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'survey_gizmo/api/question'
|
2
|
+
|
1
3
|
module SurveyGizmo; module API
|
2
4
|
# @see SurveyGizmo::Resource::ClassMethods
|
3
5
|
class Page
|
@@ -9,21 +11,23 @@ module SurveyGizmo; module API
|
|
9
11
|
attribute :properties, Hash
|
10
12
|
attribute :after, Integer
|
11
13
|
attribute :survey_id, Integer
|
14
|
+
attribute :questions, Array[Question]
|
12
15
|
|
13
|
-
|
14
|
-
route '/survey/:survey_id/surveypage', via: :create
|
15
|
-
route '/survey/:survey_id/surveypage/:id', via: [:get, :update, :delete]
|
16
|
+
@route = '/survey/:survey_id/surveypage'
|
16
17
|
|
17
18
|
def survey
|
18
|
-
@survey ||=
|
19
|
+
@survey ||= Survey.first(id: survey_id)
|
19
20
|
end
|
20
21
|
|
21
22
|
def questions
|
22
|
-
|
23
|
-
|
23
|
+
# See note about broken subquestions in resource.rb
|
24
|
+
@questions.flat_map { |q| q.sub_question_skus }.each do |sku|
|
25
|
+
sku = sku[1] if sku.is_a?(Array)
|
26
|
+
next if @questions.find { |q| q.id == sku }
|
27
|
+
@questions << Question.first(children_params.merge(id: sku))
|
28
|
+
end
|
24
29
|
|
25
|
-
|
26
|
-
{ id: self.id, survey_id: self.survey_id }
|
30
|
+
@questions.each { |q| q.attributes = children_params }
|
27
31
|
end
|
28
32
|
end
|
29
33
|
end; end
|