-
Notifications
You must be signed in to change notification settings - Fork 255
/
Copy path__init__.py
147 lines (124 loc) · 5.53 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import warnings
import mongoengine
from flask import Flask, current_app
from flask_mongoengine import db_fields, documents
from flask_mongoengine.connection import *
from flask_mongoengine.json import override_json_encoder
from flask_mongoengine.pagination import *
from flask_mongoengine.sessions import *
def current_mongoengine_instance():
"""Return a MongoEngine instance associated with current Flask app."""
me = current_app.extensions.get("mongoengine", {})
for k, v in me.items():
if isinstance(k, MongoEngine):
return k
class MongoEngine:
"""Main class used for initialization of Flask-MongoEngine."""
def __init__(self, app=None, config=None):
if config is not None:
warnings.warn(
(
"Passing flat configuration is deprecated. Please check "
"http://docs.mongoengine.org/projects/flask-mongoengine/flask_config.html "
"for more info."
),
DeprecationWarning,
stacklevel=2,
)
# Extended database fields
self.BinaryField = db_fields.BinaryField
self.BooleanField = db_fields.BooleanField
self.CachedReferenceField = db_fields.CachedReferenceField
self.ComplexDateTimeField = db_fields.ComplexDateTimeField
self.DateField = db_fields.DateField
self.DateTimeField = db_fields.DateTimeField
self.DecimalField = db_fields.DecimalField
self.DictField = db_fields.DictField
self.DynamicField = db_fields.DynamicField
self.EmailField = db_fields.EmailField
self.EmbeddedDocumentField = db_fields.EmbeddedDocumentField
self.EmbeddedDocumentListField = db_fields.EmbeddedDocumentListField
self.EnumField = db_fields.EnumField
self.FileField = db_fields.FileField
self.FloatField = db_fields.FloatField
self.GenericEmbeddedDocumentField = db_fields.GenericEmbeddedDocumentField
self.GenericLazyReferenceField = db_fields.GenericLazyReferenceField
self.GenericReferenceField = db_fields.GenericReferenceField
self.GeoJsonBaseField = db_fields.GeoJsonBaseField
self.GeoPointField = db_fields.GeoPointField
self.ImageField = db_fields.ImageField
self.IntField = db_fields.IntField
self.LazyReferenceField = db_fields.LazyReferenceField
self.LineStringField = db_fields.LineStringField
self.ListField = db_fields.ListField
self.LongField = db_fields.LongField
self.MapField = db_fields.MapField
self.MultiLineStringField = db_fields.MultiLineStringField
self.MultiPointField = db_fields.MultiPointField
self.MultiPolygonField = db_fields.MultiPolygonField
self.ObjectIdField = db_fields.ObjectIdField
self.PointField = db_fields.PointField
self.PolygonField = db_fields.PolygonField
self.ReferenceField = db_fields.ReferenceField
self.SequenceField = db_fields.SequenceField
self.SortedListField = db_fields.SortedListField
self.StringField = db_fields.StringField
self.URLField = db_fields.URLField
self.UUIDField = db_fields.UUIDField
# Flask related data
self.app = None
self.config = config
# Extended documents classes
self.Document = documents.Document
self.DynamicDocument = documents.DynamicDocument
if app is not None:
self.init_app(app, config)
def init_app(self, app, config=None):
if not app or not isinstance(app, Flask):
raise TypeError("Invalid Flask application instance")
if config is not None:
warnings.warn(
(
"Passing flat configuration is deprecated. Please check "
"http://docs.mongoengine.org/projects/flask-mongoengine/flask_config.html "
"for more info."
),
DeprecationWarning,
stacklevel=2,
)
self.app = app
app.extensions = getattr(app, "extensions", {})
# Make documents JSON serializable
override_json_encoder(app)
if "mongoengine" not in app.extensions:
app.extensions["mongoengine"] = {}
if self in app.extensions["mongoengine"]:
# Raise an exception if extension already initialized as
# potentially new configuration would not be loaded.
raise ValueError("Extension already initialized")
if config:
# Passed config have max priority, over init config.
self.config = config
if not self.config:
# If no configs passed, use app.config.
self.config = app.config
# Obtain db connection(s)
connections = create_connections(self.config)
# Store objects in application instance so that multiple apps do not
# end up accessing the same objects.
s = {"app": app, "conn": connections}
app.extensions["mongoengine"][self] = s
@property
def connection(self) -> dict:
"""
Return MongoDB connection(s) associated with this MongoEngine
instance.
"""
return current_app.extensions["mongoengine"][self]["conn"]
def __getattr__(self, attr_name):
"""
Mongoengine backward compatibility handler.
Provide original :module:``mongoengine`` module methods/classes if they are not
modified by us, and not mapped directly.
"""
return getattr(mongoengine, attr_name)