PageRenderTime 40ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/django/contrib/contenttypes/management.py

https://code.google.com/p/mango-py/
Python | 60 lines | 53 code | 1 blank | 6 comment | 8 complexity | f87ecd808c4d1678961f485f0e0cd04c MD5 | raw file
Possible License(s): BSD-3-Clause
  1. from django.contrib.contenttypes.models import ContentType
  2. from django.db.models import get_apps, get_models, signals
  3. from django.utils.encoding import smart_unicode
  4. def update_contenttypes(app, created_models, verbosity=2, **kwargs):
  5. """
  6. Creates content types for models in the given app, removing any model
  7. entries that no longer have a matching model class.
  8. """
  9. ContentType.objects.clear_cache()
  10. content_types = list(ContentType.objects.filter(app_label=app.__name__.split('.')[-2]))
  11. app_models = get_models(app)
  12. if not app_models:
  13. return
  14. for klass in app_models:
  15. opts = klass._meta
  16. try:
  17. ct = ContentType.objects.get(app_label=opts.app_label,
  18. model=opts.object_name.lower())
  19. content_types.remove(ct)
  20. except ContentType.DoesNotExist:
  21. ct = ContentType(name=smart_unicode(opts.verbose_name_raw),
  22. app_label=opts.app_label, model=opts.object_name.lower())
  23. ct.save()
  24. if verbosity >= 2:
  25. print "Adding content type '%s | %s'" % (ct.app_label, ct.model)
  26. # The presence of any remaining content types means the supplied app has an
  27. # undefined model. Confirm that the content type is stale before deletion.
  28. if content_types:
  29. if kwargs.get('interactive', False):
  30. content_type_display = '\n'.join([' %s | %s' % (ct.app_label, ct.model) for ct in content_types])
  31. ok_to_delete = raw_input("""The following content types are stale and need to be deleted:
  32. %s
  33. Any objects related to these content types by a foreign key will also
  34. be deleted. Are you sure you want to delete these content types?
  35. If you're unsure, answer 'no'.
  36. Type 'yes' to continue, or 'no' to cancel: """ % content_type_display)
  37. else:
  38. ok_to_delete = False
  39. if ok_to_delete == 'yes':
  40. for ct in content_types:
  41. if verbosity >= 2:
  42. print "Deleting stale content type '%s | %s'" % (ct.app_label, ct.model)
  43. ct.delete()
  44. else:
  45. if verbosity >= 2:
  46. print "Stale content types remain."
  47. def update_all_contenttypes(verbosity=2, **kwargs):
  48. for app in get_apps():
  49. update_contenttypes(app, None, verbosity, **kwargs)
  50. signals.post_syncdb.connect(update_contenttypes)
  51. if __name__ == "__main__":
  52. update_all_contenttypes()