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

۲. مجوزها

مجوز کاری است که با یک مدل می‌شود کرد. Django به هر مدل چهار مجوز می‌دهد - view_order، add_order، change_order، delete_order - و کتابخانه همان‌ها را همان‌طور که هستند به کار می‌برد. فروشگاه به جای آن‌ها مجوزهای خودش را اعلام می‌کند، که اسمشان کاری است که انجام می‌شود:

class Order(models.Model):
    class Status(models.TextChoices):
        PENDING = 'pending', _('Pending')
        APPROVED = 'approved', _('Approved')
        REJECTED = 'rejected', _('Rejected')
        DELIVERED = 'delivered', _('Delivered')

    customer = models.ForeignKey(
        Person, on_delete=models.CASCADE, related_name='orders', verbose_name=_('customer')
    )
    branch = models.ForeignKey(
        Branch, on_delete=models.PROTECT, related_name='orders', verbose_name=_('branch')
    )
    item = models.CharField(_('item'), max_length=120)
    status = models.CharField(
        _('status'), max_length=16, choices=Status.choices, default=Status.PENDING
    )
    #: Set by the shop, never by the customer - empty until it is.
    price = models.DecimalField(_('price'), max_digits=10, decimal_places=2, null=True, blank=True)

    objects = OrderQuerySet.as_manager()

    class Meta:
        verbose_name = _('order')
        verbose_name_plural = _('orders')
        default_permissions = ()
        permissions = build_permissions(
            'order',
            _('orders'),
            actions=(*DEFAULT_ACTIONS, 'approve'),
            labels={'approve': _('Can approve or reject %(resource)s')},
            # Only whoever holds shop.order_view_price reads it.
            protected_fields=('price',),
            # Only whoever may approve writes these, and only from pending.
            status_actions={
                'approve': {'field': 'status', 'to': ['approved', 'rejected'], 'from': ['pending']},
            },
        )

    def __str__(self):
        return f'{self.item} ({self.branch})'

build_permissions این‌ها را می‌سازد:

مجوز از کجا
shop.order_view، order_create، order_edit، order_delete DEFAULT_ACTIONS
shop.order_approve اکشنی که کنار آن‌ها اضافه شده
shop.order_view_price، order_edit_price فیلد محافظت‌شده - قدم ۶

default_permissions = () چهار مجوز Django را خاموش می‌کند، تا یک مدل یک دسته اسم داشته باشد و نه دو دسته؛ مدلی که هر دو را نگه دارد موقع بالا آمدن پروژه رد می‌شود (E014). اکشن وضعیت قدم ۷ است.

permission_for(Order, 'edit') به هر دو شکل جواب می‌دهد، پس هیچ جای دیگری از پروژه لازم نیست بداند یک مدل کدام را نگه داشته.

در پنل ادمین

دسترسی، مجوزها همه‌ی مجوزها را فهرست می‌کند، و اینکه چه کسی هر کدام را دارد:

همه‌ی مجوزها، و اینکه چه کسی هر کدام را دارد

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