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

۴. دامنه‌های ردیف در کد

دامنه می‌گوید یک مجوز به کدام ردیف‌ها می‌رسد. یک مدل دامنه‌هایش را روی queryset خودش تعریف می‌کند:

"""Which orders a grant reaches: the scopes the code offers beside the admin site's."""

from types import MappingProxyType

from django.db.models import Q
from django.utils.translation import gettext_lazy as _

from clearance.querysets import ScopedQuerySet


class OrderQuerySet(ScopedQuerySet):
    scopes = MappingProxyType(
        {
            'own': _('Their own orders'),
            'branch': _("Their branch's orders"),
        }
    )

    def scope_own(self, user):
        return Q(customer=user)

    def scope_branch(self, user):
        return Q(branch=getattr(user, 'branch_id', None))

هر دامنه یک اسم است، یک برچسب که پنل ادمین نشان می‌دهد، و متدی که برای شخص یک Q برمی‌گرداند. all همیشه کنار آن‌ها هست. سفارش این queryset را مدیر (manager) خودش می‌کند - objects = OrderQuerySet.as_manager()، در قدم ۲.

خواستن ردیف‌ها

Order.objects.visible_to(user)            # the orders they may view
Order.objects.visible_to(user, 'edit')    # the orders they may edit

برای افراد فروشگاه:

شخص چه دارد visible_to(person)
north_manager order_view در branch چراغ مطالعه و صندلی اداری - سفارش‌های North
accountant order_view در all هر چهار سفارش
alice order_view در own چراغ مطالعه و قفسه‌ی کتاب - سفارش‌های خودش
کسی که چیزی به او داده نشده هیچ هیچ

مجوزهای یک شخص در هر درخواست یک بار و با تعداد ثابتی کوئری خوانده می‌شوند، هر چند فهرست که یک صفحه نشان دهد.

همه‌ی درها از همین می‌پرسند

پنل ادمین، viewهای Django و API همه از همین visible_to می‌پرسند. با north_manager، فهرست سفارش‌ها در پنل ادمین سفارش‌های North را دارد و نه چیز دیگری - و قیمتی ندارد، که قدم ۶ است:

سفارش‌هایی که north_manager در پنل ادمین می‌بیند

سفارش شعبه‌ی دیگر برای آن‌ها رد نمی‌شود: برایشان وجود ندارد، همان 404 سفارشی که هیچ‌وقت ثبت نشده.

نوشتن ردیف‌ها

دامنه برای آنچه نوشته می‌شود هم برقرار است: سفارشی که بیرون از دامنه‌ی create ساخته شود، یا با ویرایش از ردیف‌هایی که شخص به آن‌ها می‌رسد بیرون برود، رد می‌شود و نوشتنش برگردانده می‌شود.