1 | from datetime import datetime |
---|
2 | from .._compat import PY2, integer_types |
---|
3 | from ..adapters.mongo import Mongo, MongoBlob |
---|
4 | from ..helpers.classes import Reference |
---|
5 | from . import Parser, parsers, for_type, before_parse |
---|
6 | |
---|
7 | long = integer_types[-1] |
---|
8 | |
---|
9 | |
---|
10 | @parsers.register_for(Mongo) |
---|
11 | class MongoParser(Parser): |
---|
12 | @for_type("id") |
---|
13 | def _id(self, value): |
---|
14 | if isinstance(value, self.adapter.ObjectId): |
---|
15 | return long(str(value), 16) |
---|
16 | return long(value) |
---|
17 | |
---|
18 | @for_type("blob") |
---|
19 | def _blob(self, value): |
---|
20 | return MongoBlob.decode(value) if PY2 else value |
---|
21 | |
---|
22 | @before_parse("reference") |
---|
23 | def reference_extras(self, field_type): |
---|
24 | return {"referee": field_type[10:].strip()} |
---|
25 | |
---|
26 | @for_type("reference") |
---|
27 | def _reference(self, value, referee): |
---|
28 | if isinstance(value, self.adapter.ObjectId): |
---|
29 | value = long(str(value), 16) |
---|
30 | if "." not in referee: |
---|
31 | value = Reference(value) |
---|
32 | value._table, value._record = self.adapter.db[referee], None |
---|
33 | return value |
---|
34 | |
---|
35 | @before_parse("list:reference") |
---|
36 | def referencelist_extras(self, field_type): |
---|
37 | return {"field_type": field_type} |
---|
38 | |
---|
39 | @for_type("list:reference") |
---|
40 | def _list_references(self, value, field_type): |
---|
41 | return [self.registered["reference"](el, field_type[5:]) for el in value] |
---|
42 | |
---|
43 | @for_type("date") |
---|
44 | def _date(self, value): |
---|
45 | if isinstance(value, datetime): |
---|
46 | return value.date() |
---|
47 | return value |
---|
48 | |
---|
49 | @for_type("time") |
---|
50 | def _time(self, value): |
---|
51 | if isinstance(value, datetime): |
---|
52 | return value.time() |
---|
53 | return value |
---|