Class: Www::CourseEnrollmentsController

Inherits:
BasePortalController show all
Defined in:
app/controllers/www/course_enrollments_controller.rb

Overview

Controller: course enrollments.

Constant Summary

Constants included from Controllers::MasqueradeGuarded

Controllers::MasqueradeGuarded::DEFAULT_BLOCK_MESSAGE

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Instance Method Summary collapse

Methods inherited from BasePortalController

#current_ability, #portal_party, #set_catalog, #set_webpack

Methods included from Controllers::MasqueradeGuarded

block_while_masquerading, #masquerade_blocks?

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #registration_lead_type, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Instance Method Details

#indexvoid

This method returns an undefined value.

Lists the current user's course enrollments.



13
14
15
# File 'app/controllers/www/course_enrollments_controller.rb', line 13

def index
  @course_enrollments = @context_user.course_enrollments
end

#request_examvoid

This method returns an undefined value.

Starts (or resumes) an exam for the course enrollment, once its content
is complete.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/controllers/www/course_enrollments_controller.rb', line 37

def request_exam
  @course = @course_enrollment.course

  # Check that the course content is done before requesting an exam
  if @course_enrollment.content_completed?
    # check that the user doesn't have any active exam at the moment or that they didn't already passed an exam
    exams = @course_enrollment.course_exams
    if exams.empty? || (exams.passed.empty? && exams.active.empty?)
      # create a new exam
      # Retakes reuse the same exam definition by design (unlimited retakes,
      # same question set — decided 2026-07-07).
      topic_exam = @course.topic_exams.active.first
      unless topic_exam
        ErrorReporting.error("No active topic exam found for course #{@course.id}.")
        flash[:error] = "We're experiencing some technical difficulties at the moment and we can't open a new exam.
                        Our team is aware and working on fixing this issue. Please try again later."
        redirect_to @course_enrollment
        return
      end

      new_exam = @course_enrollment.course_exams.new(
                          topic_exam_id: topic_exam.id,
                          state: 'in_progress',
                          position: @course_enrollment.course_exams.size + 1
                        )

      begin
        ActiveRecord::Base.transaction do
          new_exam.save!
          CourseExam::InitializeTopics.new(new_exam, @course_enrollment, @context_user).call
        end
        redirect_to edit_course_enrollment_course_exam_path(@course_enrollment, new_exam)
      rescue StandardError => e
        ErrorReporting.error(e, "An error ocurred while creating an exam for the course #{@course.id}.")
        flash[:error] = "We're experiencing some technical difficulties at the moment and we can't open a new exam.
                        Our team is aware and working on fixing this issue. Please try again later."
        redirect_to @course_enrollment
      end
    else
      flash[:info] = 'You already have one exam pending'
      redirect_to @course_enrollment
    end
  else
    flash[:info] = 'You have unfinished modules. Please complete all modules before requesting the exam.'
    redirect_to @course_enrollment
  end
end

#showvoid

This method returns an undefined value.

Displays a course enrollment's categories and exams.



20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/controllers/www/course_enrollments_controller.rb', line 20

def show
  @course = @course_enrollment.course
  @categories = @course_enrollment.course_categories
  @exams = @course_enrollment.course_exams

  return if @categories.present?

  ErrorReporting.error("Course enrollment doesn't have any content. Check enrollment id #{@course_enrollment.id}")
  flash[:error] = "We're experiencing some technical difficulties at the moment and we can't display the content of this course.
                    Our team is aware and working on fixing this issue. Please try again later."
  redirect_to '/courses'
end