{ "info": { "author": "Christopher Glass", "author_email": "tribaal@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. |travisci| image:: https://api.travis-ci.org/chrisglass/django-rulez.png\n.. _travisci https://travis-ci.org/chrisglass/django-rulez\n\n|travisci|\n\n#############\ndjango-rulez\n#############\n\ndjango-rulez is a lean, fast and complete rules-based permissions system for\nthe django framework.\n\nMost other authentication frameworks focus on using database joins, which gets\npretty slow after a while (since mostly every query generates a lot of joins).\nDjango-rulez uses a memory-based hashmap instead.\n\nDjango-rulez also implements a role concept, allowing for very readable and\nmaintainable code.\n\ndjango-rulez was forked from django-rules, since some of the goals django-rules\nset themselves didn't match our current project goals. You can refer to their \ngithub project page for more information about this other cool project: \nhttps://github.com/maraujop/django-rules\nKudos for the good work guys!\n\nGenerally, it is also an instance-level authorization backend, that stores the \nrules themselves as methods on models.\n\nStatus\n======\n\nSince many people asked - this project is still active and used in production\nsystems, but its current goals have been reached and not much further\ndevelopment happens.\n\nPull requests or discussion is very welcome, especially if you have an\ninteresting use-case we haven't thought of :)\n\nOur test coverage is 100%, and we would like to keep it this way, so\nplease make sure you test before you push.\n\nInstallation\n=============\n\n\nFrom source\n------------\n\nTo install django-rulez from source::\n\n\tgit clone https://github.com/chrisglass/django-rulez/ django-rulez\n\tcd django-rulez\n\tpython setup.py install\n\nFrom Pypi\n----------\n\nSimply install django-rulez like you would install any other pypi package::\n\n pip install django-rulez\n\n\nConfiguration\n==============\n\n* Add `rulez` to the list of `INSTALLED_APPS` in your `settings.py`\n* Add the django-rulez authorization backend to the list of `AUTHENTICATION_BACKENDS` in `settings.py`::\n\n\tAUTHENTICATION_BACKENDS = [\n\t 'django.contrib.auth.backends.ModelBackend', # Django's default auth backend\n\t 'rulez.backends.ObjectPermissionBackend',\n\t]\n\nExample\n=========\n\nThe following example should get you started::\n\n # models.py\n from rulez import registry\n \n class myModel(models.Model):\n \n def can_edit(self, user_obj):\n '''\n Not a very useful rule, but it's an example\n '''\n if user_obj.username == 'chris':\n return True\n return False\n \n registry.register('can_edit', myModel)\n\nDjango-rulez requires to declare the rule as a method in the same model. This\nis very simple in case the rule applies to a model in our own application, but\nin some cases, we might need to set object permisions to models from 3rd-party\napplications (e.g. to the User model). Let's see an example for this case::\n\n # models.py\n from django.contrib.auth.models import User\n from rulez import registry\n \n def user_can_edit(self, user_obj):\n '''\n This function will be hooked up to the User model as a method.\n The rule says that a user can only be modified by the same user\n '''\n if self == user_obj:\n return True\n return False\n \n # 'add_to_class' is a standard Django method\n User.add_to_class('can_edit', user_can_edit)\n \n registry.register('can_edit', User)\n\nAnother example: using roles\n=============================\n\nA little more code is needed to use roles, but it's still pretty concise::\n\n # models.py\n from rulez.rolez.base import AbstractRole\n from rulez.roles.models import ModelRoleMixin\n from rulez import registry\n\n class Editor(AbstractRole):\n \"\"\" That's a role\"\"\"\n @classmethod\n def is_member(cls, user, obj):\n \"\"\"Remember, class methods take the class instead of self\"\"\"\n if user.username == 'chris':\n return True\n return False\n\n class myModel(models.Model, ModelRoleMixin): # Don't forget the mixin!\n \n def can_edit(self, user_obj):\n '''\n Not a very useful either but it's an example\n '''\n return self.has_role(user_obj, Editor):\n\n roles = [Editor, ]\n\n registry.register('can_edit', myModel)\n\nUsing your rules\n=================\n\nOnce you have created a rule or role, you can utilize them directly on \nan instance of your model:::\n\n model_instance = MyModel.objects.get(pk=1)\n user_chris = User.objects.get(username='chris')\n\n model_instance.can_edit(user_chris)\n\nOr, with the help of django-rulez's authentication backend, on a user \nobject:::\n\n user_chris.has_perm('can_edit', model_instance)\n\nIn addition, the following templatetag usage is supported:::\n\n {% load rulez_perms %}\n {% rulez_perms can_edit model_instance as VARNAME %}\n {% if VARNAME %}\n You have permissions\n {% else %}\n Sorry, you don't have permission\n {% endif %}", "description_content_type": null, "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/chrisglass/django-rulez", "keywords": "authorization,backends,django,rules,permissions,rulez", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "django-rulez", "package_url": "https://pypi.org/project/django-rulez/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-rulez/", "project_urls": { "Homepage": "http://github.com/chrisglass/django-rulez" }, "release_url": "https://pypi.org/project/django-rulez/1.0.2/", "requires_dist": null, "requires_python": null, "summary": "A lean and mean object-level rules system for the Django framework", "version": "1.0.2" }, "last_serial": 1503643, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "484197bbfca48f63d74d367d7e1838f8", "sha256": "a2bfd2e7137ec23157c612fe0d4e86dd59d9d5584fb6ed21813b325b00e78748" }, "downloads": -1, "filename": "django-rulez-0.1.tar.gz", "has_sig": false, "md5_digest": "484197bbfca48f63d74d367d7e1838f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5724, "upload_time": "2011-03-01T16:54:17", "url": "https://files.pythonhosted.org/packages/4b/3a/eb142c37bfdaed7f2810b81cba5df582be4973d358072f28327a500c89db/django-rulez-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "9dc7fe9a7640aef116ef76aa05ee29bf", "sha256": "d7eb07136db0fdbfe2bd87696914f15eae8a286a77964993c0dff41814a5bda6" }, "downloads": -1, "filename": "django-rulez-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9dc7fe9a7640aef116ef76aa05ee29bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5867, "upload_time": "2011-03-01T17:03:21", "url": "https://files.pythonhosted.org/packages/48/41/e14cd1fc45e8a1638b1269599a901688f38e6223e1591718a3cc664fddf6/django-rulez-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "874cca3ad9fc5ab84a5e68c423376da9", "sha256": "5c52e5beb684c2bc0d5dfc9047258bee88ddd15e6fb739522e8767ebb5fb571b" }, "downloads": -1, "filename": "django-rulez-0.1.2.tar.gz", "has_sig": false, "md5_digest": "874cca3ad9fc5ab84a5e68c423376da9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6225, "upload_time": "2011-03-11T16:23:49", "url": "https://files.pythonhosted.org/packages/4c/8e/50d60ce72923f74563464c5ba13bab3835e6ad215d988f63b90a3c4e3ff4/django-rulez-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f5be7008d189fb05ff207049b81a1acb", "sha256": "e2e7c39bc8aca4a444f5da711b81b11e1bef37ace2a0242beff6130c9e8c1ee6" }, "downloads": -1, "filename": "django-rulez-0.2.0.tar.gz", "has_sig": false, "md5_digest": "f5be7008d189fb05ff207049b81a1acb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8166, "upload_time": "2011-04-28T11:19:21", "url": "https://files.pythonhosted.org/packages/6e/ff/03f22e2fc1be30fd276e3e4c0b2e4cce11b9862bb754a2d4b0447d1542b6/django-rulez-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "8677b02a17f497d90461912676886d5f", "sha256": "6067a00bebbc4f081068e0bd743a8662270ffc73d3e8d6bfbd6638c417ad2b73" }, "downloads": -1, "filename": "django-rulez-0.2.1.tar.gz", "has_sig": false, "md5_digest": "8677b02a17f497d90461912676886d5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8157, "upload_time": "2011-04-28T12:03:08", "url": "https://files.pythonhosted.org/packages/97/74/365cd24de9338953b54b1e38da39be50cf989ca5764e55b34826c0aba57f/django-rulez-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "b3585016a7ada30aba147333d2c5d110", "sha256": "b6e517742cf7db4e4f5f0537309a286a9810cef2d672ef98d85dd51008568b07" }, "downloads": -1, "filename": "django-rulez-0.2.2.tar.gz", "has_sig": false, "md5_digest": "b3585016a7ada30aba147333d2c5d110", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7328, "upload_time": "2011-05-02T10:53:54", "url": "https://files.pythonhosted.org/packages/3b/e6/7e16eb6d7bc833897712404abf985ad723a89dbb70f813387523b121354b/django-rulez-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "0302282d0339cc71b9ee39893edf5a43", "sha256": "74ed33487204dd1dffd103421b7ae2565e0dbb7bae17d50a53c40b20f6bf39fa" }, "downloads": -1, "filename": "django-rulez-0.2.3.tar.gz", "has_sig": false, "md5_digest": "0302282d0339cc71b9ee39893edf5a43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8315, "upload_time": "2011-06-01T14:24:33", "url": "https://files.pythonhosted.org/packages/e5/ac/c94c2dbd479210d22f8c496a86c3599eaf819432c3757c888b465f8d23e1/django-rulez-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "a4eab10919b35e35ee6de83e614c9b10", "sha256": "148788b8443ebc19ea62ff299a1c5869023065e4bf0301dca14861a1786792d9" }, "downloads": -1, "filename": "django-rulez-0.2.4.tar.gz", "has_sig": false, "md5_digest": "a4eab10919b35e35ee6de83e614c9b10", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8385, "upload_time": "2011-07-18T16:57:42", "url": "https://files.pythonhosted.org/packages/30/67/133aeced52905496421869c70e56fd1648b1b34445bc7bd6aae995030d17/django-rulez-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "37f291ff5002745d3dde5d4d78408000", "sha256": "a9bef6a912eec859ab53574b0c162c522614e930eeb0e168ba153fec97eaf4a1" }, "downloads": -1, "filename": "django-rulez-0.2.5.tar.gz", "has_sig": false, "md5_digest": "37f291ff5002745d3dde5d4d78408000", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10767, "upload_time": "2012-03-06T17:18:23", "url": "https://files.pythonhosted.org/packages/c6/f8/05fea5618c4a61000dfb02ab769cb8eca89803f4c221bec10ab6de6247b8/django-rulez-0.2.5.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "93530fd1d713a761bfc053796e3e28d4", "sha256": "5b82730a8286cae2fb769714b244cc42cde6038c24e4ef44541809b84bdba80c" }, "downloads": -1, "filename": "django-rulez-1.0.0.tar.gz", "has_sig": false, "md5_digest": "93530fd1d713a761bfc053796e3e28d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12723, "upload_time": "2013-08-09T15:52:53", "url": "https://files.pythonhosted.org/packages/a0/56/d7d220d294fd24bb2e0949fe9cc1e2e8fafa7b6b451bff76effbc7e6ffce/django-rulez-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "a2e8dc422f495fafd77fd74d7a2f7963", "sha256": "547c1b3794d1e7d2c8e13c12a79f847cfbee213c1485ffe7f631153ab82c12aa" }, "downloads": -1, "filename": "django_rulez-1.0.1-py2.7.egg", "has_sig": false, "md5_digest": "a2e8dc422f495fafd77fd74d7a2f7963", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 28876, "upload_time": "2015-04-13T20:10:46", "url": "https://files.pythonhosted.org/packages/cf/3d/a06d587b3898fd89cf7e7aba608b463d0f3bf4b5b7b251d4d723c7aad2b4/django_rulez-1.0.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "d799ab541278c8d44ca0267dafcf7630", "sha256": "d25ab7aa2ce0a988c543073b942e295a8abcef8ab7a591269d3df39d92990a72" }, "downloads": -1, "filename": "django-rulez-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d799ab541278c8d44ca0267dafcf7630", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12720, "upload_time": "2013-08-09T16:10:41", "url": "https://files.pythonhosted.org/packages/7b/4c/c7d130be39dff4975dee730aaa5404fa103a56577c96e20a74e78e794b85/django-rulez-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "4168d0c61632d289cf912ac3bd7ccbe3", "sha256": "88866a1a3be59262432eb92c6dc0673ad569a05aa183048360970286a4ca2b30" }, "downloads": -1, "filename": "django-rulez-1.0.2.tar.gz", "has_sig": false, "md5_digest": "4168d0c61632d289cf912ac3bd7ccbe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11995, "upload_time": "2015-04-13T20:12:08", "url": "https://files.pythonhosted.org/packages/7a/a3/bc2e830b6fe659c04909075a32be30995e6c4424f8d8c352810fccbbdbfb/django-rulez-1.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4168d0c61632d289cf912ac3bd7ccbe3", "sha256": "88866a1a3be59262432eb92c6dc0673ad569a05aa183048360970286a4ca2b30" }, "downloads": -1, "filename": "django-rulez-1.0.2.tar.gz", "has_sig": false, "md5_digest": "4168d0c61632d289cf912ac3bd7ccbe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11995, "upload_time": "2015-04-13T20:12:08", "url": "https://files.pythonhosted.org/packages/7a/a3/bc2e830b6fe659c04909075a32be30995e6c4424f8d8c352810fccbbdbfb/django-rulez-1.0.2.tar.gz" } ] }