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