How does it compare to the solutions that already exist listed here? http://djangopackages.com/grids/g/perms/
-Mike On Fri, Apr 13, 2012 at 7:56 PM, Moritz S. <moritz.sich...@googlemail.com>wrote: > Hi all, > > I have been using django for a while and became happy by the time I > discovered the auth module that supports permission handling. But this > module turned out to only be able to handle model based permissions. I > could not imagine django of not having such a basic functionality (in my > opinion) despite of having so much other great abilities. So I started to > search for it but eventually figured out that the auth model's code was > prepared for implementing this but it haven't been done yet. > So I decided to write a patch for this on my own. > Currently I'm writing this patch but there are several design decisions to > make so I wanted to share this with you and hear your opinions. > > First of all: I think the main problem of this implementation is to link > the objects with the corresponding permissions. With model based > permissions that's easy because you only have to store a permission once > with the models ContentType and relate with a ManyToManyField to them and > that's it. The problem with object based permissions is that every object > needs to have his own set of permissions and you can't just use ForeignKeys > or ManyToManyFields from a permission model because in the process of > creating the permission model (and table) you don't know about the models > that will provide object permissions therefore you can't refer to them. > So I tried some different implementations. > > At first I tried to used dynamic models (e.g. this project makes use of > them: http://pypi.python.org/pypi/django-object-permissions): The idea is > to create intermediate models like 'MyModel_ObjectPermissions' that stores > the object permissions with foreign keys to the model itself, user and > group. > But this has a huge disadvantage: the use of dynamic models. > In fact thinking as database specialist that is the easiest way of > connecting the model instances to the permissions but dynamic models are > very sensitive and kind of hacky in my opinion and I think that does not > match well with django's ideas. > > Then I found out about GenericRelations from the contenttypes framework. > So you could possibly use a single model called 'ObjectPermissions' or > something and link users, permissions and instances of all types of models > and only had to use one GenericRelation. This solution eliminates the > problem wit the dynamic models because it doesn't even make use of them. > But the GenericRelations have another not negligible disadvantage: The > databases behind django don't have native support for them. I thought of > huge django projects handling thousands and thousands of object > permissions. I think these GenericRelations wouldn't be such scalable to > make use of them. > > The only solution for me was to find a way to link the (unknown) model > instances to the permissions in the reversed direction. So not use > ForeignKeys, etc. in the permission model to refer to the unknown model but > to refer from the model to the permission itself. That would fix the > problem of not knowing the models while creating the permission model. So > in the end I thought of following: > - there is a new model in the auth module called 'ObjectPermission' this > model has ManyToManyFields to User and Group and a ForeignKey to Permission > - instead of ObjectPermission referring to the model using object > permissions, a field called 'object_permissions' is added to the > corresponding models (by use of the class_prepared signal) (dynamically > adding fields is way better than use completely dynamic models in my > opinion) > - the object_permissions field is a ManyToManyField, that refers to > ObjectPermission. In fact, a 'ManyToOneField' would be sufficient but > django only has one to many fields (the ForeignKeyField) and we can't just > use this in the reversed direction, as I mentioned above > This picture illustrates the relations: > > > <https://lh6.googleusercontent.com/-4wiWd_3CYFc/T4i4ZgfPKeI/AAAAAAAAAAM/iCqyCLwKQBA/s1600/object_permissions_models.png> > > > Furthermore I thought of slightly modifying the auth module (apart from > the ObjectPermission model) in the following way: > - when the auth app is initialized a function is registered to listen to > the class_prepared signal. This function adds the object_permissions field > to each model, that has the Meta.object_permissions set to True (for this > to work, this meta attribute has to be set in django.db.models.options) > - the User model gets the methods grant_perm and revoke_perm that takes > the permission and as optional argument the object in order to simplify the > process of handling permissions > - in the ModelBackend the methods has_perm, etc. have to be modified to be > able to handle function calls with given objects (obviously) > > So that was the technical part. > > Now I want you to give feedback if this implementation is viable and maybe > sometimes may get into django. > > > Thanks, > Moritz > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/django-developers/-/WbQ6EMVuxqkJ. > To post to this group, send email to django-developers@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. > -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.