A rule engine for Django apps.
Project description
A tool to manage logical rules throughout your application. Logical rules are more powerful than permission or rule tables because they are written in python. Register a rule once and work with it throughout your app, from templates to generic view mixins. Instead of cluttering your models with rule-style and permission-style methods define those rules in rules.py and then get easy access to them in your views and templates.
Installation
Use pip to install from PyPI:
pip install django-logical-rules
Add logical_rules to your settings.py file:
INSTALLED_APPS = ( ... 'logical_rules', ... )
Additional Requirements
If you want to use the messaging features install Django messages framework.
Configuration
Rules are defined in rules.py files within your apps. Here’s an example of a rule:
import logical_rules def user_can_edit_mymodel(object, user): """ Confirms a user can edit a specific model ...owners only! """ return object.owner == user logical_rules.site.register("user_can_edit_mymodel", user_can_edit_mymodel)
To include your models in the registry you will need to do run the autodiscover, a bit like django.contrib.admin (I generally put this in urls.py):
import logical_rules logical_rules.autodiscover()
Usage
Template Tag
Once you have created a rule, it’s easy to use anywhere in your templates:
{% load logical_rules_tags %} {% testrule user_can_edit_mymodel object request.user %} <p>You are the owner!</p> {% endtestrule %}
Note: Don’t use quotes around the rule name in the template.
RulesMixin
If you are extending Django’s class-based generic views, you might find this mixin useful. It allows you to define rules that should be applied before rendering a view. Here’s an example usage:
class MyView(RulesMixin, DetailView): def update_logical_rules(self): super(MyView, self).update_logical_rules() self.add_logical_rule({ 'name': 'user_can_edit_mymodel', 'param_callbacks': [ ('object', 'get_object'), ('user', 'get_request_user') ] })
param_callbacks are our technique for getting the parameters for your rule. These are assumed to be methods on your class. get_request_user() is defined in RuleMixin since it’s so common. get_object() is a method on the DetailView class.
Rule dictionaries can have other properties, like redirect_url and response_callback. If redirect_url is defined, then the view will return an HttpResponseRedirect to that URL. If response_callback is defined, then the view will return the result of that method.
Messaging integration is possible with message and message_level options.
Finally, we’ve added two commonly used rules. As an optional substitute for login_required, we have user_is_authenticated and to test a generic expression, we have evaluate_expression.
Direct Calling
import logical_rules if logical_rules.site.test_rule(rule['name'], arg1, arg2): print "passed" else: print "failed"
Contributing
Think this needs something else? To contribute to django-logical-rules create a fork on Bitbucket. Clone your fork, make some changes, and submit a pull request.
Bugs are great contributions too! Feel free to add an issue on Bitbucket:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file django-logical-rules-1.0.tar.gz
.
File metadata
- Download URL: django-logical-rules-1.0.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 81060931c4692307678e1494c520db684af8050baa149d3e1b9e89b96f2cc4d1 |
|
MD5 | 40ae2b01616dc17e39d8a5fed35da504 |
|
BLAKE2b-256 | e4033bbe4cb8ed862271026e3328e9c815e6c926486834db692eec8edd14d91e |