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,13 @@
1
+ class CreateSurveillanceSurveys < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_surveys do |t|
4
+ t.string :title
5
+ t.text :description
6
+ t.text :last_page_description
7
+ t.date :end_date
8
+ t.boolean :published, default: false
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class CreateSurveillanceSections < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_sections do |t|
4
+ t.string :title
5
+ t.text :description
6
+ t.integer :position, default: 0
7
+ t.integer :survey_id
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ class CreateSurveillanceQuestions < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_questions do |t|
4
+ t.text :title
5
+ t.text :description
6
+ t.belongs_to :parent, polymorphic: true
7
+ t.string :field_type
8
+ t.boolean :mandatory, default: true
9
+ t.integer :position, default: 0
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ class CreateSurveillanceOptions < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_options do |t|
4
+ t.string :title
5
+ t.integer :question_id
6
+ t.integer :position, default: 0
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class CreateSurveillanceAttempts < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_attempts do |t|
4
+ t.belongs_to :user, polymorphic: true
5
+ t.integer :survey_id
6
+ t.string :ip_address
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class CreateSurveillanceAnswers < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_answers do |t|
4
+ t.integer :attempt_id
5
+ t.integer :question_id
6
+ t.boolean :other_choosed, default: false
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class CreateSurveillanceAnswerContents < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_answer_contents do |t|
4
+ t.text :value
5
+ t.integer :answer_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateSurveillanceFieldSettings < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_field_settings do |t|
4
+ t.string :key
5
+ t.text :value
6
+ t.integer :question_id
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ class CreateSurveillanceAnswersOptionsJoinTable < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_answers_options do |t|
4
+ t.references :answer, :option
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ class CreateSurveillanceBranchRules < ActiveRecord::Migration
2
+ def change
3
+ create_table :surveillance_branch_rules do |t|
4
+ t.integer :question_id
5
+ t.integer :sub_question_id
6
+ t.integer :option_id
7
+ t.integer :section_id
8
+ t.string :condition
9
+ t.string :action
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class AddStateToSurveillanceAttempts < ActiveRecord::Migration
2
+ def change
3
+ add_column :surveillance_attempts, :state, :string
4
+ add_column :surveillance_attempts, :last_answered_section, :integer
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddAccessTokenToSurveillanceAttempts < ActiveRecord::Migration
2
+ def change
3
+ add_column :surveillance_attempts, :access_token, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddPartialToSurveillanceQuestions < ActiveRecord::Migration
2
+ def change
3
+ add_column :surveillance_questions, :partial, :string
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ module Surveillance
2
+ class InstallGenerator < Rails::Generators::Base
3
+ # Copied files come from templates folder
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ # Generator desc
7
+ desc "Surveillance installation generator"
8
+
9
+ def welcome
10
+ say "Installing surveillance files ..."
11
+ end
12
+
13
+ def copy_initializer_file
14
+ say "Copying Surveillance initializer template"
15
+ copy_file "initializer.rb", "config/initializers/surveillance.rb"
16
+ end
17
+
18
+ def copy_migrations
19
+ say "Installing migrations, don't forget to `rake db:migrate`"
20
+ rake "surveillance:install:migrations"
21
+ end
22
+
23
+ def mount_engine
24
+ mount_path = ask(
25
+ "Where would you like to mount the Surveillance engine ? [/surveillance]"
26
+ ).presence || '/surveillance'
27
+
28
+ gsub_file "config/routes.rb", /mount Surveillance::Engine.*\'/, ''
29
+
30
+ path = mount_path.match(/^\//) ? mount_path : "/#{ mount_path }"
31
+ route "mount Surveillance::Engine => '#{ path }'"
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,51 @@
1
+ Surveillance.config do |config|
2
+ # Choose a controller class method to be called before admin controllers
3
+ # actions to authenticate admins
4
+ # Setting it to nil, will let everybody access the admin panel
5
+ #
6
+ # Default : nil
7
+ #
8
+ # config.admin_authorization_method = :authenticate_user!
9
+
10
+ # Define a layout to be used in Surveillance views
11
+ # Setting it to nil will let the default layout
12
+ #
13
+ # Default : nil
14
+ #
15
+ # config.views_layout = "survey"
16
+
17
+ # Change Admin base controller
18
+ #
19
+ # config.admin_base_controller = 'AdminController'
20
+
21
+ # Register field partials to allow overriding field rendering from admin
22
+ #
23
+ # Don't forget to add the registered partial view in :
24
+ # "app/views/surveillance/field/customer/<partial_path>"
25
+ #
26
+ # config.partials.register "Partial Name", "partial_path"
27
+
28
+ # Register a callback to be called when an attempt has already be registered
29
+ # for an anonymous user.
30
+ # The callback will be executed in the context of the controller, allowing you
31
+ # to use controller methods
32
+ # Setting it to nil will keep the default behaviour of adding a flash[:error]
33
+ # message and redirecting to the surveys list
34
+ #
35
+ # Default : nil
36
+ #
37
+ # config.attempt_already_registered_callback = ->(attempt) {
38
+ # flash[:error] = "You already completed this survey"
39
+ # redirect_to(root_path)
40
+ # }
41
+
42
+ # Surveys root path used when redirecting from a survey
43
+ # Executed in the context of the controller / view where it is called
44
+ # Note that the controller is inside the Surveillance Engine, you need
45
+ # to call the root on the `main_app` object if you need to redirect to
46
+ # your app
47
+ #
48
+ # Default : nil
49
+ #
50
+ # config.surveys_root_path = -> { main_app.root_path }
51
+ end
@@ -0,0 +1,61 @@
1
+ require "decent_exposure"
2
+ require "haml-rails"
3
+ require "jquery-rails"
4
+ require "simple_form"
5
+ require "spreadsheet_on_rails"
6
+ require 'aasm'
7
+
8
+ require "surveillance/engine"
9
+
10
+ module Surveillance
11
+ extend ActiveSupport::Autoload
12
+
13
+ autoload :Field, "surveillance/field"
14
+ autoload :PartialsCollection, "surveillance/partials_collection"
15
+ autoload :SettingsCollection, "surveillance/settings_collection"
16
+ autoload :Setting, "surveillance/setting"
17
+ autoload :Validators, "surveillance/validators"
18
+
19
+ # Defines an autorization method to be called before actions in admin
20
+ # controllers to authenticate admin users
21
+ #
22
+ mattr_accessor :admin_authorization_method
23
+ @@admin_authorization_method = nil
24
+
25
+ mattr_accessor :admin_base_controller
26
+ @@admin_base_controller = 'Surveillance::ApplicationController'
27
+
28
+ mattr_accessor :views_layout
29
+ @@views_layout = nil
30
+
31
+ mattr_accessor :partials
32
+ @@partials = Surveillance::PartialsCollection.new
33
+
34
+ mattr_accessor :attempt_already_registered_callback
35
+ @@attempt_already_registered_callback = nil
36
+
37
+ mattr_accessor :surveys_root_path
38
+ @@surveys_root_path = nil
39
+
40
+ class << self
41
+ def table_name_prefix
42
+ 'surveillance_'
43
+ end
44
+
45
+ def options_for ary, key
46
+ ary.map do |item|
47
+ str = item.to_s
48
+ [I18n.t("surveillance.#{ key }.#{ str }"), str]
49
+ end
50
+ end
51
+
52
+ def config &block
53
+ yield self
54
+ end
55
+
56
+ def unique_token
57
+ (Time.now.to_f * (100 ** 10)).to_i.to_s(36) +
58
+ (rand * 10 ** 10).to_i.to_s(36)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,5 @@
1
+ module Surveillance
2
+ module BranchAction
3
+ ACTIONS = %w(goto_section finalize_survey)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Surveillance
2
+ module BranchCondition
3
+ CONDITIONS = %w(answers doesnt_answer answers_option doesnt_answer_option)
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module Surveillance
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Surveillance
4
+
5
+ config.to_prepare do
6
+ path = Rails.root.join('lib', 'decorators', 'surveillance', '**', '*.rb')
7
+
8
+ Dir[path].each do |file|
9
+ load file
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,58 @@
1
+ module Surveillance
2
+ module Field
3
+ extend ActiveSupport::Autoload
4
+ extend ActiveSupport::Concern
5
+
6
+ autoload :Base, "surveillance/field/base"
7
+ autoload :Text, "surveillance/field/text"
8
+ autoload :TextArea, "surveillance/field/text_area"
9
+ autoload :Number, "surveillance/field/number"
10
+ autoload :Date, "surveillance/field/date"
11
+ autoload :SingleChoice, "surveillance/field/single_choice"
12
+ autoload :MultipleChoices, "surveillance/field/multiple_choices"
13
+ autoload :SingleSelect, "surveillance/field/single_select"
14
+ autoload :Matrix, "surveillance/field/matrix"
15
+ autoload :MultipleChoicesMatrix, "surveillance/field/multiple_choices_matrix"
16
+ autoload :SelectMatrix, "surveillance/field/select_matrix"
17
+ autoload :MatrixChoice, "surveillance/field/matrix_choice"
18
+ autoload :MatrixQuestion, "surveillance/field/matrix_question"
19
+ autoload :Order, "surveillance/field/order"
20
+ autoload :OrderQuestion, "surveillance/field/order_question"
21
+
22
+ autoload :OtherChoice, "surveillance/field/other_choice"
23
+
24
+ mattr_accessor :available_field_types
25
+ @@available_field_types = %w(
26
+ text text_area number date single_choice multiple_choices single_select
27
+ matrix multiple_choices_matrix select_matrix order
28
+ )
29
+
30
+ def field(options = {})
31
+ attempt = options.fetch(:attempt, nil)
32
+ answer = options.fetch(:answer, nil)
33
+ rebuild = options.fetch(:rebuild, false)
34
+
35
+ return @field if !rebuild && @field
36
+ @field = (field_class).new(self, attempt: attempt, answer: answer)
37
+ end
38
+
39
+ def field_class
40
+ Field.const_get(field_type.camelize)
41
+ end
42
+
43
+ def self.field_types_enum
44
+ Surveillance.options_for(@@available_field_types, "field_types")
45
+ end
46
+
47
+ included do
48
+ validates_presence_of :field_type
49
+
50
+ after_initialize do
51
+ self.field_type ||= "text"
52
+ end
53
+
54
+ before_validation :before_validation_callback
55
+ delegate :before_validation_callback, to: :field
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,149 @@
1
+ module Surveillance
2
+ module Field
3
+ class Base
4
+ include ActionView::Helpers::FormOptionsHelper
5
+
6
+ attr_accessor :question
7
+ attr_writer :answer, :attempt
8
+
9
+ def initialize question, options = {}
10
+ self.question = question
11
+ self.attempt = options.fetch(:attempt, nil)
12
+ self.answer = options.fetch(:answer, nil)
13
+ end
14
+
15
+ def attempt
16
+ @attempt || (@answer && @answer.attempt)
17
+ end
18
+
19
+ def answer
20
+ @answer ||= attempt && attempt.answer_to(question)
21
+ end
22
+
23
+ def answer_or_initialize
24
+ answer || Surveillance::Answer.new
25
+ end
26
+
27
+ def answer_or_initialize_for attempt
28
+ self.attempt = attempt
29
+ answer = answer_or_initialize
30
+ answer.question = question
31
+ answer
32
+ end
33
+
34
+ def choosable?
35
+ false
36
+ end
37
+
38
+ def mandatory_content?
39
+ false
40
+ end
41
+
42
+ def matrix?
43
+ false
44
+ end
45
+
46
+ def has_sub_questions?
47
+ false
48
+ end
49
+
50
+ def view_name
51
+ "question"
52
+ end
53
+
54
+ def setting_value key
55
+ setting = question.settings.find { |s| s.key == key.to_s }
56
+ setting && setting.value
57
+ end
58
+
59
+ def settings
60
+ @settings ||= self.class.settings.freeze
61
+ end
62
+
63
+ def settings?
64
+ settings.length > 0
65
+ end
66
+
67
+ def answer_string
68
+ answer.content ? answer.content.value : ""
69
+ end
70
+
71
+ # Defines following partial view path methods :
72
+ %w(show settings overview export).each do |view|
73
+ define_method(:"#{ view }_path") do
74
+ "#{ self.class.name.underscore }/#{ view }"
75
+ end
76
+ end
77
+
78
+ def form_path
79
+ if question.partial.presence
80
+ "surveillance/field/custom/#{ question.partial }"
81
+ else
82
+ "#{ self.class.name.underscore }/form"
83
+ end
84
+
85
+ end
86
+
87
+ def rules_form_path
88
+ "surveillance/field/shared/rules_form"
89
+ end
90
+
91
+ def validate_answer answer
92
+ self.answer = answer
93
+
94
+ if question.mandatory && empty?
95
+ answer.errors[:present] << I18n.t("errors.messages.empty")
96
+ end
97
+ end
98
+
99
+ def empty?
100
+ !present?
101
+ end
102
+
103
+ def present?
104
+ raise NoMethodError, "Each field type must override present? to " +
105
+ "implement custom presence logic. " +
106
+ "Raised from #{ self.class.name }"
107
+ end
108
+
109
+ def available_branch_conditions
110
+ conditions = %w(answers doesnt_answer)
111
+ conditions += %w(answers_option doesnt_answer_option) if choosable?
112
+ conditions
113
+ end
114
+
115
+ def available_branch_actions
116
+ %w(goto_section finalize_survey)
117
+ end
118
+
119
+ def options_list
120
+ @options_list ||= question.options.each_with_index.map do |option, index|
121
+ ["#{ index } - #{ option.title }", option.id]
122
+ end
123
+ end
124
+
125
+ # Override this method to define custom before_validation callbacks to
126
+ # be executed on the referer question model
127
+ #
128
+ def before_validation_callback
129
+ end
130
+
131
+ class << self
132
+ attr_writer :settings
133
+
134
+ def setting key, options = {}
135
+ settings[key] = Surveillance::Setting.new(self, options.merge(key: key))
136
+ end
137
+
138
+ def settings
139
+ @settings ||= Surveillance::SettingsCollection.new
140
+ end
141
+
142
+ def inherited subclass
143
+ # Ensure settings are inherited
144
+ subclass.settings.reverse_merge! settings
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end