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 ThinkFeelDoEngine
|
|
2
3
|
# Used to the average in difference between the actual
|
|
3
4
|
# and predicted values of a collection of activities
|
|
@@ -35,7 +36,7 @@ module ThinkFeelDoEngine
|
|
|
35
36
|
def percent_complete(activities)
|
|
36
37
|
if activities.were_planned.count > 0
|
|
37
38
|
(activities.reviewed_and_complete.count.to_f /
|
|
38
|
-
|
|
39
|
+
activities.were_planned.count.to_f * 100
|
|
39
40
|
).round(0).to_s + "%"
|
|
40
41
|
else
|
|
41
42
|
"Not Available"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
# Ensure font awesome icon helpers are available.
|
|
3
4
|
module ApplicationHelper
|
|
@@ -5,7 +6,7 @@ module ThinkFeelDoEngine
|
|
|
5
6
|
|
|
6
7
|
def host_email_link
|
|
7
8
|
host_url = Rails.application.config.action_mailer
|
|
8
|
-
|
|
9
|
+
.default_url_options[:host]
|
|
9
10
|
host_url if host_url
|
|
10
11
|
end
|
|
11
12
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Coach
|
|
3
4
|
# Provides helpers for patient dashboard index and phq9 table
|
|
@@ -42,11 +43,11 @@ module ThinkFeelDoEngine
|
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
def reverse_label_styling(string, na_condition, tf_condition)
|
|
45
|
-
if tf_condition
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
string = if tf_condition
|
|
47
|
+
"danger label-adj_danger"
|
|
48
|
+
else
|
|
49
|
+
"success label-adj_success"
|
|
50
|
+
end
|
|
50
51
|
string = "warning" if na_condition || tf_condition.nil?
|
|
51
52
|
string
|
|
52
53
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Coach
|
|
3
4
|
# Displays navigational information in the form of breadcrumbs
|
|
@@ -69,9 +70,10 @@ module ThinkFeelDoEngine
|
|
|
69
70
|
participant_list = "<ul>"
|
|
70
71
|
participants.each do |participant|
|
|
71
72
|
participant_list +=
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
"<li>#{link_to participant.display_name,
|
|
74
|
+
coach_group_patient_dashboard_path(
|
|
75
|
+
group, participant
|
|
76
|
+
)}</li>" if participant
|
|
75
77
|
end
|
|
76
78
|
participant_list += "</ul>"
|
|
77
79
|
participant_list
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Coach
|
|
3
4
|
# Provides helpers for coach message composition.
|
|
@@ -19,7 +20,8 @@ module ThinkFeelDoEngine
|
|
|
19
20
|
|
|
20
21
|
def insert_intro_slideshow_anchor(options)
|
|
21
22
|
if (slideshow = SlideshowAnchor.fetch(:home_intro))
|
|
22
|
-
path = ThinkFeelDoEngine::Engine
|
|
23
|
+
path = ThinkFeelDoEngine::Engine
|
|
24
|
+
.routes.url_helpers
|
|
23
25
|
.participants_public_slideshow_slide_path(
|
|
24
26
|
slideshow_id: slideshow.id,
|
|
25
27
|
id: slideshow.slides.first.id
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Coach
|
|
3
4
|
# Displays navigational information in the form of breadcrumbs
|
|
@@ -5,7 +6,7 @@ module ThinkFeelDoEngine
|
|
|
5
6
|
VISUALIZATION_CONTROLLERS = [
|
|
6
7
|
"participant_activities_visualizations",
|
|
7
8
|
"participant_thoughts_visualizations"
|
|
8
|
-
]
|
|
9
|
+
].freeze
|
|
9
10
|
|
|
10
11
|
def breadcrumbs
|
|
11
12
|
return unless VISUALIZATION_CONTROLLERS.include?(controller_name)
|
|
@@ -32,20 +33,20 @@ module ThinkFeelDoEngine
|
|
|
32
33
|
participant
|
|
33
34
|
.activities.planned.created_for_day(Time.zone.today).count +
|
|
34
35
|
participant
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
.activities
|
|
37
|
+
.reviewed_and_complete.created_for_day(Time.zone.today).count +
|
|
37
38
|
participant
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
.activities
|
|
40
|
+
.reviewed_and_incomplete.created_for_day(Time.zone.today).count
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
def activities_planned_7_day(participant)
|
|
43
44
|
participant.activities
|
|
44
|
-
|
|
45
|
+
.planned.created_last_seven_days.count +
|
|
45
46
|
participant.activities
|
|
46
|
-
|
|
47
|
+
.reviewed_and_complete.created_last_seven_days.count +
|
|
47
48
|
participant.activities
|
|
48
|
-
|
|
49
|
+
.reviewed_and_incomplete.created_last_seven_days.count
|
|
49
50
|
end
|
|
50
51
|
|
|
51
52
|
def activities_planned_total(participant)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
# Provides helpers for slide creation.
|
|
3
4
|
module SlidesHelper
|
|
@@ -8,13 +9,15 @@ module ThinkFeelDoEngine
|
|
|
8
9
|
link_to "Destroy Table of Contents",
|
|
9
10
|
arm_bit_maker_slideshow_destroy_table_of_contents_path(
|
|
10
11
|
arm,
|
|
11
|
-
slideshow
|
|
12
|
+
slideshow
|
|
13
|
+
),
|
|
12
14
|
class: "btn btn-default toc"
|
|
13
15
|
else
|
|
14
16
|
link_to "Add Table of Contents",
|
|
15
17
|
arm_bit_maker_slideshow_create_table_of_contents_path(
|
|
16
18
|
arm,
|
|
17
|
-
slideshow
|
|
19
|
+
slideshow
|
|
20
|
+
),
|
|
18
21
|
class: "btn btn-default toc"
|
|
19
22
|
end
|
|
20
23
|
end
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
# Used to display asterisks if tasks and tools have been assigned to a group
|
|
3
4
|
# and to hide unassigned links
|
|
4
5
|
module TasksHelper
|
|
5
6
|
def task_status(membership, content_module)
|
|
6
7
|
membership.available_task_statuses
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
.for_content_module(content_module)
|
|
9
|
+
.order(start_day: :asc)
|
|
10
|
+
.last
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def task_status_viz(task_status)
|
|
@@ -17,7 +18,8 @@ module ThinkFeelDoEngine
|
|
|
17
18
|
available_module = TaskStatusLink.new(
|
|
18
19
|
available_module: available_module,
|
|
19
20
|
icon: icon,
|
|
20
|
-
membership: membership
|
|
21
|
+
membership: membership
|
|
22
|
+
)
|
|
21
23
|
link_to available_module.name,
|
|
22
24
|
think_feel_do_engine.navigator_location_path(
|
|
23
25
|
module_id: available_module.id
|
|
@@ -43,7 +45,7 @@ module ThinkFeelDoEngine
|
|
|
43
45
|
# If the TaskStatus was *just* marked complete, this is the first time
|
|
44
46
|
# viewing the ContentProvider, so we should consider it incomplete.
|
|
45
47
|
ContentProviderDecorator.fetch(provider)
|
|
46
|
-
|
|
48
|
+
.is_skippable_after_first_viewing &&
|
|
47
49
|
task_status(membership, mod).completed_at < Time.current - 5.minutes
|
|
48
50
|
end
|
|
49
51
|
|
|
@@ -97,10 +99,10 @@ module ThinkFeelDoEngine
|
|
|
97
99
|
|
|
98
100
|
def completed?
|
|
99
101
|
membership.available_task_statuses
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
.for_content_module(available_module)
|
|
103
|
+
.order(start_day: :asc)
|
|
104
|
+
.last
|
|
105
|
+
.try(:completed_at)
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
def completion_status
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
# Sends a new lesson notification to a given participant.
|
|
3
4
|
class LessonNotificationMailer < ActionMailer::Base
|
|
4
5
|
default(
|
|
5
|
-
from: Rails.configuration.action_mailer.default_options[:from]
|
|
6
|
+
from: Rails.configuration.action_mailer.default_options[:from]
|
|
7
|
+
)
|
|
6
8
|
|
|
7
9
|
def lesson_notification_email(
|
|
8
|
-
application_name:, lesson_module:, participant_email:
|
|
10
|
+
application_name:, lesson_module:, participant_email:
|
|
11
|
+
)
|
|
9
12
|
@application_name = application_name
|
|
10
13
|
@lesson = lesson_module
|
|
11
14
|
mail(to: participant_email,
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
# Mailer for SiteMessage delivery.
|
|
3
4
|
class SiteMessageMailer < ActionMailer::Base
|
|
4
5
|
def general(message)
|
|
5
6
|
markdown = Redcarpet::Markdown.new(
|
|
6
7
|
Redcarpet::Render::HTML,
|
|
7
|
-
space_after_headers: true
|
|
8
|
+
space_after_headers: true
|
|
9
|
+
)
|
|
8
10
|
@body = markdown.render(message.body)
|
|
9
11
|
|
|
10
12
|
mail to: message.participant.email,
|
data/app/models/ability.rb
CHANGED
data/app/models/activity.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Represents a real-world activity of a participant.
|
|
2
3
|
class Activity < ActiveRecord::Base
|
|
3
4
|
attr_accessor :activity_type_title,
|
|
@@ -96,18 +97,21 @@ class Activity < ActiveRecord::Base
|
|
|
96
97
|
predicted_accomplishment_intensity: nil,
|
|
97
98
|
predicted_pleasure_intensity: nil,
|
|
98
99
|
actual_accomplishment_intensity: nil,
|
|
99
|
-
actual_pleasure_intensity: nil
|
|
100
|
+
actual_pleasure_intensity: nil
|
|
101
|
+
)
|
|
100
102
|
}
|
|
101
103
|
|
|
102
104
|
scope :reviewed_and_incomplete, lambda {
|
|
103
105
|
where(is_reviewed: true)
|
|
104
106
|
.where(
|
|
105
107
|
actual_accomplishment_intensity: nil,
|
|
106
|
-
actual_pleasure_intensity: nil
|
|
108
|
+
actual_pleasure_intensity: nil
|
|
109
|
+
)
|
|
107
110
|
.where
|
|
108
111
|
.not(
|
|
109
112
|
predicted_accomplishment_intensity: nil,
|
|
110
|
-
predicted_pleasure_intensity: nil
|
|
113
|
+
predicted_pleasure_intensity: nil
|
|
114
|
+
)
|
|
111
115
|
}
|
|
112
116
|
|
|
113
117
|
scope :monitored, lambda {
|
|
@@ -115,10 +119,12 @@ class Activity < ActiveRecord::Base
|
|
|
115
119
|
.where
|
|
116
120
|
.not(
|
|
117
121
|
actual_accomplishment_intensity: nil,
|
|
118
|
-
actual_pleasure_intensity: nil
|
|
122
|
+
actual_pleasure_intensity: nil
|
|
123
|
+
)
|
|
119
124
|
.where(
|
|
120
125
|
predicted_accomplishment_intensity: nil,
|
|
121
|
-
predicted_pleasure_intensity: nil
|
|
126
|
+
predicted_pleasure_intensity: nil
|
|
127
|
+
)
|
|
122
128
|
}
|
|
123
129
|
|
|
124
130
|
# To Do: fix naming and/or what is going on here
|
|
@@ -134,11 +140,13 @@ class Activity < ActiveRecord::Base
|
|
|
134
140
|
where(
|
|
135
141
|
is_reviewed: false,
|
|
136
142
|
actual_accomplishment_intensity: nil,
|
|
137
|
-
actual_pleasure_intensity: nil
|
|
143
|
+
actual_pleasure_intensity: nil
|
|
144
|
+
)
|
|
138
145
|
.where
|
|
139
146
|
.not(
|
|
140
147
|
predicted_accomplishment_intensity: nil,
|
|
141
|
-
predicted_pleasure_intensity: nil
|
|
148
|
+
predicted_pleasure_intensity: nil
|
|
149
|
+
)
|
|
142
150
|
}
|
|
143
151
|
|
|
144
152
|
scope :random, lambda {
|
|
@@ -149,14 +157,16 @@ class Activity < ActiveRecord::Base
|
|
|
149
157
|
where
|
|
150
158
|
.not(
|
|
151
159
|
predicted_accomplishment_intensity: nil,
|
|
152
|
-
predicted_pleasure_intensity: nil
|
|
160
|
+
predicted_pleasure_intensity: nil
|
|
161
|
+
)
|
|
153
162
|
}
|
|
154
163
|
|
|
155
164
|
scope :with_actual_ratings, lambda {
|
|
156
165
|
where
|
|
157
166
|
.not(
|
|
158
167
|
actual_accomplishment_intensity: nil,
|
|
159
|
-
actual_pleasure_intensity: nil
|
|
168
|
+
actual_pleasure_intensity: nil
|
|
169
|
+
)
|
|
160
170
|
}
|
|
161
171
|
|
|
162
172
|
scope :unplanned, lambda {
|
|
@@ -182,7 +192,8 @@ class Activity < ActiveRecord::Base
|
|
|
182
192
|
def update_as_reviewed(params = {})
|
|
183
193
|
update(
|
|
184
194
|
params
|
|
185
|
-
.merge(in_review: true, is_reviewed: true)
|
|
195
|
+
.merge(in_review: true, is_reviewed: true)
|
|
196
|
+
)
|
|
186
197
|
end
|
|
187
198
|
|
|
188
199
|
def actual_ratings!
|
data/app/models/activity_type.rb
CHANGED
data/app/models/arm.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# These arms are part of the adolescent and adult projects
|
|
2
3
|
# Between 1 and 8 groups are in each arm and each group
|
|
3
4
|
# could have between 1 and 10 or so participants
|
|
@@ -41,7 +42,6 @@ class Arm < ActiveRecord::Base
|
|
|
41
42
|
tools = BitCore::Tool.arel_table
|
|
42
43
|
bit_core_tools
|
|
43
44
|
.where(tools[:type].eq(nil)
|
|
44
|
-
.or(tools[:type].not_eq("Tools::Home"))
|
|
45
|
-
)
|
|
45
|
+
.or(tools[:type].not_eq("Tools::Home")))
|
|
46
46
|
end
|
|
47
47
|
end
|
data/app/models/arm_validator.rb
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Validates Arm model.
|
|
2
3
|
class ArmValidator < ActiveModel::Validator
|
|
3
4
|
def validate(record)
|
|
4
|
-
if ActiveRecord::Base
|
|
5
|
+
if ActiveRecord::Base
|
|
6
|
+
.connection
|
|
5
7
|
.column_exists?(:arms, :can_message_after_membership_complete) &&
|
|
6
8
|
record.can_message_after_membership_complete.nil?
|
|
7
9
|
record.errors[:base] << "An Arm must have a value for can_message"\
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# A read-only, view backed model that represents an assigned Content Module.
|
|
2
3
|
class AvailableContentModule < ActiveRecord::Base
|
|
3
4
|
self.primary_key = :id
|
|
@@ -52,7 +53,9 @@ class AvailableContentModule < ActiveRecord::Base
|
|
|
52
53
|
.lt(membership_start_date + study_week_number.weeks)
|
|
53
54
|
.and(
|
|
54
55
|
available_on
|
|
55
|
-
.gteq(membership_start_date + (study_week_number - 1).weeks)
|
|
56
|
+
.gteq(membership_start_date + (study_week_number - 1).weeks)
|
|
57
|
+
)
|
|
58
|
+
)
|
|
56
59
|
end
|
|
57
60
|
|
|
58
61
|
def self.is_terminated_on(date)
|
|
@@ -63,7 +66,8 @@ class AvailableContentModule < ActiveRecord::Base
|
|
|
63
66
|
for_participant(membership.participant)
|
|
64
67
|
.where(
|
|
65
68
|
arel_table[:available_on]
|
|
66
|
-
.lt(membership.start_date + (membership.week_in_study - 1).weeks)
|
|
69
|
+
.lt(membership.start_date + (membership.week_in_study - 1).weeks)
|
|
70
|
+
)
|
|
67
71
|
end
|
|
68
72
|
|
|
69
73
|
def self.is_not_terminated_on(date)
|
data/app/models/awake_period.rb
CHANGED
|
@@ -16,10 +16,12 @@ module Concerns
|
|
|
16
16
|
.create!(
|
|
17
17
|
position: new_tools.count,
|
|
18
18
|
title: tool.title,
|
|
19
|
-
type: tool.type
|
|
19
|
+
type: tool.type
|
|
20
|
+
)
|
|
20
21
|
|
|
21
22
|
tool.copy_all_to(
|
|
22
|
-
new_tool: new_tool
|
|
23
|
+
new_tool: new_tool
|
|
24
|
+
)
|
|
23
25
|
end
|
|
24
26
|
end
|
|
25
27
|
|
|
@@ -29,14 +31,16 @@ module Concerns
|
|
|
29
31
|
new_tools.create!(
|
|
30
32
|
position: new_tools.count,
|
|
31
33
|
title: TOOL_TITLE,
|
|
32
|
-
type: LEARN_TOOL
|
|
34
|
+
type: LEARN_TOOL
|
|
35
|
+
)
|
|
33
36
|
|
|
34
37
|
return unless new_tool
|
|
35
38
|
|
|
36
39
|
bit_core_tools
|
|
37
40
|
.find_by(type: LEARN_TOOL)
|
|
38
41
|
.copy_content_modules_to(
|
|
39
|
-
new_tool: new_tool
|
|
42
|
+
new_tool: new_tool
|
|
43
|
+
)
|
|
40
44
|
end
|
|
41
45
|
end
|
|
42
46
|
|
|
@@ -48,7 +52,8 @@ module Concerns
|
|
|
48
52
|
ContentModule.transaction do
|
|
49
53
|
content_modules.each do |content_module|
|
|
50
54
|
content_module.copy_content_providers_to(
|
|
51
|
-
new_tool: new_tool
|
|
55
|
+
new_tool: new_tool
|
|
56
|
+
)
|
|
52
57
|
end
|
|
53
58
|
end
|
|
54
59
|
end
|
|
@@ -56,9 +61,10 @@ module Concerns
|
|
|
56
61
|
def copy_content_modules_to(new_tool:)
|
|
57
62
|
ContentModule.transaction do
|
|
58
63
|
content_modules.where(type: LESSON_MODULE)
|
|
59
|
-
|
|
64
|
+
.find_each do |content_module|
|
|
60
65
|
content_module.copy_content_providers_to(
|
|
61
|
-
new_tool: new_tool
|
|
66
|
+
new_tool: new_tool
|
|
67
|
+
)
|
|
62
68
|
end
|
|
63
69
|
end
|
|
64
70
|
end
|
|
@@ -72,7 +78,8 @@ module Concerns
|
|
|
72
78
|
position: position,
|
|
73
79
|
title: title,
|
|
74
80
|
tool: new_tool,
|
|
75
|
-
type: type
|
|
81
|
+
type: type
|
|
82
|
+
)
|
|
76
83
|
|
|
77
84
|
new_content_module.content_providers.destroy_all
|
|
78
85
|
|
|
@@ -80,7 +87,8 @@ module Concerns
|
|
|
80
87
|
content_provider
|
|
81
88
|
.copy_source_content_to!(
|
|
82
89
|
new_arm: new_tool.arm,
|
|
83
|
-
new_content_module: new_content_module
|
|
90
|
+
new_content_module: new_content_module
|
|
91
|
+
)
|
|
84
92
|
end
|
|
85
93
|
|
|
86
94
|
new_content_module
|
|
@@ -96,7 +104,8 @@ module Concerns
|
|
|
96
104
|
position: position,
|
|
97
105
|
show_next_nav: show_next_nav,
|
|
98
106
|
type: type,
|
|
99
|
-
source_content: source_content.try(:copy_to, new_arm)
|
|
107
|
+
source_content: source_content.try(:copy_to, new_arm)
|
|
108
|
+
)
|
|
100
109
|
end
|
|
101
110
|
end
|
|
102
111
|
end
|
|
@@ -126,13 +135,12 @@ module Concerns
|
|
|
126
135
|
Slide.class_eval do
|
|
127
136
|
def copy_to!(slideshow)
|
|
128
137
|
slideshow.slides
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.update_attributes!(options: options)
|
|
138
|
+
.find_or_create_by!(body: body,
|
|
139
|
+
is_title_visible: is_title_visible,
|
|
140
|
+
position: position,
|
|
141
|
+
title: title,
|
|
142
|
+
type: type)
|
|
143
|
+
.update_attributes!(options: options)
|
|
136
144
|
end
|
|
137
145
|
end
|
|
138
146
|
end
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ContentModules
|
|
2
3
|
# Container for didactic content.
|
|
3
4
|
class LessonModule < BitCore::ContentModule
|
|
4
|
-
SLIDESHOW_PROVIDER_TYPE =
|
|
5
|
+
SLIDESHOW_PROVIDER_TYPE = BitCore::ContentProviders::SlideshowProvider.to_s
|
|
5
6
|
after_save :update_slideshow
|
|
6
7
|
|
|
7
8
|
def self.sort(arm_id, lesson_ids)
|
|
8
9
|
start_position = Arm.find(arm_id)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
.bit_core_tools.find_by_type("Tools::Learn")
|
|
11
|
+
.content_modules
|
|
12
|
+
.where(type: [nil, "BitCore::ContentModule"])
|
|
13
|
+
.order(position: :asc).maximum(:position)
|
|
13
14
|
start_position ||= 1
|
|
14
15
|
start_position += 1
|
|
15
16
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ContentModules
|
|
2
3
|
# Methods for extending BitCore::ContentModule with scopes.
|
|
3
4
|
module Scopes
|
|
@@ -14,8 +15,8 @@ module ContentModules
|
|
|
14
15
|
def non_didactic(group_id)
|
|
15
16
|
non_didactic_module_ids = Task.where(group_id: group_id,
|
|
16
17
|
has_didactic_content: false)
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
.select(:id, :bit_core_content_module_id)
|
|
19
|
+
.map(&:bit_core_content_module_id)
|
|
19
20
|
|
|
20
21
|
where(id: non_viz_module_ids & non_didactic_module_ids).select(:id)
|
|
21
22
|
end
|