root/dbf/serializer.py

Revision 0:7e9e34581fe2, 2.0 KB (checked in by tyrion-mx, 4 years ago)

initial files

Line 
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"""
12import datetime
13import decimal
14import warnings
15
16from django.core.serializers import base
17from django.utils.encoding import smart_unicode
18
19from dbf import fields, models
20
21
22class 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)
Note: See TracBrowser for help on using the browser.