effective_learndash 0.1.3 → 0.1.4
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/README.md +6 -0
- data/app/assets/config/effective_learndash_manifest.js +0 -1
- data/app/controllers/admin/course_registrations_controller.rb +8 -0
- data/app/controllers/effective/course_registrations_controller.rb +13 -0
- data/app/controllers/effective/learndash_courses_controller.rb +32 -0
- data/app/datatables/admin/effective_course_registrations_datatable.rb +28 -0
- data/app/datatables/admin/effective_learndash_courses_datatable.rb +4 -0
- data/app/datatables/admin/effective_learndash_enrollments_datatable.rb +1 -2
- data/app/datatables/effective_course_registrants_datatable.rb +24 -0
- data/app/datatables/effective_course_registrations_datatable.rb +35 -0
- data/app/datatables/effective_learndash_courses_datatable.rb +28 -0
- data/app/datatables/effective_learndash_enrollments_datatable.rb +4 -1
- data/app/models/concerns/effective_learndash_course_registration.rb +167 -0
- data/app/models/concerns/effective_learndash_owner.rb +1 -1
- data/app/models/effective/course_registrant.rb +53 -0
- data/app/models/effective/course_registration.rb +5 -0
- data/app/models/effective/learndash_api.rb +10 -1
- data/app/models/effective/learndash_course.rb +78 -3
- data/app/models/effective/learndash_enrollment.rb +7 -3
- data/app/models/effective/learndash_user.rb +5 -6
- data/app/views/admin/learndash_courses/_form.html.haml +25 -0
- data/app/views/admin/learndash_courses/_form_course_registration_content.html.haml +19 -0
- data/app/views/admin/learndash_courses/_form_learndash_course.html.haml +32 -0
- data/app/views/effective/course_registrations/_content.html.haml +10 -0
- data/app/views/effective/course_registrations/_course.html.haml +9 -0
- data/app/views/effective/course_registrations/_course_registration.html.haml +3 -0
- data/app/views/effective/course_registrations/_dashboard.html.haml +30 -0
- data/app/views/effective/course_registrations/_layout.html.haml +3 -0
- data/app/views/effective/course_registrations/_orders.html.haml +4 -0
- data/app/views/effective/course_registrations/_summary.html.haml +35 -0
- data/app/views/effective/course_registrations/billing.html.haml +15 -0
- data/app/views/effective/course_registrations/checkout.html.haml +6 -0
- data/app/views/effective/course_registrations/course.html.haml +21 -0
- data/app/views/effective/course_registrations/start.html.haml +24 -0
- data/app/views/effective/course_registrations/submitted.html.haml +16 -0
- data/app/views/effective/course_registrations/summary.html.haml +8 -0
- data/app/views/effective/learndash/_dashboard.html.haml +1 -1
- data/app/views/effective/learndash_courses/_learndash_course.html.haml +13 -0
- data/app/views/effective/learndash_courses/index.html.haml +5 -0
- data/app/views/effective/learndash_courses/show.html.haml +6 -0
- data/config/effective_learndash.rb +9 -0
- data/config/routes.rb +13 -3
- data/db/migrate/01_create_effective_learndash.rb.erb +98 -33
- data/lib/effective_learndash/engine.rb +1 -0
- data/lib/effective_learndash/version.rb +1 -1
- data/lib/effective_learndash.rb +6 -1
- data/lib/generators/effective_learndash/install_generator.rb +0 -1
- metadata +31 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 83cc9e6d5daa0a6e08e491f1ea9edec7f8e394b045801a2d704eaacab5c93f18
         | 
| 4 | 
            +
              data.tar.gz: 467de056d4e11255c927a212e0f893b54ddcac8720ec12bf80299873ff5e2910
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1cbb48faa89c8d2a6fee3f47b78cdb41f3cf20871b354f7e88852a5103e0a294d4b2dd1d2eca63be1525dd546e365fd8143416e35942d714039ecd6031a12a0c
         | 
| 7 | 
            +
              data.tar.gz: ee47891e98f74e0c8ecdbacbd76f37071a16d95a347bca7014f421a4aeb007b7ffc92d0f96c080dea39c8d57b15b92aa83f06f5558a0ee2182049dfa442952c0
         | 
    
        data/README.md
    CHANGED
    
    | @@ -74,6 +74,12 @@ The permissions you actually want to define are as follows (using CanCan): | |
