ansible / django-ansible-base

Apache License 2.0
12 stars 43 forks source link

Fix bug with reference to id as opposed to pk #538

Closed AlanCoding closed 1 month ago

AlanCoding commented 1 month ago

Demonstrated bug with the test before the code change:

=============================================== FAILURES ===============================================
_______________________________ test_delete_non_id_after_obj_assignment ________________________________

admin_api_client = <rest_framework.test.APIClient object at 0x7f83cdb8b980>
nk_rd = <RoleDefinition: RoleDefinition(pk=6, name=name-key-admin)>
position = <PositionModel: PositionModel object (4)>, user = <User: user>

    @pytest.mark.django_db
    def test_delete_non_id_after_obj_assignment(admin_api_client, nk_rd, position, user):
        nk_rd.give_permission(user, position)
>       position.delete()

test_app/tests/rbac/compatibility/test_non_id_primary_key.py:49: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../../venvs/awx/lib64/python3.12/site-packages/django/db/models/base.py:1132: in delete
    return collector.delete()
../../../../venvs/awx/lib64/python3.12/site-packages/django/db/models/deletion.py:512: in delete
    signals.post_delete.send(
../../../../venvs/awx/lib64/python3.12/site-packages/django/dispatch/dispatcher.py:177: in send
    (receiver, receiver(signal=self, sender=sender, **named))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

instance = <PositionModel: PositionModel object (4)>, args = ()
kwargs = {'origin': <PositionModel: PositionModel object (4)>, 'sender': <class 'test_app.models.PositionModel'>, 'signal': <django.db.models.signals.ModelSignal object at 0x7f83d006d220>, 'using': 'default'}
ct = <ContentType: test_app | position model>

    def rbac_post_delete_remove_object_roles(instance, *args, **kwargs):
        """
        Call this when deleting an object to cascade delete its object roles
        Deleting a team can have consequences for the rest of the graph
        """
        if instance._meta.model_name == permission_registry.team_model._meta.model_name:
            indirectly_affected_roles = set()
            indirectly_affected_roles.update(team_ancestor_roles(instance))
            for team_role in instance.__rbac_stashed_member_roles:
                indirectly_affected_roles.update(team_role.descendent_roles())
            compute_team_member_roles()
            compute_object_role_permissions(object_roles=indirectly_affected_roles)

            # Similar to user deletion, clean up any orphaned object roles
            ObjectRole.objects.filter(users__isnull=True, teams__isnull=True).delete()

        ct = permission_registry.content_type_model.objects.get_for_model(instance)
>       ObjectRole.objects.filter(content_type=ct, object_id=instance.id).delete()
E       AttributeError: 'PositionModel' object has no attribute 'id'

ansible_base/rbac/triggers.py:255: AttributeError
sonarcloud[bot] commented 1 month ago

Quality Gate Passed Quality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
100.0% Coverage on New Code
0.0% Duplication on New Code

See analysis details on SonarCloud