surveillance 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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