.. _tips-tricks:

======================
Hints, tips and tricks
======================

Within a permission class, you can refer to the user and group using self::

    class CampaignPermission(permissions.BasePermission):
        label = 'campaign_permission'
        checks = ('do_foo',)

        def do_foo(self, campaign=None):
            print self.user
            print self.group
            # ...

You can unregister permission classes and re-register them::

    authority.unregister(Campaign)
    authority.register(Campaign, CampaignPermission)

Within a permission class, you can refer to Django's basic permissions::

    class FlagpagePermisson(permissions.BasePermission):
        label = 'flatpage_permission'
        checks = ('do_foo',)

        def do_foo(self, campaign=None):
            if foo and self.change_flatpage():
                # ...

    authority.register(Flatpage, FlagpagePermisson)

If the ``Permission`` table changes during the lifespan of a django-authority
permission instance and the smart cache is being used, you will need to call
invalidate_permissions_cache in order to see that changes::

    class UserPermission(permission.BasePermission):
        label = 'user_permission'
        checks = ('do_foo',)
    authority.register(User, UserPermission)

    user_permission = UserPermission(user)

    # can_foo is False here since the permission has not yet been added.
    can_foo = user_permission.has_user_perms('foo', user)

    Permission.objects.create(
        content_type=Permission.objects.get_content_type(User),
        object_id=user.pk,
        codename='foo',
        user=user,
        approved=True,
    )

    # can_foo is still False because the permission cache has not been
    invalidated yet.
    can_foo = user_permission.has_user_perms('foo', user)

    user_permission.invalidate_permissions_cache()

    # can_foo is now True
    can_foo = user_permission.has_user_perms('foo', user)

This is particularly useful if you are using the permission instances during a
request, where it is unlikely that the state of the ``Permission`` table will
change.

Although the previous example was only passing in a ``user`` into the
permission, smart caching is used when getting permissions in a ``group`` as
well.
