diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 32e8b6c9..99028a51 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -8,7 +8,7 @@ def show authorize @course # query for all projects_instances, owner_type and owner_id for participants table - @course.projects.includes(project_instances: { enrolment: :user }).load + @course.projects.includes(project_instances: { supervisor_enrolment: :user }).load @projects_by_owner = @course.projects.index_by { |p| [p.owner_type, p.owner_id] } @student_list = @course.students @@ -43,10 +43,10 @@ def show if @current_user_enrolment&.coordinator? supervisor_enrolment = @lecturer_enrolment || @current_user_enrolment @my_student_projects = @course.projects.supervised_by(supervisor_enrolment).approved - @incoming_proposals = @course.projects.where(enrolment: supervisor_enrolment).proposals + @incoming_proposals = @course.projects.where(supervisor_enrolment: supervisor_enrolment).proposals elsif @current_user_enrolment&.lecturer? @my_student_projects = @course.projects.supervised_by(@current_user_enrolment).approved - @incoming_proposals = @course.projects.where(enrolment: @current_user_enrolment).proposals + @incoming_proposals = @course.projects.where(supervisor_enrolment: @current_user_enrolment).proposals end # view instances for participants_table @@ -262,7 +262,7 @@ def profile @course = Course.find(params[:id]) @grouped = @course.grouped - @course.projects.includes(project_instances: { enrolment: :user }).load + @course.projects.includes(project_instances: { supervisor_enrolment: :user }).load @projects_by_owner = @course.projects.index_by { |p| [p.owner_type, p.owner_id] } if @participant_type == 'group' diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index fa30d859..2bcdf4e8 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -163,7 +163,7 @@ def create @project = Project.create!( course: @course, owner: @course.grouped? ? group : current_user, - enrolment: supervisor_enrolment + supervisor_enrolment: supervisor_enrolment ) # Get title @@ -176,7 +176,7 @@ def create version: 1, title: title_value, created_by: current_user, - enrolment: supervisor_enrolment, + supervisor_enrolment: supervisor_enrolment, source_topic: topic || nil, last_edit_time: Time.current, last_edit_by: current_user.id diff --git a/app/models/project.rb b/app/models/project.rb index b415b42f..37ee0a81 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -2,7 +2,7 @@ class Project < ApplicationRecord enum :ownership_type, { student: 0, project_group: 1, lecturer: 2 } default_scope { where(ownership_type: %i[student project_group]) } - belongs_to :enrolment + belongs_to :supervisor_enrolment, class_name: 'Enrolment', foreign_key: 'enrolment_id' belongs_to :course belongs_to :owner, polymorphic: true @@ -23,7 +23,7 @@ class Project < ApplicationRecord scope :proposals, -> { where(status: %i[pending redo rejected]) } # Enrolment (supervisor) filters - scope :supervised_by, ->(enrolment) { where(enrolment: enrolment) } + scope :supervised_by, ->(supervisor_enrolment) { where(supervisor_enrolment: supervisor_enrolment) } scope :owned_by_user_or_groups, lambda { |user, groups| where(owner: [user] + groups.to_a) @@ -36,10 +36,7 @@ class Project < ApplicationRecord STATUS_SORT_ORDER = { 'rejected' => 0, 'redo' => 1, 'pending' => 2, 'not_submitted' => 3, 'approved' => 4 }.freeze def supervisor - return nil unless enrolment_id.present? - - enrolment = Enrolment.find_by(id: enrolment_id) - enrolment&.user + self.supervisor_enrolment.user end def member @@ -75,7 +72,7 @@ def instance_to_edit(created_by:, has_supervisor_comment:) project_instances.build( version: (project_instances.maximum(:version) || 0) + 1, created_by: created_by, - enrolment: enrolment, + supervisor_enrolment: supervisor_enrolment, title: current_title, status: (status if approved?) ) diff --git a/app/models/project_instance.rb b/app/models/project_instance.rb index bdf749a6..c5671591 100644 --- a/app/models/project_instance.rb +++ b/app/models/project_instance.rb @@ -4,7 +4,7 @@ class ProjectInstance < ApplicationRecord default_scope { where(project_instance_type: :project) } belongs_to :project - belongs_to :enrolment + belongs_to :supervisor_enrolment, class_name: 'Enrolment', foreign_key: 'enrolment_id' has_many :comments, as: :location, dependent: :destroy @@ -23,7 +23,7 @@ class ProjectInstance < ApplicationRecord validates :title, presence: true def supervisor - enrolment&.user + self.supervisor_enrolment.user end private @@ -33,7 +33,7 @@ def update_parent_project project.update( status: status, - enrolment: enrolment + supervisor_enrolment: supervisor_enrolment ) end diff --git a/db/seeds.rb b/db/seeds.rb index e4d8d0e6..7050342a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -604,56 +604,56 @@ group_1_project = Project.create!( course: course_with_groups, - enrolment: lecturer_1_lecturer_enrolment, + supervisor_enrolment: lecturer_1_lecturer_enrolment, owner: group_1, ownership_type: :project_group ) group_2_project = Project.create!( course: course_with_groups, - enrolment: lecturer_1_lecturer_enrolment, + supervisor_enrolment: lecturer_1_lecturer_enrolment, owner: group_2, ownership_type: :project_group ) group_3_project = Project.create!( course: course_with_groups, - enrolment: lecturer_1_lecturer_enrolment, + supervisor_enrolment: lecturer_1_lecturer_enrolment, owner: group_3, ownership_type: :project_group ) group_4_project = Project.create!( course: course_with_groups, - enrolment: lecturer_1_lecturer_enrolment, + supervisor_enrolment: lecturer_1_lecturer_enrolment, owner: group_4, ownership_type: :project_group ) student_1_project = Project.create!( course: course_no_groups, - enrolment: lecturer_1_lecturer_enrolment_no_groups, + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups, owner: student1, ownership_type: :student ) student_2_project = Project.create!( course: course_no_groups, - enrolment: lecturer_1_lecturer_enrolment_no_groups, + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups, owner: student2, ownership_type: :student ) student_3_project = Project.create!( course: course_no_groups, - enrolment: lecturer_1_lecturer_enrolment_no_groups, + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups, owner: student3, ownership_type: :student ) student_4_project = Project.create!( course: course_no_groups, - enrolment: lecturer_1_lecturer_enrolment_no_groups, + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups, owner: student4, ownership_type: :student ) @@ -809,7 +809,7 @@ created_by: student1, title: 'Difficult Group Project 1', status: :pending, - enrolment: lecturer_2_lecturer_enrolment + supervisor_enrolment: lecturer_2_lecturer_enrolment ) group_1_instance_2 = ProjectInstance.create!( @@ -818,7 +818,7 @@ created_by: student1, title: 'Difficult Group Project 2', status: :redo, - enrolment: lecturer_2_lecturer_enrolment + supervisor_enrolment: lecturer_2_lecturer_enrolment ) group_1_instance_3 = ProjectInstance.create!( @@ -827,7 +827,7 @@ created_by: student1, title: 'Difficult Group Project 3', status: :rejected, - enrolment: lecturer_3_lecturer_enrolment + supervisor_enrolment: lecturer_3_lecturer_enrolment ) group_1_instance_4 = ProjectInstance.create!( @@ -836,7 +836,7 @@ created_by: student1, title: 'Difficult Group Project 4', status: :approved, - enrolment: lecturer_1_lecturer_enrolment + supervisor_enrolment: lecturer_1_lecturer_enrolment ) group_2_instance_1 = ProjectInstance.create!( @@ -845,7 +845,7 @@ created_by: student4, title: 'Difficult Group Project Group 2', status: :rejected, - enrolment: lecturer_1_lecturer_enrolment + supervisor_enrolment: lecturer_1_lecturer_enrolment ) group_3_instance_1 = ProjectInstance.create!( @@ -854,7 +854,7 @@ created_by: student7, title: 'Difficult Group Project Group 3', status: :redo, - enrolment: lecturer_1_lecturer_enrolment + supervisor_enrolment: lecturer_1_lecturer_enrolment ) group_4_instance_1 = ProjectInstance.create!( @@ -863,7 +863,7 @@ created_by: student10, title: 'Difficult Group Project Group 4', status: :pending, - enrolment: lecturer_1_lecturer_enrolment + supervisor_enrolment: lecturer_1_lecturer_enrolment ) student_1_project_instance_1 = ProjectInstance.create!( @@ -872,7 +872,7 @@ created_by: student1, title: 'Student 1 Project', status: :pending, - enrolment: lecturer_3_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_3_lecturer_enrolment_no_groups ) student_1_project_instance_2 = ProjectInstance.create!( @@ -881,7 +881,7 @@ created_by: student1, title: 'Student 1 Project 2', status: :rejected, - enrolment: lecturer_3_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_3_lecturer_enrolment_no_groups ) student_1_project_instance_3 = ProjectInstance.create!( @@ -890,7 +890,7 @@ created_by: student1, title: 'Student 1 Project 3', status: :redo, - enrolment: lecturer_2_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_2_lecturer_enrolment_no_groups ) student_1_project_instance_4 = ProjectInstance.create!( @@ -899,7 +899,7 @@ created_by: student1, title: 'Student 1 Project 4', status: :approved, - enrolment: lecturer_1_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups ) student_2_project_instance_1 = ProjectInstance.create!( @@ -908,7 +908,7 @@ created_by: student2, title: 'Student 2 Project', status: :pending, - enrolment: lecturer_1_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups ) student_3_project_instance_1 = ProjectInstance.create!( @@ -917,7 +917,7 @@ created_by: student3, title: 'Student 3 Project', status: :redo, - enrolment: lecturer_1_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups ) student_4_project_instance_1 = ProjectInstance.create!( @@ -926,7 +926,7 @@ created_by: student4, title: 'Student 4 Project', status: :rejected, - enrolment: lecturer_1_lecturer_enrolment_no_groups + supervisor_enrolment: lecturer_1_lecturer_enrolment_no_groups ) # Create Project Instance Fields diff --git a/test/factories/project_instances.rb b/test/factories/project_instances.rb index 6d00c3e2..9f605bea 100644 --- a/test/factories/project_instances.rb +++ b/test/factories/project_instances.rb @@ -1,7 +1,7 @@ FactoryBot.define do factory :project_instance do association :project - association :enrolment + association :supervisor_enrolment, factory: :enrolment association :created_by, factory: :user version { 1 } status { :pending } diff --git a/test/factories/projects.rb b/test/factories/projects.rb index 1b5eddc4..170f0db7 100644 --- a/test/factories/projects.rb +++ b/test/factories/projects.rb @@ -1,7 +1,7 @@ FactoryBot.define do factory :project do association :course - association :enrolment + association :supervisor_enrolment, factory: :enrolment owner { association :user } owner_type { 'User' } status { :pending } diff --git a/test/models/project_instance_test.rb b/test/models/project_instance_test.rb index 4b9136eb..f101cbc4 100644 --- a/test/models/project_instance_test.rb +++ b/test/models/project_instance_test.rb @@ -5,13 +5,13 @@ class ProjectInstanceTest < ActiveSupport::TestCase @course = FactoryBot.create(:course) @user = FactoryBot.create(:user, is_staff: false) @enrolment = FactoryBot.create(:enrolment, user: @user, course: @course, role: :student) - @project = FactoryBot.create(:project, course: @course, owner: @user, enrolment: @enrolment) + @project = FactoryBot.create(:project, course: @course, owner: @user, supervisor_enrolment: @enrolment) end test 'project instance created with happy paths' do instance = ProjectInstance.create!( project: @project, - enrolment: @enrolment, + supervisor_enrolment: @enrolment, created_by: @user, version: 1, title: 'Test Project Title' @@ -25,7 +25,7 @@ class ProjectInstanceTest < ActiveSupport::TestCase test 'saving project instance updates the parent project status happy path' do ProjectInstance.create!( project: @project, - enrolment: @enrolment, + supervisor_enrolment: @enrolment, created_by: @user, version: 1, title: 'Test Project Title' @@ -36,12 +36,12 @@ class ProjectInstanceTest < ActiveSupport::TestCase test 'saving an older instance does not overwrite parent project status sad path' do instance_v1 = ProjectInstance.create!( - project: @project, enrolment: @enrolment, + project: @project, supervisor_enrolment: @enrolment, created_by: @user, version: 1, title: 'Test Project Title', status: :pending ) ProjectInstance.create!( - project: @project, enrolment: @enrolment, + project: @project, supervisor_enrolment: @enrolment, created_by: @user, version: 2, title: 'Test Project Title 2', status: :approved ) @@ -53,12 +53,12 @@ class ProjectInstanceTest < ActiveSupport::TestCase test 'current_instance returns the instance with the highest version' do ProjectInstance.create!( - project: @project, enrolment: @enrolment, + project: @project, supervisor_enrolment: @enrolment, created_by: @user, version: 1, title: 'Test Project Title' ) instance_v2 = ProjectInstance.create!( - project: @project, enrolment: @enrolment, + project: @project, supervisor_enrolment: @enrolment, created_by: @user, version: 2, title: 'Test Project Title 2' ) @@ -82,13 +82,13 @@ class ProjectInstanceTest < ActiveSupport::TestCase test 'cannot create two instances with the same version for the same project' do ProjectInstance.create!( - project: @project, enrolment: @enrolment, + project: @project, supervisor_enrolment: @enrolment, created_by: @user, version: 1, title: 'First' ) assert_raises ActiveRecord::RecordNotUnique do ProjectInstance.create!( - project: @project, enrolment: @enrolment, + project: @project, supervisor_enrolment: @enrolment, created_by: @user, version: 1, title: 'Duplicate' ) end diff --git a/test/models/project_test.rb b/test/models/project_test.rb index 93899e5f..b5ee5872 100644 --- a/test/models/project_test.rb +++ b/test/models/project_test.rb @@ -7,8 +7,8 @@ class ProjectTest < ActiveSupport::TestCase @lecturer = create(:user, is_staff: true) @student_enrolment = create(:enrolment, :student, user: @student, course: @course) @lecturer_enrolment = create(:enrolment, :lecturer, user: @lecturer, course: @course) - @project = create(:project, course: @course, owner: @student, enrolment: @lecturer_enrolment) - @instance = create(:project_instance, project: @project, enrolment: @lecturer_enrolment, created_by: @student, version: 1) + @project = create(:project, course: @course, owner: @student, supervisor_enrolment: @lecturer_enrolment) + @instance = create(:project_instance, project: @project, supervisor_enrolment: @lecturer_enrolment, created_by: @student, version: 1) end test 'instance_to_edit returns new instance when project is rejected' do diff --git a/test/system/projects/change_status_test.rb b/test/system/projects/change_status_test.rb index b2023074..de27fdb2 100644 --- a/test/system/projects/change_status_test.rb +++ b/test/system/projects/change_status_test.rb @@ -11,8 +11,8 @@ class ChangeStatusTest < ApplicationSystemTestCase @lecturer_enrolment = create(:enrolment, user: @lecturer, course: @course, role: :lecturer) @other_student_enrolment = create(:enrolment, user: @other_student, course: @course, role: :student) - @project = create(:project, course: @course, owner: @student, enrolment: @lecturer_enrolment) - @instance = create(:project_instance, project: @project, enrolment: @lecturer_enrolment, created_by: @student, version: 1, status: :pending) + @project = create(:project, course: @course, owner: @student, supervisor_enrolment: @lecturer_enrolment) + @instance = create(:project_instance, project: @project, supervisor_enrolment: @lecturer_enrolment, created_by: @student, version: 1, status: :pending) end test 'supervisor can change project status happy path' do diff --git a/test/system/projects/project_versioning_test.rb b/test/system/projects/project_versioning_test.rb index ab824359..b7861ebc 100644 --- a/test/system/projects/project_versioning_test.rb +++ b/test/system/projects/project_versioning_test.rb @@ -9,9 +9,9 @@ class ProjectVersioningTest < ApplicationSystemTestCase @student_enrolment = create(:enrolment, :student, user: @student, course: @course) @lecturer_enrolment = create(:enrolment, :lecturer, user: @lecturer, course: @course) - @project = create(:project, course: @course, owner: @student, enrolment: @lecturer_enrolment) - @instance_1 = create(:project_instance, project: @project, enrolment: @lecturer_enrolment, created_by: @student, version: 1, status: :pending) - @instance_2 = create(:project_instance, project: @project, enrolment: @lecturer_enrolment, created_by: @student, version: 2, status: :pending) + @project = create(:project, course: @course, owner: @student, supervisor_enrolment: @lecturer_enrolment) + @instance_1 = create(:project_instance, project: @project, supervisor_enrolment: @lecturer_enrolment, created_by: @student, version: 1, status: :pending) + @instance_2 = create(:project_instance, project: @project, supervisor_enrolment: @lecturer_enrolment, created_by: @student, version: 2, status: :pending) end test 'defaults to latest version on page load' do