Did you check my library ( django-permission:
https://github.com/lambdalisue/django-permission )? which is not stable
yet and has completely different approach to enable Object Permission in
Django.
I gave up database based object permission. If you have some article
which is only visible for authenticated user
, you may want to give a "view" permission for all authenticated users
when the article has saved (if you don't use
"is_authenticated" or "login_required" or whatever for some reason).
That works fine while you add new user. If you
add new user then you have to give permission of the article to the new
user. If you have a lot of user and a lot of article, objects...
adding new user takes long time and it's not efficient.
Just in case if my library helps you. Regard.
(12/04/14 9:43), Moritz S. wrote:
I checked the four most used solutions.
The first three ones use GenericKeys (in my opinion not the ideal
solution as I described above) and the fourth one as far as I can see
does not use the auth permission backend but does permission handling
on his own.
-Moritz
Am Samstag, 14. April 2012 02:14:35 UTC+2 schrieb Mike Axiak:
How does it compare to the solutions that already exist listed here?
http://djangopackages.com/grids/g/perms/
<http://djangopackages.com/grids/g/perms/>
-Mike
On Fri, Apr 13, 2012 at 7:56 PM, Moritz S.
<moritz.sich...@googlemail.com
<mailto: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
<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
<https://groups.google.com/d/msg/django-developers/-/WbQ6EMVuxqkJ>.
To post to this group, send email to
django-developers@googlegroups.com
<mailto:django-developers@googlegroups.com>.
To unsubscribe from this group, send email to
django-developers+unsubscr...@googlegroups.com
<mailto:django-developers%2bunsubscr...@googlegroups.com>.
For more options, visit this group at
http://groups.google.com/group/django-developers?hl=en
<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 view this discussion on the web visit
https://groups.google.com/d/msg/django-developers/-/EzRqqRU1eSUJ.
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.