from datetime import datetime from .._compat import PY2, integer_types from ..adapters.mongo import Mongo, MongoBlob from ..helpers.classes import Reference from . import Parser, parsers, for_type, before_parse long = integer_types[-1] @parsers.register_for(Mongo) class MongoParser(Parser): @for_type('id') def _id(self, value): if isinstance(value, self.adapter.ObjectId): return long(str(value), 16) return long(value) @for_type('blob') def _blob(self, value): return MongoBlob.decode(value) if PY2 else value @before_parse('reference') def reference_extras(self, field_type): return {'referee': field_type[10:].strip()} @for_type('reference') def _reference(self, value, referee): if isinstance(value, self.adapter.ObjectId): value = long(str(value), 16) if '.' not in referee: value = Reference(value) value._table, value._record = self.adapter.db[referee], None return value @before_parse('list:reference') def referencelist_extras(self, field_type): return {'field_type': field_type} @for_type('list:reference') def _list_references(self, value, field_type): return [self.registered['reference']( el, field_type[5:]) for el in value] @for_type('date') def _date(self, value): if isinstance(value, datetime): return value.date() return value @for_type('time') def _time(self, value): if isinstance(value, datetime): return value.time() return value