Skip to content

Commit 8f0b208

Browse files
committed
add create_from_project for lesson
1 parent ecb7842 commit 8f0b208

File tree

6 files changed

+80
-3
lines changed

6 files changed

+80
-3
lines changed

app/controllers/api/lessons_controller.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Api
44
class LessonsController < ApiController
55
before_action :authorize_user, except: %i[index show]
66
before_action :verify_school_class_belongs_to_school, only: :create
7-
load_and_authorize_resource :lesson
7+
load_and_authorize_resource :lesson, except: [:create_from_project]
88

99
def index
1010
archive_scope = params[:include_archived] == 'true' ? Lesson : Lesson.unarchived
@@ -41,6 +41,21 @@ def create_copy
4141
end
4242
end
4343

44+
def create_from_project
45+
remix_origin = request.origin || request.referer
46+
47+
puts("lesson_params: #{lesson_params}")
48+
49+
result = Lesson::CreateFromProject.call(lesson_params: lesson_params, remix_origin:)
50+
51+
if result.success?
52+
@lesson_with_user = result[:lesson].with_user
53+
render :show, formats: [:json], status: :created
54+
else
55+
render json: { error: result[:error] }, status: :unprocessable_entity
56+
end
57+
end
58+
4459
def update
4560
# TODO: Consider removing user_id from the lesson_params for update so users can update other users' lessons without changing ownership
4661
# OR consider dropping user_id on lessons and using teacher id/ids on the class instead
@@ -86,6 +101,7 @@ def base_params
86101
:description,
87102
:visibility,
88103
:due_date,
104+
:project_identifier,
89105
{
90106
project_attributes: [
91107
:name,

app/models/ability.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def define_school_owner_abilities(school:)
6767
can(%i[read create destroy], :school_owner)
6868
can(%i[read create destroy], :school_teacher)
6969
can(%i[read create create_batch update destroy], :school_student)
70+
can(%i[create_from_project], Lesson)
7071
can(%i[create create_copy], Lesson, school_id: school.id)
7172
can(%i[read update destroy], Lesson, school_id: school.id, visibility: %w[teachers students public])
7273
end
@@ -83,13 +84,14 @@ def define_school_teacher_abilities(user:, school:)
8384
can(%i[create update destroy], Lesson) do |lesson|
8485
school_teacher_can_manage_lesson?(user:, school:, lesson:)
8586
end
87+
can(%i[create_from_project], Lesson)
8688
can(%i[read create_copy], Lesson, school_id: school.id, visibility: %w[teachers students])
8789
can(%i[create], Project) do |project|
8890
school_teacher_can_manage_project?(user:, school:, project:)
8991
end
9092
can(%i[read update show_context], Project, school_id: school.id, lesson: { visibility: %w[teachers students] })
9193
can(%i[read], Project,
92-
remixed_from_id: Project.where(school_id: school.id, remixed_from_id: nil, lesson_id: Lesson.where(school_class_id: ClassTeacher.where(teacher_id: user.id).select(:school_class_id))).pluck(:id))
94+
remixed_from_id: Project.where(school_id: school.id, lesson_id: Lesson.where(school_class_id: ClassTeacher.where(teacher_id: user.id).select(:school_class_id))).pluck(:id))
9395
end
9496

9597
def define_school_student_abilities(user:, school:)

app/models/project.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ module Types
3131
validate :project_with_instructions_must_belong_to_school
3232
validate :project_with_school_id_has_school_project
3333
validate :school_project_school_matches_project_school
34+
validate :lesson_id_cannot_be_changed
3435

3536
default_scope -> { where.not(project_type: Types::SCRATCH) }
3637

@@ -142,4 +143,10 @@ def school_project_school_matches_project_school
142143

143144
errors.add(:school_project, 'School project school_id must match project school_id')
144145
end
146+
147+
def lesson_id_cannot_be_changed
148+
return unless lesson_id_changed? && lesson_id_was.present?
149+
150+
errors.add(:lesson_id, 'cannot be changed once set')
151+
end
145152
end

app/views/api/lessons/index.json.jbuilder

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ json.array!(@lessons_with_users) do |lesson, user|
2323
:identifier,
2424
:project_type
2525
)
26-
json.project.finished(lesson.project.finished) if lesson.project.remixed_from_id.present?
26+
# json.project.finished(lesson.project.finished) if lesson.project.remixed_from_id.present?
2727
end
2828

2929
json.user_name(user&.name)

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161

6262
resources :lessons, only: %i[index create show update destroy] do
6363
post :copy, on: :member, to: 'lessons#create_copy'
64+
post :create_from_project, on: :collection, to: 'lessons#create_from_project'
6465
end
6566

6667
resources :teacher_invitations, param: :token, only: :show do
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# frozen_string_literal: true
2+
3+
class Lesson
4+
class CreateFromProject
5+
class << self
6+
def call(lesson_params:, remix_origin:)
7+
pp 'creating lesson from project!'
8+
# ActiveRecord::Base.transaction do
9+
response = OperationResponse.new
10+
response[:lesson] = build_lesson_from_project(lesson_params, remix_origin)
11+
response[:lesson].save!
12+
response
13+
rescue StandardError => e
14+
Sentry.capture_exception(e)
15+
pp(e)
16+
errors = response[:lesson].errors.full_messages.join(',')
17+
response[:error] = "Error creating remix of lesson: #{errors}"
18+
response
19+
# end
20+
end
21+
22+
private
23+
24+
def build_lesson_from_project(lesson_params, remix_origin)
25+
# original_project = Project.find_by(identifier: lesson_params[:project_identifier])
26+
# lesson_copy = Lesson.new(name: original_project.name)
27+
# filtered_params = lesson_params.except(:project_identifier)
28+
# lesson_copy.assign_attributes(filtered_params)
29+
# lesson_copy.project = build_project_remix(original_project, lesson_params, remix_origin)
30+
31+
# lesson_copy
32+
project = Project.find_by(identifier: lesson_params[:project_identifier])
33+
lesson = Lesson.new(
34+
name: project.name)
35+
lesson.assign_attributes(lesson_params.except(:project_identifier))
36+
lesson.project = project
37+
lesson
38+
end
39+
40+
# def build_project_remix(original_project, lesson_params, remix_origin)
41+
# response = Project::CreateRemix.call(
42+
# params: {school_id: lesson_params[:school_id]},
43+
# user_id: lesson_params[:user_id],
44+
# original_project: original_project,
45+
# remix_origin: remix_origin
46+
# )
47+
# response[:project]
48+
# end
49+
end
50+
end
51+
end

0 commit comments

Comments
 (0)