think_feel_do_engine 3.10.6

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 (613) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +54 -0
  4. data/Rakefile +49 -0
  5. data/app/assets/images/changing_actions.gif +0 -0
  6. data/app/assets/images/evaluating_thoughts.gif +0 -0
  7. data/app/assets/images/favicon.ico +0 -0
  8. data/app/assets/images/think_feel_do_engine/athletic_man.png +0 -0
  9. data/app/assets/images/think_feel_do_engine/favicon.ico +0 -0
  10. data/app/assets/images/think_feel_do_engine/head_with_gears.jpg +0 -0
  11. data/app/assets/images/think_feel_do_engine/professional_woman.png +0 -0
  12. data/app/assets/images/think_feel_do_engine/woman_with_wrench.png +0 -0
  13. data/app/assets/javascripts/think_feel_do_engine.js +32 -0
  14. data/app/assets/javascripts/think_feel_do_engine/activities/activity_tracker.js +386 -0
  15. data/app/assets/javascripts/think_feel_do_engine/activities/dailyBreakdown.js +407 -0
  16. data/app/assets/javascripts/think_feel_do_engine/activities/forms.js +81 -0
  17. data/app/assets/javascripts/think_feel_do_engine/activities/your_activities.js +28 -0
  18. data/app/assets/javascripts/think_feel_do_engine/assessments.js +14 -0
  19. data/app/assets/javascripts/think_feel_do_engine/coach/messages/new.js +13 -0
  20. data/app/assets/javascripts/think_feel_do_engine/coach/patient_dashboards/index.js +16 -0
  21. data/app/assets/javascripts/think_feel_do_engine/dateWrapper.js +7 -0
  22. data/app/assets/javascripts/think_feel_do_engine/devise/passwords/edit.js.erb +24 -0
  23. data/app/assets/javascripts/think_feel_do_engine/event_capture/init.js +68 -0
  24. data/app/assets/javascripts/think_feel_do_engine/feel/emotion_mood_viz.js +31 -0
  25. data/app/assets/javascripts/think_feel_do_engine/feel/emotions.js +450 -0
  26. data/app/assets/javascripts/think_feel_do_engine/feel/timeago.js +214 -0
  27. data/app/assets/javascripts/think_feel_do_engine/forms/multi_page.js.erb +22 -0
  28. data/app/assets/javascripts/think_feel_do_engine/forms/multi_page_thought.js.erb +41 -0
  29. data/app/assets/javascripts/think_feel_do_engine/forms/suggested_prompt.js +22 -0
  30. data/app/assets/javascripts/think_feel_do_engine/markdown_editor.js +13 -0
  31. data/app/assets/javascripts/think_feel_do_engine/media_access_events.js +35 -0
  32. data/app/assets/javascripts/think_feel_do_engine/messages.js +8 -0
  33. data/app/assets/javascripts/think_feel_do_engine/participants.js +12 -0
  34. data/app/assets/javascripts/think_feel_do_engine/responsive-table.js +75 -0
  35. data/app/assets/javascripts/think_feel_do_engine/scrollindicator.js +92 -0
  36. data/app/assets/javascripts/think_feel_do_engine/shared/detect_timeout.js +42 -0
  37. data/app/assets/javascripts/think_feel_do_engine/slideshows.js +14 -0
  38. data/app/assets/javascripts/think_feel_do_engine/stepped_care.js +53 -0
  39. data/app/assets/javascripts/think_feel_do_engine/task_status.js +19 -0
  40. data/app/assets/javascripts/think_feel_do_engine/thought_patterns/index.js.erb +17 -0
  41. data/app/assets/javascripts/think_feel_do_engine/thoughts/edit_bulk.js +12 -0
  42. data/app/assets/javascripts/think_feel_do_engine/thoughts/scThoughtTrackerMenuViz.js +346 -0
  43. data/app/assets/javascripts/think_feel_do_engine/thoughts/thought_viz.js +53 -0
  44. data/app/assets/javascripts/think_feel_do_engine/users.js +10 -0
  45. data/app/assets/javascripts/think_feel_do_engine/validate_social_sharing.js +60 -0
  46. data/app/assets/stylesheets/think_feel_do_engine.css +12 -0
  47. data/app/assets/stylesheets/think_feel_do_engine/activities.css.scss +15 -0
  48. data/app/assets/stylesheets/think_feel_do_engine/base.css.scss +691 -0
  49. data/app/assets/stylesheets/think_feel_do_engine/dataTables-overrides.css.scss +27 -0
  50. data/app/assets/stylesheets/think_feel_do_engine/mobile.css.scss +3 -0
  51. data/app/assets/stylesheets/think_feel_do_engine/print.css.scss +1 -0
  52. data/app/controllers/think_feel_do_engine/application_controller.rb +77 -0
  53. data/app/controllers/think_feel_do_engine/bit_maker/content_modules_controller.rb +115 -0
  54. data/app/controllers/think_feel_do_engine/bit_maker/content_providers_controller.rb +117 -0
  55. data/app/controllers/think_feel_do_engine/bit_maker/slides_controller.rb +168 -0
  56. data/app/controllers/think_feel_do_engine/bit_maker/slideshow_anchors_controller.rb +61 -0
  57. data/app/controllers/think_feel_do_engine/bit_maker/slideshows_controller.rb +93 -0
  58. data/app/controllers/think_feel_do_engine/coach/group_dashboard_controller.rb +18 -0
  59. data/app/controllers/think_feel_do_engine/coach/memberships_controller.rb +38 -0
  60. data/app/controllers/think_feel_do_engine/coach/messages_controller.rb +91 -0
  61. data/app/controllers/think_feel_do_engine/coach/participant_activities_visualizations_controller.rb +24 -0
  62. data/app/controllers/think_feel_do_engine/coach/participant_thoughts_visualizations_controller.rb +15 -0
  63. data/app/controllers/think_feel_do_engine/coach/patient_dashboards_controller.rb +70 -0
  64. data/app/controllers/think_feel_do_engine/coach/phq_assessments_controller.rb +94 -0
  65. data/app/controllers/think_feel_do_engine/coach/received_messages_controller.rb +45 -0
  66. data/app/controllers/think_feel_do_engine/coach/sent_messages_controller.rb +26 -0
  67. data/app/controllers/think_feel_do_engine/coach/site_messages_controller.rb +49 -0
  68. data/app/controllers/think_feel_do_engine/coach_dashboard_controller.rb +11 -0
  69. data/app/controllers/think_feel_do_engine/concerns/browser_detective.rb +26 -0
  70. data/app/controllers/think_feel_do_engine/concerns/navigator_enabled.rb +17 -0
  71. data/app/controllers/think_feel_do_engine/keep_alive_controller.rb +27 -0
  72. data/app/controllers/think_feel_do_engine/lesson_slides_controller.rb +98 -0
  73. data/app/controllers/think_feel_do_engine/lessons_controller.rb +128 -0
  74. data/app/controllers/think_feel_do_engine/manage/groups_controller.rb +29 -0
  75. data/app/controllers/think_feel_do_engine/manage/tasks_controller.rb +68 -0
  76. data/app/controllers/think_feel_do_engine/memberships_controller.rb +55 -0
  77. data/app/controllers/think_feel_do_engine/navigator_controller.rb +109 -0
  78. data/app/controllers/think_feel_do_engine/participant_data_controller.rb +83 -0
  79. data/app/controllers/think_feel_do_engine/participants/activities_controller.rb +62 -0
  80. data/app/controllers/think_feel_do_engine/participants/assessments_controller.rb +84 -0
  81. data/app/controllers/think_feel_do_engine/participants/lessons_controller.rb +28 -0
  82. data/app/controllers/think_feel_do_engine/participants/media_access_events_controller.rb +42 -0
  83. data/app/controllers/think_feel_do_engine/participants/passwords_controller.rb +33 -0
  84. data/app/controllers/think_feel_do_engine/participants/public_slides_controller.rb +11 -0
  85. data/app/controllers/think_feel_do_engine/participants/sessions_controller.rb +16 -0
  86. data/app/controllers/think_feel_do_engine/participants/task_status_controller.rb +29 -0
  87. data/app/controllers/think_feel_do_engine/participants/thoughts_controller.rb +28 -0
  88. data/app/controllers/think_feel_do_engine/password_entropy_bits_controller.rb +12 -0
  89. data/app/controllers/think_feel_do_engine/privacy_policies_controller.rb +15 -0
  90. data/app/controllers/think_feel_do_engine/quick_sign_ins_controller.rb +18 -0
  91. data/app/controllers/think_feel_do_engine/users/passwords_controller.rb +16 -0
  92. data/app/controllers/think_feel_do_engine/users/registrations_controller.rb +16 -0
  93. data/app/controllers/think_feel_do_engine/users/sessions_controller.rb +36 -0
  94. data/app/helpers/think_feel_do_engine/activities_helper.rb +53 -0
  95. data/app/helpers/think_feel_do_engine/application_helper.rb +24 -0
  96. data/app/helpers/think_feel_do_engine/brand_helper.rb +36 -0
  97. data/app/helpers/think_feel_do_engine/coach/activity_color_code_helper.rb +52 -0
  98. data/app/helpers/think_feel_do_engine/coach/dashboard_and_phq_table_helper.rb +93 -0
  99. data/app/helpers/think_feel_do_engine/coach/group_dashboard_helper.rb +156 -0
  100. data/app/helpers/think_feel_do_engine/coach/messages_helper.rb +35 -0
  101. data/app/helpers/think_feel_do_engine/coach/moods_and_phq_viz_helper.rb +23 -0
  102. data/app/helpers/think_feel_do_engine/coach/patient_dashboard_helper.rb +58 -0
  103. data/app/helpers/think_feel_do_engine/emotions_helper.rb +15 -0
  104. data/app/helpers/think_feel_do_engine/phq_assessment_helper.rb +14 -0
  105. data/app/helpers/think_feel_do_engine/presenters_helper.rb +8 -0
  106. data/app/helpers/think_feel_do_engine/slides_helper.rb +43 -0
  107. data/app/helpers/think_feel_do_engine/tasks_helper.rb +110 -0
  108. data/app/mailers/think_feel_do_engine/lesson_notification_mailer.rb +15 -0
  109. data/app/mailers/think_feel_do_engine/message_notifications.rb +21 -0
  110. data/app/mailers/think_feel_do_engine/site_message_mailer.rb +11 -0
  111. data/app/models/ability.rb +91 -0
  112. data/app/models/activity.rb +362 -0
  113. data/app/models/activity_type.rb +8 -0
  114. data/app/models/arm.rb +47 -0
  115. data/app/models/arm_validator.rb +11 -0
  116. data/app/models/available_content_module.rb +95 -0
  117. data/app/models/awake_period.rb +40 -0
  118. data/app/models/bit_core/slide_observer.rb +9 -0
  119. data/app/models/coach_assignment.rb +9 -0
  120. data/app/models/content_modules.rb +27 -0
  121. data/app/models/content_modules/lesson_module.rb +88 -0
  122. data/app/models/content_provider_decorator.rb +115 -0
  123. data/app/models/content_provider_policy.rb +6 -0
  124. data/app/models/content_providers/accomplished_activity_index_provider.rb +21 -0
  125. data/app/models/content_providers/activity_index_provider.rb +25 -0
  126. data/app/models/content_providers/augmented_thoughts_table_provider.rb +18 -0
  127. data/app/models/content_providers/awake_period_form.rb +67 -0
  128. data/app/models/content_providers/create_activity.rb +42 -0
  129. data/app/models/content_providers/edit_past_feel_provider.rb +8 -0
  130. data/app/models/content_providers/evaluate_thoughts_provider.rb +15 -0
  131. data/app/models/content_providers/fun_activity_checklist.rb +43 -0
  132. data/app/models/content_providers/harmful_thoughts_edit_form_provider.rb +31 -0
  133. data/app/models/content_providers/helpful_thoughts_index_provider.rb +31 -0
  134. data/app/models/content_providers/important_activity_checklist.rb +44 -0
  135. data/app/models/content_providers/index_past_feel_provider.rb +24 -0
  136. data/app/models/content_providers/input_new_activity_form.rb +28 -0
  137. data/app/models/content_providers/learn_lessons_index_provider.rb +55 -0
  138. data/app/models/content_providers/messages_index_provider.rb +64 -0
  139. data/app/models/content_providers/module_index_provider.rb +41 -0
  140. data/app/models/content_providers/new_complete_thought_form_provider.rb +26 -0
  141. data/app/models/content_providers/new_current_emotion_provider.rb +30 -0
  142. data/app/models/content_providers/new_current_feel_provider.rb +26 -0
  143. data/app/models/content_providers/new_harmful_thought_form_provider.rb +27 -0
  144. data/app/models/content_providers/new_message_form_provider.rb +61 -0
  145. data/app/models/content_providers/new_past_feel_provider.rb +26 -0
  146. data/app/models/content_providers/new_thought_form_provider.rb +26 -0
  147. data/app/models/content_providers/new_thoughts_form_provider.rb +26 -0
  148. data/app/models/content_providers/past_activity_form.rb +55 -0
  149. data/app/models/content_providers/past_activity_review_form.rb +36 -0
  150. data/app/models/content_providers/past_due_activities_viz.rb +40 -0
  151. data/app/models/content_providers/pleasurable_activity_index_provider.rb +20 -0
  152. data/app/models/content_providers/previous_planned_activities_provider.rb +35 -0
  153. data/app/models/content_providers/random_slide_provider.rb +14 -0
  154. data/app/models/content_providers/show_message_provider.rb +78 -0
  155. data/app/models/content_providers/thought_patterns_index_provider.rb +21 -0
  156. data/app/models/content_providers/thoughts_distortion_viz_provider.rb +22 -0
  157. data/app/models/content_providers/thoughts_table_provider.rb +17 -0
  158. data/app/models/content_providers/unhelpful_thoughts_list_provider.rb +67 -0
  159. data/app/models/content_providers/unhelpful_thoughts_reflection_provider.rb +26 -0
  160. data/app/models/content_providers/unplanned_activity_form.rb +35 -0
  161. data/app/models/content_providers/your_activities_provider.rb +94 -0
  162. data/app/models/delivered_message.rb +59 -0
  163. data/app/models/emotion.rb +30 -0
  164. data/app/models/emotional_rating.rb +45 -0
  165. data/app/models/engagement.rb +7 -0
  166. data/app/models/group.rb +144 -0
  167. data/app/models/media_access_event.rb +24 -0
  168. data/app/models/membership.rb +199 -0
  169. data/app/models/message.rb +58 -0
  170. data/app/models/message_sms_notification.rb +45 -0
  171. data/app/models/mood.rb +31 -0
  172. data/app/models/participant.rb +355 -0
  173. data/app/models/participant_login_event.rb +6 -0
  174. data/app/models/participant_token.rb +32 -0
  175. data/app/models/phq_assessment.rb +55 -0
  176. data/app/models/phq_stepping.rb +325 -0
  177. data/app/models/phq_stepping_assessment.rb +96 -0
  178. data/app/models/planned_activity.rb +5 -0
  179. data/app/models/roles/clinician.rb +4 -0
  180. data/app/models/roles/content_author.rb +4 -0
  181. data/app/models/roles/researcher.rb +4 -0
  182. data/app/models/site_message.rb +6 -0
  183. data/app/models/slideshow_anchor.rb +16 -0
  184. data/app/models/task.rb +102 -0
  185. data/app/models/task_status.rb +94 -0
  186. data/app/models/think_feel_do_engine/addressable.rb +28 -0
  187. data/app/models/think_feel_do_engine/concerns/validate_password.rb +65 -0
  188. data/app/models/think_feel_do_engine/password_validator.rb +55 -0
  189. data/app/models/think_feel_do_engine/reports/emotional_rating.rb +23 -0
  190. data/app/models/think_feel_do_engine/reports/event.rb +26 -0
  191. data/app/models/think_feel_do_engine/reports/lesson_module.rb +47 -0
  192. data/app/models/think_feel_do_engine/reports/lesson_slide_view.rb +94 -0
  193. data/app/models/think_feel_do_engine/reports/lesson_viewing.rb +64 -0
  194. data/app/models/think_feel_do_engine/reports/login.rb +22 -0
  195. data/app/models/think_feel_do_engine/reports/messaging.rb +109 -0
  196. data/app/models/think_feel_do_engine/reports/module_page_view.rb +57 -0
  197. data/app/models/think_feel_do_engine/reports/module_session.rb +130 -0
  198. data/app/models/think_feel_do_engine/reports/patient_activity.rb +22 -0
  199. data/app/models/think_feel_do_engine/reports/patient_thought.rb +22 -0
  200. data/app/models/think_feel_do_engine/reports/phq_assessment.rb +32 -0
  201. data/app/models/think_feel_do_engine/reports/reporter.rb +45 -0
  202. data/app/models/think_feel_do_engine/reports/site_session.rb +63 -0
  203. data/app/models/think_feel_do_engine/reports/task_completion.rb +30 -0
  204. data/app/models/think_feel_do_engine/reports/tool_access.rb +51 -0
  205. data/app/models/think_feel_do_engine/reports/tool_module.rb +29 -0
  206. data/app/models/think_feel_do_engine/reports/user_agent.rb +33 -0
  207. data/app/models/think_feel_do_engine/reports/video_session.rb +65 -0
  208. data/app/models/think_feel_do_engine/reports/wai_assessment.rb +35 -0
  209. data/app/models/thought.rb +80 -0
  210. data/app/models/thought_pattern.rb +6 -0
  211. data/app/models/tool_nav_item.rb +65 -0
  212. data/app/models/tools/home.rb +5 -0
  213. data/app/models/tools/learn.rb +5 -0
  214. data/app/models/tools/messages.rb +5 -0
  215. data/app/models/tools/think.rb +5 -0
  216. data/app/models/unplanned_activities.rb +47 -0
  217. data/app/models/user.rb +55 -0
  218. data/app/models/user_role.rb +18 -0
  219. data/app/models/values/accomplishment.rb +23 -0
  220. data/app/models/values/emotional_rating.rb +23 -0
  221. data/app/models/values/mood.rb +22 -0
  222. data/app/models/values/pleasure.rb +23 -0
  223. data/app/models/wai_assessment.rb +30 -0
  224. data/app/presenters/think_feel_do_engine/harmful_thought_viz_presenter.rb +30 -0
  225. data/app/presenters/think_feel_do_engine/lesson_event/completion_data_presenter.rb +41 -0
  226. data/app/presenters/think_feel_do_engine/media_access_event_presenter.rb +54 -0
  227. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  228. data/app/views/devise/passwords/edit.html.erb +35 -0
  229. data/app/views/devise/passwords/new.html.erb +17 -0
  230. data/app/views/devise/sessions/new.html.erb +50 -0
  231. data/app/views/devise/shared/_links.erb +25 -0
  232. data/app/views/layouts/phq_assessment_mailer.html.erb +87 -0
  233. data/app/views/slides/show.html.erb +2 -0
  234. data/app/views/think_feel_do_engine/activities/_activity.html.erb +18 -0
  235. data/app/views/think_feel_do_engine/activities/_activity_coach_view.html.erb +6 -0
  236. data/app/views/think_feel_do_engine/activities/_activity_coach_view_future.html.erb +13 -0
  237. data/app/views/think_feel_do_engine/activities/_activity_coach_view_past.html.erb +21 -0
  238. data/app/views/think_feel_do_engine/activities/_activity_form_fields.html.erb +21 -0
  239. data/app/views/think_feel_do_engine/activities/_build_activity.html.erb +107 -0
  240. data/app/views/think_feel_do_engine/activities/_daily_summary.html.erb +121 -0
  241. data/app/views/think_feel_do_engine/activities/_intensity_selector.html.erb +25 -0
  242. data/app/views/think_feel_do_engine/activities/_mutable_activity.html.erb +14 -0
  243. data/app/views/think_feel_do_engine/activities/_past_due_activities_index_viz.html.erb +25 -0
  244. data/app/views/think_feel_do_engine/activities/_past_due_rows.erb +7 -0
  245. data/app/views/think_feel_do_engine/activities/_past_due_table.erb +39 -0
  246. data/app/views/think_feel_do_engine/activities/_previously_planned.html.erb +9 -0
  247. data/app/views/think_feel_do_engine/activities/accomplished_index.html.erb +84 -0
  248. data/app/views/think_feel_do_engine/activities/create_activity.html.erb +5 -0
  249. data/app/views/think_feel_do_engine/activities/fun_activity_checklist.html.erb +5 -0
  250. data/app/views/think_feel_do_engine/activities/important_activity_checklist.html.erb +5 -0
  251. data/app/views/think_feel_do_engine/activities/index.html.erb +81 -0
  252. data/app/views/think_feel_do_engine/activities/input_new_activity_form.html.erb +64 -0
  253. data/app/views/think_feel_do_engine/activities/past_activity_form.html.erb +75 -0
  254. data/app/views/think_feel_do_engine/activities/past_activity_review.html.erb +104 -0
  255. data/app/views/think_feel_do_engine/activities/pleasurable_index.html.erb +84 -0
  256. data/app/views/think_feel_do_engine/activities/previously_planned_fullpage.html.erb +12 -0
  257. data/app/views/think_feel_do_engine/activities/unplanned_activity_form.html.erb +21 -0
  258. data/app/views/think_feel_do_engine/activities/visualization.html.erb +120 -0
  259. data/app/views/think_feel_do_engine/assigned_tasks/show.html.erb +1 -0
  260. data/app/views/think_feel_do_engine/awake_periods/incomplete.html.erb +13 -0
  261. data/app/views/think_feel_do_engine/awake_periods/new.html.erb +34 -0
  262. data/app/views/think_feel_do_engine/bit_maker/content_modules/_form.html.erb +24 -0
  263. data/app/views/think_feel_do_engine/bit_maker/content_modules/edit.html.erb +9 -0
  264. data/app/views/think_feel_do_engine/bit_maker/content_modules/index.html.erb +38 -0
  265. data/app/views/think_feel_do_engine/bit_maker/content_modules/new.html.erb +9 -0
  266. data/app/views/think_feel_do_engine/bit_maker/content_modules/show.html.erb +27 -0
  267. data/app/views/think_feel_do_engine/bit_maker/content_providers/_form.html.erb +48 -0
  268. data/app/views/think_feel_do_engine/bit_maker/content_providers/edit.html.erb +12 -0
  269. data/app/views/think_feel_do_engine/bit_maker/content_providers/index.html.erb +36 -0
  270. data/app/views/think_feel_do_engine/bit_maker/content_providers/new.html.erb +12 -0
  271. data/app/views/think_feel_do_engine/bit_maker/content_providers/show.html.erb +42 -0
  272. data/app/views/think_feel_do_engine/bit_maker/slides/_fields.html.erb +212 -0
  273. data/app/views/think_feel_do_engine/bit_maker/slides/_slide.html.erb +23 -0
  274. data/app/views/think_feel_do_engine/bit_maker/slides/edit.html.erb +9 -0
  275. data/app/views/think_feel_do_engine/bit_maker/slides/index.html.erb +6 -0
  276. data/app/views/think_feel_do_engine/bit_maker/slides/new.html.erb +6 -0
  277. data/app/views/think_feel_do_engine/bit_maker/slideshow_anchors/create.js.erb +2 -0
  278. data/app/views/think_feel_do_engine/bit_maker/slideshow_anchors/destroy.js.erb +2 -0
  279. data/app/views/think_feel_do_engine/bit_maker/slideshows/_fields.html +4 -0
  280. data/app/views/think_feel_do_engine/bit_maker/slideshows/_slide_panel.html.erb +12 -0
  281. data/app/views/think_feel_do_engine/bit_maker/slideshows/_toc_panel.html.erb +5 -0
  282. data/app/views/think_feel_do_engine/bit_maker/slideshows/edit.html.erb +7 -0
  283. data/app/views/think_feel_do_engine/bit_maker/slideshows/index.html.erb +42 -0
  284. data/app/views/think_feel_do_engine/bit_maker/slideshows/new.html.erb +6 -0
  285. data/app/views/think_feel_do_engine/bit_maker/slideshows/show.html.erb +31 -0
  286. data/app/views/think_feel_do_engine/coach/group_dashboard/_activities_future.html.erb +69 -0
  287. data/app/views/think_feel_do_engine/coach/group_dashboard/_activities_past.html.erb +75 -0
  288. data/app/views/think_feel_do_engine/coach/group_dashboard/_comments.html.erb +63 -0
  289. data/app/views/think_feel_do_engine/coach/group_dashboard/_goals.html.erb +71 -0
  290. data/app/views/think_feel_do_engine/coach/group_dashboard/_learning_lesson_row.html.erb +5 -0
  291. data/app/views/think_feel_do_engine/coach/group_dashboard/_lesson_completion_breakdown.html.erb +33 -0
  292. data/app/views/think_feel_do_engine/coach/group_dashboard/_lessons.html.erb +21 -0
  293. data/app/views/think_feel_do_engine/coach/group_dashboard/_likes.html.erb +63 -0
  294. data/app/views/think_feel_do_engine/coach/group_dashboard/_logins.html.erb +24 -0
  295. data/app/views/think_feel_do_engine/coach/group_dashboard/_on_my_mind_statements.html.erb +66 -0
  296. data/app/views/think_feel_do_engine/coach/group_dashboard/_summary.html.erb +30 -0
  297. data/app/views/think_feel_do_engine/coach/group_dashboard/_summary_social.html.erb +24 -0
  298. data/app/views/think_feel_do_engine/coach/group_dashboard/_thoughts.html.erb +67 -0
  299. data/app/views/think_feel_do_engine/coach/group_dashboard/index.html.erb +50 -0
  300. data/app/views/think_feel_do_engine/coach/messages/index.html.erb +50 -0
  301. data/app/views/think_feel_do_engine/coach/messages/new.html.erb +32 -0
  302. data/app/views/think_feel_do_engine/coach/patient_dashboards/_active_patient.html.erb +104 -0
  303. data/app/views/think_feel_do_engine/coach/patient_dashboards/_details.html.erb +54 -0
  304. data/app/views/think_feel_do_engine/coach/patient_dashboards/_header.html.erb +5 -0
  305. data/app/views/think_feel_do_engine/coach/patient_dashboards/_inactive_patient.html.erb +34 -0
  306. data/app/views/think_feel_do_engine/coach/patient_dashboards/_mood_emotion_viz.html.erb +6 -0
  307. data/app/views/think_feel_do_engine/coach/patient_dashboards/_not_stepped_table.html.erb +36 -0
  308. data/app/views/think_feel_do_engine/coach/patient_dashboards/_phq_summary.html.erb +61 -0
  309. data/app/views/think_feel_do_engine/coach/patient_dashboards/_stepped_table.html.erb +35 -0
  310. data/app/views/think_feel_do_engine/coach/patient_dashboards/_table_of_contents.html.erb +20 -0
  311. data/app/views/think_feel_do_engine/coach/patient_dashboards/_test_summary.html.erb +39 -0
  312. data/app/views/think_feel_do_engine/coach/patient_dashboards/_vizs.html.erb +73 -0
  313. data/app/views/think_feel_do_engine/coach/patient_dashboards/index.html.erb +20 -0
  314. data/app/views/think_feel_do_engine/coach/patient_dashboards/show.html.erb +23 -0
  315. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_audio_access_table.html.erb +49 -0
  316. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_feelings_table.html.erb +48 -0
  317. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_future_activities_table.html.erb +66 -0
  318. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_lessons_table.html.erb +56 -0
  319. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_logins_table.html.erb +47 -0
  320. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_messages_table.html.erb +46 -0
  321. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_mood_table.html.erb +46 -0
  322. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_past_activities_table.html.erb +70 -0
  323. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_patient_info.html.erb +39 -0
  324. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_patient_login_stats.html.erb +51 -0
  325. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_phq9_data.html.erb +47 -0
  326. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_summary_totals.html.erb +49 -0
  327. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_tasks_table.html.erb +47 -0
  328. data/app/views/think_feel_do_engine/coach/patient_dashboards/tables/_thoughts_table.html.erb +49 -0
  329. data/app/views/think_feel_do_engine/coach/phq_assessments/_form.html.erb +42 -0
  330. data/app/views/think_feel_do_engine/coach/phq_assessments/edit.html.erb +3 -0
  331. data/app/views/think_feel_do_engine/coach/phq_assessments/index.html.erb +43 -0
  332. data/app/views/think_feel_do_engine/coach/phq_assessments/new.html.erb +3 -0
  333. data/app/views/think_feel_do_engine/coach/received_messages/_received_message.html.erb +5 -0
  334. data/app/views/think_feel_do_engine/coach/site_messages/_form.html.erb +38 -0
  335. data/app/views/think_feel_do_engine/coach/site_messages/index.html.erb +30 -0
  336. data/app/views/think_feel_do_engine/coach/site_messages/new.html.erb +3 -0
  337. data/app/views/think_feel_do_engine/coach/site_messages/show.html.erb +16 -0
  338. data/app/views/think_feel_do_engine/emotions/_emotion_coach_view.html.erb +8 -0
  339. data/app/views/think_feel_do_engine/emotions/_form.html.erb +28 -0
  340. data/app/views/think_feel_do_engine/emotions/index.html.erb +75 -0
  341. data/app/views/think_feel_do_engine/emotions/new_current.html.erb +30 -0
  342. data/app/views/think_feel_do_engine/learn/_completion_data.html.erb +28 -0
  343. data/app/views/think_feel_do_engine/learn/lessons_index.html.erb +72 -0
  344. data/app/views/think_feel_do_engine/lesson_notification_mailer/lesson_notification_email.html.erb +82 -0
  345. data/app/views/think_feel_do_engine/lesson_notification_mailer/lesson_notification_email.text.erb +10 -0
  346. data/app/views/think_feel_do_engine/lesson_slides/_audio.html.erb +1 -0
  347. data/app/views/think_feel_do_engine/lesson_slides/_video.html.erb +4 -0
  348. data/app/views/think_feel_do_engine/lesson_slides/edit.html.erb +7 -0
  349. data/app/views/think_feel_do_engine/lesson_slides/new.html.erb +6 -0
  350. data/app/views/think_feel_do_engine/lesson_slides/show.html.erb +21 -0
  351. data/app/views/think_feel_do_engine/lessons/_form.html.erb +8 -0
  352. data/app/views/think_feel_do_engine/lessons/_lesson.html.erb +6 -0
  353. data/app/views/think_feel_do_engine/lessons/all_content.html.erb +12 -0
  354. data/app/views/think_feel_do_engine/lessons/edit.html.erb +8 -0
  355. data/app/views/think_feel_do_engine/lessons/index.html.erb +36 -0
  356. data/app/views/think_feel_do_engine/lessons/new.html.erb +8 -0
  357. data/app/views/think_feel_do_engine/lessons/show.html.erb +30 -0
  358. data/app/views/think_feel_do_engine/login_events/_login_event.html.erb +6 -0
  359. data/app/views/think_feel_do_engine/manage/groups/_assigned_task_cell.html.erb +16 -0
  360. data/app/views/think_feel_do_engine/manage/groups/edit_tasks.html.erb +83 -0
  361. data/app/views/think_feel_do_engine/manage/groups/index.html.erb +19 -0
  362. data/app/views/think_feel_do_engine/manage/tasks/index.html.erb +24 -0
  363. data/app/views/think_feel_do_engine/media_access_events/_access_data.html.erb +24 -0
  364. data/app/views/think_feel_do_engine/memberships/update.js.erb +4 -0
  365. data/app/views/think_feel_do_engine/message_notifications/new_for_coach.html.erb +93 -0
  366. data/app/views/think_feel_do_engine/message_notifications/new_for_coach.text.erb +3 -0
  367. data/app/views/think_feel_do_engine/message_notifications/new_for_participant.html.erb +93 -0
  368. data/app/views/think_feel_do_engine/message_notifications/new_for_participant.text.erb +3 -0
  369. data/app/views/think_feel_do_engine/messages/_message.html.erb +7 -0
  370. data/app/views/think_feel_do_engine/messages/_message_info.html.erb +9 -0
  371. data/app/views/think_feel_do_engine/messages/index.html.erb +54 -0
  372. data/app/views/think_feel_do_engine/messages/new.html.erb +34 -0
  373. data/app/views/think_feel_do_engine/messages/not_found.html.erb +3 -0
  374. data/app/views/think_feel_do_engine/messages/show.html.erb +27 -0
  375. data/app/views/think_feel_do_engine/moods/_mood.html.erb +7 -0
  376. data/app/views/think_feel_do_engine/moods/new_current.html.erb +18 -0
  377. data/app/views/think_feel_do_engine/moods/new_past_mood.html.erb +28 -0
  378. data/app/views/think_feel_do_engine/navigator/_before_content.html.erb +5 -0
  379. data/app/views/think_feel_do_engine/navigator/show_content.html.erb +14 -0
  380. data/app/views/think_feel_do_engine/participant_data/create.js.erb +1 -0
  381. data/app/views/think_feel_do_engine/participant_data/update.js.erb +1 -0
  382. data/app/views/think_feel_do_engine/participants/activities/create.js.erb +5 -0
  383. data/app/views/think_feel_do_engine/participants/assessments/new_phq_assessment.html.erb +77 -0
  384. data/app/views/think_feel_do_engine/participants/assessments/new_wai_assessment.html.erb +51 -0
  385. data/app/views/think_feel_do_engine/participants/assessments/success.html +1 -0
  386. data/app/views/think_feel_do_engine/participants/content_modules/index.html.erb +36 -0
  387. data/app/views/think_feel_do_engine/participants/lessons/_printable.html.erb +15 -0
  388. data/app/views/think_feel_do_engine/participants/lessons/show.html.erb +1 -0
  389. data/app/views/think_feel_do_engine/participants/messages/_inbox_header.html.erb +1 -0
  390. data/app/views/think_feel_do_engine/participants/public_slides/show.html.erb +8 -0
  391. data/app/views/think_feel_do_engine/participants/received_messages/_received_message.html.erb +1 -0
  392. data/app/views/think_feel_do_engine/participants/thoughts/create.js.erb +24 -0
  393. data/app/views/think_feel_do_engine/phq_assessments/_phq_assessment.html.erb +15 -0
  394. data/app/views/think_feel_do_engine/privacy_policies/show.html.erb +17 -0
  395. data/app/views/think_feel_do_engine/shared/_alerts.html.erb +17 -0
  396. data/app/views/think_feel_do_engine/shared/_authentication.html.erb +5 -0
  397. data/app/views/think_feel_do_engine/shared/_email_head.html.erb +771 -0
  398. data/app/views/think_feel_do_engine/shared/_footer.html.erb +21 -0
  399. data/app/views/think_feel_do_engine/shared/_head.html.erb +14 -0
  400. data/app/views/think_feel_do_engine/shared/_home.html.erb +4 -0
  401. data/app/views/think_feel_do_engine/shared/_jplayer.html.erb +48 -0
  402. data/app/views/think_feel_do_engine/shared/_rating_selector.html.erb +16 -0
  403. data/app/views/think_feel_do_engine/shared/participant/_hamburger_nav_items.html.erb +19 -0
  404. data/app/views/think_feel_do_engine/shared/participant/_nav_items.html.erb +49 -0
  405. data/app/views/think_feel_do_engine/shared/participant/_navbar.html.erb +38 -0
  406. data/app/views/think_feel_do_engine/shared/user/_navbar.html.erb +25 -0
  407. data/app/views/think_feel_do_engine/site_message_mailer/general.html.erb +8 -0
  408. data/app/views/think_feel_do_engine/site_message_mailer/general.text.erb +3 -0
  409. data/app/views/think_feel_do_engine/slides/_audio.html.erb +4 -0
  410. data/app/views/think_feel_do_engine/slides/_slide.html.erb +18 -0
  411. data/app/views/think_feel_do_engine/slides/_table_of_contents.html.erb +24 -0
  412. data/app/views/think_feel_do_engine/slides/_video.html.erb +34 -0
  413. data/app/views/think_feel_do_engine/slides/homepage.html.erb +29 -0
  414. data/app/views/think_feel_do_engine/slides/show.html.erb +11 -0
  415. data/app/views/think_feel_do_engine/slides/sort.js.erb +1 -0
  416. data/app/views/think_feel_do_engine/slides/sort_with_reload.js.erb +1 -0
  417. data/app/views/think_feel_do_engine/task_statuses/_task_status.html.erb +8 -0
  418. data/app/views/think_feel_do_engine/thought_patterns/evaluating.html.erb +2 -0
  419. data/app/views/think_feel_do_engine/thought_patterns/index.html.erb +8 -0
  420. data/app/views/think_feel_do_engine/thoughts/_form.html.erb +11 -0
  421. data/app/views/think_feel_do_engine/thoughts/_harmful_thought.html.erb +4 -0
  422. data/app/views/think_feel_do_engine/thoughts/_mutable_thought.html.erb +23 -0
  423. data/app/views/think_feel_do_engine/thoughts/_thought.html.erb +10 -0
  424. data/app/views/think_feel_do_engine/thoughts/_thought_effects.html.erb +1 -0
  425. data/app/views/think_feel_do_engine/thoughts/_thought_patterns.html.erb +7 -0
  426. data/app/views/think_feel_do_engine/thoughts/distortion_viz.html.erb +28 -0
  427. data/app/views/think_feel_do_engine/thoughts/edit_bulk.html.erb +43 -0
  428. data/app/views/think_feel_do_engine/thoughts/index.html.erb +24 -0
  429. data/app/views/think_feel_do_engine/thoughts/new.html.erb +5 -0
  430. data/app/views/think_feel_do_engine/thoughts/new_bulk.html.erb +36 -0
  431. data/app/views/think_feel_do_engine/thoughts/new_complete.html.erb +28 -0
  432. data/app/views/think_feel_do_engine/thoughts/new_harmful.html.erb +14 -0
  433. data/app/views/think_feel_do_engine/thoughts/thoughts_table.html.erb +60 -0
  434. data/app/views/think_feel_do_engine/thoughts/unhelpful_thoughts_form.html.erb +103 -0
  435. data/config/brakeman.ignore +206 -0
  436. data/config/brakeman.yml +5 -0
  437. data/config/initializers/datetime_formats.rb +32 -0
  438. data/config/initializers/devise.rb +272 -0
  439. data/config/initializers/event_capture.rb +43 -0
  440. data/config/initializers/think_feel_do_engine.rb +4 -0
  441. data/config/locales/devise.en.yml +60 -0
  442. data/config/locales/en.yml +4 -0
  443. data/config/locales/rails_admin.en.yml +5 -0
  444. data/config/routes.rb +107 -0
  445. data/db/migrate/20140221174027_devise_create_users.rb +41 -0
  446. data/db/migrate/20140221182135_devise_create_participants.rb +28 -0
  447. data/db/migrate/20140221184614_create_groups.rb +29 -0
  448. data/db/migrate/20140221190256_create_memberships.rb +39 -0
  449. data/db/migrate/20140221201915_create_user_roles.rb +23 -0
  450. data/db/migrate/20140221204356_create_activity_types.rb +27 -0
  451. data/db/migrate/20140221211420_create_activities.rb +46 -0
  452. data/db/migrate/20140221214020_create_awake_periods.rb +29 -0
  453. data/db/migrate/20140223151355_create_slideshows.rb +12 -0
  454. data/db/migrate/20140223151505_create_slides.rb +33 -0
  455. data/db/migrate/20140224024338_create_content_modules.rb +12 -0
  456. data/db/migrate/20140224031252_create_content_providers.rb +34 -0
  457. data/db/migrate/20140224194936_require_titles_on_slides.rb +8 -0
  458. data/db/migrate/20140226174312_add_is_title_visible_to_slides.rb +8 -0
  459. data/db/migrate/20140226234059_drop_time_requirement_on_activities.rb +9 -0
  460. data/db/migrate/20140228042747_add_type_to_slides.rb +9 -0
  461. data/db/migrate/20140304020641_create_participant_statuses.rb +16 -0
  462. data/db/migrate/20140305134049_create_thoughts.rb +40 -0
  463. data/db/migrate/20140305204811_drop_extracted_bit_player_tables.rb +9 -0
  464. data/db/migrate/20140305220121_create_bit_player_content_modules.bit_player.rb +12 -0
  465. data/db/migrate/20140305220122_create_bit_player_content_providers.bit_player.rb +34 -0
  466. data/db/migrate/20140305233152_create_bit_player_participant_statuses.bit_player.rb +16 -0
  467. data/db/migrate/20140305235536_create_bit_player_slideshows.bit_player.rb +10 -0
  468. data/db/migrate/20140306000610_create_bit_player_slides.bit_player.rb +47 -0
  469. data/db/migrate/20140306161346_create_messages.rb +13 -0
  470. data/db/migrate/20140306161532_create_delivered_messages.rb +29 -0
  471. data/db/migrate/20140306175954_create_coach_assignments.rb +12 -0
  472. data/db/migrate/20140311172344_create_mood.rb +9 -0
  473. data/db/migrate/20140311182036_create_emotions.rb +10 -0
  474. data/db/migrate/20140311194313_add_column_activation_level_and_intensity_to_emotion.rb +9 -0
  475. data/db/migrate/20140313025147_create_thought_patterns.rb +10 -0
  476. data/db/migrate/20140313192408_add_pattern_id_to_thoughts.rb +22 -0
  477. data/db/migrate/20140313205806_add_name_to_emotions.rb +6 -0
  478. data/db/migrate/20140314203044_change_column_name_activation_level_to_valence.rb +8 -0
  479. data/db/migrate/20140318163703_create_group_slideshow_joins.rb +12 -0
  480. data/db/migrate/20140320183600_add_start_date_to_memberships.rb +5 -0
  481. data/db/migrate/20140326144359_create_phq_assessments.rb +39 -0
  482. data/db/migrate/20140326205140_create_participant_tokens.rb +32 -0
  483. data/db/migrate/20140331165739_add_end_date_to_memberships.rb +5 -0
  484. data/db/migrate/20140402151311_create_tasks.rb +11 -0
  485. data/db/migrate/20140402170153_add_creator_id_to_tasks.rb +5 -0
  486. data/db/migrate/20140407134214_create_task_statuses.rb +11 -0
  487. data/db/migrate/20140407150122_add_release_day_to_task_remove_is_completed_at_from_task.rb +6 -0
  488. data/db/migrate/20140407202026_create_bit_player_tools.bit_player.rb +14 -0
  489. data/db/migrate/20140407202027_change_module_context_to_tool.bit_player.rb +31 -0
  490. data/db/migrate/20140411184738_add_recurring_to_tasks.rb +5 -0
  491. data/db/migrate/20140411195557_add_question_and_explanation_to_thought_pattern.rb +6 -0
  492. data/db/migrate/20140411195804_add_challenging_thought_and_as_if_to_thought.rb +6 -0
  493. data/db/migrate/20140415165729_add_start_day_to_task_statuses.rb +5 -0
  494. data/db/migrate/20140418190852_remove_fk_groups_users_constraint.rb +21 -0
  495. data/db/migrate/20140421192355_change_start_date_on_membership_from_date_time_to_date.rb +9 -0
  496. data/db/migrate/20140501170217_add_is_admin_to_users.rb +5 -0
  497. data/db/migrate/20140501190812_add_participant_login_event.rb +9 -0
  498. data/db/migrate/20140502222145_add_is_admin_to_all_current_users.rb +15 -0
  499. data/db/migrate/20140505145843_add_study_id_to_participants.rb +5 -0
  500. data/db/migrate/20140523154605_delete_group_slideshow_join.rb +16 -0
  501. data/db/migrate/20140609181801_create_engagements.rb +10 -0
  502. data/db/migrate/20140620171824_create_bit_core_tools.bit_core.rb +29 -0
  503. data/db/migrate/20140620171825_create_bit_core_content_modules.bit_core.rb +41 -0
  504. data/db/migrate/20140620171826_create_bit_core_content_providers.bit_core.rb +43 -0
  505. data/db/migrate/20140620171827_create_bit_core_slideshows.bit_core.rb +10 -0
  506. data/db/migrate/20140620171828_create_bit_core_slides.bit_core.rb +44 -0
  507. data/db/migrate/20140620181933_add_options_to_slides.bit_core.rb +6 -0
  508. data/db/migrate/20140621023345_convert_slides_slideshows_to_bit_core.bit_player.rb +39 -0
  509. data/db/migrate/20140621024853_update_tasks_with_bit_core.rb +7 -0
  510. data/db/migrate/20140621024854_add_config_fields_to_providers.bit_core.rb +10 -0
  511. data/db/migrate/20140621031203_convert_tools_modules_presenters_to_bit_core.bit_player.rb +53 -0
  512. data/db/migrate/20140623182430_remove_valence_from_emotions.rb +5 -0
  513. data/db/migrate/20140624163655_rename_column_participant_id_on_emotions_to_creator_id.rb +5 -0
  514. data/db/migrate/20140624165438_create_emotional_ratings.rb +10 -0
  515. data/db/migrate/20140624165626_remove_rating_from_emotion_remove_intensity_from_emotion.rb +6 -0
  516. data/db/migrate/20140625133411_add_type_to_content_modules.bit_core.rb +6 -0
  517. data/db/migrate/20140625140629_convert_lesson_modules.rb +12 -0
  518. data/db/migrate/20140625140630_add_recommendations_to_thought_patterns.rb +5 -0
  519. data/db/migrate/20140702192100_create_content_provider_policies.rb +10 -0
  520. data/db/migrate/20140703203931_add_termination_day_to_tasks.rb +5 -0
  521. data/db/migrate/20140710122908_create_slideshow_anchors.rb +10 -0
  522. data/db/migrate/20140715170155_add_inactive_log_out_to_participant_login_event.rb +5 -0
  523. data/db/migrate/20140721190945_normalize_emotions.rb +18 -0
  524. data/db/migrate/20140722163946_add_thought_patterns.rb +83 -0
  525. data/db/migrate/20140722172101_add_missing_fk_constraints.rb +187 -0
  526. data/db/migrate/20140722195542_add_emotion_ids_to_orphaned_emotional_ratings.rb +12 -0
  527. data/db/migrate/20140725164219_add_is_monitored_to_activity.rb +5 -0
  528. data/db/migrate/20140725185012_add_participant_onload_log_out_to_login_event.rb +5 -0
  529. data/db/migrate/20140729151610_add_signed_out_at_to_participant_login_events.rb +5 -0
  530. data/db/migrate/20140729171907_remove_participant_on_load_log_out_from_login_event.rb +5 -0
  531. data/db/migrate/20140730202349_update_thought_patterns.rb +94 -0
  532. data/db/migrate/20140815190945_add_phq_edit_columns.rb +13 -0
  533. data/db/migrate/20140818202120_add_has_didactic_content_to_tasks.rb +5 -0
  534. data/db/migrate/20140821184357_add_is_scheduled_to_activities.rb +5 -0
  535. data/db/migrate/20140902204337_create_event_capture_events.event_capture.rb +14 -0
  536. data/db/migrate/20140903134021_add_participant_id_to_events.rb +23 -0
  537. data/db/migrate/20141027181511_add_phone_number_to_participant.rb +5 -0
  538. data/db/migrate/20141027181539_add_contact_status_to_participant.rb +5 -0
  539. data/db/migrate/20141110190545_create_site_messages.rb +29 -0
  540. data/db/migrate/20141121152018_create_arms.rb +8 -0
  541. data/db/migrate/20141121201238_add_arm_id_to_groups.rb +5 -0
  542. data/db/migrate/20141125194600_add_null_false_to_arms.rb +6 -0
  543. data/db/migrate/20141125202627_add_null_false_to_columns_and_associate_arm_group_join_arm_ids_to_groups.rb +5 -0
  544. data/db/migrate/20141201154255_add_arm_id_to_bit_core_tools.rb +9 -0
  545. data/db/migrate/20141201165610_change_column_bit_core_tools_arm_id_to_null.rb +5 -0
  546. data/db/migrate/20141202133320_remove_position_unique_constraint_from_tool.rb +21 -0
  547. data/db/migrate/20141202173321_add_arm_id_to_bit_core_slideshows.rb +5 -0
  548. data/db/migrate/20141202173458_change_column_bit_core_slideshows_to_null_false.rb +38 -0
  549. data/db/migrate/20141211140747_add_is_admin_.textClipping +0 -0
  550. data/db/migrate/20141211140747_add_is_admin_to_participants.rb +5 -0
  551. data/db/migrate/20141214203919_add_has_woz_to_arm.rb +5 -0
  552. data/db/migrate/20141222222717_change_default_contact_preference.rb +5 -0
  553. data/db/migrate/20150107183443_add_is_positive_to_emotion.rb +6 -0
  554. data/db/migrate/20150107192208_remove_is_positive_from_emotion.rb +5 -0
  555. data/db/migrate/20150107192402_add_is_positive_to_emotional_rating.rb +5 -0
  556. data/db/migrate/20150127204928_add_is_complete_to_membership.rb +5 -0
  557. data/db/migrate/20150127204950_add_is_stepped_to_membership.rb +5 -0
  558. data/db/migrate/20150128151059_change_is_stepped_membership_to_not_allow_null.rb +5 -0
  559. data/db/migrate/20150128151231_change_is_complete_membership_to_not_allow_null.rb +5 -0
  560. data/db/migrate/20150128151515_data_migration_add_values_for_is_stepped_and_is_complete.rb +11 -0
  561. data/db/migrate/20150128192928_destroy_invalid_task_statuses.rb +14 -0
  562. data/db/migrate/20150129160122_add_description_to_tools.rb +5 -0
  563. data/db/migrate/20150130160818_add_type_to_tools.bit_core.rb +6 -0
  564. data/db/migrate/20150130161629_convert_messages_tool_type.rb +7 -0
  565. data/db/migrate/20150130173324_convert_home_tool_type.rb +7 -0
  566. data/db/migrate/20150130185412_convert_learn_tool_type.rb +7 -0
  567. data/db/migrate/20150131200718_add_is_viz_to_content_modules.bit_core.rb +6 -0
  568. data/db/migrate/20150131201021_add_is_viz_flag_to_modules.rb +9 -0
  569. data/db/migrate/20150202203359_update_tool_type_columns.rb +23 -0
  570. data/db/migrate/20150202215540_fix_module_viz_columns.rb +9 -0
  571. data/db/migrate/20150202232642_prevent_null_membership_dates.rb +6 -0
  572. data/db/migrate/20150206221439_create_wai_assessments.rb +52 -0
  573. data/db/migrate/20150209195004_create_think_feel_do_engine_media_access_events.rb +12 -0
  574. data/db/migrate/20150209212556_add_stepped_on_column_to_memberships.rb +10 -0
  575. data/db/migrate/20150209213422_remove_is_stepped_column_from_memberships.rb +5 -0
  576. data/db/migrate/20150210142824_destroy_invalid_messages.rb +5 -0
  577. data/db/migrate/20150210153608_add_slide_reference_to_media_access_events.rb +8 -0
  578. data/db/migrate/20150210161100_add_missing_constraints.rb +43 -0
  579. data/db/migrate/20150210163220_add_fk_constraints_to_media_access_events.rb +21 -0
  580. data/db/migrate/20150210164226_add_slide_fk_contstraint_to_media_access_events.rb +21 -0
  581. data/db/migrate/20150210165021_add_tool_constraint.bit_core.rb +26 -0
  582. data/db/migrate/20150218184531_add_has_table_of_contents_to_slideshows.rb +9 -0
  583. data/db/migrate/20150225221700_add_is_reviewed_to_activities.rb +5 -0
  584. data/db/migrate/20150226210641_remove_is_monitored_from_activities.rb +5 -0
  585. data/db/migrate/20150227221640_remove_is_complete_from_activities.rb +5 -0
  586. data/db/migrate/20150302155709_remove_is_scheduled_from_activities.rb +5 -0
  587. data/db/migrate/20150307182155_create_available_content_modules_view.rb +46 -0
  588. data/db/migrate/20150310171015_update_available_content_modules_view.rb +48 -0
  589. data/db/migrate/20150410174157_add_can_message_after_membership_complete_to_arms.rb +5 -0
  590. data/db/migrate/20150410175659_populate_arm_message_flag.rb +7 -0
  591. data/db/migrate/20150810204045_nullify_empty_thoughts_columns.rb +15 -0
  592. data/db/migrate/20150903210028_add_relase_day_not_null_constraint_to_trask.rb +5 -0
  593. data/db/migrate/20151104152804_update_think_tool_type_to_tools_think.rb +9 -0
  594. data/lib/tasks/lesson_notifications.rake +66 -0
  595. data/lib/tasks/seed.rake +30 -0
  596. data/lib/tasks/think_feel_do_engine_tasks.rake +4 -0
  597. data/lib/think_feel_do_engine.rb +16 -0
  598. data/lib/think_feel_do_engine/engine.rb +16 -0
  599. data/lib/think_feel_do_engine/version.rb +4 -0
  600. data/vendor/assets/images/jplayer.blue.monday.jpg +0 -0
  601. data/vendor/assets/images/jplayer.blue.monday.seeking.gif +0 -0
  602. data/vendor/assets/images/jplayer.blue.monday.video.play.png +0 -0
  603. data/vendor/assets/javascripts/bootstrap-markdown.js +1347 -0
  604. data/vendor/assets/javascripts/bootstrap-timepicker.js +1097 -0
  605. data/vendor/assets/javascripts/d3.min.js +5 -0
  606. data/vendor/assets/javascripts/froogaloop.min.js +4 -0
  607. data/vendor/assets/javascripts/jplayer.2.9.2.min.js +1 -0
  608. data/vendor/assets/javascripts/moment.min.js +6 -0
  609. data/vendor/assets/javascripts/snap.js +568 -0
  610. data/vendor/assets/stylesheets/bootstrap-timepicker.min.css +10 -0
  611. data/vendor/assets/stylesheets/jplayer.blue.monday.css.scss +630 -0
  612. data/vendor/assets/stylesheets/snap.css.scss +80 -0
  613. metadata +949 -0