| 74 74 | 
             
            can(:show, Effective::LearndashUser) { |lduser| lduser.owner_id == user.id }
         | 
| 75 75 | 
             
            can(:index, Effective::LearndashEnrollment)
         | 
| 76 76 |  | 
| 77 | 
            +
            can([:index, :show], Effective::LearndashCourse) { |course| !course.draft? }
         | 
| 78 | 
            +
            can([:show, :index], Effective::CourseRegistrant) { |registrant| registrant.owner == user || registrant.owner.blank? }
         | 
| 79 | 
            +
            can([:new, :create], EffectiveLearndash.CourseRegistration)
         | 
| 80 | 
            +
            can([:show, :index], EffectiveLearndash.CourseRegistration) { |registration| registration.owner == user }
         | 
| 81 | 
            +
            can([:update, :destroy], EffectiveLearndash.CourseRegistration) { |registration| registration.owner == user && !registration.was_submitted? }
         | 
| 82 | 
            +
             | 
| 77 83 | 
             
            if user.admin?
         | 
| 78 84 | 
             
              can :admin, :effective_learndash
         | 
| 79 85 |  | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            module Admin
         | 
| 2 | 
            +
              class CourseRegistrationsController < ApplicationController
         | 
| 3 | 
            +
                before_action(:authenticate_user!) if defined?(Devise)
         | 
