diefenbach / django-permissions Goto Github PK
View Code? Open in Web Editor NEWLicense: BSD 3-Clause "New" or "Revised" License
License: BSD 3-Clause "New" or "Revised" License
A few weeks ago, I stepped into this app, not to be confused with the almost omonymous "django-permission" (without the "s"); it simplicity and neatness impressed me.
But permissions are granted to roles (and through them to users or groups) only for specific content objects: in the Home»Permissions»Object section of the Admin interface, you cannot add an ObjectPermission object without specifying the content_id besides the content_type id.
By inspecting the code, it seems easy to associate permissions to roles in a more "global" way, that is for content types.
I tried a small patch: it works and till now didn't cause side-effects.
Here are the patches:
models.py, class ObjectPermission
- content_id = models.PositiveIntegerField(verbose_name=_(u"Content id"))
+ content_id = models.PositiveIntegerField(verbose_name=_(u"Content id"), blank=True, null=True)
- content = generic.GenericForeignKey(ct_field="content_type", fk_field="content_id")
utils.py, def def has_permission; add the following code just after the while statement
p = ObjectPermission.objects.filter(
content_type=ctype, content_id__isnull=True, role__in=roles, permission__codename=codename).values("id")
if len(p) > 0:
result = True
break
Being the app already installed and synced, I had also to tweak the schema of the database in order to remove the contraints on the content_id field of the permissions_objectpermission table.
NOTE:
I'm not forking the code, among other things, since for a name conflict I was forced to rename the app.
Moreover, as stated in another issue, I had to make, in the util module, function get_roles, another patch in code that I don't understand fully.
hello,
I'm looking for the equivalent of has_role of permissions 1.0 that has been removed. I tried get_roles but it fails with ony user as argument.
I am using 1.2.2.
from permissions.utils import get_roles
sre=User.objects.get(username="sre")
get_roles(sre)
AttributeError Traceback (most recent call last)
<ipython-input-4-d0d05e14a9a3> in <module>()
----> 1 perm.get_roles(sre)
/home/fox/prog/workspace/django-1.8/lib/python2.7/site-packages/permissions/utils.pyc in get_roles(user, obj)
204 """
205 # Cached roles
--> 206 ctype = ContentType.objects.get_for_model(obj)
207 obj_id = "{}|{}".format(obj.id, ctype.id) if obj else "0"
208 try:
/home/fox/prog/workspace/django-1.8/lib/python2.7/site-packages/django/contrib/contenttypes/models.pyc in get_for_model(self, model, for_concrete_model)
51 for the same model don't hit the database.
52 """
---> 53 opts = self._get_opts(model, for_concrete_model)
54 try:
55 return self._get_from_cache(opts)
/home/fox/prog/workspace/django-1.8/lib/python2.7/site-packages/django/contrib/contenttypes/models.pyc in _get_opts(self, model, for_concrete_model)
28 def _get_opts(self, model, for_concrete_model):
29 if for_concrete_model:
---> 30 model = model._meta.concrete_model
31 elif model._deferred:
32 model = model._meta.proxy_for_model
AttributeError: 'NoneType' object has no attribute '_meta'
In version 1.1, module utils.py
, function get_roles
, I had to change the construction of the queries, in order to make get_roles
itself and has_permission
work. Here is my code:
groups_ids = [g.id for g in groups]
groups_ids_str = ", ".join([str(id) for id in groups_ids]) # to be used for caching ?
if groups_ids:
query = Q(user_id=user.id) | Q(group_id__in=groups_ids)
prrs = PrincipalRoleRelation.objects.filter(
query, content_id=None
).values("role_id")
(around line 217; made similar change around line 231; I imagine that the variable groups_ids_str
should be used for caching, but don't know how.)
It seems that the current version, in Github, needs the same fix.
By, Giovanni
hello,
Thanks for providing migration with django-persmissions-.1.2. With an existing database created with django-permissions 1.0, it fails, complaining about existing table :
manage.py migrate permissions
[...]
django.db.utils.OperationalError: table "permissions_objectpermission" already exists
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.