پرش به محتویات

نگه داشتن سابقه‌ی تغییرها

هر تغییری در دسترسی یک سیگنال است که بعد از commit شدن تغییر فرستاده می‌شود - پس گیرنده هیچ‌وقت تغییری را که برگشت خورده ثبت نمی‌کند. هر کدام actor را دارد، کسی که تغییر را داده، و None برای خود سیستم.

# audit/receivers.py
from django.dispatch import receiver

from clearance import signals
from audit.models import AccessChange


@receiver(signals.bundle_given)
def bundle_given(sender, actor, person, bundle, **kwargs):
    AccessChange.objects.create(actor=actor, person=person, what=f'given {bundle}')


@receiver(signals.permission_revoked)
def permission_revoked(sender, actor, person, permission, reason, **kwargs):
    AccessChange.objects.create(
        actor=actor, person=person, what=f'took {permission}: {reason}'
    )

گیرنده‌ها را وقتی اپ بالا می‌آید وصل کنید:

class AuditConfig(AppConfig):
    name = 'audit'

    def ready(self):
        from audit import receivers  # noqa: F401

همه‌ی سیگنال‌ها و آنچه هر کدام همراه دارد در مرجع است. تغییری که در پنل ادمین، در کد یا با clearance_sync انجام شود همان سیگنال است: همه از همان سرویس‌ها می‌گذرند.

آنچه سیگنال نیست

اینکه چه کسی یک رکورد را می‌خواند تغییری در دسترسی نیست: آن را جایی ثبت کنید که رکورد خوانده می‌شود - یک view، یک serializer. رد شدن هم تغییر نیست؛ یک AccessRefused است که فراخواننده می‌گیرد، یا یک 403.