1
1
from pymongo import MongoClient
2
2
from pymongo .cursor import Cursor
3
3
from pymongo .command_cursor import CommandCursor
4
+ from microngo .pagination import Pagination
4
5
5
- class Microngo ():
6
+ class Microngo (object ):
6
7
def __init__ (self , * args , ** kwargs ):
7
8
'''
8
9
:param str db: Database name. This param is optional, you can use :func:`~microngo.Microngo.database` to set current database.
@@ -61,7 +62,7 @@ def insert(self, collection):
61
62
62
63
return Document (self ._collection (collection ))
63
64
64
- class Document ():
65
+ class Document (object ):
65
66
def __init__ (self , collection , data = None ):
66
67
'''
67
68
:param obj collection: PyMongo collection object
@@ -70,16 +71,16 @@ def __init__(self, collection, data=None):
70
71
'''
71
72
72
73
# Variables
73
- self .microngo_collection = collection
74
- self .microngo_payloads = []
75
- self .microngo_document_id = None
74
+ self ._microngo_collection = collection
75
+ self ._microngo_payloads = []
76
+ self ._microngo_document_id = None
76
77
77
78
# Dict data
78
79
if data :
79
80
if isinstance (data , dict ):
80
81
# Set documen id if exist
81
82
if data .get ("_id" ):
82
- self .microngo_document_id = data .get ("_id" )
83
+ self ._microngo_document_id = data .get ("_id" )
83
84
# Update data
84
85
self .__dict__ .update (data )
85
86
@@ -91,38 +92,38 @@ def _get_payloads(self):
91
92
payloads = dict (self .__dict__ )
92
93
93
94
# Remove internal variables and return data
94
- del payloads ['microngo_collection ' ]
95
- del payloads ['microngo_payloads ' ]
96
- del payloads ['microngo_document_id ' ]
95
+ del payloads ['_microngo_collection ' ]
96
+ del payloads ['_microngo_payloads ' ]
97
+ del payloads ['_microngo_document_id ' ]
97
98
return payloads
98
99
99
100
def _clear_payloads (self ):
100
101
# Cache variable
101
- cache_collection = self .microngo_collection
102
- cache_payloads = self .microngo_payloads
103
- cache_document_id = self .microngo_document_id
102
+ cache_collection = self ._microngo_collection
103
+ cache_payloads = self ._microngo_payloads
104
+ cache_document_id = self ._microngo_document_id
104
105
105
106
# Clear self variables
106
107
payloads = self .__dict__
107
108
payloads .clear ()
108
109
109
110
# Reasign internal variables from cache
110
- payloads ['microngo_collection' ] = cache_collection
111
- payloads ['microngo_payloads ' ] = cache_payloads
112
- payloads ['microngo_document_id ' ] = cache_document_id
111
+ payloads ['_microngo_collection' ] = cache_collection
112
+ payloads ['_microngo_payloads ' ] = cache_payloads
113
+ payloads ['_microngo_document_id ' ] = cache_document_id
113
114
return self
114
115
115
116
def add (self ):
116
117
'''
117
118
Add document to list, then insert to collection with insert_many function.
118
119
'''
119
120
120
- if not self .microngo_document_id :
121
+ if not self ._microngo_document_id :
121
122
# Get payloads
122
123
payloads = self ._get_payloads ()
123
124
124
125
# Append to cache
125
- self .microngo_payloads .append (payloads )
126
+ self ._microngo_payloads .append (payloads )
126
127
127
128
# Clear previous payload and return
128
129
self ._clear_payloads ()
@@ -141,38 +142,38 @@ def save(self):
141
142
'''
142
143
Save document to collection.
143
144
144
- :return: str or ObjectID
145
+ :return: list of OjectId or single ObjectId
145
146
'''
146
147
147
- if self .microngo_document_id :
148
+ if self ._microngo_document_id :
148
149
# Update
149
- self .microngo_collection .update_one (
150
- {'_id' : self .microngo_document_id },
150
+ self ._microngo_collection .update_one (
151
+ {'_id' : self ._microngo_document_id },
151
152
{'$set' : self ._get_payloads ()},
152
153
upsert = False
153
154
)
154
- return self .microngo_document_id
155
+ return self ._microngo_document_id
155
156
else :
156
157
# Insert
157
- if len (self .microngo_payloads ) > 0 :
158
- data = self .microngo_payloads
159
- return self .microngo_collection .insert_many (data ).inserted_ids
158
+ if len (self ._microngo_payloads ) > 0 :
159
+ data = self ._microngo_payloads
160
+ return self ._microngo_collection .insert_many (data ).inserted_ids
160
161
else :
161
162
data = self ._get_payloads ()
162
- doc_id = self .microngo_collection .insert_one (data ).inserted_id
163
- self .microngo_document_id = doc_id
163
+ doc_id = self ._microngo_collection .insert_one (data ).inserted_id
164
+ self ._microngo_document_id = doc_id
164
165
return doc_id
165
166
166
167
def remove (self ):
167
168
'''
168
169
Remove document from collection.
169
170
'''
170
171
171
- if self .microngo_document_id :
172
+ if self ._microngo_document_id :
172
173
# Delete
173
- self .microngo_collection .delete_one ({'_id' : self .microngo_document_id })
174
+ self ._microngo_collection .delete_one ({'_id' : self ._microngo_document_id })
174
175
175
- class Query ():
176
+ class Query (object ):
176
177
def __init__ (self , collection , cursor = None ):
177
178
'''
178
179
:param obj collection: PyMongo collection object
@@ -281,4 +282,21 @@ def all(self):
281
282
else :
282
283
raise Exception ("cursor type is '%s'" % (type (self .cursor )))
283
284
284
- return documents
285
+ return documents
286
+
287
+ def paginate (self , page , per_page = 20 ):
288
+ '''
289
+ Crate pagination query
290
+
291
+ :return: :class:`~pagination.Pagination` or None
292
+ '''
293
+ if page < 1 :
294
+ return None
295
+
296
+ total = self .cursor .count ()
297
+ items = self .skip ((page - 1 ) * per_page ).limit (per_page ).all ()
298
+
299
+ if len (items ) < 1 and page != 1 :
300
+ return None
301
+
302
+ return Pagination (self , page , per_page , total , items )
0 commit comments