diff --git a/greg/management/commands/import_sponsors_from_cerebrum.py b/greg/management/commands/import_sponsors_from_cerebrum.py index 45e9e8d1e689ae78ac558f7d6a77670c30a260c7..0ff3e1b03f9fc3e398167a94a0859cc0d5980c3f 100644 --- a/greg/management/commands/import_sponsors_from_cerebrum.py +++ b/greg/management/commands/import_sponsors_from_cerebrum.py @@ -40,18 +40,31 @@ class Command(BaseCommand): def _upsert_sponsor_unit_link(self, sponsor: Sponsor, unit: OrganizationalUnit): """Ensure a link between sponsor and unit.""" - sunit, created = SponsorOrganizationalUnit.objects.get_or_create( - sponsor=sponsor, - organizational_unit=unit, - source=self.CEREBRUM_SOURCE, - automatic=True, - defaults={"hierarchical_access": settings.CEREBRUM_HIERARCHICAL_ACCESS}, - ) + try: + sunit = SponsorOrganizationalUnit.objects.get( + sponsor=sponsor, + organizational_unit=unit, + ) + created = False + except SponsorOrganizationalUnit.DoesNotExist: + sunit = SponsorOrganizationalUnit.objects.create( + sponsor=sponsor, + organizational_unit=unit, + source=self.CEREBRUM_SOURCE, + automatic=True, + hierarchical_access=settings.CEREBRUM_HIERARCHICAL_ACCESS, + ) + created = True if created: logger.info("sponsor_ou_link_create", sponsor=sponsor.id, sunit=sunit.id) else: logger.info("sponsor_ou_link_found", sponsor=sponsor.id, sunit=sunit.id) + sunit.source = self.CEREBRUM_SOURCE + sunit.automatic = True sunit.hierarchical_access = settings.CEREBRUM_HIERARCHICAL_ACCESS + changes = sunit.get_dirty_fields(check_relationship=True, verbose=True) + if changes: + logger.info("sponsor_ou_link_changed", changes=changes) sunit.save() return SponsorOrganizationalUnit.objects.get(id=sunit.id) diff --git a/greg/tests/management/test_import_sponsors_from_cerebrum.py b/greg/tests/management/test_import_sponsors_from_cerebrum.py index f548a7ea789b0e50ccbf3693c9ff5191fe83e4bd..54afca68d02476da92e91395f34a13f26b3c298a 100644 --- a/greg/tests/management/test_import_sponsors_from_cerebrum.py +++ b/greg/tests/management/test_import_sponsors_from_cerebrum.py @@ -150,3 +150,20 @@ def test_import_sponsors_from_cerebrum( # One excluded from unit with stedkode in manual list assert Sponsor.objects.all().count() == 2 assert SponsorOrganizationalUnit.objects.count() == 2 + + # when a SponsorOrganizationalUnit with source != 'cerebrum' + # and automatic = False exists, replace it with an automatic one + sunit_lookup = dict( + organizational_unit__identifiers__name="legacy_stedkode", + organizational_unit__identifiers__value="234567", + ) + sunit = SponsorOrganizationalUnit.objects.filter(**sunit_lookup).first() + assert isinstance(sunit, SponsorOrganizationalUnit) + sunit.source = "manual" + sunit.automatic = False + sunit.save() + call_command("import_sponsors_from_cerebrum") + sunit = SponsorOrganizationalUnit.objects.filter(**sunit_lookup).first() + assert isinstance(sunit, SponsorOrganizationalUnit) + assert sunit.source == "cerebrum" + assert sunit.automatic