From d9bf81097979960a02eb874cbdfa6c42e3c4e9d3 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 14:50:13 +0200 Subject: [PATCH 01/13] Adapt alumni_processing migration to role change --- ...230918160847_add_alumni_processing_timestamps_to_role.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/migrate/20230918160847_add_alumni_processing_timestamps_to_role.rb b/db/migrate/20230918160847_add_alumni_processing_timestamps_to_role.rb index c8eb1df2c..2b631f2b2 100644 --- a/db/migrate/20230918160847_add_alumni_processing_timestamps_to_role.rb +++ b/db/migrate/20230918160847_add_alumni_processing_timestamps_to_role.rb @@ -10,17 +10,17 @@ def up add_column :roles, :alumni_invitation_processed_at, :datetime, null: true add_column :roles, :alumni_reminder_processed_at, :datetime, null: true - if connection.adapter_name.downcase =~ /sqlite/ + if /sqlite/.match?(connection.adapter_name.downcase) connection.execute <<~SQL UPDATE roles SET alumni_invitation_processed_at = '1970-01-01', alumni_reminder_processed_at = '1970-01-01' - WHERE deleted_at < TIME('now') + WHERE en_on < TIME('now') SQL else connection.execute <<~SQL UPDATE roles SET alumni_invitation_processed_at = '1970-01-01', alumni_reminder_processed_at = '1970-01-01' - WHERE deleted_at < NOW() + WHERE end_on < NOW() SQL end end From 5de2a7e444194ec8c41bfba2634746a2069654c3 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 14:53:01 +0200 Subject: [PATCH 02/13] Adapt event/approver for role changes --- app/domain/event/approver.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/domain/event/approver.rb b/app/domain/event/approver.rb index 8d28e2514..87bece127 100644 --- a/app/domain/event/approver.rb +++ b/app/domain/event/approver.rb @@ -105,7 +105,7 @@ def approvers_for_groups(groups) Person.joins(:roles) .where(roles: {group_id: groups.collect(&:id), type: role_types.collect(&:sti_name), - deleted_at: nil}) + end_on: (Date.today..nil)}) .distinct end From 0abe14d7b42f112c79b104172fc5b439fa01f3b4 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 15:10:15 +0200 Subject: [PATCH 03/13] Adapt seeder after postgres change --- db/seeds/development/events.rb | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/db/seeds/development/events.rb b/db/seeds/development/events.rb index ba91167a6..72ce5390e 100644 --- a/db/seeds/development/events.rb +++ b/db/seeds/development/events.rb @@ -1,29 +1,26 @@ -# encoding: utf-8 - # Copyright (c) 2012-2021, Pfadibewegung Schweiz. This file is part of # hitobito_pbs and licensed under the Affero General Public License version 3 # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require Rails.root.join('db', 'seeds', 'support', 'event_seeder') +require Rails.root.join("db", "seeds", "support", "event_seeder") srand(42) class PbsEventSeeder < EventSeeder - def seed_event(group_id, type) values = event_values(group_id) case type - when :course then seed_course(values) - when :camp then seed_camp(values) - when :base then seed_base_event(values) + when :course then seed_course(values) + when :camp then seed_camp(values) + when :base then seed_base_event(values) end end def seed_course(values) event = super(values.merge(Hash[approvals])) event.reload - event.state = Event::Course.possible_states.shuffle.first + event.state = Event::Course.possible_states.sample event.save! end @@ -59,20 +56,19 @@ def camp_group_types end def camp_group_ids - Group.where(type: camp_group_types).pluck(:id) + Group.where(type: camp_group_types.map(&:sti_name)).pluck(:id) end def camp_attributes(values) - kind = @@kinds.shuffle.first + kind = @@kinds.sample values.merge(name: "#{kind.try(:short_name)} #{values[:number]}".strip, - kind_id: kind.try(:id), - state: Event::Camp.possible_states.shuffle.first, - signature: Event::Camp.used_attributes.include?(:signature), - external_applications: Event::Camp.used_attributes.include?(:external_applications)) + kind_id: kind.try(:id), + state: Event::Camp.possible_states.sample, + signature: Event::Camp.used_attributes.include?(:signature), + external_applications: Event::Camp.used_attributes.include?(:external_applications)) end end - seeder = PbsEventSeeder.new layer_types = Group.all_types.select(&:layer).collect(&:sti_name) @@ -94,4 +90,4 @@ def camp_attributes(values) end end -Event::Participation.update_all(state: 'assigned', active: true) +Event::Participation.update_all(state: "assigned", active: true) From 45e7db40294da00b01528d322788d1d2eeb2d897 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 15:41:17 +0200 Subject: [PATCH 04/13] Adjust alumni code to use date_range --- app/domain/alumni/invitations.rb | 8 +- app/domain/alumni/reminders.rb | 4 +- spec/domain/alumni/invitation_spec.rb | 107 ++++++++++++------------- spec/domain/alumni/invitations_spec.rb | 73 +++++++++-------- spec/domain/alumni/reminders_spec.rb | 67 ++++++++-------- 5 files changed, 128 insertions(+), 131 deletions(-) diff --git a/app/domain/alumni/invitations.rb b/app/domain/alumni/invitations.rb index 7a658916b..0cbf97fcd 100644 --- a/app/domain/alumni/invitations.rb +++ b/app/domain/alumni/invitations.rb @@ -15,15 +15,15 @@ def process def relevant_roles Role - .with_deleted - .where(deleted_at: time_range, alumni_invitation_processed_at: nil) + .with_inactive + .where(end_on: date_range, alumni_invitation_processed_at: nil) .includes(:person, :group) end - def time_range + def date_range from = parse_duration(:alumni, :invitation, :role_deleted_after_ago) to = parse_duration(:alumni, :invitation, :role_deleted_before_ago) - from.ago..to.ago + (from.ago.to_date..to.ago.to_date) end private diff --git a/app/domain/alumni/reminders.rb b/app/domain/alumni/reminders.rb index 235e62c03..ab800b8da 100644 --- a/app/domain/alumni/reminders.rb +++ b/app/domain/alumni/reminders.rb @@ -9,8 +9,8 @@ module Alumni class Reminders < Invitations self.type = :reminder - def time_range - ..parse_duration(:alumni, :reminder, :role_deleted_before_ago).ago + def date_range + ..parse_duration(:alumni, :reminder, :role_deleted_before_ago).ago.to_date end end end diff --git a/spec/domain/alumni/invitation_spec.rb b/spec/domain/alumni/invitation_spec.rb index 71b588cd7..0ce7c77de 100644 --- a/spec/domain/alumni/invitation_spec.rb +++ b/spec/domain/alumni/invitation_spec.rb @@ -5,19 +5,18 @@ # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require 'spec_helper' +require "spec_helper" describe Alumni::Invitation do - - def create_role(type, group, deleted_at: nil) - type.create!(group: group, person: person, created_at: 1.year.ago, deleted_at: deleted_at) + def create_role(type, group, end_on: nil) + type.create!(group: group, person: person, created_at: 1.year.ago, end_on: end_on) end let(:person) { Fabricate(:person) } - let(:role) { create_role(Group::Pfadi::Mitleitung, groups(:pegasus), deleted_at: 4.months.ago) } - let(:ehemalige_group) { Group::Ehemalige.create!(name: 'Ehemalige', parent: groups(:schekka)) } + let(:role) { create_role(Group::Pfadi::Mitleitung, groups(:pegasus), end_on: 4.months.ago) } + let(:ehemalige_group) { Group::Ehemalige.create!(name: "Ehemalige", parent: groups(:schekka)) } let(:silverscout_group) do - Group::SilverscoutsRegion.create!(name: 'Silverscouts Bern', parent: groups(:silverscouts)) + Group::SilverscoutsRegion.create!(name: "Silverscouts Bern", parent: groups(:silverscouts)) end let(:type) { :invitation } @@ -28,7 +27,7 @@ def create_role(type, group, deleted_at: nil) allow(FeatureGate).to receive(:enabled?).with(:self_registration_reason).and_return(false) end - context '#conditions_met?' do + context "#conditions_met?" do conditions = [ :feature_enabled?, :no_active_role_in_layer?, @@ -38,7 +37,7 @@ def create_role(type, group, deleted_at: nil) :person_has_no_alumni_role? ] - it 'returns true if all conditions are met' do + it "returns true if all conditions are met" do conditions.each do |condition| allow(subject).to receive(condition).and_return(true) end @@ -55,70 +54,70 @@ def create_role(type, group, deleted_at: nil) end end - context '#feature_enabled?' do - it 'returns true if feature is enabled' do - allow(FeatureGate).to receive(:enabled?).with('alumni.invitation').and_return(true) + context "#feature_enabled?" do + it "returns true if feature is enabled" do + allow(FeatureGate).to receive(:enabled?).with("alumni.invitation").and_return(true) expect(subject.feature_enabled?).to eq true end - it 'returns false if feature is disabled' do - allow(FeatureGate).to receive(:enabled?).with('alumni.invitation').and_return(false) + it "returns false if feature is disabled" do + allow(FeatureGate).to receive(:enabled?).with("alumni.invitation").and_return(false) expect(subject.feature_enabled?).to eq false end end - context '#no_active_role_in_layer?' do - it 'returns true if no active role in layer' do + context "#no_active_role_in_layer?" do + it "returns true if no active role in layer" do expect(subject.no_active_role_in_layer?).to eq true end - it 'returns false if active role in layer' do + it "returns false if active role in layer" do create_role(Group::Pfadi::Mitleitung, role.group) expect(subject.no_active_role_in_layer?).to eq false end end - context '#old_enough_if_in_age_group?' do - context 'role is in age group' do + context "#old_enough_if_in_age_group?" do + context "role is in age group" do let(:role) { create_role(Group::Pfadi::Pfadi, groups(:pegasus)) } - it 'returns true if person is old enough' do + it "returns true if person is old enough" do person.update!(birthday: 16.years.ago.to_date) expect(subject.old_enough_if_in_age_group?).to eq true end - it 'returns false if person is not old enough' do + it "returns false if person is not old enough" do person.update!(birthday: (16.years.ago + 1.day).to_date) expect(subject.old_enough_if_in_age_group?).to eq false end - it 'returns false if person has no birthday' do + it "returns false if person has no birthday" do person.update!(birthday: nil) expect(subject.old_enough_if_in_age_group?).to eq false end end - context 'role is not in age group' do + context "role is not in age group" do let(:role) { create_role(Group::Abteilung::Abteilungsleitung, groups(:schekka)) } - it 'returns true if person is old enough' do + it "returns true if person is old enough" do person.update!(birthday: 16.years.ago.to_date) expect(subject.old_enough_if_in_age_group?).to eq true end - it 'returns true if person is not old enough' do + it "returns true if person is not old enough" do person.update!(birthday: (16.years.ago + 1.day).to_date) expect(subject.old_enough_if_in_age_group?).to eq true end - it 'returns true if person has no birthday' do + it "returns true if person has no birthday" do person.update!(birthday: nil) expect(subject.old_enough_if_in_age_group?).to eq true @@ -126,72 +125,72 @@ def create_role(type, group, deleted_at: nil) end end - context '#applicable_role?' do - it 'returns false if role is ehemalige role' do - role = create_role(Group::Ehemalige::Mitglied, ehemalige_group, deleted_at: 5.months.ago) + context "#applicable_role?" do + it "returns false if role is ehemalige role" do + role = create_role(Group::Ehemalige::Mitglied, ehemalige_group, end_on: 5.months.ago) expect(described_class.new(role, :invitation).applicable_role?).to eq false end - it 'returns false if role group is silverscout group' do + it "returns false if role group is silverscout group" do role = create_role(Group::SilverscoutsRegion::Mitglied, silverscout_group, - deleted_at: 5.months.ago) + end_on: 5.months.ago) expect(described_class.new(role, :invitation).applicable_role?).to eq false end - it 'returns false if role group is root group' do - role = create_role(Group::Root::Admin, groups(:root), deleted_at: 5.months.ago) + it "returns false if role group is root group" do + role = create_role(Group::Root::Admin, groups(:root), end_on: 5.months.ago) expect(described_class.new(role, :invitation).applicable_role?).to eq false end - it 'returns true if role is not ehemalige role, not silverscout group and not root group' do - role = create_role(Group::Pfadi::Mitleitung, groups(:pegasus), deleted_at: 5.months.ago) + it "returns true if role is not ehemalige role, not silverscout group and not root group" do + role = create_role(Group::Pfadi::Mitleitung, groups(:pegasus), end_on: 5.months.ago) expect(described_class.new(role, :invitation).applicable_role?).to eq true end end - context '#person_has_main_email?' do - it 'returns true if person has main email' do - role.person.email = 'person@example.com' + context "#person_has_main_email?" do + it "returns true if person has main email" do + role.person.email = "person@example.com" expect(subject.person_has_main_email?).to eq true end - it 'returns false if person has no main email' do + it "returns false if person has no main email" do role.person.email = nil expect(subject.person_has_main_email?).to eq false end end - context '#person_has_no_alumni_role?' do - it 'returns false if person has ehemalige role' do + context "#person_has_no_alumni_role?" do + it "returns false if person has ehemalige role" do create_role(Group::Ehemalige::Mitglied, ehemalige_group) expect(subject.person_has_no_alumni_role?).to eq false end - it 'returns false if person has silverscout role' do + it "returns false if person has silverscout role" do create_role(Group::SilverscoutsRegion::Mitglied, silverscout_group) expect(subject.person_has_no_alumni_role?).to eq false end - it 'returns false if person has root role' do + it "returns false if person has root role" do create_role(Group::Root::Admin, groups(:root)) expect(subject.person_has_no_alumni_role?).to eq false end - it 'returns true if person has no ehemalige, silverscout or root role' do + it "returns true if person has no ehemalige, silverscout or root role" do create_role(Group::Abteilung::Abteilungsleitung, groups(:schekka)) expect(subject.person_has_no_alumni_role?).to eq true end end - context '#process' do + context "#process" do [:invitation, :reminder].each do |mail_type| let(:type) { mail_type } context "for type=#{mail_type}" do - context 'if conditions are met' do - it 'sets timestamp' do + context "if conditions are met" do + it "sets timestamp" do timestamp_attr = "alumni_#{type}_processed_at" freeze_time do @@ -201,17 +200,17 @@ def create_role(type, group, deleted_at: nil) end end - it 'sends email' do + it "sends email" do ex_members_group_ids = [instance_double(Group), instance_double(Group)] silverscout_group_ids = [instance_double(Group), instance_double(Group)] groups_finder = instance_double(Alumni::ApplicableGroups, - ex_members_group_ids: ex_members_group_ids, silverscout_group_ids: silverscout_group_ids) + ex_members_group_ids: ex_members_group_ids, silverscout_group_ids: silverscout_group_ids) - mail = double('mail') + mail = double("mail") expect(mail).to receive(:deliver_later) expect(AlumniMailer).to receive(type).with(role.person, ex_members_group_ids, - silverscout_group_ids).and_return(mail) + silverscout_group_ids).and_return(mail) invitation = described_class.new(role, type, groups_finder) expect(invitation).to receive(:conditions_met?).and_return(true) @@ -219,8 +218,8 @@ def create_role(type, group, deleted_at: nil) end end - context 'if conditions are not met' do - it 'sets timestamp' do + context "if conditions are not met" do + it "sets timestamp" do timestamp_attr = "alumni_#{type}_processed_at" freeze_time do @@ -230,7 +229,7 @@ def create_role(type, group, deleted_at: nil) end end - it 'does not send email' do + it "does not send email" do expect(AlumniMailer).not_to receive(:send) subject.process diff --git a/spec/domain/alumni/invitations_spec.rb b/spec/domain/alumni/invitations_spec.rb index 8a5f89de3..beb35cad5 100644 --- a/spec/domain/alumni/invitations_spec.rb +++ b/spec/domain/alumni/invitations_spec.rb @@ -5,95 +5,94 @@ # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require 'spec_helper' +require "spec_helper" describe Alumni::Invitations do around do |example| freeze_time { example.run } end - context '#time_range' do + context "#date_range" do after { Settings.reload! } - it 'begins 6 months ago' do - expect(subject.time_range.begin).to eq 6.months.ago + it "begins 6 months ago" do + expect(subject.date_range.begin).to eq 6.months.ago.to_date end - it 'ends 3 months ago' do - expect(subject.time_range.end).to eq 3.months.ago + it "ends 3 months ago" do + expect(subject.date_range.end).to eq 3.months.ago.to_date end - it 'is configurable' do - Settings.alumni.invitation.role_deleted_after_ago = 'P6Y' - Settings.alumni.invitation.role_deleted_before_ago = 'P7D' + it "is configurable" do + Settings.alumni.invitation.role_deleted_after_ago = "P6Y" + Settings.alumni.invitation.role_deleted_before_ago = "P7D" - expect(subject.time_range.begin).to eq 6.years.ago - expect(subject.time_range.end).to eq 7.days.ago + expect(subject.date_range.begin).to eq 6.years.ago.to_date + expect(subject.date_range.end).to eq 7.days.ago.to_date end end - context '#type' do - it 'is :invitation' do + context "#type" do + it "is :invitation" do expect(subject.type).to eq :invitation end end - context '#relevant_roles' do - def make_role(deleted_at: nil, alumni_invitation_processed_at: nil) + context "#relevant_roles" do + def make_role(end_on: nil, alumni_invitation_processed_at: nil) Fabricate( - 'Group::Pfadi::Pfadi', + "Group::Pfadi::Pfadi", group: groups(:pegasus), created_at: 1.year.ago, - deleted_at: deleted_at, + end_on: end_on, alumni_invitation_processed_at: alumni_invitation_processed_at ) end - it 'includes roles with deleted_at in time_range' do - older_role = make_role(deleted_at: 6.months.ago) - newer_role = make_role(deleted_at: 3.months.ago) + it "includes roles with end_on in date_range" do + older_role = make_role(end_on: 6.months.ago) + newer_role = make_role(end_on: 3.months.ago) expect(subject.relevant_roles).to include(older_role, newer_role) end - it 'excludes roles with deleted_at not in time_range' do - too_old_role = make_role(deleted_at: 6.months.ago - 1.minute) - too_new_role = make_role(deleted_at: 3.months.ago + 1.minute) + it "excludes roles with end_on not in date_range" do + too_old_role = make_role(end_on: 6.months.ago - 1.day) + too_new_role = make_role(end_on: 3.months.ago + 1.day) expect(subject.relevant_roles).not_to include(too_old_role, too_new_role) end - it 'excludes roles with deleted_at nil' do - current_role = make_role(deleted_at: nil) + it "excludes roles with end_on nil" do + current_role = make_role(end_on: nil) expect(subject.relevant_roles).not_to include(current_role) end - it 'includes roles with alumni_invitation_processed_at nil' do - unprocessed_role = make_role(deleted_at: 4.months.ago, alumni_invitation_processed_at: nil) + it "includes roles with alumni_invitation_processed_at nil" do + unprocessed_role = make_role(end_on: 4.months.ago, alumni_invitation_processed_at: nil) expect(subject.relevant_roles).to include(unprocessed_role) end - it 'excludes roles with alumni_invitation_processed_at set' do - processed_role = make_role(deleted_at: 4.months.ago, - alumni_invitation_processed_at: 1.second.ago) + it "excludes roles with alumni_invitation_processed_at set" do + processed_role = make_role(end_on: 4.months.ago, + alumni_invitation_processed_at: 1.second.ago) expect(subject.relevant_roles).not_to include(processed_role) end - end - context '#process' do - it 'calls Alumni::Invitation#process for each relevant role' do - role1 = instance_double('Role') - role2 = instance_double('Role') + context "#process" do + it "calls Alumni::Invitation#process for each relevant role" do + role1 = instance_double("Role") + role2 = instance_double("Role") allow(subject).to receive(:relevant_roles).and_return([role1, role2]) [role1, role2].each do |role| - invitation_double = instance_double('Alumni::Invitation') + invitation_double = instance_double("Alumni::Invitation") expect(Alumni::Invitation).to receive(:new).with(role, - :invitation).and_return(invitation_double) + :invitation).and_return(invitation_double) expect(invitation_double).to receive(:process) end diff --git a/spec/domain/alumni/reminders_spec.rb b/spec/domain/alumni/reminders_spec.rb index e4a796e62..1c7aa3d3b 100644 --- a/spec/domain/alumni/reminders_spec.rb +++ b/spec/domain/alumni/reminders_spec.rb @@ -5,92 +5,91 @@ # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require 'spec_helper' +require "spec_helper" describe Alumni::Reminders do around do |example| freeze_time { example.run } end - context '#time_range' do + context "#date_range" do after { Settings.reload! } - it 'begins open ended' do - expect(subject.time_range.begin).to eq nil + it "begins open ended" do + expect(subject.date_range.begin).to eq nil end - it 'ends 6 months ago' do - expect(subject.time_range.end).to eq 6.months.ago + it "ends 6 months ago" do + expect(subject.date_range.end).to eq 6.months.ago.to_date end - it 'is configurable' do - Settings.alumni.reminder.role_deleted_before_ago = 'PT30S' + it "is configurable" do + Settings.alumni.reminder.role_deleted_before_ago = "P1M" - expect(subject.time_range.end).to eq 30.seconds.ago + expect(subject.date_range.end).to eq 1.month.ago.to_date end end - context '#type' do - it 'is :reminder' do + context "#type" do + it "is :reminder" do expect(subject.type).to eq :reminder end end - context '#relevant_roles' do - def make_role(deleted_at: nil, alumni_reminder_processed_at: nil) + context "#relevant_roles" do + def make_role(end_on: nil, alumni_reminder_processed_at: nil) Fabricate( - 'Group::Pfadi::Pfadi', + "Group::Pfadi::Pfadi", group: groups(:pegasus), created_at: 10.years.ago, - deleted_at: deleted_at, + end_on: end_on, alumni_reminder_processed_at: alumni_reminder_processed_at ) end - it 'includes roles with deleted_at in time_range' do - older_role = make_role(deleted_at: 100.months.ago) - newer_role = make_role(deleted_at: 6.months.ago) + it "includes roles with end_on in date_range" do + older_role = make_role(end_on: 100.months.ago) + newer_role = make_role(end_on: 6.months.ago) expect(subject.relevant_roles).to include(older_role, newer_role) end - it 'excludes roles with deleted_at not in time_range' do - too_new_role = make_role(deleted_at: 6.months.ago + 1.minute) + it "excludes roles with end_on not in date_range" do + too_new_role = make_role(end_on: 6.months.ago + 1.day) expect(subject.relevant_roles).not_to include(too_new_role) end - it 'excludes roles with deleted_at nil' do - current_role = make_role(deleted_at: nil) + it "excludes roles with end_on nil" do + current_role = make_role(end_on: nil) expect(subject.relevant_roles).not_to include(current_role) end - it 'includes roles with alumni_reminder_processed_at nil' do - unprocessed_role = make_role(deleted_at: 10.months.ago, alumni_reminder_processed_at: nil) + it "includes roles with alumni_reminder_processed_at nil" do + unprocessed_role = make_role(end_on: 10.months.ago, alumni_reminder_processed_at: nil) expect(subject.relevant_roles).to include(unprocessed_role) end - it 'excludes roles with alumni_reminder_processed_at set' do - processed_role = make_role(deleted_at: 4.months.ago, - alumni_reminder_processed_at: 1.second.ago) + it "excludes roles with alumni_reminder_processed_at set" do + processed_role = make_role(end_on: 4.months.ago, + alumni_reminder_processed_at: 1.second.ago) expect(subject.relevant_roles).not_to include(processed_role) end - end - context '#process' do - it 'calls Alumni::Invitation#process for each relevant role' do - role1 = instance_double('Role') - role2 = instance_double('Role') + context "#process" do + it "calls Alumni::Invitation#process for each relevant role" do + role1 = instance_double("Role") + role2 = instance_double("Role") allow(subject).to receive(:relevant_roles).and_return([role1, role2]) [role1, role2].each do |role| - invitation_double = instance_double('Alumni::Invitation') + invitation_double = instance_double("Alumni::Invitation") expect(Alumni::Invitation).to receive(:new).with(role, - :reminder).and_return(invitation_double) + :reminder).and_return(invitation_double) expect(invitation_double).to receive(:process) end From 583291482ea5cb46c9a1cd541e1cf40b970bb08e Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:01:03 +0200 Subject: [PATCH 05/13] Adjust role spec --- spec/models/role_spec.rb | 100 ++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 55 deletions(-) diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb index c0dfb0b14..81189b3ac 100644 --- a/spec/models/role_spec.rb +++ b/spec/models/role_spec.rb @@ -1,5 +1,3 @@ -# encoding: utf-8 - # Copyright (c) 2012-2024, Pfadibewegung Schweiz. This file is part of # hitobito_pbs and licensed under the Affero General Public License version 3 # or later. See the COPYING file at the top-level directory or at @@ -19,104 +17,98 @@ # deleted_at :datetime # -require 'spec_helper' +require "spec_helper" describe Role do - let(:role) { roles(:al_schekka) } - - describe 'dates' do - let(:now) { Time.zone.parse('2014-05-03 16:32:21') } + describe "dates" do + let(:now) { Time.zone.parse("2014-05-03 16:32:21") } before do allow(Time.zone).to receive_messages(now: now) - role.update_column(:created_at, '2014-04-03 12:00:00') + role.update_column(:created_at, "2014-04-03 12:00:00") end - - context 'are valid if' do - it 'created_at in the past' do + context "are valid if" do + it "created_at in the past" do expect(role).to be_valid end - it 'created_at after deleted_at in the past' do - role.update_column(:deleted_at, '2014-04-03 14:00:00') + it "created_at after end_on in the past" do + role.update_column(:end_on, "2014-04-03") expect(role).to be_valid end end - end - context 'notification if person is on black list' do - let(:group) { groups(:schekka) } - let!(:person) { Fabricate(:person, first_name: 'foo', last_name: 'bar') } - let(:last_email) { ActionMailer::Base.deliveries.last } + context "notification if person is on black list" do + let(:group) { groups(:schekka) } + let!(:person) { Fabricate(:person, first_name: "foo", last_name: "bar") } + let(:last_email) { ActionMailer::Base.deliveries.last } before do - allow_any_instance_of(BlackListMailer).to receive(:recipients).and_return('test@test.com') + allow_any_instance_of(BlackListMailer).to receive(:recipients).and_return("test@test.com") end - it 'is sent on role creation with black list person' do - Fabricate(:black_list, first_name: 'foo', last_name: 'bar') + it "is sent on role creation with black list person" do + Fabricate(:black_list, first_name: "foo", last_name: "bar") expect do Role.create(group: group, - person: person, - type: Group::Abteilung::Sekretariat.sti_name) + person: person, + type: Group::Abteilung::Sekretariat.sti_name) end.to change { ActionMailer::Base.deliveries.count }.by(1) expect(last_email.body).to include(person.full_name) - end - it 'is not sent on role creation if person is not blacklisted' do + it "is not sent on role creation if person is not blacklisted" do expect do Role.create(group: group, - person: person, - type: Group::Abteilung::Sekretariat.sti_name) + person: person, + type: Group::Abteilung::Sekretariat.sti_name) end.not_to change { ActionMailer::Base.deliveries.count } end - end - context 'notification when gaining access to more person data' do - let(:actuator) { people(:al_schekka) } - let(:home_group) { groups(:schekka) } + context "notification when gaining access to more person data" do + let(:actuator) { people(:al_schekka) } + let(:home_group) { groups(:schekka) } let(:foreign_group) { groups(:chaeib) } - let(:person) { Fabricate(:person, first_name: 'Asdf') } + let(:person) { Fabricate(:person, first_name: "Asdf") } before { Person.stamper = actuator } after { Person.reset_stamper } - it 'is sent on role creation with more access' do + it "is sent on role creation with more access" do Fabricate(Group::Abteilung::Sekretariat.name.to_sym, group: foreign_group, person: person) role = Role.new(group_id: home_group.id, - person_id: person.id, - type: Group::Abteilung::Sekretariat.sti_name) + person_id: person.id, + type: Group::Abteilung::Sekretariat.sti_name) expect { role.save! }.to change { Delayed::Job.count }.by(1) job = GroupMembershipJob.new(person, actuator, home_group) expect(Delayed::Job.where(handler: job.to_yaml).count).to eq 1 end - it 'is not sent on role creation with equal access' do + it "is not sent on role creation with equal access" do Fabricate(Group::Abteilung::Sekretariat.name.to_sym, group: home_group, person: person) role = Role.new(group_id: home_group.id, - person_id: person.id, - type: Group::Abteilung::Revisor.sti_name) + person_id: person.id, + type: Group::Abteilung::Revisor.sti_name) expect { role.save! }.not_to change { Delayed::Job.count } end - it 'is not sent on role creation for new person' do + it "is not sent on role creation for new person" do role = Role.new(group_id: home_group.id, - person_id: person.id, - type: Group::Abteilung::Sekretariat.sti_name) + person_id: person.id, + type: Group::Abteilung::Sekretariat.sti_name) expect { role.save! }.not_to change { Delayed::Job.count } end - it 'is not sent on role update (not possible to gain access via update)' do + it "is not sent on role update (not possible to gain access via update)" do groups(:sunnewirbu) role = Fabricate(Group::Abteilung::Revisor.name.to_sym, group: home_group, person: person) @@ -124,42 +116,40 @@ expect { role.save! }.not_to change { Delayed::Job.count } end - it 'is not sent on role destruction' do + it "is not sent on role destruction" do role = Fabricate(Group::Abteilung::Sekretariat.name.to_sym, group: home_group, person: person) expect { role.really_destroy! }.not_to change { Delayed::Job.count } end - end - context 'primary group (regression for #7766)' do + context "primary group (regression for #7766)" do let(:person) { role.person } before { person.update_column :primary_group_id, role.group.id } - it 'should be reset if primary role is removed by setting deleted_at' do + it "should be reset if primary role is removed by setting end_on" do expect(person.primary_group_id).to eq(role.group.id) - role.deleted_at = Time.zone.now + role.end_on = Time.zone.yesterday role.save! + expect(role).not_to be_active - expect(role).to be_deleted expect(person.primary_group_id).to be_nil end - it 'should not be reset if secondary role is removed by setting deleted_at' do + it "should not be reset if secondary role is removed by setting deleted_at" do another_role = Fabricate(Group::Abteilung::Sekretariat.name.to_sym, - group: groups(:patria), person: person) + group: groups(:patria), person: person) expect(person.primary_group_id).to eq(role.group.id) - another_role.created_at = 1.minute.ago - another_role.deleted_at = Time.zone.now + another_role.created_at = 3.days.ago + another_role.end_on = Time.zone.yesterday another_role.save! - expect(role).not_to be_deleted - expect(another_role).to be_deleted + expect(role).to be_active + expect(another_role).not_to be_active expect(person.primary_group_id).to eq role.group.id end end - end From d9b3bc8d335094bf679e57521e3efa4ffef7a33a Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:32:53 +0200 Subject: [PATCH 06/13] Adjust roles_controller_spec --- spec/controllers/roles_controller_spec.rb | 92 +++++++++++------------ 1 file changed, 43 insertions(+), 49 deletions(-) diff --git a/spec/controllers/roles_controller_spec.rb b/spec/controllers/roles_controller_spec.rb index 0e9de902d..450f36987 100644 --- a/spec/controllers/roles_controller_spec.rb +++ b/spec/controllers/roles_controller_spec.rb @@ -1,45 +1,41 @@ -# encoding: utf-8 - # Copyright (c) 2012-2014, Pfadibewegung Schweiz. This file is part of # hitobito_pbs and licensed under the Affero General Public License version 3 # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require 'spec_helper' +require "spec_helper" describe RolesController do - - let(:group) { groups(:bund) } + let(:group) { groups(:bund) } let(:person) { people(:al_schekka) } - let(:role) { assigns(:role).model } + let(:role) { assigns(:role).model } let(:role_defaults) do - { group_id: group.id, - person_id: person.id, - type: Group::Bund::MitarbeiterGs.sti_name } + {group_id: group.id, + person_id: person.id, + type: Group::Bund::MitarbeiterGs.sti_name} end before { sign_in(people(:bulei)) } - describe 'POST #create' do - context 'with valid params' do + describe "POST #create" do + context "with valid params" do let(:role_params) do - role_defaults.merge(created_at: Date.new(2014, 3, 4), - deleted_at: Date.new(2014, 3, 5)) + role_defaults.merge(created_at: Date.new(2014, 3, 4)) end - it 'redirects' do - expect { post :create, params: { group_id: group.id, role: role_params } }.to change { Role.with_deleted.count }.by(1) - expect(flash[:notice]).to eq 'Rolle Mitarbeiter*in GS für AL Schekka / Torben in Pfadibewegung Schweiz wurde erfolgreich erstellt.' + it "redirects" do + expect { post :create, params: {group_id: group.id, role: role_params} }.to change { Role.count }.by(1) + expect(flash[:notice]).to eq "Rolle Mitarbeiter*in GS für AL Schekka / Torben in Pfadibewegung Schweiz wurde erfolgreich erstellt." is_expected.to redirect_to(group_people_path(group.id)) end end - context 'notification when gaining access to more person data' do - let(:actuator) { people(:al_schekka) } - let(:home_group) { groups(:schekka) } + context "notification when gaining access to more person data" do + let(:actuator) { people(:al_schekka) } + let(:home_group) { groups(:schekka) } let(:foreign_group) { groups(:chaeib) } - let(:person) { Fabricate(:person, first_name: 'Asdf') } + let(:person) { Fabricate(:person, first_name: "Asdf") } before do sign_in(actuator) @@ -48,55 +44,53 @@ after { Person.reset_stamper } - it 'is sent on role creation with more access' do + it "is sent on role creation with more access" do Fabricate(Group::Abteilung::Sekretariat.name.to_sym, group: foreign_group, person: person) - role_params = { group_id: home_group.id, - person_id: person.id, - type: Group::Abteilung::Sekretariat.sti_name } - expect { post :create, params: { group_id: home_group.id, role: role_params } }. - to change { Delayed::Job.count }.by(1) + role_params = {group_id: home_group.id, + person_id: person.id, + type: Group::Abteilung::Sekretariat.sti_name} + expect { post :create, params: {group_id: home_group.id, role: role_params} } + .to change { Delayed::Job.count }.by(1) job = GroupMembershipJob.new(person, actuator, home_group) expect(Delayed::Job.where(handler: job.to_yaml).count).to eq 1 end - it 'is not sent on role creation with equal access' do + it "is not sent on role creation with equal access" do Fabricate(Group::Abteilung::Sekretariat.name.to_sym, group: home_group, person: person) - role_params = { group_id: home_group.id, - person_id: person.id, - type: Group::Abteilung::Revisor.sti_name } - expect { post :create, params: { group_id: home_group.id, role: role_params } }. - not_to change { Delayed::Job.count } + role_params = {group_id: home_group.id, + person_id: person.id, + type: Group::Abteilung::Revisor.sti_name} + expect { post :create, params: {group_id: home_group.id, role: role_params} } + .not_to change { Delayed::Job.count } end - it 'is not sent on role creation for new person' do - role_params = { group_id: home_group.id, - person_id: nil, - type: Group::Abteilung::Sekretariat.sti_name, - new_person: { first_name: 'Asdf', last_name: 'Asdf' } } - expect { post :create, params: { group_id: home_group.id, role: role_params } }. - not_to change { Delayed::Job.count } + it "is not sent on role creation for new person" do + role_params = {group_id: home_group.id, + person_id: nil, + type: Group::Abteilung::Sekretariat.sti_name, + new_person: {first_name: "Asdf", last_name: "Asdf"}} + expect { post :create, params: {group_id: home_group.id, role: role_params} } + .not_to change { Delayed::Job.count } end - it 'is not sent on role update (not possible to gain access via update)' do + it "is not sent on role update (not possible to gain access via update)" do child_group = groups(:sunnewirbu) role = Fabricate(Group::Abteilung::Revisor.name.to_sym, group: home_group, person: person) - role_params = { group_id: child_group.id, - type: Group::Woelfe::Wolf.sti_name } - expect { put :update, params: { group_id: home_group.id, id: role.id, role: role_params } }. - not_to change { Delayed::Job.count } + role_params = {group_id: child_group.id, + type: Group::Woelfe::Wolf.sti_name} + expect { put :update, params: {group_id: home_group.id, id: role.id, role: role_params} } + .not_to change { Delayed::Job.count } end - it 'is not sent on role destruction' do + it "is not sent on role destruction" do role = Fabricate(Group::Abteilung::Sekretariat.name.to_sym, group: home_group, person: person) - expect { delete :destroy, params: { group_id: home_group.id, id: role.id } }. - not_to change { Delayed::Job.count } + expect { delete :destroy, params: {group_id: home_group.id, id: role.id} } + .not_to change { Delayed::Job.count } end end - end - end From 291376e40bb3cc5b72d9878051586de34f5919a5 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:50:10 +0200 Subject: [PATCH 07/13] Adjust population_controller spec --- .../controllers/population_controller_spec.rb | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/spec/controllers/population_controller_spec.rb b/spec/controllers/population_controller_spec.rb index 8e87eab24..9004573d4 100644 --- a/spec/controllers/population_controller_spec.rb +++ b/spec/controllers/population_controller_spec.rb @@ -1,76 +1,72 @@ -# encoding: utf-8 - # Copyright (c) 2012-2014, Pfadibewegung Schweiz. This file is part of # hitobito_pbs and licensed under the Affero General Public License version 3 # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require 'spec_helper' +require "spec_helper" describe PopulationController do - let(:abteilung) { groups(:schekka) } let(:pegasus) { groups(:pegasus) } - let!(:leader) { Fabricate(Group::Abteilung::Abteilungsleitung.name.to_sym, group: abteilung).person } let!(:guide) { Fabricate(Group::Abteilung::StufenleitungWoelfe.name.to_sym, group: abteilung).person } let!(:webmaster) { Fabricate(Group::Abteilung::Webmaster.name.to_sym, group: abteilung).person } let!(:deleted) do Fabricate(Group::Abteilung::AbteilungsleitungStv.name.to_sym, - group: abteilung, - created_at: 2.years.ago, - deleted_at: 1.year.ago) + group: abteilung, + created_at: 2.years.ago, + end_on: 1.year.ago) end let!(:group_leader) { Fabricate(Group::Pfadi::Mitleitung.name.to_sym, group: pegasus, person: guide).person } let!(:child) { Fabricate(Group::Pfadi::Pfadi.name.to_sym, group: pegasus).person } before { sign_in(leader) } - describe 'GET index' do - before { get :index, params: { id: abteilung.id } } + describe "GET index" do + before { get :index, params: {id: abteilung.id} } - describe 'groups' do + describe "groups" do subject { assigns(:groups) } it do is_expected.to eq([abteilung, - groups(:sunnewirbu), - groups(:baereried), - groups(:medusa), - groups(:pegasus), - groups(:poseidon), - groups(:rovers), - groups(:elternrat), - groups(:fussballers)]) + groups(:sunnewirbu), + groups(:baereried), + groups(:medusa), + groups(:pegasus), + groups(:poseidon), + groups(:rovers), + groups(:elternrat), + groups(:fussballers)]) end end - describe 'people by group' do + describe "people by group" do subject { assigns(:people_by_group) } - + it { expect(subject[abteilung].collect(&:to_s)).to contain_exactly(*[leader, people(:al_schekka), guide].collect(&:to_s)) } it { expect(subject[groups(:pegasus)].collect(&:to_s)).to contain_exactly(*[group_leader, child, people(:child)].collect(&:to_s)) } it { expect(subject[groups(:baereried)]).to be_nil } # no people in group - not displayed at all end - describe 'complete' do + describe "complete" do subject { assigns(:people_data_complete) } it { is_expected.to be_falsey } end - describe 'shows year data' do + describe "shows year data" do subject { assigns(:members_per_birthyear) } it { expect(subject.map(&:count).sum).to eq(assigns(:total).total) } end end - describe 'GET index does not include deleted groups' do + describe "GET index does not include deleted groups" do before do groups(:poseidon).destroy - get :index, params: { id: abteilung.id } + get :index, params: {id: abteilung.id} end subject { assigns(:groups) } From f1b12632730aebdcd8b40549e2495b4707e735c4 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:40:19 +0200 Subject: [PATCH 08/13] Adjust event/approver#approvers_for_group query --- app/domain/event/approver.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/domain/event/approver.rb b/app/domain/event/approver.rb index 87bece127..05e7188c7 100644 --- a/app/domain/event/approver.rb +++ b/app/domain/event/approver.rb @@ -105,7 +105,7 @@ def approvers_for_groups(groups) Person.joins(:roles) .where(roles: {group_id: groups.collect(&:id), type: role_types.collect(&:sti_name), - end_on: (Date.today..nil)}) + end_on: [nil, ..Time.zone.today]}) .distinct end From 56de4337f623def68835486ccf2fec0889a92f56 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:40:35 +0200 Subject: [PATCH 09/13] Adjust member counter --- app/domain/member_counter.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/domain/member_counter.rb b/app/domain/member_counter.rb index 082674bd1..05c615778 100644 --- a/app/domain/member_counter.rb +++ b/app/domain/member_counter.rb @@ -112,8 +112,7 @@ def region def members Person.joins(:roles) .where(roles: {group_id: abteilung.self_and_descendants, - type: self.class.counted_roles.collect(&:sti_name), - deleted_at: nil}) + type: self.class.counted_roles.collect(&:sti_name)}) .distinct end From 41aa58941891255b3ac6adde5da3bd342154dd4a Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:41:43 +0200 Subject: [PATCH 10/13] Adjust person/family_member_spec --- .../person/family_member_finder_spec.rb | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/spec/domain/person/family_member_finder_spec.rb b/spec/domain/person/family_member_finder_spec.rb index 96b7236ca..9c54f2da1 100644 --- a/spec/domain/person/family_member_finder_spec.rb +++ b/spec/domain/person/family_member_finder_spec.rb @@ -1,22 +1,18 @@ -# encoding: utf-8 - # Copyright (c) 2017, Pfadibewegung Schweiz. This file is part of # hitobito_pbs and licensed under the Affero General Public License version 3 # or later. See the COPYING file at the top-level directory or at # https://github.com/hitobito/hitobito_pbs. -require 'spec_helper' +require "spec_helper" describe Person::FamilyMemberFinder do - let(:service) { described_class.new(person) } let(:person) { Fabricate(:person) } let(:sibling) { Fabricate(:person) } let!(:sibling_relation) { Fabricate(:family_member, person: person, other: sibling, kind: :sibling) } - describe '#family_members_in_event' do - + describe "#family_members_in_event" do let(:person_event) { Fabricate(:event) } let!(:person_participation) { Fabricate(:event_participation, person: person, event: person_event) } let(:sibling_event) { Fabricate(:event) } @@ -26,68 +22,71 @@ service.family_members_in_event(person_event, kind: :sibling) end - context 'without siblings' do + context "without siblings" do let!(:sibling_relation) { nil } + it { is_expected.to be_empty } end - context 'with siblings in different events' do + context "with siblings in different events" do it { is_expected.to be_empty } end - context 'with siblings in same event' do + context "with siblings in same event" do let(:sibling_event) { person_event } + it { is_expected.to contain_exactly(sibling_participation) } end - context 'with siblings with deleted role in same group' do + context "with siblings with deleted role in same group" do let!(:sibling_participation) { Fabricate(:event_participation, person: sibling, event: sibling_event, active: false) } + it { is_expected.to be_empty } end - end - describe '#family_members_in_layer' do - + describe "#family_members_in_layer" do let(:layer) { Fabricate(Group::Abteilung.name) } - let(:person_group) { Fabricate(Group::Pfadi.name, parent: layer)} + let(:person_group) { Fabricate(Group::Pfadi.name, parent: layer) } let!(:person_role) { Fabricate(person_group.default_role.name, person: person, group: person_group) } - let(:sibling_group) { Fabricate(Group::Woelfe.name, parent: layer)} + let(:sibling_group) { Fabricate(Group::Woelfe.name, parent: layer) } let!(:sibling_role) { Fabricate(sibling_group.default_role.name, person: sibling, group: sibling_group) } subject do service.family_members_in_layer(person_group, kind: :sibling) end - context 'without siblings' do + context "without siblings" do let!(:sibling_relation) { nil } + it { is_expected.to be_empty } end - context 'with siblings in different groups' do - let(:sibling_group) { Fabricate(Group::Woelfe.name, parent: Fabricate(Group::Abteilung.name))} + context "with siblings in different groups" do + let(:sibling_group) { Fabricate(Group::Woelfe.name, parent: Fabricate(Group::Abteilung.name)) } + it { is_expected.to be_empty } end - context 'with siblings in same group' do + context "with siblings in same group" do let(:sibling_group) { person_group } + it { is_expected.to contain_exactly(sibling_role) } end - context 'with siblings in same layer' do + context "with siblings in same layer" do it { is_expected.to contain_exactly(sibling_role) } end - context 'with siblings with deleted role in same group' do - let!(:sibling_role) do - Fabricate(sibling_group.default_role.name, person: sibling, group: sibling_group, - created_at: 2.months.ago, deleted_at: 1.month.ago) + context "with siblings with deleted role in same group" do + let!(:sibling_role) do + Fabricate(sibling_group.default_role.name, person: sibling, group: sibling_group, + created_at: 2.months.ago, end_on: 1.month.ago) end + it { is_expected.to be_empty } end - end - end From 292b9beb0dc7f17764e8e910e39ea6cd7e74477d Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:43:52 +0200 Subject: [PATCH 11/13] Regenerate graphiti schema --- spec/support/graphiti/schema.json | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/spec/support/graphiti/schema.json b/spec/support/graphiti/schema.json index 62e980e8d..82f20a4c1 100644 --- a/spec/support/graphiti/schema.json +++ b/spec/support/graphiti/schema.json @@ -2245,8 +2245,14 @@ "writable": false, "description": null }, - "deleted_at": { - "type": "datetime", + "start_on": { + "type": "date", + "readable": true, + "writable": false, + "description": null + }, + "end_on": { + "type": "date", "readable": true, "writable": false, "description": null @@ -2285,7 +2291,9 @@ }, "updated_at": { }, - "deleted_at": { + "start_on": { + }, + "end_on": { }, "person_id": { }, @@ -2330,8 +2338,19 @@ "lte" ] }, - "deleted_at": { - "type": "datetime", + "start_on": { + "type": "date", + "operators": [ + "eq", + "not_eq", + "gt", + "gte", + "lt", + "lte" + ] + }, + "end_on": { + "type": "date", "operators": [ "eq", "not_eq", From 0b4ae2daba991da38c1891db8b6e39154feb52c8 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 16:45:54 +0200 Subject: [PATCH 12/13] Adjust rake task --- lib/tasks/people.rake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/tasks/people.rake b/lib/tasks/people.rake index 79122241b..61b05cfed 100644 --- a/lib/tasks/people.rake +++ b/lib/tasks/people.rake @@ -51,7 +51,7 @@ namespace :people do roles = Role.deleted. select('type, label, person_id, DATE(deleted_at) as deleted_at'). distinct. - where(deleted_at: last_year_range, type: types) + where(end_on: last_year_range, type: types) def human_attrs(attrs, model_class) attrs.collect { |attr| model_class.human_attribute_name(attr) } @@ -69,7 +69,7 @@ namespace :people do roles.each do |role| person_values = values(person_attrs, role.person) do |model, attr| - + value = model.send(attr) case attr when 'birthday' then value ? value.strftime('%Y-%m-%d') : nil @@ -82,7 +82,7 @@ namespace :people do role_values = values(role_attrs, role) do |model, attr| case attr - when 'deleted_at' then model.send(attr).strftime('%Y-%m-%d') + when 'deleted_at' then model.send(:end_on).strftime('%Y-%m-%d') when 'Rolle' then model.model_name.human else model.send(attr) end From bbdd4641059981c27ad8d8a436afc92dc68ec374 Mon Sep 17 00:00:00 2001 From: Andreas Maierhofer Date: Tue, 3 Sep 2024 14:53:14 +0200 Subject: [PATCH 13/13] Adjust role callbacks --- app/models/pbs/role.rb | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/app/models/pbs/role.rb b/app/models/pbs/role.rb index 9e0b6a644..cbad90523 100644 --- a/app/models/pbs/role.rb +++ b/app/models/pbs/role.rb @@ -25,11 +25,6 @@ module Pbs::Role before_create :detect_group_membership_notification after_create :send_group_membership_notification after_create :send_black_list_mail, if: :person_blacklisted? - - after_save :update_primary_group - - alias_method_chain :set_first_primary_group, :kantonalverband - alias_method_chain :reset_primary_group, :kantonalverband end def detect_group_membership_notification @@ -61,25 +56,8 @@ def send_black_list_mail BlackListMailer.hit(person, group).deliver_now end - def update_primary_group - if soft_deleted_change? - reset_primary_group - end - end - - def soft_deleted_change? - previous_changes.include?(:deleted_at) && - previous_changes[:deleted_at].first.nil? && - previous_changes[:deleted_at].last - end - - def set_first_primary_group_with_kantonalverband - set_first_primary_group_without_kantonalverband - person.reload.reset_kantonalverband! - end - - def reset_primary_group_with_kantonalverband - reset_primary_group_without_kantonalverband + def set_first_primary_group + super person.reload.reset_kantonalverband! end