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
|