app/django/contrib/contenttypes/management.py
changeset 54 03e267d67478
child 323 ff1a9aa48cfd
equal deleted inserted replaced
53:57b4279d8c4e 54:03e267d67478
       
     1 from django.contrib.contenttypes.models import ContentType
       
     2 from django.dispatch import dispatcher
       
     3 from django.db.models import get_apps, get_models, signals
       
     4 from django.utils.encoding import smart_unicode
       
     5 
       
     6 def update_contenttypes(app, created_models, verbosity=2):
       
     7     """
       
     8     Creates content types for models in the given app, removing any model
       
     9     entries that no longer have a matching model class.
       
    10     """
       
    11     ContentType.objects.clear_cache()
       
    12     content_types = list(ContentType.objects.filter(app_label=app.__name__.split('.')[-2]))
       
    13     app_models = get_models(app)
       
    14     if not app_models:
       
    15         return
       
    16     for klass in app_models:
       
    17         opts = klass._meta
       
    18         try:
       
    19             ct = ContentType.objects.get(app_label=opts.app_label,
       
    20                                          model=opts.object_name.lower())
       
    21             content_types.remove(ct)
       
    22         except ContentType.DoesNotExist:
       
    23             ct = ContentType(name=smart_unicode(opts.verbose_name_raw),
       
    24                 app_label=opts.app_label, model=opts.object_name.lower())
       
    25             ct.save()
       
    26             if verbosity >= 2:
       
    27                 print "Adding content type '%s | %s'" % (ct.app_label, ct.model)
       
    28     # The presence of any remaining content types means the supplied app has an
       
    29     # undefined model and can safely be removed, which cascades to also remove
       
    30     # related permissions.
       
    31     for ct in content_types:
       
    32         if verbosity >= 2:
       
    33             print "Deleting stale content type '%s | %s'" % (ct.app_label, ct.model)
       
    34         ct.delete()
       
    35 
       
    36 def update_all_contenttypes(verbosity=2):
       
    37     for app in get_apps():
       
    38         update_contenttypes(app, None, verbosity)
       
    39 
       
    40 dispatcher.connect(update_contenttypes, signal=signals.post_syncdb)
       
    41 
       
    42 if __name__ == "__main__":
       
    43     update_all_contenttypes()