| 4 | 
            +
                before_action { EffectiveResources.authorize!(self, :admin, :effective_learndash) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                include Effective::CrudController
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            module Effective
         | 
| 2 | 
            +
              class CourseRegistrationsController < ApplicationController
         | 
| 3 | 
            +
                before_action(:authenticate_user!) if defined?(Devise)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                include Effective::WizardController
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                resource_scope -> {
         | 
| 8 | 
            +
                  learndash_course = Effective::LearndashCourse.find(params[:learndash_course_id])
         | 
| 9 | 
            +
                  EffectiveLearndash.CourseRegistration.deep.where(owner: current_user, learndash_course: learndash_course)
         | 
| 10 | 
            +
                }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            module Effective
         | 
| 2 | 
            +
              class LearndashCoursesController < ApplicationController
         | 
| 3 | 
            +
                include Effective::CrudController
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                resource_scope -> {
         | 
| 6 | 
            +
                  unpublished = EffectiveResources.authorized?(self, :admin, :effective_learndash)
         | 
| 7 | 
            +
                  Effective::LearndashCourse.learndash_courses(user: current_user, unpublished: unpublished)
         | 
| 8 | 
            +
                }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def show
         | 
| 11 | 
            +
                  @learndash_course = resource_scope.find(params[:id])
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  if @learndash_course.respond_to?(:roles_permit?)
         | 
| 14 | 
            +
                    raise Effective::AccessDenied.new('Access Denied', :show, @learndash_course) unless @learndash_course.roles_permit?(current_user)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  EffectiveResources.authorize!(self, :show, @learndash_course)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  if EffectiveResources.authorized?(self, :admin, :effective_learndash)
         | 
| 20 | 
            +
                    flash.now[:warning] = [
         | 
| 21 | 
            +
                      'Hi Admin!',
         | 
| 22 | 
            +
                      ('You are viewing a hidden course.' if @learndash_course.draft?),
         | 
| 23 | 
            +
                      'Click here to',
         | 
| 24 | 
            +
                      ("<a href='#{effective_learndash.edit_admin_learndash_course_path(@learndash_course)}' class='alert-link'>edit learndash course settings</a>.")
         | 
| 25 | 
            +
                    ].compact.join(' ')
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  @page_title ||= @learndash_course.to_s
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            module Admin
         | 
| 2 | 
            +
              class EffectiveCourseRegistrationsDatatable < Effective::Datatable
         | 
| 3 | 
            +
                datatable do
         | 
| 4 | 
            +
                  col :updated_at, visible: false
         | 
| 5 | 
            +
                  col :created_at, visible: false
         | 
| 6 | 
            +
                  col :id, visible: false
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  col :token, visible: false
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  col :created_at, label: 'Created', visible: false
         | 
| 11 | 
            +
                  col :updated_at, label: 'Updated', visible: false
         | 
| 12 | 
            +
                  col :submitted_at, label: 'Submitted', visible: false, as: :date
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  col :learndash_course
         | 
| 15 | 
            +
                  col :owner
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  col :course_registrants, search: :string, visible: false
         | 
| 18 | 
            +
                  col :orders, label: 'Order'
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  actions_col
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                collection do
         | 
| 24 | 
            +
                  scope = EffectiveLearndash.CourseRegistration.all.deep.done
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            # Used on the Course Registrations courses step
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class EffectiveCourseRegistrantsDatatable < Effective::Datatable
         | 
| 4 | 
            +
              datatable do
         | 
| 5 | 
            +
                col :learndash_course
         | 
| 6 | 
            +
                col :owner, label: 'User', action: false
         | 
| 7 | 
            +
                col :price, as: :price
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              collection do
         | 
| 11 | 
            +
                scope = Effective::CourseRegistrant.deep.all
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                if attributes[:learndash_course_id].present?
         | 
| 14 | 
            +
                  scope = scope.where(learndash_course_id: attributes[:learndash_course_id])
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                if attributes[:course_registration_id].present?
         | 
| 18 | 
            +
                  scope = scope.where(course_registration_id: attributes[:course_registration_id])
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                scope
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # Dashboard Course Registrations
         | 
| 2 | 
            +
            class EffectiveCourseRegistrationsDatatable < Effective::Datatable
         | 
| 3 | 
            +
              datatable do
         | 
| 4 | 
            +
                order :created_at
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                col :token, visible: false
         | 
| 7 | 
            +
                col :created_at, visible: false
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                col(:submitted_at, label: 'Registered on') do |registration|
         | 
| 10 | 
            +
                  registration.submitted_at&.strftime('%F') || 'Incomplete'
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                col :learndash_course, search: :string do |registration|
         | 
| 14 | 
            +
                  registration.learndash_course.to_s
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                col :owner, visible: false, search: :string
         | 
| 18 | 
            +
                col :status, visible: false
         | 
| 19 | 
            +
                col :orders, action: :show, visible: false, search: :string
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                actions_col(actions: []) do |registration|
         | 
| 22 | 
            +
                  if registration.draft?
         | 
| 23 | 
            +
                    dropdown_link_to('Continue', effective_learndash.learndash_course_course_registration_build_path(registration.learndash_course, registration, registration.next_step), 'data-turbolinks' => false)
         | 
| 24 | 
            +
                    dropdown_link_to('Delete', effective_learndash.learndash_course_course_registration_path(registration.learndash_course, registration), 'data-confirm': "Really delete #{registration}?", 'data-method': :delete)
         | 
| 25 | 
            +
                  else
         | 
| 26 | 
            +
                    dropdown_link_to('Show', effective_learndash.learndash_course_course_registration_path(registration.learndash_course, registration))
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              collection do
         | 
| 32 | 
            +
                EffectiveLearndash.CourseRegistration.deep.where(owner: current_user)
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # Dashboard Courses
         | 
| 2 | 
            +
            class EffectiveLearndashCoursesDatatable < Effective::Datatable
         | 
| 3 | 
            +
              filters do
         | 
| 4 | 
            +
                # Registerable should be first here, so when displayed as a simple datatable on the dashboard they only see registerable courses
         | 
| 5 | 
            +
                scope :registerable
         | 
| 6 | 
            +
                scope :all
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              datatable do
         | 
| 10 | 
            +
                order :title
         | 
| 11 | 
            +
                col :id, visible: false
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                col :title, label: 'Title' do |learndash_course|
         | 
| 14 | 
            +
                  link_to(learndash_course.to_s, effective_learndash.learndash_course_path(learndash_course))
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                actions_col show: false do |learndash_course|
         | 
| 18 | 
            +
                  if learndash_course.can_register?
         | 
| 19 | 
            +
                    dropdown_link_to('Register', effective_learndash.new_learndash_course_course_registration_path(learndash_course))
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              collection do
         | 
| 25 | 
            +
                Effective::LearndashCourse.deep.learndash_courses(user: current_user)
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            end
         | 
| @@ -1,7 +1,10 @@ | |
| 1 1 | 
             
            # Dashboard LearndashUsers
         | 
| 2 2 | 
             
            class EffectiveLearndashEnrollmentsDatatable < Effective::Datatable
         | 
| 3 3 | 
             
              datatable do
         | 
| 4 | 
            -
                col :learndash_course
         | 
| 4 | 
            +
                col :learndash_course do |enrollment|
         | 
| 5 | 
            +
                  link_to(enrollment.learndash_course, EffectiveLearndash.learndash_url, target: '_blank')
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 5 8 | 
             
                col :progress_status
         | 
| 6 9 |  | 
| 7 10 | 
             
                col :last_step, visible: false
         | 
| @@ -0,0 +1,167 @@ | |
| 1 | 
            +
            # frozen_stcourse_registrant_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # EffectiveLearndashCourseRegistration
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # Mark your owner model with effective_learndash_course_registration to get all the includes
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module EffectiveLearndashCourseRegistration
         | 
| 8 | 
            +
              extend ActiveSupport::Concern
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              module Base
         | 
| 11 | 
            +
                def effective_learndash_course_registration
         | 
| 12 | 
            +
                  include ::EffectiveLearndashCourseRegistration
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              module ClassMethods
         | 
| 17 | 
            +
                def effective_learndash_course_registration?; true; end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              included do
         | 
| 21 | 
            +
                acts_as_purchasable_parent
         | 
| 22 | 
            +
                acts_as_tokened
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                acts_as_statused(
         | 
| 25 | 
            +
                  :draft,      # Just Started
         | 
| 26 | 
            +
                  :submitted   # All done
         | 
| 27 | 
            +
                )
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                acts_as_wizard(
         | 
| 30 | 
            +
                  start: 'Start',
         | 
| 31 | 
            +
                  course: 'Course',
         | 
| 32 | 
            +
                  summary: 'Review',
         | 
| 33 | 
            +
                  billing: 'Billing Address',
         | 
| 34 | 
            +
                  checkout: 'Checkout',
         | 
| 35 | 
            +
                  submitted: 'Submitted'
         | 
| 36 | 
            +
                )
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                acts_as_purchasable_wizard
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                log_changes(except: :wizard_steps) if respond_to?(:log_changes)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                # Application Namespace
         | 
| 43 | 
            +
                belongs_to :owner, polymorphic: true
         | 
| 44 | 
            +
                accepts_nested_attributes_for :owner
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                # Effective Namespace
         | 
| 47 | 
            +
                belongs_to :learndash_course, class_name: 'Effective::LearndashCourse'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                has_many :course_registrants, -> { order(:id) }, class_name: 'Effective::CourseRegistrant', inverse_of: :course_registration, dependent: :destroy
         | 
| 50 | 
            +
                accepts_nested_attributes_for :course_registrants, reject_if: :all_blank, allow_destroy: true
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                has_many :orders, -> { order(:id) }, as: :parent, class_name: 'Effective::Order', dependent: :nullify
         | 
| 53 | 
            +
                accepts_nested_attributes_for :orders
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                effective_resource do
         | 
| 56 | 
            +
                  # Acts as Statused
         | 
| 57 | 
            +
                  status                 :string, permitted: false
         | 
| 58 | 
            +
                  status_steps           :text, permitted: false
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  # Dates
         | 
| 61 | 
            +
                  submitted_at           :datetime
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  # Acts as Wizard
         | 
| 64 | 
            +
                  wizard_steps           :text, permitted: false
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  timestamps
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                scope :deep, -> { includes(:owner, :orders, :course_registrants) }
         | 
| 70 | 
            +
                scope :sorted, -> { order(:id) }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                scope :in_progress, -> { where.not(status: [:submitted]) }
         | 
| 73 | 
            +
                scope :done, -> { where(status: [:submitted]) }
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                scope :for, -> (user) { where(owner: user) }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                # All Steps validations
         | 
| 78 | 
            +
                validates :owner, presence: true
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                # Course Step
         | 
| 81 | 
            +
                validate(if: -> { current_step == :course }) do
         | 
| 82 | 
            +
                  self.errors.add(:course_registrants, "can't be blank") unless present_course_registrants.present?
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                # All Fees and Orders
         | 
| 86 | 
            +
                def submit_fees
         | 
| 87 | 
            +
                  course_registrants
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                def after_submit_purchased!
         | 
| 91 | 
            +
                  # Enroll them in the course!
         | 
| 92 | 
            +
                  learndash_owner.create_learndash_enrollment(course: learndash_course)
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              # Instance Methods
         | 
| 98 | 
            +
              def to_s
         | 
| 99 | 
            +
                persisted? ? "#{learndash_course} - #{owner}" : 'course registration'
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              def course
         | 
| 103 | 
            +
                learndash_course
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
              def in_progress?
         | 
| 107 | 
            +
                draft?
         | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              def done?
         | 
| 111 | 
            +
                submitted?
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
              def course_registrant
         | 
| 115 | 
            +
                course_registrants.first
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
              def build_course_registrant
         | 
| 119 | 
            +
                course_registrants.build(owner: owner)
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
              def learndash_owner
         | 
| 123 | 
            +
                (course_registrant&.owner || owner)
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              def member_pricing?
         | 
| 127 | 
            +
                learndash_owner.membership_present?
         | 
| 128 | 
            +
              end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
              def assign_pricing
         | 
| 131 | 
            +
                price = (member_pricing? ? learndash_course.member_price : learndash_course.regular_price)
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                course_registrant.assign_attributes(
         | 
| 134 | 
            +
                  price: price,
         | 
| 135 | 
            +
                  qb_item_name: learndash_course.qb_item_name,
         | 
| 136 | 
            +
                  tax_exempt: learndash_course.tax_exempt
         | 
| 137 | 
            +
                )
         | 
| 138 | 
            +
              end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
              # After the course step.
         | 
| 141 | 
            +
              def course!
         | 
| 142 | 
            +
                raise('expected a learndash course') unless learndash_course.present?
         | 
| 143 | 
            +
                raise('expected a course_registrant to be present') unless course_registrant.present?
         | 
| 144 | 
            +
                raise('expected a course_registrant to have an owner') unless course_registrant.owner.present?
         | 
| 145 | 
            +
                raise('expected a learndash owner') unless learndash_owner.class.try(:effective_learndash_owner?)
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                # Assign prices
         | 
| 148 | 
            +
                assign_pricing()
         | 
| 149 | 
            +
                raise('expected course_registrant to have a price') if course_registrant.price.blank?
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                # Save record
         | 
| 152 | 
            +
                save!
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                # Create a learndash user now before payment to catch any errors in server stuff before payment.
         | 
| 155 | 
            +
                learndash_owner.create_learndash_user
         | 
| 156 | 
            +
                raise('expected a persisted learndash user') unless learndash_owner.learndash_user&.persisted?
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                true
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
              private
         | 
| 162 | 
            +
             | 
| 163 | 
            +
              def present_course_registrants
         | 
| 164 | 
            +
                course_registrants.reject(&:marked_for_destruction?)
         | 
| 165 | 
            +
              end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # This is the registrant as created by the course registration
         | 
| 4 | 
            +
            # It tracks who purchased which course for how much
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Effective
         | 
| 7 | 
            +
              class CourseRegistrant < ActiveRecord::Base
         | 
| 8 | 
            +
                acts_as_purchasable
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                log_changes(to: :learndash_course) if respond_to?(:log_changes)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                # The learndash course containing all the pricing and unique info about this course purchase
         | 
| 13 | 
            +
                belongs_to :learndash_course
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # Every course is charged to a owner
         | 
| 16 | 
            +
                belongs_to :owner, polymorphic: true
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                # As checked out through the learndash course purchase wizard
         | 
| 19 | 
            +
                belongs_to :course_registration, polymorphic: true
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                effective_resource do
         | 
| 22 | 
            +
                  # Acts as Purchasable
         | 
| 23 | 
            +
                  price             :integer
         | 
| 24 | 
            +
                  qb_item_name      :string
         | 
| 25 | 
            +
                  tax_exempt        :boolean
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  timestamps
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                scope :sorted, -> { order(:id) }
         | 
| 31 | 
            +
                scope :deep, -> { includes(:learndash_course, :owner, :course_registration) }
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                before_validation(if: -> { course_registration.present? }) do
         | 
| 34 | 
            +
                  self.learndash_course ||= course_registration.learndash_course
         | 
| 35 | 
            +
                  self.owner ||= course_registration.owner
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                before_validation(if: -> { learndash_course.present? }) do
         | 
| 39 | 
            +
                  self.price ||= learndash_course.price
         | 
| 40 | 
            +
                  self.qb_item_name ||= learndash_course.qb_item_name
         | 
| 41 | 
            +
                  self.tax_exempt = learndash_course.tax_exempt? if self.tax_exempt.nil?
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                def to_s
         | 
| 45 | 
            +
                  persisted? ? title : 'course purchase'
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                def title
         | 
| 49 | 
            +
                  "#{learndash_course} - #{owner}"
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -60,13 +60,14 @@ module Effective | |
| 60 60 |  | 
| 61 61 | 
             
                  username = username_for(owner)
         | 
| 62 62 | 
             
                  password = password_for(owner)
         | 
| 63 | 
            +
                  email = email_for(owner)
         | 
| 63 64 |  | 
| 64 65 | 
             
                  payload = {
         | 
| 65 66 | 
             
                    username: username,
         | 
| 66 67 | 
             
                    password: password,
         | 
| 68 | 
            +
                    email: email,
         | 
| 67 69 |  | 
| 68 70 | 
             
                    name: owner.to_s,
         | 
| 69 | 
            -
                    email: owner.email,
         | 
| 70 71 | 
             
                    roles: ['subscriber'],
         | 
| 71 72 |  | 
| 72 73 | 
             
                    first_name: owner.try(:first_name),
         | 
| @@ -152,6 +153,14 @@ module Effective | |
| 152 153 | 
             
                  name
         | 
| 153 154 | 
             
                end
         | 
| 154 155 |  | 
| 156 | 
            +
                def email_for(resource)
         | 
| 157 | 
            +
                  raise('expected a learndash owner') unless resource.class.respond_to?(:effective_learndash_owner?) # This is a user
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                  email = resource.email
         | 
| 160 | 
            +
                  email = "test#{email}" unless Rails.env.production?
         | 
| 161 | 
            +
                  email
         | 
| 162 | 
            +
                end
         | 
| 163 | 
            +
             | 
| 155 164 | 
             
                def password_for(resource)
         | 
| 156 165 | 
             
                  raise('expected a learndash owner') unless resource.class.respond_to?(:effective_learndash_owner?) # This is a user
         | 
| 157 166 | 
             
                  EffectiveLearndash.wp_password_for(resource)
         | 
| @@ -3,22 +3,88 @@ module Effective | |
| 3 3 | 
             
                has_many :learndash_enrollments
         | 
| 4 4 | 
             
                has_many :learndash_users, through: :learndash_enrollments
         | 
| 5 5 |  | 
| 6 | 
            +
                log_changes if respond_to?(:log_changes)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                # rich_text_body - Used by the select step
         | 
| 9 | 
            +
                has_many_rich_texts
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # rich_text_body
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                # rich_text_all_steps_content
         | 
| 14 | 
            +
                # rich_text_start_content
         | 
| 15 | 
            +
                # rich_text_select_content
         | 
| 16 | 
            +
                # rich_text_select_content
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                acts_as_slugged
         | 
| 19 | 
            +
                log_changes if respond_to?(:log_changes)
         | 
| 20 | 
            +
                acts_as_role_restricted if respond_to?(:acts_as_role_restricted)
         | 
| 21 | 
            +
             | 
| 6 22 | 
             
                effective_resource do
         | 
| 7 23 | 
             
                  # This user the wordpress credentials
         | 
| 8 | 
            -
                  course_id | 
| 9 | 
            -
                   | 
| 10 | 
            -
                   | 
| 24 | 
            +
                  course_id             :integer
         | 
| 25 | 
            +
                  title                 :string
         | 
| 26 | 
            +
                  status                :string
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  # Our attributes
         | 
| 29 | 
            +
                  slug                   :string
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  # For course purchases
         | 
| 32 | 
            +
                  can_register           :boolean
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  # Pricing
         | 
| 35 | 
            +
                  regular_price         :integer
         | 
| 36 | 
            +
                  member_price          :integer
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  qb_item_name          :string
         | 
| 39 | 
            +
                  tax_exempt            :boolean
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  # Access
         | 
| 42 | 
            +
                  roles_mask             :integer
         | 
| 43 | 
            +
                  authenticate_user      :boolean
         | 
| 11 44 |  | 
| 12 45 | 
             
                  timestamps
         | 
| 13 46 | 
             
                end
         | 
| 14 47 |  | 
| 15 48 | 
             
                scope :deep, -> { all }
         | 
| 16 49 | 
             
                scope :sorted, -> { order(:title) }
         | 
| 50 | 
            +
                scope :registerable, -> { where(can_register: true) }
         | 
| 51 | 
            +
                scope :published, -> { all }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                scope :paginate, -> (page: nil, per_page: nil) {
         | 
| 54 | 
            +
                  page = (page || 1).to_i
         | 
| 55 | 
            +
                  offset = [(page - 1), 0].max * (per_page || EffectiveLearndash.per_page)
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  limit(per_page).offset(offset)
         | 
| 58 | 
            +
                }
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                scope :learndash_courses, -> (user: nil, unpublished: false) {
         | 
| 61 | 
            +
                  scope = all.deep.sorted
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  if defined?(EffectiveRoles) && EffectiveLearndash.use_effective_roles
         | 
| 64 | 
            +
                    scope = scope.for_role(user&.roles)
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  if user.blank?
         | 
| 68 | 
            +
                    scope = scope.where(authenticate_user: false)
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  # TODO
         | 
| 72 | 
            +
                  # unless unpublished
         | 
| 73 | 
            +
                  #   scope = scope.published
         | 
| 74 | 
            +
                  # end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  scope
         | 
| 77 | 
            +
                }
         | 
| 17 78 |  | 
| 18 79 | 
             
                validates :course_id, presence: true
         | 
| 19 80 | 
             
                validates :status, presence: true
         | 
| 20 81 | 
             
                validates :title, presence: true
         | 
| 21 82 |  | 
| 83 | 
            +
                with_options(if: -> { can_register? }) do
         | 
| 84 | 
            +
                  validates :regular_price, presence: true
         | 
| 85 | 
            +
                  validates :member_price, presence: true
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 22 88 | 
             
                # Syncs all courses
         | 
| 23 89 | 
             
                def self.refresh!
         | 
| 24 90 | 
             
                  courses = all()
         | 
| @@ -35,5 +101,14 @@ module Effective | |
| 35 101 | 
             
                  title.presence || 'learndash course'
         | 
| 36 102 | 
             
                end
         | 
| 37 103 |  | 
| 104 | 
            +
                def body
         | 
| 105 | 
            +
                  rich_text_body
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                # Todo
         | 
| 109 | 
            +
                def draft?
         | 
| 110 | 
            +
                  false
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
             | 
| 38 113 | 
             
              end
         | 
| 39 114 | 
             
            end
         | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            module Effective
         | 
| 2 2 | 
             
              class LearndashEnrollment < ActiveRecord::Base
         | 
| 3 3 | 
             
                belongs_to :owner, polymorphic: true
         | 
| 4 | 
            -
                log_changes(to: :owner) if respond_to?(:log_changes)
         | 
| 5 | 
            -
             | 
| 6 4 | 
             
                belongs_to :learndash_course
         | 
| 7 5 | 
             
                belongs_to :learndash_user
         | 
| 8 6 |  | 
| 7 | 
            +
                log_changes(to: :learndash_course, except: [:last_synced_at]) if respond_to?(:log_changes)
         | 
| 8 | 
            +
             | 
| 9 9 | 
             
                PROGRESS_STATUSES = ['not-started', 'in-progress', 'completed']
         | 
| 10 10 |  | 
| 11 11 | 
             
                effective_resource do
         | 
| @@ -58,7 +58,11 @@ module Effective | |
| 58 58 | 
             
                  progress_status == 'completed'
         | 
| 59 59 | 
             
                end
         | 
| 60 60 |  | 
| 61 | 
            -
                def refresh!
         | 
| 61 | 
            +
                def refresh!(force: false)
         | 
| 62 | 
            +
                  unless force
         | 
| 63 | 
            +
                    return if last_synced_at.present? && (Time.zone.now - last_synced_at) < 5
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 62 66 | 
             
                  assign_api_attributes
         | 
| 63 67 | 
             
                  save!
         | 
| 64 68 | 
             
                end
         | 
| @@ -44,13 +44,12 @@ module Effective | |
| 44 44 | 
             
                  owner&.to_s || username.presence || 'learndash user'
         | 
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 | 
            -
                def  | 
| 48 | 
            -
                   | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 47 | 
            +
                def refresh!(force: false)
         | 
| 48 | 
            +
                  unless force
         | 
| 49 | 
            +
                    return if last_synced_at.present? && (Time.zone.now - last_synced_at) < 5
         | 
| 50 | 
            +
                    return if learndash_enrollments.none? { |enrollment| !enrollment.completed? }
         | 
| 51 | 
            +
                  end
         | 
| 52 52 |  | 
| 53 | 
            -
                def refresh!
         | 
| 54 53 | 
             
                  assign_api_course_enrollments
         | 
| 55 54 | 
             
                  save!
         | 
| 56 55 | 
             
                end
         |