From c3da80ed8c7909c62834185d79dae602f8313ff5 Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:35:00 +0200 Subject: [PATCH 1/9] add attr-acessor for selected, in order to be able to filter form selected volunteers on select in form --- app/models/semester_process_volunteer.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/semester_process_volunteer.rb b/app/models/semester_process_volunteer.rb index 523d982ea..7c0f0cfc4 100644 --- a/app/models/semester_process_volunteer.rb +++ b/app/models/semester_process_volunteer.rb @@ -1,4 +1,6 @@ class SemesterProcessVolunteer < ApplicationRecord + attr_accessor :selected + belongs_to :volunteer belongs_to :semester_process belongs_to :responsible, -> { with_deleted }, class_name: 'User', -- GitLab From ece24e92a07b2c0f9bde90c756d60b70e3506dee Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:36:02 +0200 Subject: [PATCH 2/9] fix(semester-process-volunteer): fix missions method, to work also in non saved state --- app/models/semester_process_volunteer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/semester_process_volunteer.rb b/app/models/semester_process_volunteer.rb index 7c0f0cfc4..3abfc88f6 100644 --- a/app/models/semester_process_volunteer.rb +++ b/app/models/semester_process_volunteer.rb @@ -25,6 +25,6 @@ class SemesterProcessVolunteer < ApplicationRecord # will only return an array, not a AD-result def missions - assignments + group_assignments + semester_process_volunteer_missions.map(&:mission) end end -- GitLab From a479287d5b8ce827b5cd6c1c946ad3aa27228a50 Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:37:52 +0200 Subject: [PATCH 3/9] feat(semester-process-volunteer): builder that assigns the elegible missions from the volunteer to the SemesterProcessVolunteerMission join table relation --- app/models/semester_process_volunteer.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/semester_process_volunteer.rb b/app/models/semester_process_volunteer.rb index 3abfc88f6..88542a3a7 100644 --- a/app/models/semester_process_volunteer.rb +++ b/app/models/semester_process_volunteer.rb @@ -27,4 +27,14 @@ class SemesterProcessVolunteer < ApplicationRecord def missions semester_process_volunteer_missions.map(&:mission) end + + def build_missions(semester) + new_missions = volunteer.assignments.active_between(semester.begin, semester.end) + + volunteer.group_assignments.active_between(semester.begin, semester.end) + + semester_process_volunteer_missions << new_missions.map do |mission| + SemesterProcessVolunteerMission.new(mission: mission) + end + end + end -- GitLab From b5456f7f9202187738eaf65be22863efcf819b5c Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:38:33 +0200 Subject: [PATCH 4/9] feat(semester-process-volunteer): add builder that creates hours relations, feedbacks and mails - relations to all hours with meeting date within the semester - scaffold empty semesterFeedback record for each mission related - build the SemesterProcessMail.kind == :mail for the initial mail --- app/models/semester_process_volunteer.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/semester_process_volunteer.rb b/app/models/semester_process_volunteer.rb index 88542a3a7..72bb14776 100644 --- a/app/models/semester_process_volunteer.rb +++ b/app/models/semester_process_volunteer.rb @@ -3,6 +3,9 @@ class SemesterProcessVolunteer < ApplicationRecord belongs_to :volunteer belongs_to :semester_process + delegate :semester, to: :semester_process + delegate :creator, to: :semester_process + belongs_to :responsible, -> { with_deleted }, class_name: 'User', inverse_of: 'semester_processes', optional: true belongs_to :reviewed_by, -> { with_deleted }, class_name: 'User', @@ -37,4 +40,11 @@ class SemesterProcessVolunteer < ApplicationRecord end end + def build_hours_feedbacks_and_mails + missions.each do |mission| + hours << mission.hours.date_between_inclusion(:meeting_date, semester.begin, semester.end) + semester_feedbacks << SemesterFeedback.new(mission: mission, volunteer: mission.volunteer) + end + semester_process_mails << SemesterProcessMail.new(kind: :mail, sent_by: creator) + end end -- GitLab From a7d3e195f304cc79d2d83d819510c5ed1ea4ec2c Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:41:16 +0200 Subject: [PATCH 5/9] feat(semester-process): make SemesterProcessVolunteer a nested attribute - so that it can be treated as a child of this in forms - --- app/models/semester_process.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/semester_process.rb b/app/models/semester_process.rb index 005829560..81acce594 100644 --- a/app/models/semester_process.rb +++ b/app/models/semester_process.rb @@ -6,6 +6,8 @@ class SemesterProcess < ApplicationRecord inverse_of: 'semester_process_reminder_mail_posted', optional: true has_many :semester_process_volunteers, dependent: :destroy + accepts_nested_attributes_for :semester_process_volunteers, allow_destroy: true + has_many :volunteers, through: :semester_process_volunteers has_many :semester_feedbacks, through: :semester_process_volunteers has_many :hours, through: :semester_process_volunteers -- GitLab From cf1adbaa01047bcc6c49d159bbabaa379a01a8da Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:42:31 +0200 Subject: [PATCH 6/9] feat(semester-process): semester setter, that can parse '2018,1' and build semester daterange - if passed from form input, it can build the correct semester that was passed from form input --- app/models/semester_process.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/semester_process.rb b/app/models/semester_process.rb index 81acce594..c30f67b37 100644 --- a/app/models/semester_process.rb +++ b/app/models/semester_process.rb @@ -26,4 +26,14 @@ class SemesterProcess < ApplicationRecord # will only return an array, not a AD-result delegate :missions, to: :semester_process_volunteers + + # creates semester date range from string '[year],[semester_number]' e.g. '2018,2' + def semester=(semester) + if semester.is_a?(String) + super(Semester.new(*semester.split(',').map(&:to_i)).current) + else + super(semester) + end + end + end -- GitLab From 498f2bdbf8c4a73c6800a669ef93bd62e75eaa87 Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:43:51 +0200 Subject: [PATCH 7/9] feat(semester-process): builder for creating SemesterProcessVolunteer - takes query of elegible volunteers and then builds SemesterProcessVolunteer for each - if array of volunteer ids is passed, it will only build SemesterProcessVolunteer for these --- app/models/semester_process.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/semester_process.rb b/app/models/semester_process.rb index c30f67b37..534afbcf6 100644 --- a/app/models/semester_process.rb +++ b/app/models/semester_process.rb @@ -36,4 +36,12 @@ class SemesterProcess < ApplicationRecord end end + def build_semester_volunteers(volunteers, selected = nil) + volunteers = volunteers.where(id: selected) if selected + semester_process_volunteers << volunteers.to_a.map do |volunteer| + spv = SemesterProcessVolunteer.new(volunteer: volunteer, selected: true) + spv.build_missions(semester) + spv + end + end end -- GitLab From ad09fd302604e74b84f12eb2baff377e38076ddd Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 10:46:33 +0200 Subject: [PATCH 8/9] feat(semester-process): builder that triggers the builders for all Semester process Volunteers --- app/models/semester_process.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/semester_process.rb b/app/models/semester_process.rb index 534afbcf6..44f72a45e 100644 --- a/app/models/semester_process.rb +++ b/app/models/semester_process.rb @@ -44,4 +44,8 @@ class SemesterProcess < ApplicationRecord spv end end + + def build_volunteers_hours_feedbacks_and_mails + semester_process_volunteers.map(&:build_hours_feedbacks_and_mails) + end end -- GitLab From 74074de33541075775569e35d441f06a14a00160 Mon Sep 17 00:00:00 2001 From: Kaspar Vollenweider Date: Fri, 12 Oct 2018 17:00:53 +0200 Subject: [PATCH 9/9] test(semester_process_volunteer): add test for #build_hours_feedbacks_and_mails and #build_missions --- .../models/semester_process_volunteer_test.rb | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/test/models/semester_process_volunteer_test.rb b/test/models/semester_process_volunteer_test.rb index 9243f63fc..c3f942348 100644 --- a/test/models/semester_process_volunteer_test.rb +++ b/test/models/semester_process_volunteer_test.rb @@ -28,4 +28,60 @@ class SemesterProcessVolunteerTest < ActiveSupport::TestCase assert_not @subject.reload.reminders.include? mail assert @subject.reload.reminders.include? reminder end + + test '#build_missions' do + travel_to time_z(2018, 7, 15) + semester = Semester.new + semester_process = SemesterProcess.new(semester: semester.previous, creator: create(:user)) + + @assignment.update(period_start: nil, period_end: nil) + @group_assignment.update(period_start: nil, period_end: nil) + + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 0, subject.semester_process_volunteer_missions.size + + @assignment.update(period_start: time_z(2015, 7, 15)) + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 1, subject.semester_process_volunteer_missions.size + + @group_assignment.update(period_start: time_z(2018, 7, 1)) + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 1, subject.semester_process_volunteer_missions.size + + @group_assignment.update(period_start: time_z(2018, 7, 1).advance(weeks: -2)) + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 1, subject.semester_process_volunteer_missions.size + end + + test '#build_hours_feedbacks_and_mails' do + travel_to time_z(2018, 7, 15) + semester = Semester.new + semester_process = SemesterProcess.new(semester: semester.previous, creator: create(:user)) + + @assignment.update(period_start: time_z(2018, 1, 15), period_end: nil) + @group_assignment.update(period_start: time_z(2018, 1, 15), period_end: nil) + hour_assignment = create :hour, hourable: @assignment, meeting_date: time_z(2018, 3, 15), + volunteer: @volunteer + + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + subject.build_hours_feedbacks_and_mails + assert subject.hours.include? hour_assignment + assert_equal @assignment, subject.semester_feedbacks.find { |fb| fb.assignment_id == @assignment.id }.mission + + hour_group_assignment = create :hour, hourable: @group_assignment.group_offer, + meeting_date: time_z(2018, 3, 15), volunteer: @volunteer + + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + subject.build_hours_feedbacks_and_mails + assert subject.hours.include? hour_assignment + assert subject.hours.include? hour_group_assignment + assert_equal @assignment, subject.semester_feedbacks.find { |fb| fb.assignment_id == @assignment.id }.mission + assert_equal @group_assignment, subject.semester_feedbacks.find { |fb| fb.group_assignment_id == @group_assignment.id }.mission + end end -- GitLab