think_feel_do_engine 3.19.9 → 3.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +11 -3
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/javascripts/think_feel_do_engine/activities/activity_tracker.js +3 -2
- data/app/controllers/think_feel_do_engine/application_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/bit_maker/content_modules_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/bit_maker/content_providers_controller.rb +2 -1
- data/app/controllers/think_feel_do_engine/bit_maker/slides_controller.rb +7 -5
- data/app/controllers/think_feel_do_engine/bit_maker/slideshow_anchors_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/bit_maker/slideshows_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/group_dashboard_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/memberships_controller.rb +7 -4
- data/app/controllers/think_feel_do_engine/coach/messages_controller.rb +2 -1
- data/app/controllers/think_feel_do_engine/coach/participant_activities_visualizations_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/participant_thoughts_visualizations_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/patient_dashboards_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/phq_assessments_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/received_messages_controller.rb +2 -1
- data/app/controllers/think_feel_do_engine/coach/sent_messages_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/site_messages_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach_dashboard_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/concerns/browser_detective.rb +13 -12
- data/app/controllers/think_feel_do_engine/concerns/invalid_auth_token.rb +1 -0
- data/app/controllers/think_feel_do_engine/concerns/navigator_enabled.rb +1 -0
- data/app/controllers/think_feel_do_engine/keep_alive_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/lesson_slides_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/lessons_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/manage/groups_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/manage/tasks_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/memberships_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/navigator_controller.rb +7 -4
- data/app/controllers/think_feel_do_engine/participant_data_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/participants/activities_controller.rb +8 -11
- data/app/controllers/think_feel_do_engine/participants/assessments_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/participants/lessons_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/participants/media_access_events_controller.rb +3 -3
- data/app/controllers/think_feel_do_engine/participants/passwords_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/participants/public_slides_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/participants/sessions_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/participants/thoughts_controller.rb +4 -5
- data/app/controllers/think_feel_do_engine/password_entropy_bits_controller.rb +3 -1
- data/app/controllers/think_feel_do_engine/privacy_policies_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/quick_sign_ins_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/users/passwords_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/users/registrations_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/users/sessions_controller.rb +1 -0
- data/app/helpers/think_feel_do_engine/activities_helper.rb +2 -1
- data/app/helpers/think_feel_do_engine/application_helper.rb +2 -1
- data/app/helpers/think_feel_do_engine/brand_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/coach/activity_color_code_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/coach/dashboard_and_phq_table_helper.rb +6 -5
- data/app/helpers/think_feel_do_engine/coach/group_dashboard_helper.rb +5 -3
- data/app/helpers/think_feel_do_engine/coach/messages_helper.rb +3 -1
- data/app/helpers/think_feel_do_engine/coach/moods_and_phq_viz_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/coach/patient_dashboard_helper.rb +9 -8
- data/app/helpers/think_feel_do_engine/emotions_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/phq_assessment_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/presenters_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/slides_helper.rb +5 -2
- data/app/helpers/think_feel_do_engine/tasks_helper.rb +11 -9
- data/app/mailers/think_feel_do_engine/lesson_notification_mailer.rb +5 -2
- data/app/mailers/think_feel_do_engine/message_notifications.rb +1 -0
- data/app/mailers/think_feel_do_engine/site_message_mailer.rb +3 -1
- data/app/models/ability.rb +1 -0
- data/app/models/activity.rb +21 -10
- data/app/models/activity_type.rb +1 -0
- data/app/models/arm.rb +2 -2
- data/app/models/arm_validator.rb +3 -1
- data/app/models/available_content_module.rb +6 -2
- data/app/models/awake_period.rb +1 -0
- data/app/models/bit_core/slide_observer.rb +1 -0
- data/app/models/coach_assignment.rb +1 -0
- data/app/models/concerns/accessibility.rb +1 -0
- data/app/models/concerns/copier.rb +25 -17
- data/app/models/content_modules/lesson_module.rb +6 -5
- data/app/models/content_modules.rb +3 -2
- data/app/models/content_provider_decorator.rb +1 -0
- data/app/models/content_provider_policy.rb +1 -0
- data/app/models/content_providers/accomplished_activity_index_provider.rb +1 -0
- data/app/models/content_providers/activity_index_provider.rb +1 -0
- data/app/models/content_providers/augmented_thoughts_table_provider.rb +1 -0
- data/app/models/content_providers/awake_period_form.rb +1 -0
- data/app/models/content_providers/create_activity.rb +4 -3
- data/app/models/content_providers/edit_past_feel_provider.rb +1 -0
- data/app/models/content_providers/evaluate_thoughts_provider.rb +1 -0
- data/app/models/content_providers/fun_activity_checklist.rb +5 -4
- data/app/models/content_providers/harmful_thoughts_edit_form_provider.rb +1 -0
- data/app/models/content_providers/helpful_thoughts_index_provider.rb +1 -0
- data/app/models/content_providers/important_activity_checklist.rb +5 -4
- data/app/models/content_providers/index_past_feel_provider.rb +1 -0
- data/app/models/content_providers/input_new_activity_form.rb +1 -0
- data/app/models/content_providers/learn_lessons_index_provider.rb +5 -4
- data/app/models/content_providers/messages_index_provider.rb +2 -1
- data/app/models/content_providers/module_index_provider.rb +1 -0
- data/app/models/content_providers/new_complete_thought_form_provider.rb +1 -0
- data/app/models/content_providers/new_current_emotion_provider.rb +1 -0
- data/app/models/content_providers/new_current_feel_provider.rb +1 -0
- data/app/models/content_providers/new_harmful_thought_form_provider.rb +1 -0
- data/app/models/content_providers/new_message_form_provider.rb +1 -0
- data/app/models/content_providers/new_past_feel_provider.rb +1 -0
- data/app/models/content_providers/new_thought_form_provider.rb +1 -0
- data/app/models/content_providers/new_thoughts_form_provider.rb +1 -0
- data/app/models/content_providers/past_activity_form.rb +1 -0
- data/app/models/content_providers/past_activity_review_form.rb +1 -0
- data/app/models/content_providers/past_due_activities_viz.rb +1 -0
- data/app/models/content_providers/pleasurable_activity_index_provider.rb +1 -0
- data/app/models/content_providers/previous_planned_activities_provider.rb +1 -0
- data/app/models/content_providers/random_slide_provider.rb +1 -0
- data/app/models/content_providers/show_message_provider.rb +5 -3
- data/app/models/content_providers/thought_patterns_index_provider.rb +1 -0
- data/app/models/content_providers/thoughts_distortion_viz_provider.rb +1 -0
- data/app/models/content_providers/thoughts_table_provider.rb +1 -0
- data/app/models/content_providers/unhelpful_thoughts_list_provider.rb +5 -2
- data/app/models/content_providers/unhelpful_thoughts_reflection_provider.rb +1 -0
- data/app/models/content_providers/unplanned_activity_form.rb +1 -0
- data/app/models/content_providers/your_activities_provider.rb +4 -2
- data/app/models/delivered_message.rb +3 -1
- data/app/models/emotion.rb +3 -2
- data/app/models/emotional_rating.rb +1 -0
- data/app/models/engagement.rb +1 -0
- data/app/models/group.rb +2 -1
- data/app/models/group_metrics/weekly_activities_count.rb +1 -0
- data/app/models/group_metrics/weekly_comments_count.rb +1 -0
- data/app/models/group_metrics/weekly_count.rb +1 -0
- data/app/models/group_metrics/weekly_goals_count.rb +1 -0
- data/app/models/group_metrics/weekly_likes_count.rb +1 -0
- data/app/models/group_metrics/weekly_logins_count.rb +1 -0
- data/app/models/group_metrics/weekly_on_the_mind_statements_count.rb +1 -0
- data/app/models/group_metrics/weekly_thoughts_count.rb +1 -0
- data/app/models/media_access_event.rb +1 -0
- data/app/models/membership.rb +5 -3
- data/app/models/message.rb +1 -0
- data/app/models/message_sms_notification.rb +3 -1
- data/app/models/mood.rb +3 -1
- data/app/models/participant.rb +2 -1
- data/app/models/participant_login_event.rb +1 -0
- data/app/models/participant_metrics/weekly_count.rb +1 -0
- data/app/models/participant_metrics/weekly_logins_count.rb +1 -0
- data/app/models/participant_token.rb +3 -2
- data/app/models/phq_assessment.rb +3 -0
- data/app/models/phq_stepping.rb +5 -4
- data/app/models/phq_stepping_assessment.rb +12 -13
- data/app/models/planned_activity.rb +1 -0
- data/app/models/roles/clinician.rb +1 -0
- data/app/models/roles/content_author.rb +1 -0
- data/app/models/roles/researcher.rb +1 -0
- data/app/models/site_message.rb +1 -0
- data/app/models/slideshow_anchor.rb +2 -1
- data/app/models/task.rb +3 -1
- data/app/models/task_status.rb +4 -2
- data/app/models/think_feel_do_engine/addressable.rb +1 -0
- data/app/models/think_feel_do_engine/concerns/validate_password.rb +1 -0
- data/app/models/think_feel_do_engine/password_validator.rb +3 -1
- data/app/models/think_feel_do_engine/reports/emotional_rating.rb +1 -0
- data/app/models/think_feel_do_engine/reports/event.rb +3 -2
- data/app/models/think_feel_do_engine/reports/lesson_module.rb +4 -3
- data/app/models/think_feel_do_engine/reports/lesson_slide_view.rb +1 -0
- data/app/models/think_feel_do_engine/reports/lesson_viewing.rb +9 -8
- data/app/models/think_feel_do_engine/reports/login.rb +1 -0
- data/app/models/think_feel_do_engine/reports/messaging.rb +2 -1
- data/app/models/think_feel_do_engine/reports/module_page_view.rb +1 -0
- data/app/models/think_feel_do_engine/reports/module_session.rb +6 -5
- data/app/models/think_feel_do_engine/reports/patient_activity.rb +1 -0
- data/app/models/think_feel_do_engine/reports/patient_thought.rb +2 -1
- data/app/models/think_feel_do_engine/reports/phq_assessment.rb +1 -0
- data/app/models/think_feel_do_engine/reports/reporter.rb +2 -1
- data/app/models/think_feel_do_engine/reports/site_session.rb +1 -0
- data/app/models/think_feel_do_engine/reports/task_completion.rb +3 -2
- data/app/models/think_feel_do_engine/reports/tool_access.rb +1 -0
- data/app/models/think_feel_do_engine/reports/tool_module.rb +1 -0
- data/app/models/think_feel_do_engine/reports/user_agent.rb +1 -0
- data/app/models/think_feel_do_engine/reports/video_session.rb +1 -0
- data/app/models/think_feel_do_engine/reports/wai_assessment.rb +1 -0
- data/app/models/thought.rb +4 -2
- data/app/models/thought_pattern.rb +1 -0
- data/app/models/tool_nav_item.rb +2 -1
- data/app/models/tools/home.rb +1 -0
- data/app/models/tools/learn.rb +1 -0
- data/app/models/tools/messages.rb +1 -0
- data/app/models/tools/think.rb +1 -0
- data/app/models/unplanned_activities.rb +2 -2
- data/app/models/user.rb +1 -0
- data/app/models/user_role.rb +2 -1
- data/app/models/values/accomplishment.rb +1 -0
- data/app/models/values/emotional_rating.rb +1 -0
- data/app/models/values/mood.rb +1 -0
- data/app/models/values/pleasure.rb +1 -0
- data/app/models/wai_assessment.rb +4 -1
- data/app/presenters/think_feel_do_engine/harmful_thought_viz_presenter.rb +1 -0
- data/app/presenters/think_feel_do_engine/lesson_event/completion_data_presenter.rb +1 -0
- data/app/presenters/think_feel_do_engine/media_access_event_presenter.rb +1 -0
- data/app/support/mood_and_emotion_visualization_service.rb +22 -25
- data/lib/think_feel_do_engine/engine.rb +1 -0
- data/lib/think_feel_do_engine/version.rb +2 -1
- data/lib/think_feel_do_engine.rb +1 -0
- metadata +20 -6
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a form for a Participant to schedule new Activities that have
|
3
4
|
# been fun in the past.
|
@@ -34,9 +35,9 @@ module ContentProviders
|
|
34
35
|
|
35
36
|
def activities(participant)
|
36
37
|
participant.activities
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
.random
|
39
|
+
.in_the_past
|
40
|
+
.first(5)
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a form for a Participant to schedule new Activities that have
|
3
4
|
# been fun in the past.
|
@@ -34,10 +35,10 @@ module ContentProviders
|
|
34
35
|
|
35
36
|
def activities(participant)
|
36
37
|
participant.activities
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
.pleasurable
|
39
|
+
.random
|
40
|
+
.in_the_past
|
41
|
+
.first(5)
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a checklist of a random set of Activities for a Participant to
|
3
4
|
# plan.
|
@@ -35,10 +36,10 @@ module ContentProviders
|
|
35
36
|
|
36
37
|
def activities(participant)
|
37
38
|
participant.activities
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
.accomplished
|
40
|
+
.random
|
41
|
+
.in_the_past
|
42
|
+
.first(5)
|
42
43
|
end
|
43
44
|
end
|
44
45
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a view of current learning tools: videos and lessons
|
3
4
|
class LearnLessonsIndexProvider < BitCore::ContentProvider
|
@@ -26,8 +27,8 @@ module ContentProviders
|
|
26
27
|
|
27
28
|
def weekly_tasks(participant, membership, app_context)
|
28
29
|
all_tasks = participant.learning_tasks(content_modules(app_context))
|
29
|
-
|
30
|
-
|
30
|
+
.includes(task: :bit_core_content_module)
|
31
|
+
.order("bit_core_content_modules.position")
|
31
32
|
|
32
33
|
(1..week_count).map do |week|
|
33
34
|
{
|
@@ -44,8 +45,8 @@ module ContentProviders
|
|
44
45
|
|
45
46
|
def content_modules(app_context)
|
46
47
|
ContentModules::LessonModule.joins(:tool)
|
47
|
-
|
48
|
-
|
48
|
+
.where("bit_core_tools.title" => app_context)
|
49
|
+
.where.not(id: bit_core_content_module_id)
|
49
50
|
end
|
50
51
|
|
51
52
|
def week_count
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a UI for viewing sent and received Messages.
|
3
4
|
class MessagesIndexProvider < BitCore::ContentProvider
|
@@ -58,7 +59,7 @@ module ContentProviders
|
|
58
59
|
|
59
60
|
def received_messages(participant)
|
60
61
|
participant.received_messages.joins(:message)
|
61
|
-
|
62
|
+
.order("messages.sent_at DESC")
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a view of a sent or received Message.
|
3
4
|
class ShowMessageProvider < BitCore::ContentProvider
|
@@ -25,7 +26,8 @@ module ContentProviders
|
|
25
26
|
)
|
26
27
|
else
|
27
28
|
options.view_context.render(
|
28
|
-
template: "think_feel_do_engine/messages/not_found"
|
29
|
+
template: "think_feel_do_engine/messages/not_found"
|
30
|
+
)
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
@@ -51,10 +53,10 @@ module ContentProviders
|
|
51
53
|
|
52
54
|
received_message =
|
53
55
|
participant.received_messages
|
54
|
-
|
56
|
+
.find_by(message_id: view_context.params[:message_id])
|
55
57
|
sent_message =
|
56
58
|
participant.messages
|
57
|
-
|
59
|
+
.find_by(id: view_context.params[:message_id])
|
58
60
|
|
59
61
|
received_message || sent_message
|
60
62
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Provides a list of a Participant's unhelpful Thoughts.
|
3
4
|
class UnhelpfulThoughtsListProvider < BitCore::ContentProvider
|
@@ -56,11 +57,13 @@ module ContentProviders
|
|
56
57
|
"#{@view.link_to(
|
57
58
|
title_1,
|
58
59
|
@view.navigator_location_path(module_id: module_1.id),
|
59
|
-
style: 'font-size: larger;'
|
60
|
+
style: 'font-size: larger;'
|
61
|
+
)} or use " \
|
60
62
|
"#{@view.link_to(
|
61
63
|
title_2,
|
62
64
|
@view.navigator_location_path(module_id: module_2.id),
|
63
|
-
style: 'font-size: larger;'
|
65
|
+
style: 'font-size: larger;'
|
66
|
+
)} to do multiple steps at once."
|
64
67
|
else
|
65
68
|
report_missing_module
|
66
69
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ContentProviders
|
2
3
|
# Visualizations of participant activities.
|
3
4
|
class YourActivitiesProvider < BitCore::ContentProvider
|
@@ -12,7 +13,7 @@ module ContentProviders
|
|
12
13
|
negative_emotions: negative_emotions(options),
|
13
14
|
positive_emotions: positive_emotions(options),
|
14
15
|
with_actual_ratings: with_actual_ratings(options),
|
15
|
-
dates_with_activities:
|
16
|
+
dates_with_activities: collect_dates_with_activities(options)
|
16
17
|
}
|
17
18
|
)
|
18
19
|
end
|
@@ -78,7 +79,8 @@ module ContentProviders
|
|
78
79
|
|
79
80
|
# dates with scheduled activities formatted for jquery datepicker
|
80
81
|
def collect_dates_with_activities(options)
|
81
|
-
past_activities(options)
|
82
|
+
past_activities(options)
|
83
|
+
.where("start_time <= ?", Time.zone.now)
|
82
84
|
.uniq
|
83
85
|
.map { |activity| activity.start_time.to_date.strftime("%Y-%m-%d") }
|
84
86
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# An instance of a Message sent to a Participant or User.
|
2
3
|
class DeliveredMessage < ActiveRecord::Base
|
3
4
|
include ThinkFeelDoEngine::Addressable
|
@@ -37,7 +38,8 @@ class DeliveredMessage < ActiveRecord::Base
|
|
37
38
|
MessageSmsNotification
|
38
39
|
.new(
|
39
40
|
body: "You have a new #{application_name} message.",
|
40
|
-
phone_number: recipient.phone_number
|
41
|
+
phone_number: recipient.phone_number
|
42
|
+
)
|
41
43
|
.deliver
|
42
44
|
else
|
43
45
|
ThinkFeelDoEngine::MessageNotifications
|
data/app/models/emotion.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Participants rate their emotions a name and intensity
|
2
3
|
class Emotion < ActiveRecord::Base
|
3
4
|
belongs_to :creator, class_name: "Participant"
|
@@ -17,12 +18,12 @@ class Emotion < ActiveRecord::Base
|
|
17
18
|
)
|
18
19
|
end
|
19
20
|
|
20
|
-
private
|
21
|
-
|
22
21
|
def self.normalized_name(n)
|
23
22
|
n.strip.downcase
|
24
23
|
end
|
25
24
|
|
25
|
+
private
|
26
|
+
|
26
27
|
def normalize_name
|
27
28
|
if name.respond_to?(:strip)
|
28
29
|
self.name = self.class.normalized_name(name)
|
data/app/models/engagement.rb
CHANGED
data/app/models/group.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# A set of Participants.
|
2
3
|
class Group < ActiveRecord::Base
|
3
4
|
belongs_to :arm
|
@@ -30,6 +31,6 @@ class Group < ActiveRecord::Base
|
|
30
31
|
|
31
32
|
def non_moderator_memberships
|
32
33
|
memberships.joins(:participant)
|
33
|
-
|
34
|
+
.merge(Participant.not_moderator)
|
34
35
|
end
|
35
36
|
end
|
data/app/models/membership.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# The relationship of a Participant to a Group.
|
2
3
|
class Membership < ActiveRecord::Base
|
3
4
|
AMERICAN_DATE_FMT = "%m/%d/%Y"
|
@@ -178,9 +179,10 @@ class Membership < ActiveRecord::Base
|
|
178
179
|
|
179
180
|
def single_active_membership
|
180
181
|
if Membership.where(participant_id: participant_id)
|
181
|
-
|
182
|
-
|
183
|
-
|
182
|
+
.where("start_date <= ? AND end_date >= ?",
|
183
|
+
end_date, start_date)
|
184
|
+
.where.not(id: id)
|
185
|
+
.exists?
|
184
186
|
errors.add(:base, "There can be only one active membership")
|
185
187
|
end
|
186
188
|
end
|
data/app/models/message.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# SMS notification service for Messages and Notifications sent to Participants.
|
2
3
|
class MessageSmsNotification
|
3
4
|
attr_reader :body, :phone_number
|
@@ -50,6 +51,7 @@ class MessageSmsNotification
|
|
50
51
|
def sms_client
|
51
52
|
@sms_client ||= Twilio::REST::Client.new(
|
52
53
|
config.twilio_account_sid,
|
53
|
-
config.twilio_auth_token
|
54
|
+
config.twilio_auth_token
|
55
|
+
)
|
54
56
|
end
|
55
57
|
end
|
data/app/models/mood.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Participants rate their mood
|
2
3
|
class Mood < ActiveRecord::Base
|
3
4
|
belongs_to :participant
|
@@ -18,7 +19,8 @@ class Mood < ActiveRecord::Base
|
|
18
19
|
scope :last_seven_days, lambda {
|
19
20
|
where(
|
20
21
|
arel_table[:created_at]
|
21
|
-
.gteq(Time.current.advance(days: -7).beginning_of_day)
|
22
|
+
.gteq(Time.current.advance(days: -7).beginning_of_day)
|
23
|
+
)
|
22
24
|
}
|
23
25
|
|
24
26
|
scope :for_day, lambda { |time|
|
data/app/models/participant.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require "devise"
|
2
3
|
|
3
4
|
# A person enrolled in the intervention.
|
@@ -194,7 +195,7 @@ class Participant < ActiveRecord::Base
|
|
194
195
|
|
195
196
|
def learning_tasks(content_modules)
|
196
197
|
active_membership.task_statuses
|
197
|
-
|
198
|
+
.for_content_module_ids(content_modules.map(&:id))
|
198
199
|
end
|
199
200
|
|
200
201
|
def stepping_suggestion
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require "securerandom"
|
2
3
|
|
3
4
|
# Associates a Participant with an action on a date and provides an obfuscated
|
4
5
|
# token representation.
|
5
6
|
class ParticipantToken < ActiveRecord::Base
|
6
|
-
TYPES = %w( phq9 wai )
|
7
|
+
TYPES = %w( phq9 wai ).freeze
|
7
8
|
TOKEN_LENGTH = 10
|
8
9
|
|
9
10
|
belongs_to :participant
|
@@ -21,7 +22,7 @@ class ParticipantToken < ActiveRecord::Base
|
|
21
22
|
def others_on_this_day
|
22
23
|
self.class.where(participant_id: participant_id,
|
23
24
|
release_date: release_date)
|
24
|
-
|
25
|
+
.where.not(id: id)
|
25
26
|
end
|
26
27
|
|
27
28
|
private
|
@@ -1,8 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Collected responses from one Participant PHQ-9 assessment session.
|
2
3
|
class PhqAssessment < ActiveRecord::Base
|
3
4
|
MIN_QUESTION_SCORE = 0
|
4
5
|
MAX_QUESTION_SCORE = 3
|
6
|
+
# rubocop:disable Style/MutableConstant
|
5
7
|
QUESTION_ATTRIBUTES = :q1, :q2, :q3, :q4, :q5, :q6, :q7, :q8, :q9
|
8
|
+
# rubocop:enable Style/MutableConstant
|
6
9
|
SUICIDAL_SCORE = 3
|
7
10
|
|
8
11
|
belongs_to :participant
|
data/app/models/phq_stepping.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Stepping suggestion based on Participant PHQ-9 results.
|
2
3
|
#
|
3
4
|
# An explanation of the algorithm:
|
@@ -58,8 +59,8 @@ class PhqStepping
|
|
58
59
|
|
59
60
|
def results
|
60
61
|
{ step?: @step, stay?: @stay, release?: @release, upper_limit: @upper_limit,
|
61
|
-
lower_limit: @lower_limit, current_week: @week,
|
62
|
-
|
62
|
+
lower_limit: @lower_limit, current_week: @week,
|
63
|
+
range_start: @range_start }
|
63
64
|
end
|
64
65
|
|
65
66
|
private
|
@@ -232,8 +233,8 @@ class PhqStepping
|
|
232
233
|
def previous_data_to_infer_from?
|
233
234
|
unless @assessments.any? do |assessment|
|
234
235
|
assessment
|
235
|
-
|
236
|
-
|
236
|
+
.week_of_assessment
|
237
|
+
.to_i < FIRST_PERIOD_STEPPING_WEEK
|
237
238
|
end
|
238
239
|
sort_assessments
|
239
240
|
fill_in_missing_unknown_assessments
|