Django permissions and Groups

Reading Time : ~ .

Permissions:

Actually permissions are of 2 types:

    1.Model level permissions
    2.object level permissions

If you want to give permissions on all cars, then Model-level is appropriate, but if you want to give permissions on a per-car basis you want Object-level. You may need both, and this isn't a problem as we'll see.

For Model permissions, Django will create permissions in the form 'appname.permissionname_modelname' for each model. If you have an app called 'drivers' with the Car model then one permission would be 'drivers.delete_car'. The permissions that Django automatically creates will be create, change, and delete.Read permission is not included in CRUD operation.Django decided to change CRUD's 'update' to 'change' for some reason. To add more permissions to a model, say read permissions, you use the Meta class:

class Book( models.Model ):

    # model stuff here

    class Meta:

        permissions = ( 

            ( "read_book", "Can read book" ),

        )

Permissions is a set of tuples, where the tuple items are the permission as described above and a description of that permission.

Finally, to check permissions, you can use has_perm:

obj.has_perm( 'drivers.read_car' )

Where obj is either a User or Group instance.

Here is some example which is used to check permissions 'perms' of a model object called entity in the app

def has_model_permissions( entity, model, perms, app ):

    for p in perms:

        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):

            return False

        return True

Where entity is the object to check permissions on (Group or User), model is the instance of a model, perms is a list of permissions as strings to check (e.g. ['read', 'change']), and app is the application name as a string. To do the same check as has_perm above you'd call something like this:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

We are having 3 default permissions which will be created when we run ./manage.py runserver.These permissions will be created for each models in a project.

add: user.has_perm('drivers.add_book')

change: user.has_perm('drivers.change_book')

delete: user.has_perm('drivers.delete_book')

Groups:

With the help of model django.contrib.auth.models.Group,we can categorizing users so you can apply permissions to group(all users)... 
For example, if the group Book, author has the permission can_edit_home_page, any user in that group will have that permission. 

from myapp.models import Book

from django.contrib.auth.models import Group, Permission

from django.contrib.contenttypes.models import ContentType content_type = ContentType.objects.get_for_model(Book)

permission = Permission.objects.create(codename='can_publish',

                                       name='Can Publish book',

                                       content_type=content_type)

We can directly add a permission to a user using user_permissions and to a group using permissions attribute.

    By Posted On
SENIOR DEVELOPER at MICROPYRAMID

Need any Help in your Project?Let's Talk

Latest Comments
Related Articles
Django-REST User Level Permissions and Object Level Permissions Anjaneyulu Batta

Django-REST User Level Permissions and Object Level Permissions. User Level Permissions and Object level Permissions allow to serve customers based on their access levels or ...

Continue Reading...
Understanding Checkout flow in Django Oscar. Shirisha Gaddi

Explaining Django Oscar checkout flow.

Continue Reading...
How to create responsive thumbnails in Django templates using sorl-thumbnail? Chaitanya Kattineni

Sorl thumbnail is the package which is being widely used to generate thumbnail in Django. It will create thumbnail of given size for the given ...

Continue Reading...

Subscribe To our news letter

Subscribe to our news letter to receive latest blog posts into your inbox. Please fill your email address in the below form.
*We don't provide your email contact details to any third parties