Skip to main content

Django's object permission library

Project description

Introduction
===========================================
This application supply Django's object permission feature

Install
===========================================

sudo pip install django-object-permission

or

git clone git://github.com/alisue/django-object-permission.git
sudo pip install django-object-permission/

or download repository and copy it to somewhere in PYTHON_PATH


How to Use
==========================================

1. Append `object_permission` to `INSTALLED_APPS`
2. run `manage.py syncdb`
3. Add `modify_object_permission(mediator, created)` and `modify_object_permission_m2m(mediator, sender, model, pk_set, removed)` to the target model at `models.py`
4. Use `object_permission.decorators.permission_required(parm, queryset)` to filtering view or whatever


Example mini `blog` app
=========================================

models.py

from django.db import models
from django.contrib.auth.models import User
from object_permission.mediators import ObjectPermissionMediator as Mediator

class Entry(models.Model):
PUB_STATES = (
('public', 'public entry'),
('protected', 'login required'),
('private', 'secret entry'),
)
pub_state = models.CharField('publish status', choices=PUB_STATES)
title = models.CharField('title', max_length=140)
body = models.TextField('body')
author = models.ForeignKey(User, verbose_name='author')

# ...

# The method below is called every after when object is saved
def modify_object_permission(self, mediator, created):
# be author to manager (has `view`, `add`, `change`, `delete` permission)
mediator.manager(self, self.author)

if self.pub_state == 'public':
# be viewer (has `view` permission) login user
mediator.viewer(self, None)
# # be editor (has `view`, `change`) login user
# mediator.editor(self, None)
# be viewer anonymous user
mediator.viewer(self, 'anonymous')
elif self.pub_state == 'protected':
mediator.viewer(self, None)
# reject anonymous user
mediator.reject(self, 'anonymous')
else:
mediator.reject(self, None)
mediator.reject(self, 'anonymous')

# The method below is called every after when object ManyToMany relation is updated
def modify_object_permission_m2m(self, mediator, sender, model, pk_set, removed):
pass

views.py

from django.views.generic import list_detail
from django.views.generic import create_update
from object_permission.decorators import permission_required
from models import Entry

def object_list(request, *args, **kwargs):
return list_detail.object_list(request, *args, **kwargs)

@permission_required('blog.view_entry', Entry)
def object_detail(request, object_id, *args, **kwargs):
return list_detail.object_detail(request, object_id=object_id, *args, **kwargs)

# actually `blog.add_entry` permission is not object permission
# so you have to set permission to each user in Django's admin site or whatever
@permission_required('blog.entry_add')
def create_object(request, *args, **kwargs):
return create_update.create_object(request, *args, **kwargs)

@permission_required('blog.change_entry', Entry)
def update_object(request, object_id, *args, **kwargs):
return create_update.update_object(request, object_id=object_id, *args, **kwargs)

@permission_required('blog.delete_entry', Entry)
def delete_object(request, object_id, *args, **kwargs):
return create_update.delete_object(request, object_id=object_id, *args, **kwargs)

index.html

<html>
<head>
<title>django-object-permission example</title>
</head>
<body>
{% ifhsp 'blog.add_entry','blog.change_entry','blog.delete_entry' of user for object %}
<!-- displayed only user who has `blog.add_entry` permission,
`blog.change_entry` permision for object or
`blog.delete_entry` permission for object -->
<h2>Toolbox</h2>
{% ifhsp 'blog.add_entry' of user %}
<!-- displayed only user who has `blog.add_entry` permission -->
<a href="{% url 'blog-entry-create' %}">Add New Entry</a>
{% endifhsp %}
{% if object %}
{% ifhsp 'blog.change_entry' of user for object %}
<!-- displayed only user who has `blog.change_entry` permission for object -->
<a href="{% url 'blog-entry-update' object.pk %}">Change this entry</a>
{% endifhsp %}
{% ifhsp 'blog.delete_entry' of user for object %}
<!-- displayed only user who has `blog.delete_entry` permission for object -->
<a href="{% url 'blog-entry-delete' object.pk %}">Delete this entry</a>
{% endifhsp %}
{% endif %}
{% endifhsp %}
</body>
</html>

Settings
=========================================
`OBJECT_PERMISSION_MODIFY_FUNCTION`
: set the name of function when object is saved for modify object permission for the object.
the default value is `modify_object_permission`

`OBJECT_PERMISSION_MODIFY_M2M_FUNCTION`
: set the name of function when object's ManyToMany relation is updated for modify object permission
for the object. the default value is `modify_object_permission_m2m`

Project details


Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page