Code

Ticket #11154: osso.core.management.__init__.py

File osso.core.management.__init__.py, 2.2 KB (added by wdoekes, 4 years ago)

Workaround for issue 11154

Line 
1# vim: set ts=8 sw=4 sts=4 et ai:
2from django.conf import settings
3from django.contrib.auth.management import create_permissions, _get_all_permissions
4from django.db.models import get_models
5from django.db.models.signals import post_syncdb
6from django.utils.encoding import smart_unicode
7
8
9def 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
43try:
44    settings.CONTENTTYPE_NO_TRAVERSE_PROXY
45except AttributeError:
46    pass
47else:
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')