Ticket #5423: 5423.5.diff

File 5423.5.diff, 5.4 KB (added by Luke Plant, 12 years ago)

Updated for trunk

  • django/core/management/commands/dumpdata.py

    diff -r d834ef768f04 django/core/management/commands/dumpdata.py
    a b  
    44from django.db import router, DEFAULT_DB_ALIAS
    55from django.utils.datastructures import SortedDict
    66
     7import sys
    78from optparse import make_option
    89
    910class Command(BaseCommand):
     
    9798        except KeyError:
    9899            raise CommandError("Unknown serialization format: %s" % format)
    99100
    100         # Now collate the objects to be serialized.
    101         objects = []
    102         for model in sort_dependencies(app_list.items()):
    103             if model in excluded_models:
    104                 continue
    105             if not model._meta.proxy and router.allow_syncdb(using, model):
    106                 if use_base_manager:
    107                     objects.extend(model._base_manager.using(using).all())
    108                 else:
    109                     objects.extend(model._default_manager.using(using).all())
     101        def get_objects():
     102            # Collate the objects to be serialized.
     103            for model in sort_dependencies(app_list.items()):
     104                if model in excluded_models:
     105                    continue
     106                if not model._meta.proxy and router.allow_syncdb(using, model):
     107                    if use_base_manager:
     108                        objects = model._base_manager
     109                    else:
     110                        objects = model._default_manager
     111                    for obj in objects.using(using).\
     112                            order_by(model._meta.pk.name).iterator():
     113                        yield obj
    110114
    111115        try:
    112             return serializers.serialize(format, objects, indent=indent,
    113                         use_natural_keys=use_natural_keys)
     116            serializers.serialize(format, get_objects(), indent=indent,
     117                    use_natural_keys=use_natural_keys, stream=sys.stdout)
    114118        except Exception, e:
    115119            if show_traceback:
    116120                raise
  • django/core/serializers/base.py

    diff -r d834ef768f04 django/core/serializers/base.py
    a b  
    3939        self.use_natural_keys = options.pop("use_natural_keys", False)
    4040
    4141        self.start_serialization()
     42        self.first = True
    4243        for obj in queryset:
    4344            self.start_object(obj)
    4445            for field in obj._meta.local_fields:
     
    5455                    if self.selected_fields is None or field.attname in self.selected_fields:
    5556                        self.handle_m2m_field(obj, field)
    5657            self.end_object(obj)
     58            if self.first:
     59                self.first = False
    5760        self.end_serialization()
    5861        return self.getvalue()
    5962
  • django/core/serializers/json.py

    diff -r d834ef768f04 django/core/serializers/json.py
    a b  
    1717    """
    1818    internal_use_only = False
    1919
    20     def end_serialization(self):
     20    def start_serialization(self):
    2121        if simplejson.__version__.split('.') >= ['2', '1', '3']:
    2222            # Use JS strings to represent Python Decimal instances (ticket #16850)
    2323            self.options.update({'use_decimal': False})
    24         simplejson.dump(self.objects, self.stream, cls=DjangoJSONEncoder, **self.options)
     24        self._current = None
     25        self.json_kwargs = self.options.copy()
     26        self.json_kwargs.pop('stream', None)
     27        self.json_kwargs.pop('fields', None)
     28        self.stream.write("[")
     29
     30    def end_serialization(self):
     31        if self.options.get("indent"):
     32            self.stream.write("\n")
     33        self.stream.write("]")
     34        if self.options.get("indent"):
     35            self.stream.write("\n")
     36
     37    def end_object(self, obj):
     38        # self._current has the field data
     39        indent = self.options.get("indent")
     40        if not self.first:
     41            self.stream.write(",")
     42            if not indent:
     43                self.stream.write(" ")
     44        if indent:
     45            self.stream.write("\n")
     46        simplejson.dump(self.get_dump_object(obj), self.stream,
     47                        cls=DjangoJSONEncoder, **self.json_kwargs)
     48        self._current = None
    2549
    2650    def getvalue(self):
     51        # overwrite PythonSerializer.getvalue() with base Serializer.getvalue()
    2752        if callable(getattr(self.stream, 'getvalue', None)):
    2853            return self.stream.getvalue()
    2954
  • django/core/serializers/python.py

    diff -r d834ef768f04 django/core/serializers/python.py
    a b  
    2727        self._current = {}
    2828
    2929    def end_object(self, obj):
    30         self.objects.append({
    31             "model"  : smart_unicode(obj._meta),
    32             "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
    33             "fields" : self._current
    34         })
     30        self.objects.append(self.get_dump_object(obj))
    3531        self._current = None
    3632
     33    def get_dump_object(self, obj):
     34        return {
     35            "pk": smart_unicode(obj._get_pk_val(), strings_only=True),
     36            "model": smart_unicode(obj._meta),
     37            "fields": self._current
     38        }
     39
    3740    def handle_field(self, obj, field):
    3841        value = field._get_val_from_obj(obj)
    3942        # Protected types (i.e., primitives like None, numbers, dates,
Back to Top