surveillance 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (276) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +42 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/javascripts/surveillance.js +6 -0
  6. data/app/assets/javascripts/surveillance/admin.coffee +4 -0
  7. data/app/assets/javascripts/surveillance/admin/matrix-questions.coffee +18 -0
  8. data/app/assets/javascripts/surveillance/application.js +17 -0
  9. data/app/assets/javascripts/surveillance/collections/branch_rule_collection.coffee +2 -0
  10. data/app/assets/javascripts/surveillance/form.coffee +7 -0
  11. data/app/assets/javascripts/surveillance/manifest.coffee +7 -0
  12. data/app/assets/javascripts/surveillance/models/branch_rule.coffee +21 -0
  13. data/app/assets/javascripts/surveillance/models/question.coffee +19 -0
  14. data/app/assets/javascripts/surveillance/models/questions/choosable_question.coffee +15 -0
  15. data/app/assets/javascripts/surveillance/models/questions/matrix.coffee +19 -0
  16. data/app/assets/javascripts/surveillance/models/questions/matrix_question.coffee +7 -0
  17. data/app/assets/javascripts/surveillance/models/questions/number.coffee +17 -0
  18. data/app/assets/javascripts/surveillance/vendor/backbone.min.js +1 -0
  19. data/app/assets/javascripts/surveillance/vendor/bootstrap.js +2118 -0
  20. data/app/assets/javascripts/surveillance/vendor/jquery-ui-sortable.js +2256 -0
  21. data/app/assets/javascripts/surveillance/vendor/jquery.scrollto.js +210 -0
  22. data/app/assets/javascripts/surveillance/vendor/underscore.min.js +5 -0
  23. data/app/assets/javascripts/surveillance/views/attempt_view.coffee +74 -0
  24. data/app/assets/javascripts/surveillance/views/question_view.coffee +53 -0
  25. data/app/assets/javascripts/surveillance/views/questions/choice_view.coffee +52 -0
  26. data/app/assets/javascripts/surveillance/views/questions/matrix_question_view.coffee +26 -0
  27. data/app/assets/javascripts/surveillance/views/questions/matrix_view.coffee +21 -0
  28. data/app/assets/javascripts/surveillance/views/questions/number_view.coffee +19 -0
  29. data/app/assets/javascripts/surveillance/views/questions/order.coffee +9 -0
  30. data/app/assets/javascripts/surveillance/views/questions/select_matrix_view.coffee +31 -0
  31. data/app/assets/javascripts/surveillance/views/section_view.coffee +54 -0
  32. data/app/assets/stylesheets/surveillance/admin.sass +1 -0
  33. data/app/assets/stylesheets/surveillance/application.css +14 -0
  34. data/app/assets/stylesheets/surveillance/fonts/glyphicons-halflings-regular.eot +0 -0
  35. data/app/assets/stylesheets/surveillance/fonts/glyphicons-halflings-regular.svg +229 -0
  36. data/app/assets/stylesheets/surveillance/fonts/glyphicons-halflings-regular.ttf +0 -0
  37. data/app/assets/stylesheets/surveillance/fonts/glyphicons-halflings-regular.woff +0 -0
  38. data/app/assets/stylesheets/surveillance/overrides.sass +2 -0
  39. data/app/assets/stylesheets/surveillance/vendor/bootstrap.css +6175 -0
  40. data/app/controllers/concerns/surveillance/attempts_management_concern.rb +51 -0
  41. data/app/controllers/concerns/surveillance/base_controller_concern.rb +37 -0
  42. data/app/controllers/surveillance/admin/attempts_controller.rb +38 -0
  43. data/app/controllers/surveillance/admin/base_controller.rb +15 -0
  44. data/app/controllers/surveillance/admin/exports_controller.rb +24 -0
  45. data/app/controllers/surveillance/admin/options_controller.rb +44 -0
  46. data/app/controllers/surveillance/admin/questions_controller.rb +59 -0
  47. data/app/controllers/surveillance/admin/sections_controller.rb +46 -0
  48. data/app/controllers/surveillance/admin/surveys_controller.rb +43 -0
  49. data/app/controllers/surveillance/application_controller.rb +7 -0
  50. data/app/controllers/surveillance/response/attempts_controller.rb +50 -0
  51. data/app/controllers/surveillance/response/base_controller.rb +38 -0
  52. data/app/controllers/surveillance/response/partial_attempts_controller.rb +15 -0
  53. data/app/controllers/surveillance/surveys_controller.rb +6 -0
  54. data/app/helpers/surveillance/admin/exports_helper.rb +37 -0
  55. data/app/helpers/surveillance/application_helper.rb +84 -0
  56. data/app/models/surveillance/answer.rb +56 -0
  57. data/app/models/surveillance/answer_content.rb +7 -0
  58. data/app/models/surveillance/attempt.rb +146 -0
  59. data/app/models/surveillance/branch_rule.rb +52 -0
  60. data/app/models/surveillance/field_setting.rb +6 -0
  61. data/app/models/surveillance/option.rb +18 -0
  62. data/app/models/surveillance/question.rb +50 -0
  63. data/app/models/surveillance/section.rb +16 -0
  64. data/app/models/surveillance/survey.rb +38 -0
  65. data/app/views/layouts/surveillance/application.html.haml +11 -0
  66. data/app/views/surveillance/admin/attempts/index.html.haml +47 -0
  67. data/app/views/surveillance/admin/attempts/list.html.haml +11 -0
  68. data/app/views/surveillance/admin/attempts/overview.html.haml +6 -0
  69. data/app/views/surveillance/admin/attempts/show.html.haml +62 -0
  70. data/app/views/surveillance/admin/exports/show.rxls +39 -0
  71. data/app/views/surveillance/admin/options/_field.html.haml +11 -0
  72. data/app/views/surveillance/admin/options/_form.html.haml +8 -0
  73. data/app/views/surveillance/admin/options/_list.html.haml +10 -0
  74. data/app/views/surveillance/admin/options/_option.html.haml +13 -0
  75. data/app/views/surveillance/admin/options/edit.html.haml +7 -0
  76. data/app/views/surveillance/admin/options/new.html.haml +7 -0
  77. data/app/views/surveillance/admin/questions/_form.html.haml +35 -0
  78. data/app/views/surveillance/admin/questions/_list.html.haml +17 -0
  79. data/app/views/surveillance/admin/questions/_question.html.haml +27 -0
  80. data/app/views/surveillance/admin/questions/edit.html.haml +7 -0
  81. data/app/views/surveillance/admin/questions/new.html.haml +4 -0
  82. data/app/views/surveillance/admin/sections/_form.html.haml +16 -0
  83. data/app/views/surveillance/admin/sections/_list.html.haml +13 -0
  84. data/app/views/surveillance/admin/sections/_section.html.haml +16 -0
  85. data/app/views/surveillance/admin/sections/edit.html.haml +7 -0
  86. data/app/views/surveillance/admin/sections/new.html.haml +4 -0
  87. data/app/views/surveillance/admin/surveys/_form.html.haml +22 -0
  88. data/app/views/surveillance/admin/surveys/_list.html.haml +13 -0
  89. data/app/views/surveillance/admin/surveys/_survey.html.haml +32 -0
  90. data/app/views/surveillance/admin/surveys/edit.html.haml +7 -0
  91. data/app/views/surveillance/admin/surveys/index.html.haml +1 -0
  92. data/app/views/surveillance/admin/surveys/new.html.haml +4 -0
  93. data/app/views/surveillance/field/date/_form.html.haml +5 -0
  94. data/app/views/surveillance/field/date/_overview.html.haml +2 -0
  95. data/app/views/surveillance/field/date/_show.html.haml +10 -0
  96. data/app/views/surveillance/field/matrix/_form.html.haml +40 -0
  97. data/app/views/surveillance/field/matrix/_overview.html.haml +19 -0
  98. data/app/views/surveillance/field/matrix/_questions_fields.html.haml +11 -0
  99. data/app/views/surveillance/field/matrix/_settings.html.haml +18 -0
  100. data/app/views/surveillance/field/matrix/_show.html.haml +22 -0
  101. data/app/views/surveillance/field/multiple_choices/_form.html.haml +18 -0
  102. data/app/views/surveillance/field/multiple_choices/_settings.html.haml +21 -0
  103. data/app/views/surveillance/field/multiple_choices/_show.html.haml +21 -0
  104. data/app/views/surveillance/field/multiple_choices_matrix/_form.html.haml +33 -0
  105. data/app/views/surveillance/field/multiple_choices_matrix/_show.html.haml +1 -0
  106. data/app/views/surveillance/field/number/_form.html.haml +5 -0
  107. data/app/views/surveillance/field/number/_overview.html.haml +2 -0
  108. data/app/views/surveillance/field/number/_settings.html.haml +2 -0
  109. data/app/views/surveillance/field/number/_show.html.haml +10 -0
  110. data/app/views/surveillance/field/order/_form.html.haml +17 -0
  111. data/app/views/surveillance/field/order/_overview.html.haml +22 -0
  112. data/app/views/surveillance/field/order/_settings.html.haml +11 -0
  113. data/app/views/surveillance/field/order/_show.html.haml +8 -0
  114. data/app/views/surveillance/field/select_matrix/_form.html.haml +17 -0
  115. data/app/views/surveillance/field/shared/_rules_form.html.haml +30 -0
  116. data/app/views/surveillance/field/shared/settings/_boolean.html.haml +9 -0
  117. data/app/views/surveillance/field/shared/settings/_number.html.haml +5 -0
  118. data/app/views/surveillance/field/single_choice/_form.html.haml +16 -0
  119. data/app/views/surveillance/field/single_choice/_overview.html.haml +14 -0
  120. data/app/views/surveillance/field/single_choice/_settings.html.haml +2 -0
  121. data/app/views/surveillance/field/single_choice/_show.html.haml +21 -0
  122. data/app/views/surveillance/field/single_select/_form.html.haml +4 -0
  123. data/app/views/surveillance/field/single_select/_overview.html.haml +14 -0
  124. data/app/views/surveillance/field/single_select/_show.html.haml +13 -0
  125. data/app/views/surveillance/field/text/_form.html.haml +5 -0
  126. data/app/views/surveillance/field/text/_overview.html.haml +2 -0
  127. data/app/views/surveillance/field/text/_show.html.haml +10 -0
  128. data/app/views/surveillance/field/text_area/_form.html.haml +5 -0
  129. data/app/views/surveillance/field/text_area/_overview.html.haml +1 -0
  130. data/app/views/surveillance/field/text_area/_show.html.haml +10 -0
  131. data/app/views/surveillance/response/attempts/complete.html.haml +11 -0
  132. data/app/views/surveillance/response/attempts/edit.html.haml +15 -0
  133. data/app/views/surveillance/sections/_section.html.haml +24 -0
  134. data/app/views/surveillance/surveys/_survey.html.haml +4 -0
  135. data/app/views/surveillance/surveys/index.html.haml +8 -0
  136. data/app/views/surveillance/surveys/show.html.haml +15 -0
  137. data/config/locales/surveillance.fr.yml +165 -0
  138. data/config/routes.rb +30 -0
  139. data/db/migrate/20130626115136_create_surveillance_surveys.rb +13 -0
  140. data/db/migrate/20130626115805_create_surveillance_sections.rb +12 -0
  141. data/db/migrate/20130626130351_create_surveillance_questions.rb +14 -0
  142. data/db/migrate/20130702111125_create_surveillance_options.rb +11 -0
  143. data/db/migrate/20130703113456_create_surveillance_attempts.rb +11 -0
  144. data/db/migrate/20130703115649_create_surveillance_answers.rb +11 -0
  145. data/db/migrate/20130703115723_create_surveillance_answer_contents.rb +10 -0
  146. data/db/migrate/20130710151627_create_surveillance_field_settings.rb +11 -0
  147. data/db/migrate/20130711100032_create_surveillance_answers_options_join_table.rb +7 -0
  148. data/db/migrate/20130729143002_create_surveillance_branch_rules.rb +14 -0
  149. data/db/migrate/20140212153506_add_state_to_surveillance_attempts.rb +6 -0
  150. data/db/migrate/20140213101147_add_access_token_to_surveillance_attempts.rb +5 -0
  151. data/db/migrate/20140213133036_add_partial_to_surveillance_questions.rb +5 -0
  152. data/lib/generators/surveillance/install/install_generator.rb +34 -0
  153. data/lib/generators/surveillance/install/templates/initializer.rb +51 -0
  154. data/lib/surveillance.rb +61 -0
  155. data/lib/surveillance/branch_action.rb +5 -0
  156. data/lib/surveillance/branch_condition.rb +5 -0
  157. data/lib/surveillance/engine.rb +13 -0
  158. data/lib/surveillance/field.rb +58 -0
  159. data/lib/surveillance/field/base.rb +149 -0
  160. data/lib/surveillance/field/date.rb +17 -0
  161. data/lib/surveillance/field/matrix.rb +66 -0
  162. data/lib/surveillance/field/matrix_question.rb +13 -0
  163. data/lib/surveillance/field/multiple_choices.rb +29 -0
  164. data/lib/surveillance/field/multiple_choices_matrix.rb +13 -0
  165. data/lib/surveillance/field/number.rb +34 -0
  166. data/lib/surveillance/field/order.rb +40 -0
  167. data/lib/surveillance/field/order_question.rb +22 -0
  168. data/lib/surveillance/field/other_choice.rb +28 -0
  169. data/lib/surveillance/field/select_matrix.rb +13 -0
  170. data/lib/surveillance/field/single_choice.rb +36 -0
  171. data/lib/surveillance/field/single_select.rb +31 -0
  172. data/lib/surveillance/field/text.rb +13 -0
  173. data/lib/surveillance/field/text_area.rb +6 -0
  174. data/lib/surveillance/partials_collection.rb +7 -0
  175. data/lib/surveillance/setting.rb +24 -0
  176. data/lib/surveillance/settings_collection.rb +17 -0
  177. data/lib/surveillance/validators.rb +7 -0
  178. data/lib/surveillance/validators/answer_validator.rb +9 -0
  179. data/lib/surveillance/version.rb +3 -0
  180. data/lib/tasks/surveillance_tasks.rake +4 -0
  181. data/spec/dummy/README.rdoc +28 -0
  182. data/spec/dummy/Rakefile +6 -0
  183. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  184. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  185. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  186. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  187. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  188. data/spec/dummy/bin/bundle +3 -0
  189. data/spec/dummy/bin/rails +4 -0
  190. data/spec/dummy/bin/rake +4 -0
  191. data/spec/dummy/config.ru +4 -0
  192. data/spec/dummy/config/application.rb +28 -0
  193. data/spec/dummy/config/boot.rb +5 -0
  194. data/spec/dummy/config/database.yml +25 -0
  195. data/spec/dummy/config/environment.rb +5 -0
  196. data/spec/dummy/config/environments/development.rb +29 -0
  197. data/spec/dummy/config/environments/production.rb +80 -0
  198. data/spec/dummy/config/environments/test.rb +36 -0
  199. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  200. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  201. data/spec/dummy/config/initializers/inflections.rb +16 -0
  202. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  203. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  204. data/spec/dummy/config/initializers/session_store.rb +3 -0
  205. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  206. data/spec/dummy/config/locales/en.yml +23 -0
  207. data/spec/dummy/config/locales/rails.fr.yml +226 -0
  208. data/spec/dummy/config/routes.rb +3 -0
  209. data/spec/dummy/db/development.sqlite3 +0 -0
  210. data/spec/dummy/db/migrate/20140113224541_create_surveillance_surveys.surveillance.rb +14 -0
  211. data/spec/dummy/db/migrate/20140113224542_create_surveillance_sections.surveillance.rb +13 -0
  212. data/spec/dummy/db/migrate/20140113224543_create_surveillance_questions.surveillance.rb +15 -0
  213. data/spec/dummy/db/migrate/20140113224544_create_surveillance_options.surveillance.rb +12 -0
  214. data/spec/dummy/db/migrate/20140113224545_create_surveillance_attempts.surveillance.rb +12 -0
  215. data/spec/dummy/db/migrate/20140113224546_create_surveillance_answers.surveillance.rb +12 -0
  216. data/spec/dummy/db/migrate/20140113224547_create_surveillance_answer_contents.surveillance.rb +11 -0
  217. data/spec/dummy/db/migrate/20140113224548_create_surveillance_field_settings.surveillance.rb +12 -0
  218. data/spec/dummy/db/migrate/20140113224549_create_surveillance_answers_options_join_table.surveillance.rb +8 -0
  219. data/spec/dummy/db/migrate/20140113224550_create_surveillance_branch_rules.surveillance.rb +15 -0
  220. data/spec/dummy/db/schema.rb +103 -0
  221. data/spec/dummy/log/development.log +38066 -0
  222. data/spec/dummy/public/404.html +58 -0
  223. data/spec/dummy/public/422.html +58 -0
  224. data/spec/dummy/public/500.html +57 -0
  225. data/spec/dummy/public/favicon.ico +0 -0
  226. data/spec/dummy/spec +1 -0
  227. data/spec/dummy/tmp/cache/assets/development/sprockets/0018421aaf29044fbd13363bbdfd8f44 +0 -0
  228. data/spec/dummy/tmp/cache/assets/development/sprockets/017d7a30ec05c0fb0265fb5167c73ee9 +0 -0
  229. data/spec/dummy/tmp/cache/assets/development/sprockets/034b76adeb89d6ca63cd9eea649331f5 +0 -0
  230. data/spec/dummy/tmp/cache/assets/development/sprockets/05de8fbfacab66a0efe4f9790b2ac723 +0 -0
  231. data/spec/dummy/tmp/cache/assets/development/sprockets/0811effcff3b9107d49398bdba7488e5 +0 -0
  232. data/spec/dummy/tmp/cache/assets/development/sprockets/0d45beae32861dc508fc2db09b9d95b3 +0 -0
  233. data/spec/dummy/tmp/cache/assets/development/sprockets/0d4961f3da5a0d5234736a6abbf42226 +0 -0
  234. data/spec/dummy/tmp/cache/assets/development/sprockets/0f491ed240e1a27bbc05e5213afd48bb +0 -0
  235. data/spec/dummy/tmp/cache/assets/development/sprockets/10e2a0dbdbb68c055e8b7ccd6f2906d8 +0 -0
  236. data/spec/dummy/tmp/cache/assets/development/sprockets/1173cdef6c662a55ef590489fe26e8fe +0 -0
  237. data/spec/dummy/tmp/cache/assets/development/sprockets/1b3e93127523ec0f3c93bcd91d4390dc +0 -0
  238. data/spec/dummy/tmp/cache/assets/development/sprockets/1bb56fbf17ccbb14dcbaa4d6d639e620 +0 -0
  239. data/spec/dummy/tmp/cache/assets/development/sprockets/2bd0ba6a1598c9fa67081d8f906db6f8 +0 -0
  240. data/spec/dummy/tmp/cache/assets/development/sprockets/3fbe053f103de46cc1b320f059b99c1f +0 -0
  241. data/spec/dummy/tmp/cache/assets/development/sprockets/4144b095447efb810a548b99e41df9eb +0 -0
  242. data/spec/dummy/tmp/cache/assets/development/sprockets/421d097cb8d88f975d8ccf75c9e5e306 +0 -0
  243. data/spec/dummy/tmp/cache/assets/development/sprockets/474bc1c9055df6cc1cdff58817a6cb41 +0 -0
  244. data/spec/dummy/tmp/cache/assets/development/sprockets/4829d251eeb22cdbd05b27b6ba809538 +0 -0
  245. data/spec/dummy/tmp/cache/assets/development/sprockets/4f584ca3f0c8ec62906e6f03bc5963c2 +0 -0
  246. data/spec/dummy/tmp/cache/assets/development/sprockets/55d647d88e01b91b2a146e7db0481c09 +0 -0
  247. data/spec/dummy/tmp/cache/assets/development/sprockets/62db8b5885b79c5dc0667fab0fbf46bb +0 -0
  248. data/spec/dummy/tmp/cache/assets/development/sprockets/7080a4d265fe784c9704db71f81da832 +0 -0
  249. data/spec/dummy/tmp/cache/assets/development/sprockets/7220af243fd39e3dffd233252e4a8c17 +0 -0
  250. data/spec/dummy/tmp/cache/assets/development/sprockets/7cd0e5bfe12b86ed494d02e8e5b62bbf +0 -0
  251. data/spec/dummy/tmp/cache/assets/development/sprockets/7e37a8ae2a50653b388d57c573d12548 +0 -0
  252. data/spec/dummy/tmp/cache/assets/development/sprockets/8113790dad1da8858c82cfc3eb14ef87 +0 -0
  253. data/spec/dummy/tmp/cache/assets/development/sprockets/83997102fc04f275cd6cd8c1ddb55835 +0 -0
  254. data/spec/dummy/tmp/cache/assets/development/sprockets/8a7b047a16adbc640e03eaabe4a4fe93 +0 -0
  255. data/spec/dummy/tmp/cache/assets/development/sprockets/90b48fb4bfa22ddcd063734065d27086 +0 -0
  256. data/spec/dummy/tmp/cache/assets/development/sprockets/935886b24c90d344752d2a80e3657801 +0 -0
  257. data/spec/dummy/tmp/cache/assets/development/sprockets/9606a6d70af63ce3fea26ded0a69d5c2 +0 -0
  258. data/spec/dummy/tmp/cache/assets/development/sprockets/97db73fdf0bbab24fb92892c61ec7a9b +0 -0
  259. data/spec/dummy/tmp/cache/assets/development/sprockets/a23bb60554e715c228ae3cdfb5d81807 +0 -0
  260. data/spec/dummy/tmp/cache/assets/development/sprockets/ad17e102b9f9288a9e919b0b0a2ab05b +0 -0
  261. data/spec/dummy/tmp/cache/assets/development/sprockets/c26ae1f6640b52c232bd392a6e2f7110 +0 -0
  262. data/spec/dummy/tmp/cache/assets/development/sprockets/c6cb3deca0f08bd9569d00fca09272da +0 -0
  263. data/spec/dummy/tmp/cache/assets/development/sprockets/d39b4eebbd0042342e10497a34fd6378 +0 -0
  264. data/spec/dummy/tmp/cache/assets/development/sprockets/d5ee573b2abdcdc245a830bde2dd76f3 +0 -0
  265. data/spec/dummy/tmp/cache/assets/development/sprockets/d6487e59842ff206d84f6de5e3a7400c +0 -0
  266. data/spec/dummy/tmp/cache/assets/development/sprockets/dafa124ddd0e828d7c5c0a5c4db455ba +0 -0
  267. data/spec/dummy/tmp/cache/assets/development/sprockets/e5bbd03518f9abc3e9bc1373c74fd3f1 +0 -0
  268. data/spec/dummy/tmp/cache/assets/development/sprockets/ed5aa255edff522c2e36e6f0151ff747 +0 -0
  269. data/spec/dummy/tmp/cache/assets/development/sprockets/ee263a426f6530013f86aa860448fa91 +0 -0
  270. data/spec/dummy/tmp/cache/assets/development/sprockets/efa0c4d855d425fdf4b63ab26c45e94c +0 -0
  271. data/spec/dummy/tmp/cache/assets/development/sprockets/f2881259fd5bad1c0a5b1ab5dff97c47 +0 -0
  272. data/spec/dummy/tmp/cache/assets/development/sprockets/f34108e540cff2fbc32036da452ca6ae +0 -0
  273. data/spec/dummy/tmp/cache/assets/development/sprockets/f7e7e00ef8efc13c6a2628e453344440 +0 -0
  274. data/spec/dummy/tmp/cache/assets/development/sprockets/f9a44009076e46b0f35af5e7031a1871 +0 -0
  275. data/spec/spec_helper.rb +87 -0
  276. metadata +598 -0
