| 1 | """ |
|---|
| 2 | >>> from dbf import serializer |
|---|
| 3 | >>> from mydjangoapp import models |
|---|
| 4 | |
|---|
| 5 | >>> s = serializer.Serializer() |
|---|
| 6 | >>> queryset = models.MyModel.objects.all() |
|---|
| 7 | >>> s.serialize(queryset) |
|---|
| 8 | |
|---|
| 9 | >>> for record in s.Model.objects.all(): |
|---|
| 10 | ... print record |
|---|
| 11 | """ |
|---|
| 12 | import datetime |
|---|
| 13 | import decimal |
|---|
| 14 | import warnings |
|---|
| 15 | |
|---|
| 16 | from django.core.serializers import base |
|---|
| 17 | from django.utils.encoding import smart_unicode |
|---|
| 18 | |
|---|
| 19 | from dbf import fields, models |
|---|
| 20 | |
|---|
| 21 | |
|---|
| 22 | class Serializer(base.Serializer): |
|---|
| 23 | |
|---|
| 24 | internal_use_only = False |
|---|
| 25 | |
|---|
| 26 | def start_serialization(self): |
|---|
| 27 | self._current = None |
|---|
| 28 | self.Model = None |
|---|
| 29 | self.objects = [] |
|---|
| 30 | |
|---|
| 31 | def end_serialization(self): |
|---|
| 32 | pass |
|---|
| 33 | |
|---|
| 34 | def start_object(self, obj): |
|---|
| 35 | if self.Model is None: |
|---|
| 36 | fieldspecs = {} |
|---|
| 37 | for field in obj._meta.fields: |
|---|
| 38 | name = field.name |
|---|
| 39 | size = field.max_length or 10 |
|---|
| 40 | type = field.get_internal_type() |
|---|
| 41 | try: |
|---|
| 42 | field = getattr(fields, type)(size=size) |
|---|
| 43 | fieldspecs[name] = field |
|---|
| 44 | except AttributeError: |
|---|
| 45 | warnings.warn("cannot encode %r field (%s)" % (name, type)) |
|---|
| 46 | name = obj.__class__.__name__ |
|---|
| 47 | dbname = smart_unicode(obj._meta) + '.dbf' |
|---|
| 48 | self.Model = models.makeModel(name, dbname=dbname, |
|---|
| 49 | stream=self.stream, fields=fieldspecs) |
|---|
| 50 | elif smart_unicode(obj._meta) != self.Model._meta.dbname[:-4]: |
|---|
| 51 | raise base.SerializationError('different models') |
|---|
| 52 | self._current = {} |
|---|
| 53 | |
|---|
| 54 | def end_object(self, obj): |
|---|
| 55 | self._current[obj._meta.pk.attname] = obj._get_pk_val() |
|---|
| 56 | print self._current |
|---|
| 57 | self.Model._meta.dbf.insert(self._current) |
|---|
| 58 | self._current = None |
|---|
| 59 | |
|---|
| 60 | def handle_field(self, obj, field): |
|---|
| 61 | self._current[field.name] = getattr(obj, field.name) |
|---|
| 62 | |
|---|
| 63 | def handle_fk_field(self, obj, field): |
|---|
| 64 | warnings.warn('cannot encode fk field: %s' % field.name) |
|---|
| 65 | |
|---|
| 66 | def handle_m2m_field(self, obj, field): |
|---|
| 67 | warnings.warn('cannot encode m2m field: %s' % field.name) |
|---|