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