1 | import datetime |
---|
2 | from .._compat import PY2, basestring, to_bytes |
---|
3 | from ..adapters.mongo import Mongo, MongoBlob |
---|
4 | from ..helpers.classes import Reference |
---|
5 | from ..objects import Row |
---|
6 | from .base import NoSQLRepresenter |
---|
7 | from . import representers, for_type |
---|
8 | |
---|
9 | |
---|
10 | @representers.register_for(Mongo) |
---|
11 | class MongoRepresenter(NoSQLRepresenter): |
---|
12 | @for_type("id") |
---|
13 | def _id(self, value): |
---|
14 | return self.adapter.object_id(value) |
---|
15 | |
---|
16 | @for_type("reference") |
---|
17 | def _reference(self, value): |
---|
18 | if isinstance(value, (Row, Reference)): |
---|
19 | value = value["id"] |
---|
20 | return self.adapter.object_id(value) |
---|
21 | |
---|
22 | @for_type("date") |
---|
23 | def _date(self, value): |
---|
24 | # this piece of data can be stripped off based on the fieldtype |
---|
25 | t = datetime.time(0, 0, 0) |
---|
26 | # mongodb doesn't have a date object and so it must datetime, |
---|
27 | # string or integer |
---|
28 | return datetime.datetime.combine(value, t) |
---|
29 | |
---|
30 | @for_type("time") |
---|
31 | def _time(self, value): |
---|
32 | # this piece of data can be stripped off based on the fieldtype |
---|
33 | d = datetime.date(2000, 1, 1) |
---|
34 | # mongodb doesn't have a time object and so it must datetime, |
---|
35 | # string or integer |
---|
36 | return datetime.datetime.combine(d, value) |
---|
37 | |
---|
38 | @for_type("datetime") |
---|
39 | def _datetime(self, value): |
---|
40 | return value |
---|
41 | |
---|
42 | @for_type("blob") |
---|
43 | def _blob(self, value): |
---|
44 | if isinstance(value, basestring) and value == "": |
---|
45 | value = None |
---|
46 | return MongoBlob(value) if PY2 else to_bytes(value) |
---|
47 | |
---|
48 | @for_type("list:reference") |
---|
49 | def _list_reference(self, value): |
---|
50 | if not isinstance(value, list): |
---|
51 | return self.adapter.object_id(value) |
---|
52 | values = self._represent_list(value) |
---|
53 | return list(map(self.adapter.object_id, values)) |
---|