1 | # vim: set ts=8 sw=4 sts=4 et ai: |
---|
2 | from django.conf import settings |
---|
3 | from django.contrib.auth.management import create_permissions, _get_all_permissions |
---|
4 | from django.db.models import get_models |
---|
5 | from django.db.models.signals import post_syncdb |
---|
6 | from django.utils.encoding import smart_unicode |
---|
7 | |
---|
8 | |
---|
9 | def create_permissions_respecting_proxy(app, created_models, verbosity, **kwargs): |
---|
10 | ''' |
---|
11 | An alternative to create_permissions found in django.contrib.auth. |
---|
12 | This one doesn't use the ContentType.objects.get_for_model which |
---|
13 | resolves the klass to the base model. Instead it returns the |
---|
14 | content type for the proxy model. |
---|
15 | ''' |
---|
16 | from django.contrib.contenttypes.models import ContentType |
---|
17 | from django.contrib.auth.models import Permission |
---|
18 | app_models = get_models(app) |
---|
19 | if not app_models: |
---|
20 | return |
---|
21 | for klass in app_models: |
---|
22 | # The difference is here: |
---|
23 | #ctype = ContentType.objects.get_for_model(klass) |
---|
24 | opts = klass._meta |
---|
25 | ctype, created = ContentType.objects.get_or_create( |
---|
26 | app_label = opts.app_label, |
---|
27 | model = opts.object_name.lower(), |
---|
28 | defaults = {'name': smart_unicode(opts.verbose_name_raw)}, |
---|
29 | ) |
---|
30 | # (end of difference) |
---|
31 | for codename, name in _get_all_permissions(klass._meta): |
---|
32 | p, created = Permission.objects.get_or_create(codename=codename, content_type__pk=ctype.id, |
---|
33 | defaults={'name': name, 'content_type': ctype}) |
---|
34 | if created and verbosity >= 2: |
---|
35 | print "Adding permission '%s'" % p |
---|
36 | |
---|
37 | |
---|
38 | # Replace the original handling with our modified one if |
---|
39 | # CONTENTTYPE_NO_TRAVERSE_PROXY is set. |
---|
40 | # This is needed if you want to use proper permissions for proxy models |
---|
41 | # that are tied to the proxy application. |
---|
42 | # See also: http://code.djangoproject.com/ticket/11154 |
---|
43 | try: |
---|
44 | settings.CONTENTTYPE_NO_TRAVERSE_PROXY |
---|
45 | except AttributeError: |
---|
46 | pass |
---|
47 | else: |
---|
48 | print 'bier' |
---|
49 | if settings.CONTENTTYPE_NO_TRAVERSE_PROXY: |
---|
50 | post_syncdb.disconnect(create_permissions, \ |
---|
51 | dispatch_uid='django.contrib.auth.management.create_permissions') |
---|
52 | post_syncdb.connect(create_permissions_respecting_proxy, \ |
---|
53 | dispatch_uid='django.contrib.auth.management.create_permissions') |
---|