Metadata-Version: 2.1
Name: drf-fancy-permissions
Version: 1.0.0
Summary: Utilities for defining fine-grained permissions in the Django Rest Framework based API views
Author: IIIT
Author-email: github@iiit.pl
License: UNKNOWN
Platform: UNKNOWN
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Description-Content-Type: text/markdown
Requires-Dist: Django (<3.0,>=1.10)
Requires-Dist: djangorestframework (>=3.3.2)

# DRF fancy permissions

![example workflow](https://github.com/innovationinit/drf-fancy-permissions/actions/workflows/test-package.yml/badge.svg?branch=main)
[![Coverage Status](https://coveralls.io/repos/github/innovationinit/drf-fancy-permissions/badge.svg)](https://coveralls.io/github/innovationinit/drf-fancy-permissions)


## About

This package provides utilities for defining fine-grained permissions in the Django Rest Framework based API views.

## Install

```bash
pip install drf-fancy-permissions
```

## Usage

Use the fancy_permissions.model_action_permission_factory, fancy_permissions.object_action_permission_factory and
fancy_permissions.parent_object_action_permission_factory functions in order to define authorization rules.

```python
from rest_framework.mixins import (
    CreateModelMixin,
    ListModelMixin,
    RetrieveModelMixin,
    UpdateModelMixin,
)
from rest_framework.viewsets import ViewSet

from fancy_permissions import (
    model_action_permission_factory,
    object_action_permission_factory,
    parent_object_action_permission_factory,
)


class SomeViewSet(
    CreateModelMixin,
    RetrieveModelMixin,
    UpdateModelMixin,
    ListModelMixin,
    ViewSet,
):
    serializer_class = SomeModelSerializer
    permission_classes = [
        model_action_permission_factory(
            create=['some_app.add_somemodel'],
            retrieve=None,  # open for all users
            partial_update=['some_app.change_somemodel'],
            list=None,  # open for all users,
        ),
        object_action_permission_factory(
            create=None,
            retrieve=None,
            partial_update=[lambda obj, user: obj.status == 'SOME_STATUS' and not obj.has_something_meaningful()],
            list=None,
            close=None,
        ),
        parent_object_action_permission_factory(
            create=[lambda obj, user: obj.can_create_children()],
            retrieve=None,
            partial_update=[lambda obj, user: obj.can_update_children()],
            list=None,
            close=None,
        ),
    ]
    queryset = SomeModel.objects.all()
```

## License
The Django Wicked Historian package is licensed under the [FreeBSD
License](https://opensource.org/licenses/BSD-2-Clause).


