11# -*- coding: utf-8 -*-
22from __future__ import absolute_import
3+ import inspect
34
45from flask import abort , current_app
56
1314from .sessions import *
1415from .pagination import *
1516from .json import overide_json_encoder
17+ from .wtf import WtfBaseField
18+
19+
20+ def _patch_base_field (object , name ):
21+ """
22+ If the object submitted has a class whose base class is
23+ mongoengine.base.fields.BaseField, then monkey patch to
24+ replace it with flask_mongoengine.wtf.WtfBaseField.
25+
26+ @note: WtfBaseField is an instance of BaseField - but
27+ gives us the flexibility to extend field parameters
28+ and settings required of WTForm via model form generator.
29+
30+ @see: flask_mongoengine.wtf.base.WtfBaseField.
31+ @see: model_form in flask_mongoengine.wtf.orm
32+
33+ @param object: The object whose footprint to locate the class.
34+ @param name: Name of the class to locate.
35+
36+ """
37+ # locate class
38+ cls = getattr (object , name )
39+ if not inspect .isclass (cls ):
40+ return
41+
42+ # fetch class base classes
43+ cls_bases = list (cls .__bases__ )
44+
45+ # replace BaseField with WtfBaseField
46+ for index , base in enumerate (cls_bases ):
47+ if base == mongoengine .base .fields .BaseField :
48+ cls_bases [index ] = WtfBaseField
49+ cls .__bases__ = tuple (cls_bases )
50+ break
51+
52+ # re-assign class back to
53+ # object footprint
54+ delattr (object , name )
55+ setattr (object , name , cls )
1656
1757
1858def _include_mongoengine (obj ):
@@ -21,6 +61,9 @@ def _include_mongoengine(obj):
2161 if not hasattr (obj , key ):
2262 setattr (obj , key , getattr (module , key ))
2363
64+ # patch BaseField if available
65+ _patch_base_field (obj , key )
66+
2467
2568def _create_connection (conn_settings ):
2669
@@ -44,10 +87,10 @@ def _create_connection(conn_settings):
4487 return mongoengine .connect (conn .pop ('db' , 'test' ), ** conn )
4588
4689
90+
4791class MongoEngine (object ):
4892
4993 def __init__ (self , app = None , config = None ):
50-
5194 _include_mongoengine (self )
5295
5396 self .Document = Document
0 commit comments