Permalink
Browse files

polymorphic_dumpdata management command functionality removed;

the regular Django dumpdata command now automatically works correctly
for polymorphic models and all Django versions
(this is handled by PolymorphicModelBase now).
Testing for dumpdata has been added.
  • Loading branch information...
1 parent f05b854 commit a87481b8b54abced91ddeb5ea24a76e0bb25cc24 @bconstantin bconstantin committed Oct 18, 2010
View
@@ -16,6 +16,7 @@ pushreg
pbackup
mcmd.py
dbconfig_local.py
+diffmanagement
pip-log.txt
build
@@ -0,0 +1,40 @@
+[
+ {
+ "pk": 1,
+ "model": "pexp.project",
+ "fields": {
+ "topic": "John's gathering",
+ "polymorphic_ctype": 2
+ }
+ },
+ {
+ "pk": 2,
+ "model": "pexp.project",
+ "fields": {
+ "topic": "Sculpting with Tim",
+ "polymorphic_ctype": 3
+ }
+ },
+ {
+ "pk": 3,
+ "model": "pexp.project",
+ "fields": {
+ "topic": "Swallow Aerodynamics",
+ "polymorphic_ctype": 4
+ }
+ },
+ {
+ "pk": 2,
+ "model": "pexp.artproject",
+ "fields": {
+ "artist": "T. Turner"
+ }
+ },
+ {
+ "pk": 3,
+ "model": "pexp.researchproject",
+ "fields": {
+ "supervisor": "Dr. Winter"
+ }
+ }
+]
@@ -20,7 +20,7 @@ class Command(NoArgsCommand):
help = ""
def handle_noargs(self, **options):
- print 'polycmd - sqlite test db is stored in:',settings.DATABASE_NAME
+ print 'polycmd - sqlite test db is stored in:',settings.SQLITE_DB_PATH
print
"""
@@ -20,7 +20,7 @@ class Command(NoArgsCommand):
help = ""
def handle_noargs(self, **options):
- #print 'polycmd - sqlite test db is stored in:',settings.SQLITE_DB_PATH
+ print 'polycmd - sqlite test db is stored in:',settings.SQLITE_DB_PATH
print
Project.objects.all().delete()
View
@@ -3,6 +3,9 @@
Please see README.rst or DOCS.rst or http://bserve.webhop.org/wiki/django_polymorphic
"""
+import sys
+import inspect
+
from django.db import models
from django.db.models.base import ModelBase
@@ -75,7 +78,7 @@ def __new__(self, model_name, bases, attrs):
def get_inherited_managers(self, attrs):
"""
Return list of all managers to be inherited/propagated from the base classes;
- use correct mro, only use managers with _inherited==False,
+ use correct mro, only use managers with _inherited==False (they are of no use),
skip managers that are overwritten by the user with same-named class attributes (in attrs)
"""
add_managers = []; add_managers_keys = set()
@@ -150,3 +153,26 @@ def validate_model_manager(self, manager, model_name, manager_name):
raise AssertionError(e)
return manager
+ # hack: a small patch to Django would be a better solution.
+ # Django's management command 'dumpdata' relies on non-polymorphic
+ # behaviour of the _default_manager. Therefore, we catch any access to _default_manager
+ # here and return the non-polymorphic default manager instead if we are called from 'dumpdata.py'
+ # (non-polymorphic default manager is 'base_objects' for polymorphic models).
+ # This way we don't need to patch django.core.management.commands.dumpdata
+ # for all supported Django versions.
+ # TODO: investigate Django how this can be avoided
+ _dumpdata_command_running = False
+ if len(sys.argv)>1: _dumpdata_command_running = ( sys.argv[1] == 'dumpdata' )
+ def __getattribute__(self, name):
+ if name=='_default_manager':
+ if self._dumpdata_command_running:
+ frm = inspect.stack()[1] # frm[1] is caller file name, frm[3] is caller function name
+ if 'django/core/management/commands/dumpdata.py' in frm[1]:
+ return self.base_objects
+ #caller_mod_name = inspect.getmodule(frm[0]).__name__ # does not work with python 2.4
+ #if caller_mod_name == 'django.core.management.commands.dumpdata':
+
+ return super(PolymorphicModelBase, self).__getattribute__(name)
+
+
+
@@ -1,19 +1,9 @@
"""
-polymorphic_dumpdata is just a slightly modified version
-of Django's dumpdata. In the long term, patching Django's
-dumpdata definitely is a better solution.
-
-Use the Django 1.1 or 1.2 variant of dumpdata, depending of the
-Django version used.
+polymorphic_dumpdata has been disabled since it's no longer needed
+(this is now handled by polymorphic.base.PolymorphicModelBase).
"""
-import django
-
-if django.VERSION[:2]==(1,1):
- from polymorphic_dumpdata_11 import Command
-
-elif django.VERSION[:2]==(1,2):
- from polymorphic_dumpdata_12 import Command
-
-else:
- assert False, 'Django version not supported'
+assert False, """
+ERROR: The management command polymorphic_dumpdata is no longer supported or needed.
+ Please use the standard Django dumpdata management command instead!
+"""
@@ -1,94 +0,0 @@
-
-from django.core.exceptions import ImproperlyConfigured
-from django.core.management.base import BaseCommand, CommandError
-from django.core import serializers
-from django.utils.datastructures import SortedDict
-
-from optparse import make_option
-
-class Command(BaseCommand):
- option_list = BaseCommand.option_list + (
- make_option('--format', default='json', dest='format',
- help='Specifies the output serialization format for fixtures.'),
- make_option('--indent', default=None, dest='indent', type='int',
- help='Specifies the indent level to use when pretty-printing output'),
- make_option('-e', '--exclude', dest='exclude',action='append', default=[],
- help='App to exclude (use multiple --exclude to exclude multiple apps).'),
- )
- help = 'Output the contents of the database as a fixture of the given format.'
- args = '[appname ...]'
-
- def handle(self, *app_labels, **options):
- from django.db.models import get_app, get_apps, get_models, get_model
-
- format = options.get('format','json')
- indent = options.get('indent',None)
- exclude = options.get('exclude',[])
- show_traceback = options.get('traceback', False)
-
- excluded_apps = [get_app(app_label) for app_label in exclude]
-
- if len(app_labels) == 0:
- app_list = SortedDict([(app, None) for app in get_apps() if app not in excluded_apps])
- else:
- app_list = SortedDict()
- for label in app_labels:
- try:
- app_label, model_label = label.split('.')
- try:
- app = get_app(app_label)
- except ImproperlyConfigured:
- raise CommandError("Unknown application: %s" % app_label)
-
- model = get_model(app_label, model_label)
- if model is None:
- raise CommandError("Unknown model: %s.%s" % (app_label, model_label))
-
- if app in app_list.keys():
- if app_list[app] and model not in app_list[app]:
- app_list[app].append(model)
- else:
- app_list[app] = [model]
- except ValueError:
- # This is just an app - no model qualifier
- app_label = label
- try:
- app = get_app(app_label)
- except ImproperlyConfigured:
- raise CommandError("Unknown application: %s" % app_label)
- app_list[app] = None
-
- # Check that the serialization format exists; this is a shortcut to
- # avoid collating all the objects and _then_ failing.
- if format not in serializers.get_public_serializer_formats():
- raise CommandError("Unknown serialization format: %s" % format)
-
- try:
- serializers.get_serializer(format)
- except KeyError:
- raise CommandError("Unknown serialization format: %s" % format)
-
- objects = []
- for app, model_list in app_list.items():
- if model_list is None:
- model_list = get_models(app)
-
- for model in model_list:
- if not model._meta.proxy:
-
-#### patch for django_polymorphic ######################################################
- # modified for django_polymorphic compatibility:
- # do not use polymorphic queryset for serialisation
- # (as the dumpdata/serializer implementation depends
- # on non-polymorphic behavious)
- base_manager=model._default_manager
- if getattr(model,'polymorphic_model_marker',None) != None:
- base_manager=getattr(model,'base_objects',None)
- objects.extend(base_manager.all())
-
- try:
- return serializers.serialize(format, objects, indent=indent)
- except Exception, e:
- if show_traceback:
- raise
- raise CommandError("Unable to serialize database: %s" % e)
Oops, something went wrong.

0 comments on commit a87481b

Please sign in to comment.