@@ -0,0 +1,51 @@
1
+ module Surveillance
2
+ module AttemptsManagementConcern
3
+ private
4
+
5
+ def surveillance_attempt_cookie_key_for(survey)
6
+ "survey-access-token-#{ survey.id }"
7
+ end
8
+
9
+ def previous_attempt
10
+ @previous_attempt ||= previous_attempt_for(survey)
11
+ end
12
+
13
+ def previous_attempt_for(survey)
14
+ if (token = cookies[surveillance_attempt_cookie_key_for(survey)])
15
+ attempt = survey.attempts.find_by_access_token(token)
16
+ return attempt if attempt
17
+ end
18
+
19
+ if (attempt = survey.attempts.find_by_ip_address(request.remote_ip))
20
+ store_attempt!(attempt)
21
+ return attempt
22
+ end
23
+
24
+ if respond_to?(:current_user) && current_user
25
+ attempt = survey.attempts.where(
26
+ surveillance_attempts: {
27
+ user_id: current_user.id, user_type: current_user.class.name
28
+ }
29
+ ).first
30
+
31
+ return attempt if attempt
32
+ end
33
+ end
34
+
35
+ def store_attempt!(attempt)
36
+ cookies[surveillance_attempt_cookie_key_for(attempt.survey)] = {
37
+ value: attempt.access_token,
38
+ expires: 1.year.from_now
39
+ }
40
+ end
41
+
42
+ def attempt_already_completed!(attempt)
43
+ if (callback = Surveillance.attempt_already_registered_callback)
44
+ instance_exec(attempt, &callback)
45
+ else
46
+ flash[:error] = t("surveillance.attempts.errors.already_completed")
47
+ redirect_to surveys_root_path
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,37 @@
1
+ module Surveillance
2
+ module BaseControllerConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :surveys_root_path
7
+
8
+ decent_configuration do
9
+ if defined?(ActiveModel::ForbiddenAttributesProtection)
10
+ strategy DecentExposure::StrongParametersStrategy
11
+ end
12
+ end
13
+ end
14
+
15
+ protected
16
+
17
+ def flash_message(type)
18
+ I18n.t("flashes.#{ flash_key }.#{ params[:action] }.#{ type }")
19
+ end
20
+
21
+ def flash_key
22
+ @flash_key ||= self.class.name.underscore.gsub(/_controller$/, "")
23
+ end
24
+
25
+ def stong_parameters?
26
+ defined?(ActiveModel::ForbiddenAttributesProtection)
27
+ end
28
+
29
+ def surveys_root_path
30
+ if (config = Surveillance.surveys_root_path)
31
+ instance_exec(&config)
32
+ else
33
+ surveys_path
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ module Surveillance
2
+ module Admin
3
+ class AttemptsController < Surveillance::Admin::BaseController
4
+ expose(:survey, model: Surveillance::Survey, finder_parameter: :survey_id)
5
+ expose(:attempts) { survey.attempts }
6
+ expose(:attempt, model: Surveillance::Attempt, attributes: :attempt_params,
7
+ finder: :find_by_access_token)
8
+
9
+ def index
10
+ self.attempts = attempts.includes_all
11
+ self.survey = Surveillance::Survey.all_with_answers.find(survey.id)
12
+ end
13
+
14
+ def list
15
+ end
16
+
17
+ def overview
18
+ end
19
+
20
+ def show
21
+ self.attempt = Surveillance::Attempt.includes_all.find(attempt.id)
22
+ self.survey = Surveillance::Survey.includes_all.find(attempt.survey_id)
23
+ end
24
+
25
+ def destroy
26
+ attempt.destroy
27
+ flash[:success] = flash_message(:success)
28
+ redirect_to admin_survey_attempts_path(attempt.survey)
29
+ end
30
+
31
+ protected
32
+
33
+ def attempt_params
34
+ stong_parameters? ? params.require(:attempt).permit! : params[:attempt]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,15 @@
1
+ module Surveillance
2
+ module Admin
3
+ class BaseController < Surveillance.admin_base_controller.constantize
4
+ if Surveillance.admin_base_controller != 'Surveillance::ApplicationController'
5
+ include Surveillance::BaseControllerConcern
6
+ include Surveillance::ApplicationHelper
7
+ helper Surveillance::ApplicationHelper
8
+ end
9
+
10
+ if Surveillance.admin_authorization_method
11
+ before_filter Surveillance.admin_authorization_method
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ module Surveillance
2
+ module Admin
3
+ class ExportsController < Surveillance::Admin::BaseController
4
+ expose(:survey, model: Surveillance::Survey)
5
+ expose(:attempts) { survey.attempts.includes_all }
6
+ expose(:sections) { survey.sections.includes_all }
7
+
8
+ def show
9
+ self.attempts = if params[:state]
10
+ attempts.where(state: params[:state])
11
+ else
12
+ attempts.where(state: ["partially_filled", "completed"])
13
+ end
14
+
15
+ send_data(
16
+ render_to_string(layout: false),
17
+ filename: "#{ t("surveillance.exports.results", survey: survey.title.parameterize) }.xls",
18
+ type: "application/xls",
19
+ disposition: "attachment"
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ module Surveillance
2
+ module Admin
3
+ class OptionsController < Surveillance::Admin::BaseController
4
+ expose(:question, model: Surveillance::Question, finder_parameter: :question_id)
5
+ expose(:options) { question.options }
6
+ expose(:option, model: Surveillance::Option, attributes: :options_params)
7
+
8
+ def create
9
+ if option.save
10
+ flash[:success] = flash_message(:success)
11
+ redirect_to edit_admin_question_path(question)
12
+ else
13
+ flash[:error] = flash_message(:error)
14
+ render "new"
15
+ end
16
+ end
17
+
18
+ def edit
19
+ end
20
+
21
+ def update
22
+ if option.save
23
+ flash[:success] = flash_message(:success)
24
+ redirect_to edit_admin_question_path(option.question)
25
+ else
26
+ flash[:error] = flash_message(:error)
27
+ render "edit"
28
+ end
29
+ end
30
+
31
+ def destroy
32
+ option.destroy
33
+ flash[:success] = flash_message(:success)
34
+ redirect_to edit_admin_question_path(option.question)
35
+ end
36
+
37
+ protected
38
+
39
+ def options_params
40
+ stong_parameters? ? params.require(:option).permit! : params[:option]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,59 @@
1
+ module Surveillance
2
+ module Admin
3
+ class QuestionsController < Surveillance::Admin::BaseController
4
+ expose(:section, model: Surveillance::Section, finder_parameter: :section_id)
5
+ expose(:questions) { section.questions }
6
+ expose(:question, model: Surveillance::Question, attributes: :question_params)
7
+
8
+ def index
9
+ end
10
+
11
+ def create
12
+ question.parent_id = params[:section_id]
13
+ question.parent_type = "Surveillance::Section"
14
+
15
+ if question.save
16
+ flash[:success] = flash_message(:success)
17
+ redirect_to edit_admin_question_path(question)
18
+ else
19
+ flash[:error] = flash_message(:error)
20
+ render "new"
21
+ end
22
+ end
23
+
24
+ def update
25
+ if question.save
26
+ flash[:success] = flash_message(:success)
27
+ redirect_to edit_admin_question_path(question)
28
+ else
29
+ flash[:error] = flash_message(:error)
30
+ render "edit"
31
+ end
32
+ end
33
+
34
+ def edit_rules
35
+ if question.update_attributes(params[:surveillance_question])
36
+ flash[:success] = flash_message(:success)
37
+ redirect_to edit_admin_section_path(question.parent)
38
+ else
39
+ flash[:error] = flash_message(:error)
40
+ section = question.parent
41
+ render "admin/surveillance/sections/edit"
42
+ end
43
+ end
44
+
45
+ def destroy
46
+ question.destroy
47
+ flash[:success] = flash_message(:success)
48
+ redirect_to edit_admin_section_path(question.parent)
49
+ end
50
+
51
+ protected
52
+
53
+ def question_params
54
+ stong_parameters? ? params.require(:question).permit! : params[:question]
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,46 @@
1
+ module Surveillance
2
+ module Admin
3
+ class SectionsController < Surveillance::Admin::BaseController
4
+ expose(:survey, model: Surveillance::Survey, finder_parameter: :survey_id)
5
+ expose(:sections) { survey.sections }
6
+ expose(:section, model: Surveillance::Section, attributes: :section_params)
7
+
8
+ def index
9
+ end
10
+
11
+ def create
12
+ section.survey_id = params[:survey_id]
13
+
14
+ if section.save
15
+ flash[:success] = flash_message(:success)
16
+ redirect_to edit_admin_section_path(section)
17
+ else
18
+ flash[:error] = flash_message(:error)
19
+ render "new"
20
+ end
21
+ end
22
+
23
+ def update
24
+ if section.save
25
+ flash[:success] = flash_message(:success)
26
+ redirect_to edit_admin_section_path(section)
27
+ else
28
+ flash[:error] = flash_message(:error)
29
+ render "edit"
30
+ end
31
+ end
32
+
33
+ def destroy
34
+ section.destroy
35
+ flash[:success] = flash_message(:success)
36
+ redirect_to edit_admin_survey_path(section.survey)
37
+ end
38
+
39
+ protected
40
+
41
+ def section_params
42
+ stong_parameters? ? params.require(:section).permit! : params[:section]
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ module Surveillance
2
+ module Admin
3
+ class SurveysController < Surveillance::Admin::BaseController
4
+ expose(:surveys) { Surveillance::Survey.order("created_at DESC") }
5
+ expose(:survey, attributes: :survey_params, model: Surveillance::Survey)
6
+
7
+ def index
8
+ end
9
+
10
+ def create
11
+ if survey.save
12
+ flash[:success] = flash_message(:success)
13
+ redirect_to edit_admin_survey_path(survey)
14
+ else
15
+ flash[:error] = flash_message(:error)
16
+ render "new"
17
+ end
18
+ end
19
+
20
+ def update
21
+ if survey.save
22
+ flash[:success] = flash_message(:success)
23
+ redirect_to edit_admin_survey_path(survey)
24
+ else
25
+ flash[:error] = flash_message(:error)
26
+ render "edit"
27
+ end
28
+ end
29
+
30
+ def destroy
31
+ survey.destroy
32
+ flash[:success] = flash_message(:success)
33
+ redirect_to admin_surveys_path
34
+ end
35
+
36
+ protected
37
+
38
+ def survey_params
39
+ stong_parameters? ? params.require(:survey).permit! : params[:survey]
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ module Surveillance
2
+ class ApplicationController < ::ApplicationController
3
+ include Surveillance::BaseControllerConcern
4
+
5
+ layout Surveillance.views_layout if Surveillance.views_layout
6
+ end
7
+ end
@@ -0,0 +1,50 @@
1
+ module Surveillance
2
+ module Response
3
+ class AttemptsController < Surveillance::Response::BaseController
4
+ include Surveillance::AttemptsManagementConcern
5
+
6
+ def new
7
+ self.attempt = if previous_attempt
8
+ if previous_attempt.completed?
9
+ attempt_already_completed!(previous_attempt)
10
+ return
11
+ end
12
+
13
+ flash[:success] = t("surveillance.attempts.previous_attempt_recovered")
14
+ previous_attempt
15
+ else
16
+ Surveillance::Attempt.create!(
17
+ last_answered_section: -1,
18
+ ip_address: request.remote_ip,
19
+ survey: survey
20
+ )
21
+ end
22
+
23
+ redirect_to edit_response_attempt_path(attempt)
24
+ end
25
+
26
+ def edit
27
+ attempt_already_completed!(attempt) and return if attempt.completed?
28
+ self.attempt = Surveillance::Attempt.includes_all.find(attempt.id)
29
+ store_attempt!(attempt)
30
+ end
31
+
32
+ def update
33
+ if attempt.save!
34
+ attempt.complete!
35
+ if survey.last_page_description.presence
36
+ redirect_to complete_response_attempt_path(attempt)
37
+ else
38
+ redirect_to survey_path(attempt.survey)
39
+ end
40
+ else
41
+ flash[:error] = flash_message(:error)
42
+ render "edit"
43
+ end
44
+ end
45
+
46
+ def complete
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ module Surveillance
4
+ module Response
5
+ class BaseController < Surveillance::ApplicationController
6
+ expose(:attempts) { surveys.attempts }
7
+ expose(:attempt, model: Surveillance::Attempt, attributes: :attempt_params,
8
+ finder: :find_by_access_token)
9
+
10
+ before_filter :survey_closed
11
+
12
+ helper_method :survey
13
+
14
+ protected
15
+
16
+ def survey
17
+ @survey ||= begin
18
+ survey_id = params[:survey_id] || (attempt && attempt.survey_id)
19
+ Surveillance::Survey.includes_all.find(survey_id) if survey_id
20
+ end
21
+ end
22
+
23
+ def attempt_params
24
+ stong_parameters? ? params.require(:attempt).permit! : params[:attempt]
25
+ end
26
+
27
+ def survey_closed
28
+ if !survey
29
+ flash[:error] = t('surveillance.attempts.errors.no_survey_found')
30
+ redirect_to surveys_root_path
31
+ elsif survey.closed?
32
+ flash[:error] = t('surveillance.attempts.errors.survey_closed')
33
+ redirect_to surveys_root_path
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end