From a07658b68f7379dfc21bedd3637270d9a972edfe Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Mon, 6 Jul 2026 14:31:54 -0300 Subject: [PATCH 1/2] [change] Renamed is_admin label to "Organization manager" #540 Closes #540 --- openwisp_users/admin.py | 2 ++ openwisp_users/api/serializers.py | 2 +- openwisp_users/base/models.py | 1 + .../0025_alter_organizationuser_is_admin.py | 20 ++++++++++++++++++ openwisp_users/tests/test_admin.py | 21 ++++++++++++++++++- openwisp_users/tests/test_api/test_api.py | 6 ++++++ .../0006_alter_organizationuser_is_admin.py | 20 ++++++++++++++++++ 7 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 openwisp_users/migrations/0025_alter_organizationuser_is_admin.py create mode 100644 tests/openwisp2/sample_users/migrations/0006_alter_organizationuser_is_admin.py diff --git a/openwisp_users/admin.py b/openwisp_users/admin.py index d1e7dcefd..af504df38 100644 --- a/openwisp_users/admin.py +++ b/openwisp_users/admin.py @@ -108,6 +108,7 @@ class OrganizationUserInline(admin.StackedInline): model = OrganizationUser formset = RequiredInlineFormSet view_on_site = False + fields = ("organization", "is_admin") autocomplete_fields = ("organization",) def get_formset(self, request, obj=None, **kwargs): @@ -591,6 +592,7 @@ class OrganizationUserAdmin( ): view_on_site = False actions = ["delete_selected_overridden"] + fields = ("user", "organization", "is_admin") search_fields = ["user__username", "organization__name"] def get_readonly_fields(self, request, obj=None): diff --git a/openwisp_users/api/serializers.py b/openwisp_users/api/serializers.py index 8bbd84048..062ae0e8b 100644 --- a/openwisp_users/api/serializers.py +++ b/openwisp_users/api/serializers.py @@ -189,8 +189,8 @@ class OrganizationUserSerializer(serializers.ModelSerializer): class Meta: model = OrganizationUser fields = ( - "is_admin", "organization", + "is_admin", ) def to_internal_value(self, data): diff --git a/openwisp_users/base/models.py b/openwisp_users/base/models.py index 16365ad63..52ff71ce5 100644 --- a/openwisp_users/base/models.py +++ b/openwisp_users/base/models.py @@ -485,6 +485,7 @@ class BaseOrganizationUser(models.Model): """ id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + is_admin = models.BooleanField(_("Organization manager"), default=False) class Meta: abstract = True diff --git a/openwisp_users/migrations/0025_alter_organizationuser_is_admin.py b/openwisp_users/migrations/0025_alter_organizationuser_is_admin.py new file mode 100644 index 000000000..bb9434ec0 --- /dev/null +++ b/openwisp_users/migrations/0025_alter_organizationuser_is_admin.py @@ -0,0 +1,20 @@ +# Generated by Django 5.2.13 on 2026-07-06 16:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("openwisp_users", "0024_apikey"), + ] + + operations = [ + migrations.AlterField( + model_name="organizationuser", + name="is_admin", + field=models.BooleanField( + default=False, verbose_name="Organization manager" + ), + ), + ] diff --git a/openwisp_users/tests/test_admin.py b/openwisp_users/tests/test_admin.py index c56fdf884..ab0ad5cda 100644 --- a/openwisp_users/tests/test_admin.py +++ b/openwisp_users/tests/test_admin.py @@ -523,6 +523,25 @@ def test_organization_user_view_on_site(self): ) self.assertNotContains(response, "viewsitelink") + def test_organization_user_is_admin_label(self): + admin = self._create_admin() + self.client.force_login(admin) + org = self._create_org() + ou = self._create_org_user(organization=org, user=admin) + response = self.client.get( + reverse(f"admin:{self.app_label}_organizationuser_change", args=[ou.pk]) + ) + self.assertContains( + response, + '", + ) + content = response.content.decode() + self.assertLess( + content.index('class="form-row field-organization"'), + content.index('class="form-row field-is_admin"'), + ) + def test_admin_change_user_is_superuser_editable(self): admin = self._create_admin() self.client.force_login(admin) @@ -712,7 +731,7 @@ def test_operator_change_org_is_admin(self): self.assertNotContains( response, '' - '