@@ -0,0 +1,6 @@
1
+ # Represents a single Participant authentication event.
2
+ class ParticipantLoginEvent < ActiveRecord::Base
3
+ belongs_to :participant
4
+
5
+ validates :participant, presence: true
6
+ end
@@ -0,0 +1,32 @@
1
+ require "securerandom"
2
+
3
+ # Associates a Participant with an action on a date and provides an obfuscated
4
+ # token representation.
5
+ class ParticipantToken < ActiveRecord::Base
6
+ TYPES = %w( phq9 wai )
7
+ TOKEN_LENGTH = 10
8
+
9
+ belongs_to :participant
10
+
11
+ validates :participant, :token, :token_type, presence: true
12
+ validates :token, uniqueness: { scope: :participant_id }
13
+ validates :token_type, presence: { in: TYPES }
14
+
15
+ before_validation :make_token
16
+
17
+ def to_s
18
+ token
19
+ end
20
+
21
+ def others_on_this_day
22
+ self.class.where(participant_id: participant_id,
23
+ release_date: release_date)
24
+ .where.not(id: id)
25
+ end
26
+
27
+ private
28
+
29
+ def make_token
30
+ self.token = SecureRandom.hex(TOKEN_LENGTH)
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ # Collected responses from one Participant PHQ-9 assessment session.
2
+ class PhqAssessment < ActiveRecord::Base
3
+ MIN_QUESTION_SCORE = 0
4
+ MAX_QUESTION_SCORE = 3
5
+ QUESTION_ATTRIBUTES = :q1, :q2, :q3, :q4, :q5, :q6, :q7, :q8, :q9
6
+ SUICIDAL_SCORE = 3
7
+
8
+ belongs_to :participant
9
+
10
+ validates :participant, :release_date, presence: true
11
+ validates :release_date, uniqueness: { scope: :participant_id }
12
+ validate :scores_valid
13
+
14
+ scope :recenty_released, -> { order(release_date: :desc) }
15
+
16
+ def self.most_recent
17
+ recenty_released.first
18
+ end
19
+
20
+ def answered_questions
21
+ @answered_questions ||= remove_nils
22
+ end
23
+
24
+ def completed?
25
+ number_answered == QUESTION_ATTRIBUTES.count
26
+ end
27
+
28
+ def number_answered
29
+ answered_questions.count
30
+ end
31
+
32
+ def score
33
+ answered_questions.inject(:+)
34
+ end
35
+
36
+ def suicidal?
37
+ q9 == SUICIDAL_SCORE
38
+ end
39
+
40
+ private
41
+
42
+ def remove_nils
43
+ QUESTION_ATTRIBUTES.map { |answer| self[answer] }.compact
44
+ end
45
+
46
+ def scores_valid
47
+ return unless number_answered > 0
48
+
49
+ if answered_questions.min < MIN_QUESTION_SCORE ||
50
+ answered_questions.max > MAX_QUESTION_SCORE
51
+ errors.add(:base, "scores must be between #{ MIN_QUESTION_SCORE } " \
52
+ "and #{ MAX_QUESTION_SCORE } inclusive")
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,325 @@
1
+ # Stepping suggestion based on Participant PHQ-9 results.
2
+ #
3
+ # An explanation of the algorithm:
4
+ #
5
+ # Weeks 4 - 8
6
+ # If PHQ-9 >= 17 at two consecutive weeks, then "step" t-CBT
7
+ # If PHQ-9 < 17 at Week 5-8, then "stay" i-CBT
8
+ # If PHQ-9 < 5 at two consecutive weeks, schedule "post-engagement" coach call
9
+ # Week 9-13
10
+ # If PHQ-9 >= 13 at two consecutive weeks, then "step" t-CBT
11
+ # If PHQ-9 < 13 and >= 5 at Week 10-13, then "stay" i-CBT
12
+ # If PHQ-9 < 5 at two consecutive weeks, schedule "post-engagement" coach call
13
+ # Week 14-20
14
+ # If PHQ-9 >= 10 at two consecutive weeks, then "step" t-CBT
15
+ # If PHQ-9 < 10 and >= 5, then "stay" i-CBT
16
+ # If PHQ-9 < 5 at two consecutive weeks, schedule "post-engagement" coach call
17
+ class PhqStepping
18
+ DANGER_LABEL = "danger"
19
+ SUCCESS_LABEL = "success"
20
+ WARNING_LABEL = "warning"
21
+ NO_SUGGESTION = "No"
22
+ YES_SUGGESTION = "YES"
23
+ MAX_NUM_OF_MISSING_RESPONSES = 3
24
+ LAST_WEEK_BEFORE_STEPPING = 3
25
+
26
+ DEFAULT_PERIOD_DISCONTINUE_CUTOFF = 0
27
+
28
+ FIRST_PERIOD_STEPPING_WEEK = 4
29
+ FIRST_PERIOD_DISCONTINUE_CUTOFF = 5
30
+ FIRST_PERIOD_STEPPING_CUTOFF = 17
31
+
32
+ SECOND_PERIOD_STEPPING_WEEK = 9
33
+ SECOND_PERIOD_STEPPING_CUTOFF = 13
34
+
35
+ attr_accessor :assessments, :week, :urgency, :suggestion,
36
+ :detailed_suggestion, :step, :stay, :release, :range_start
37
+
38
+ # assessments = [{date => score},{date => score}, ... ]
39
+ def initialize(assessments, study_start_date)
40
+ set_initial_values(assessments, study_start_date)
41
+ return unless set_phq_score_ranges
42
+ return unless prep_data_for_validation
43
+ # Return if the data is unreliable, the coach needs to consult
44
+ # and cannot use the automatic algorithm
45
+ return unless validate_data_reliability
46
+ # Most important test, the outcome determines whether to step
47
+ # priority over other tests
48
+ @step = consecutive_high_weeks?
49
+ return if @step
50
+ # At this point either way it has to be "No" (Don't step)
51
+ @urgency = SUCCESS_LABEL
52
+ # Least important test, if this returns true nothing is changed
53
+ @stay = mid_range_scores?
54
+ # Adds to test_range; if this returns true we suggest the coach look at
55
+ # post engagement options.
56
+ @release = consecutive_low_weeks?
57
+ end
58
+
59
+ def results
60
+ { step?: @step, stay?: @stay, release?: @release, upper_limit: @upper_limit,
61
+ lower_limit: @lower_limit, current_week: @week, range_start: @range_start
62
+ }
63
+ end
64
+
65
+ private
66
+
67
+ def set_initial_values(assessments, study_start_date)
68
+ @weeks_range = []
69
+ @skip_flag = [false]
70
+ @assessments = assessments
71
+ @study_start_date = study_start_date
72
+ @week = ((Date.current + 1 - study_start_date).days / 1.week).ceil
73
+ @upper_limit = FIRST_PERIOD_STEPPING_CUTOFF
74
+ @upper_prev_limit = FIRST_PERIOD_STEPPING_CUTOFF
75
+ @lower_limit = DEFAULT_PERIOD_DISCONTINUE_CUTOFF
76
+ @range_start = calc_range_start
77
+ @edge_week = (@week == @range_start)
78
+ @urgency = DANGER_LABEL
79
+ @suggestion = "#{YES_SUGGESTION}*"
80
+ @detailed_suggestion = "No assessments passed to the algorithm. "\
81
+ "An error may have occurred"
82
+ end
83
+
84
+ def calc_range_start
85
+ if @week < SECOND_PERIOD_STEPPING_WEEK
86
+ FIRST_PERIOD_STEPPING_WEEK
87
+ else
88
+ SECOND_PERIOD_STEPPING_WEEK
89
+ end
90
+ end
91
+
92
+ def validate_data_reliability
93
+ if @assessments.any? do |assessment|
94
+ assessment.missing_answers_count > MAX_NUM_OF_MISSING_RESPONSES
95
+ end
96
+ @urgency = WARNING_LABEL
97
+ @suggestion = "Consult - Missing Data"
98
+ @detailed_suggestion = "One or more assessments are missing more "\
99
+ "than than three answers. Stepping should "\
100
+ "be determined via consultation instead."
101
+ false
102
+ else
103
+ true
104
+ end
105
+ end
106
+
107
+ def set_phq_score_ranges
108
+ if @week < FIRST_PERIOD_STEPPING_WEEK
109
+ @urgency = WARNING_LABEL
110
+ @suggestion = "#{NO_SUGGESTION}; Too Early"
111
+ @detailed_suggestion = "Stay on i-CBT; Too early to determine stepping."
112
+ return false
113
+ elsif @week < SECOND_PERIOD_STEPPING_WEEK
114
+ @upper_limit = FIRST_PERIOD_STEPPING_CUTOFF
115
+ @lower_limit = FIRST_PERIOD_DISCONTINUE_CUTOFF
116
+ else
117
+ @upper_limit = SECOND_PERIOD_STEPPING_CUTOFF
118
+ @lower_limit = FIRST_PERIOD_DISCONTINUE_CUTOFF
119
+ end
120
+ true
121
+ end
122
+
123
+ def assessments_exist?
124
+ if @assessments.nil? || @assessments.empty?
125
+ @urgency = DANGER_LABEL
126
+ @suggestion = "#{YES_SUGGESTION}*"
127
+ @detailed_suggestion = "No assessments passed to the algorithm. "\
128
+ "An error may have occurred"
129
+ return false
130
+ end
131
+ true
132
+ end
133
+
134
+ def copy_previous_assessment(to_copy, target_week)
135
+ date_offset = (target_week - to_copy.week_of_assessment).weeks
136
+ copy = PhqSteppingAssessment.new(
137
+ to_copy.date + date_offset,
138
+ to_copy.score,
139
+ @study_start_date,
140
+ target_week
141
+ )
142
+ copy.missing_answers_count = to_copy.missing_answers_count
143
+ @assessments.push(copy)
144
+ end
145
+
146
+ def sort_assessments
147
+ @assessments.sort! do |a, b|
148
+ a.week_of_assessment.to_i <=> b.week_of_assessment.to_i
149
+ end
150
+ end
151
+
152
+ def filter_assessments(start)
153
+ if start == @week
154
+ start -= 1
155
+ end
156
+ @assessments.select! do |assessment|
157
+ assessment.week_of_assessment.to_i >= start &&
158
+ assessment.week_of_assessment.to_i <= @week
159
+ end
160
+ end
161
+
162
+ def get_assessment_by_week(week)
163
+ found = @assessments.select do |assessment|
164
+ assessment.week_of_assessment.to_i == week
165
+ end
166
+ found ? found[0] : false
167
+ end
168
+
169
+ def assessment_on_week_exists?(week)
170
+ !get_assessment_by_week(week).nil?
171
+ end
172
+
173
+ def prep_data_for_validation
174
+ # Convert the hash of date => score into an easily queried array of objects
175
+ return false unless assessments_exist?
176
+ @assessments = PhqSteppingAssessment
177
+ .convert_from_hash(@assessments, @study_start_date)
178
+ # Handle filling in missing phq assessment data
179
+ unless build_complete_record
180
+ @urgency = "danger"
181
+ @suggestion = "#{YES_SUGGESTION}*"
182
+ @detailed_suggestion = "Patient has no completed assessments until "\
183
+ "after week 3. Stepping algorithm not run; "\
184
+ "please use discretion."
185
+ sort_assessments
186
+ return false
187
+ end
188
+ true
189
+ end
190
+
191
+ def fill_in_missing_assessments
192
+ i = @range_start
193
+ while i <= @week
194
+ unless assessment_on_week_exists?(i)
195
+ copy_previous_assessment(get_assessment_by_week(i - 1), i)
196
+ end
197
+ i += 1
198
+ end
199
+ sort_assessments
200
+ end
201
+
202
+ def fill_in_missing_unknown_assessments
203
+ first_assessment = @assessments.first
204
+ while first_assessment.week_of_assessment.to_i >= LAST_WEEK_BEFORE_STEPPING
205
+ first_assessment = PhqSteppingAssessment.new(
206
+ first_assessment.date - 1.week,
207
+ "Unknown",
208
+ @study_start_date,
209
+ (first_assessment.week_of_assessment.to_i - 1),
210
+ true
211
+ )
212
+ @assessments.push(first_assessment)
213
+ end
214
+ end
215
+
216
+ def fill_in_initial_week
217
+ previous_assessments = @assessments.select do |assessment|
218
+ assessment.week_of_assessment.to_i < @range_start
219
+ end
220
+ copy_score_from = previous_assessments.max_by(&:week_of_assessment)
221
+ unless assessment_on_week_exists?(@range_start)
222
+ copy_previous_assessment(copy_score_from, @range_start)
223
+ end
224
+ if @edge_week
225
+ range_for_this_period = @range_start
226
+ @range_start = copy_score_from.week_of_assessment
227
+ fill_in_missing_assessments
228
+ @range_start = range_for_this_period
229
+ end
230
+ end
231
+
232
+ def previous_data_to_infer_from?
233
+ unless @assessments.any? do |assessment|
234
+ assessment
235
+ .week_of_assessment
236
+ .to_i < FIRST_PERIOD_STEPPING_WEEK
237
+ end
238
+ sort_assessments
239
+ fill_in_missing_unknown_assessments
240
+ fallback_range = @range_start
241
+ @range_start = LAST_WEEK_BEFORE_STEPPING
242
+ fill_in_missing_assessments
243
+ @range_start = fallback_range
244
+ filter_assessments(@range_start)
245
+ return false
246
+ end
247
+ true
248
+ end
249
+
250
+ def build_complete_record
251
+ return false unless previous_data_to_infer_from?
252
+ # Prep this period (week 4 - 8, 9-13, 14+)
253
+ # by making sure at least the start date has an associated assessment
254
+ fill_in_initial_week
255
+ filter_assessments(@range_start)
256
+ sort_assessments
257
+ fill_in_missing_assessments
258
+ true
259
+ end
260
+
261
+ def consecutive_high_weeks?
262
+ prev_score = @assessments.first.score
263
+ @assessments.drop(1).each do |assessment|
264
+ if assessment.score >= @upper_limit &&
265
+ prev_score >= (@edge_week ? @upper_prev_limit : @upper_limit)
266
+ @urgency = DANGER_LABEL
267
+ @suggestion = YES_SUGGESTION
268
+ @detailed_suggestion = "Step to t-CBT"
269
+ @step = true
270
+ return @step
271
+ end
272
+ prev_score = assessment.score
273
+ end
274
+
275
+ @step = false
276
+ end
277
+
278
+ def set_up_mid_range
279
+ if @edge_week
280
+ @suggestion = "#{NO_SUGGESTION}*"
281
+ @detailed_suggestion = "Stay on i-CBT; "\
282
+ "Using data from last period as well"
283
+ return false
284
+ end
285
+ @assessments_subset = @assessments.select do |assessment|
286
+ assessment.week_of_assessment.to_i >= subset_from
287
+ end
288
+ true
289
+ end
290
+
291
+ def subset_from
292
+ if @week < SECOND_PERIOD_STEPPING_WEEK
293
+ FIRST_PERIOD_STEPPING_WEEK
294
+ else
295
+ SECOND_PERIOD_STEPPING_WEEK
296
+ end
297
+ end
298
+
299
+ def mid_range_scores?
300
+ return nil unless set_up_mid_range
301
+ if @assessments_subset.any? do |assessment|
302
+ assessment.score >= @lower_limit &&
303
+ assessment.score < @upper_limit
304
+ end
305
+ @suggestion = NO_SUGGESTION
306
+ @detailed_suggestion = "Stay on i-CBT"
307
+ return true
308
+ end
309
+ false
310
+ end
311
+
312
+ def consecutive_low_weeks?
313
+ prev_score = @assessments.first.score
314
+ @assessments.drop(1).each do |assessment|
315
+ if assessment.score < FIRST_PERIOD_DISCONTINUE_CUTOFF &&
316
+ prev_score < FIRST_PERIOD_DISCONTINUE_CUTOFF
317
+ @suggestion = "#{NO_SUGGESTION} - Low Scores"
318
+ @detailed_suggestion = "Stay on i-CBT or schedule post engagement call"
319
+ return true
320
+ end
321
+ prev_score = assessment.score
322
+ end
323
+ false
324
+ end
325
+ end
@@ -0,0 +1,96 @@
1
+ # PHQ-9 Stepping Assessment in a well-formatted testable object
2
+ class PhqSteppingAssessment
3
+ attr_accessor :date, :score, :week_of_assessment,
4
+ :missing_but_copied, :missing_with_no_fallback,
5
+ :missing_answers_count
6
+
7
+ def initialize(*args)
8
+ # [0]date, [1]score, [2]study_start_date, [3]week_of_assessment
9
+ # (when copying), [4]missing-no fallback boolean,
10
+ # [5]the entire assessment object (first call from table)
11
+ @date = args[0]
12
+ @score = args[1]
13
+ if args[3].nil?
14
+ @week_of_assessment = find_week_of_assessment(args[2])
15
+ else
16
+ @week_of_assessment = args[3]
17
+ end
18
+ @missing_but_copied = (!args[3].nil?) ? args[4].nil? : false
19
+ @missing_with_no_fallback = (!args[4].nil?) ? args[4] : false
20
+ missing_answers_count = false
21
+ unless args[5].nil?
22
+ missing_answers_count = fill_in_unanswered_questions(args[5])
23
+ end
24
+ @missing_answers_count = (!args[5].nil?) ? missing_answers_count : 0
25
+ end
26
+
27
+ def self.convert_from_score(hash, study_start_date)
28
+ converted_array = []
29
+ hash.each do |date, score|
30
+ converted_array.push(PhqSteppingAssessment.new(
31
+ date,
32
+ score,
33
+ study_start_date
34
+ )
35
+ )
36
+ end
37
+ converted_array
38
+ end
39
+
40
+ def self.convert_from_assessment_objects(hash, study_start_date)
41
+ converted_array = []
42
+ hash.each do |date, assessment|
43
+ converted_array.push(PhqSteppingAssessment.new(
44
+ date,
45
+ assessment.score,
46
+ study_start_date,
47
+ nil,
48
+ false,
49
+ assessment
50
+ )
51
+ )
52
+ end
53
+ converted_array
54
+ end
55
+
56
+ def self.convert_from_hash(hash, study_start_date)
57
+ assessment_array = []
58
+ if hash.first[1].is_a? Fixnum
59
+ # Insert an assessment without being concerned about missing
60
+ # values. Helpful for testing and for inserting copied
61
+ # assessment data.
62
+ assessment_array = convert_from_score(hash, study_start_date)
63
+ else
64
+ assessment_array = convert_from_assessment_objects(hash, study_start_date)
65
+ end
66
+ assessment_array
67
+ end
68
+
69
+ private
70
+
71
+ def fill_in_missing_value(question)
72
+ (question.nil?) ? 1.5 : question
73
+ end
74
+
75
+ def fill_in_unanswered_questions(assessment)
76
+ missing_count = 9 - assessment.number_answered
77
+ return 0 if missing_count == 0
78
+ score = fill_in_missing_value(assessment.q1)
79
+ score += fill_in_missing_value(assessment.q2)
80
+ score += fill_in_missing_value(assessment.q3)
81
+ score += fill_in_missing_value(assessment.q4)
82
+ score += fill_in_missing_value(assessment.q5)
83
+ score += fill_in_missing_value(assessment.q6)
84
+ score += fill_in_missing_value(assessment.q7)
85
+ score += fill_in_missing_value(assessment.q8)
86
+ score += fill_in_missing_value(assessment.q9)
87
+ @score = score
88
+ missing_count
89
+ end
90
+
91
+ # Assessments are always made available on the same day of the
92
+ # week, starting on week 2 of study enrollment.
93
+ def find_week_of_assessment(study_start_date)
94
+ ((@date - study_start_date).days / 1.week).floor + 1
95
+ end
96
+ end