effective_learndash 0.1.1 → 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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/app/assets/config/effective_learndash_manifest.js +0 -1
  4. data/app/controllers/admin/course_registrations_controller.rb +8 -0
  5. data/app/controllers/effective/course_registrations_controller.rb +13 -0
  6. data/app/controllers/effective/learndash_courses_controller.rb +32 -0
  7. data/app/datatables/admin/effective_course_registrations_datatable.rb +28 -0
  8. data/app/datatables/admin/effective_learndash_courses_datatable.rb +4 -0
  9. data/app/datatables/admin/effective_learndash_enrollments_datatable.rb +1 -2
  10. data/app/datatables/effective_course_registrants_datatable.rb +24 -0
  11. data/app/datatables/effective_course_registrations_datatable.rb +35 -0
  12. data/app/datatables/effective_learndash_courses_datatable.rb +28 -0
  13. data/app/datatables/effective_learndash_enrollments_datatable.rb +15 -1
  14. data/app/models/concerns/effective_learndash_course_registration.rb +167 -0
  15. data/app/models/concerns/effective_learndash_owner.rb +1 -1
  16. data/app/models/effective/course_registrant.rb +53 -0
  17. data/app/models/effective/course_registration.rb +5 -0
  18. data/app/models/effective/learndash_api.rb +10 -1
  19. data/app/models/effective/learndash_course.rb +78 -3
  20. data/app/models/effective/learndash_enrollment.rb +15 -3
  21. data/app/models/effective/learndash_user.rb +5 -6
  22. data/app/views/admin/learndash_courses/_form.html.haml +25 -0
  23. data/app/views/admin/learndash_courses/_form_course_registration_content.html.haml +19 -0
  24. data/app/views/admin/learndash_courses/_form_learndash_course.html.haml +32 -0
  25. data/app/views/effective/course_registrations/_content.html.haml +10 -0
  26. data/app/views/effective/course_registrations/_course.html.haml +9 -0
  27. data/app/views/effective/course_registrations/_course_registration.html.haml +3 -0
  28. data/app/views/effective/course_registrations/_dashboard.html.haml +30 -0
  29. data/app/views/effective/course_registrations/_layout.html.haml +3 -0
  30. data/app/views/effective/course_registrations/_orders.html.haml +4 -0
  31. data/app/views/effective/course_registrations/_summary.html.haml +35 -0
  32. data/app/views/effective/course_registrations/billing.html.haml +15 -0
  33. data/app/views/effective/course_registrations/checkout.html.haml +6 -0
  34. data/app/views/effective/course_registrations/course.html.haml +21 -0
  35. data/app/views/effective/course_registrations/start.html.haml +24 -0
  36. data/app/views/effective/course_registrations/submitted.html.haml +16 -0
  37. data/app/views/effective/course_registrations/summary.html.haml +8 -0
  38. data/app/views/effective/learndash/_dashboard.html.haml +8 -5
  39. data/app/views/effective/learndash_courses/_learndash_course.html.haml +13 -0
  40. data/app/views/effective/learndash_courses/index.html.haml +5 -0
  41. data/app/views/effective/learndash_courses/show.html.haml +6 -0
  42. data/config/effective_learndash.rb +9 -0
  43. data/config/routes.rb +13 -3
  44. data/db/migrate/01_create_effective_learndash.rb.erb +98 -33
  45. data/lib/effective_learndash/engine.rb +1 -0
  46. data/lib/effective_learndash/version.rb +1 -1
  47. data/lib/effective_learndash.rb +6 -1
  48. data/lib/generators/effective_learndash/install_generator.rb +0 -1
  49. metadata +31 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f10afce8560043990198e9b364944ce9ed5d50f4c97f0a070074fa58a2e56014
4
- data.tar.gz: b4f516fcd3ceac21941a5db7e7bb8a43766608bba652998dd5f6677c74b3eccc
3
+ metadata.gz: 83cc9e6d5daa0a6e08e491f1ea9edec7f8e394b045801a2d704eaacab5c93f18
4
+ data.tar.gz: 467de056d4e11255c927a212e0f893b54ddcac8720ec12bf80299873ff5e2910
5
5
  SHA512:
