Class: ThinkFeelDoEngine::Reports::LessonViewing

Inherits:
Object
  • Object
show all
Includes:
LessonModule
Defined in:
app/models/think_feel_do_engine/reports/lesson_viewing.rb

Overview

Scenario: a Participant starts viewing a Lesson.

Constant Summary collapse

DEFAULT_LESSON_MODULE_POSTFIX =
%r{\/providers\/.*}

Constants included from LessonModule

ThinkFeelDoEngine::Reports::LessonModule::URL_ROOT_RE

Class Method Summary collapse

Methods included from LessonModule

included

Class Method Details

.all(*ids) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 19

def self.all(*ids)
  lessons = lesson_entries_map
  lessons_default = lessons_with_default_urls(lessons)

  Participant.not_moderator.select(:id, :study_id)
             .where(id: participant_ids(ids)).map do |participant|
    participant_render_events = render_events
                                .where(participant_id: participant.id)
    lesson_select_events =
      participant_render_events
      .to_a.select do |e|
        lessons.keys.include?(e.current_url.gsub(URL_ROOT_RE, "")) ||
          lessons_default
            .keys.include?(e.current_url.gsub(URL_ROOT_RE, "")) ||
          lessons_default
            .keys.include?(e.current_url.gsub(URL_ROOT_RE, "")[0...-1])
      end

    lesson_select_events.map do |e|
      lesson_id =
        lessons[e.current_url.gsub(URL_ROOT_RE, "")] ||
        lessons_default[e.current_url.gsub(URL_ROOT_RE, "")] ||
        lessons_default[e.current_url.gsub(URL_ROOT_RE, "")[0...-1]]
      last_page_opened_info =
        last_page_opened(participant_render_events, e, lesson_id)
      event_hash(participant, lesson_id, e, last_page_opened_info)
    end
  end.flatten
end

.columnsObject



10
11
12
13
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 10

def self.columns
  %w( participant_id lesson_id url page_headers lesson_selected_at
      last_page_number_opened completed last_page_opened_at )
end

.event_hash(participant, lesson_id, event, last_page_opened) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 92

def self.event_hash(participant, lesson_id, event, last_page_opened)
  {
    participant_id: participant.study_id,
    lesson_id: lesson_id,
    url: event.current_url,
    page_headers: event.headers,
    lesson_selected_at: event.emitted_at.iso8601,
    last_page_number_opened: last_page_opened[:number].to_i,
    completed: last_page_opened[:number].to_i ==
      ContentModules::LessonModule.find(lesson_id).slides.count,
    last_page_opened_at: last_page_opened[:opened_at].iso8601
  }
end

.event_lesson_page_number(event) ⇒ Object



74
75
76
77
78
79
80
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 74

def self.event_lesson_page_number(event)
  if event.current_url.include? "providers"
    event.current_url[/\d+$/]
  else
    1
  end
end

.last_page_opened(participant_render_events, first_session_event, lesson_id) ⇒ Object

last event (click) with matching module id



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 56

def self.last_page_opened(
  participant_render_events,
  first_session_event,
  lesson_id
)
  lesson_events =
    participant_render_events
    .where("emitted_at > ?", first_session_event.emitted_at)
    .order(:emitted_at)
    .to_a.take_while { |e| e.current_url.include?(lesson_id.to_s) }
  last_event = (lesson_events.last || first_session_event)

  {
    number: event_lesson_page_number(last_event),
    opened_at: last_event.emitted_at
  }
end

.lessons_with_default_urls(lessons_map) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 82

def self.lessons_with_default_urls(lessons_map)
  lessons_with_default_path = lessons_map.each.map do |lesson|
    default_lesson_url =
      lesson[0].gsub(URL_ROOT_RE, "")
               .gsub(DEFAULT_LESSON_MODULE_POSTFIX, "")
    [default_lesson_url, lesson[1]]
  end
  Hash[lessons_with_default_path]
end

.participant_ids(ids) ⇒ Object



15
16
17
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 15

def self.participant_ids(ids)
  ids.empty? ? Participant.not_moderator.ids : ids
end

.render_eventsObject



49
50
51
52
53
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 49

def self.render_events
  EventCapture::Event
    .where(kind: "render")
    .select(:participant_id, :emitted_at, :kind, :payload)
end