Django

Code

Changeset 6287

Show
Ignore:
Timestamp:
09/15/07 10:06:32 (1 year ago)
Author:
mtredinnick
Message:

Fixed #5177 -- Changed content type creation to also remove the types for any orphaned entries (so it's now an "update" feature). Thanks, Rob Hudson.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/AUTHORS

    r6275 r6287  
    150150    Richard House <Richard.House@i-logue.com> 
    151151    Robert Rock Howard <http://djangomojo.com/> 
     152    Rob Hudson <http://rob.cogit8.org/> 
    152153    Jason Huggins <http://www.jrandolph.com/blog/> 
    153154    Hyun Mi Ae 
  • django/trunk/django/contrib/contenttypes/management.py

    r5609 r6287  
    1 """ 
    2 Creates content types for all installed models. 
    3 """ 
    4  
     1from django.contrib.contenttypes.models import ContentType 
    52from django.dispatch import dispatcher 
    63from django.db.models import get_apps, get_models, signals 
    74from django.utils.encoding import smart_unicode 
    85 
    9 def create_contenttypes(app, created_models, verbosity=2): 
    10     from django.contrib.contenttypes.models import ContentType 
     6def 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    """ 
    1111    ContentType.objects.clear_cache() 
     12    content_types = list(ContentType.objects.filter(app_label=app.__name__.split('.')[-2])) 
    1213    app_models = get_models(app) 
    1314    if not app_models: 
     
    1617        opts = klass._meta 
    1718        try: 
    18             ContentType.objects.get(app_label=opts.app_label, 
    19                 model=opts.object_name.lower()) 
     19            ct = ContentType.objects.get(app_label=opts.app_label, 
     20                                         model=opts.object_name.lower()) 
     21            content_types.remove(ct) 
    2022        except ContentType.DoesNotExist: 
    2123            ct = ContentType(name=smart_unicode(opts.verbose_name_raw), 
     
    2426            if verbosity >= 2: 
    2527                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() 
    2635 
    27 def create_all_contenttypes(verbosity=2): 
     36def update_all_contenttypes(verbosity=2): 
    2837    for app in get_apps(): 
    29         create_contenttypes(app, None, verbosity) 
     38        update_contenttypes(app, None, verbosity) 
    3039 
    31 dispatcher.connect(create_contenttypes, signal=signals.post_syncdb) 
     40dispatcher.connect(update_contenttypes, signal=signals.post_syncdb) 
    3241 
    3342if __name__ == "__main__": 
    34     create_all_contenttypes() 
     43    update_all_contenttypes() 
  • django/trunk/django/contrib/contenttypes/models.py

    r5803 r6287  
    2626        Clear out the content-type cache. This needs to happen during database 
    2727        flushes to prevent caching of "stale" content type IDs (see 
    28         django.contrib.contenttypes.management.create_contenttypes for where 
     28        django.contrib.contenttypes.management.update_contenttypes for where 
    2929        this gets called). 
    3030        """