6
- metadata.gz: 7b2d11bce9c397f42f95b823003530eedfe21feb80fa08a28d04c92272085906812b9dcf2685b798a171262ae1054661535394246e7374a7f5f3dcd941d4e939
7
- data.tar.gz: 1eef5bd56979080599f509b17df4835370fc392d0eded403d39091b0d3974846e9462ed215df69835158d4c0e0d3dad7bc2bea9b9f8160ae34875179522268f9
6
+ metadata.gz: 1cbb48faa89c8d2a6fee3f47b78cdb41f3cf20871b354f7e88852a5103e0a294d4b2dd1d2eca63be1525dd546e365fd8143416e35942d714039ecd6031a12a0c
7
+ data.tar.gz: ee47891e98f74e0c8ecdbacbd76f37071a16d95a347bca7014f421a4aeb007b7ffc92d0f96c080dea39c8d57b15b92aa83f06f5558a0ee2182049dfa442952c0
data/README.md CHANGED
@@ -71,6 +71,15 @@ All authorization checks are handled via the effective_resources gem found in th
71
71
  The permissions you actually want to define are as follows (using CanCan):
72
72
 
73
73
  ```ruby
74
+ can(:show, Effective::LearndashUser) { |lduser| lduser.owner_id == user.id }
75
+ can(:index, Effective::LearndashEnrollment)
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
+
74
83
  if user.admin?
75
84
  can :admin, :effective_learndash
76
85
 
@@ -1,3 +1,2 @@
1
1
  //= link_directory ../javascripts .js
2
2
  //= link_directory ../stylesheets .css
3
- //= link_directory ../images/effective_learndash
@@ -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
@@ -15,6 +15,10 @@ module Admin
15
15
 
16
16
  col :learndash_users, visible: false
17
17
 
18
+ col :can_register
19
+ col :regular_price, as: :price
20
+ col :member_price, as: :price
21
+
18
22
  actions_col
19
23
  end
20
24
 
@@ -14,8 +14,7 @@ module Admin
14
14
  time_ago_in_words(enrollment.last_synced_at) + ' ago'
15
15
  end
16
16
 
17
- col :owner, visible: false
18
-
17
+ col :owner
19
18
  col :learndash_course
20
19
  col :learndash_user
21
20
 
@@ -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
@@ -10,6 +13,17 @@ class EffectiveLearndashEnrollmentsDatatable < Effective::Datatable
10
13
 
11
14
  col :date_started, as: :date
12
15
  col :date_completed, as: :date
16
+
17
+ actions_col(show: false) do |enrollment|
18
+ if enrollment.not_started?
19
+ dropdown_link_to('Start', EffectiveLearndash.learndash_url, target: '_blank')
20
+ elsif enrollment.in_progress?
21
+ dropdown_link_to('Continue', EffectiveLearndash.learndash_url, target: '_blank')
22
+ else
23
+ dropdown_link_to('Show', EffectiveLearndash.learndash_url, target: '_blank')
24
+ end
25
+ end
26
+
13
27
  end
14
28
 
15
29
  collection do
@@ -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
@@ -57,7 +57,7 @@ module EffectiveLearndashOwner
57
57
  return true if enrollment.completed?
58
58
 
59
59
  # Check the API
60
- enrollment.sync!
60
+ enrollment.refresh!
61
61
  enrollment.completed?
62
62
  end
63
63
 
@@ -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
@@ -0,0 +1,5 @@
1
+ module Effective
2
+ class CourseRegistration < ActiveRecord::Base
3
+ effective_learndash_course_registration
4
+ end
5
+ 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 :integer
9
- status :string
10
- title :string
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
@@ -46,11 +46,23 @@ module Effective
46
46
  persisted? ? "#{learndash_user} #{learndash_course}" : 'learndash enrollment'
47
47
  end
48
48
 
49
+ def not_started?
50
+ progress_status == 'not-started'
51
+ end
52
+
53
+ def in_progress?
54
+ progress_status == 'in-progress'
55
+ end
56
+
49
57
  def completed?
50
58
  progress_status == 'completed'
51
59
  end
52
60
 
53
- 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
+
54
66
  assign_api_attributes
55
67
  save!
56
68
  end