Explorar o código

fixes #119: correctly filter query results

Davide Alberani %!s(int64=8) %!d(string=hai) anos
pai
achega
410ea028f3
Modificáronse 2 ficheiros con 61 adicións e 56 borrados
  1. 59 56
      backend.py
  2. 2 0
      eventman_server.py

+ 59 - 56
backend.py

@@ -22,6 +22,58 @@ from bson.objectid import ObjectId
 
 re_objectid = re.compile(r'[0-9a-f]{24}')
 
+_force_conversion = {
+    'seq_hex': str,
+    'persons.seq_hex': str
+}
+
+
+def convert_obj(obj):
+    """Convert an object in a format suitable to be stored in MongoDB.
+
+    :param obj: object to convert
+
+    :return: object that can be stored in MongoDB.
+    """
+    if obj is None:
+        return None
+    if isinstance(obj, bool):
+        return obj
+    try:
+        return ObjectId(obj)
+    except:
+        pass
+    try:
+        i_obj = int(obj)
+        if i_obj > 2**64 - 1:
+            return obj
+        return i_obj
+    except:
+        pass
+    return obj
+
+
+def convert(seq):
+    """Convert an object to a format suitable to be stored in MongoDB,
+    descending lists, tuples and dictionaries (a copy is returned).
+
+    :param seq: sequence or object to convert
+
+    :return: object that can be stored in MongoDB.
+    """
+    if isinstance(seq, dict):
+        d = {}
+        for key, item in seq.iteritems():
+            if key in _force_conversion:
+                d[key] = _force_conversion[key](item)
+            else:
+                d[key] = convert(item)
+        return d
+    if isinstance(seq, (list, tuple)):
+        return [convert(x) for x in seq]
+    return convert_obj(seq)
+
+
 class EventManDB(object):
     """MongoDB connector."""
     db = None
@@ -36,11 +88,6 @@ class EventManDB(object):
             'increment': '$inc'
     }
 
-    _force_conversion = {
-            'seq_hex': str,
-            'persons.seq_hex': str
-    }
-
     def __init__(self, url=None, dbName='eventman'):
         """Initialize the instance, connecting to the database.
 
@@ -70,50 +117,6 @@ class EventManDB(object):
         self.db = self.connection[self._dbName]
         return self.db
 
-    def convert_obj(self, obj):
-        """Convert an object in a format suitable to be stored in MongoDB.
-
-        :param obj: object to convert
-
-        :return: object that can be stored in MongoDB.
-        """
-        if obj is None:
-            return None
-        if isinstance(obj, bool):
-            return obj
-        try:
-            return ObjectId(obj)
-        except:
-            pass
-        try:
-            i_obj = int(obj)
-            if i_obj > 2**64 - 1:
-                return obj
-            return i_obj
-        except:
-            pass
-        return obj
-
-    def convert(self, seq):
-        """Convert an object in a format suitable to be stored in MongoDB,
-        descending lists, tuples and dictionaries (a copy is returned).
-
-        :param seq: sequence or object to convert
-
-        :return: object that can be stored in MongoDB.
-        """
-        if isinstance(seq, dict):
-            d = {}
-            for key, item in seq.iteritems():
-                if key in self._force_conversion:
-                    d[key] = self._force_conversion[key](item)
-                else:
-                    d[key] = self.convert(item)
-            return d
-        if isinstance(seq, (list, tuple)):
-            return [self.convert(x) for x in seq]
-        return self.convert_obj(seq)
-
     def get(self, collection, _id):
         """Get a single document with the specified `_id`.
 
@@ -125,7 +128,7 @@ class EventManDB(object):
         :return: the document with the given `_id`
         :rtype: dict
         """
-        results = self.query(collection, self.convert({'_id': _id}))
+        results = self.query(collection, convert({'_id': _id}))
         return results and results[0] or {}
 
     def query(self, collection, query=None):
@@ -140,7 +143,7 @@ class EventManDB(object):
         :rtype: list
         """
         db = self.connect()
-        query = self.convert(query or {})
+        query = convert(query or {})
         return list(db[collection].find(query))
 
     def add(self, collection, data):
@@ -155,7 +158,7 @@ class EventManDB(object):
         :rtype: dict
         """
         db = self.connect()
-        data = self.convert(data)
+        data = convert(data)
         _id = db[collection].insert(data)
         return self.get(collection, _id)
 
@@ -171,7 +174,7 @@ class EventManDB(object):
         :rtype: bool
         """
         db = self.connect()
-        data = self.convert(data)
+        data = convert(data)
         ret = db[collection].update(data, {'$set': data}, upsert=True)
         return ret['updatedExisting']
 
@@ -209,8 +212,8 @@ class EventManDB(object):
         :rtype: tuple of (bool, dict)
         """
         db = self.connect()
-        data = self.convert(data or {})
-        _id_or_query = self.convert(_id_or_query)
+        data = convert(data or {})
+        _id_or_query = convert(_id_or_query)
         if isinstance(_id_or_query, (list, tuple)):
             _id_or_query = {'$or': self._buildSearchPattern(data, _id_or_query)}
         elif not isinstance(_id_or_query, dict):
@@ -243,6 +246,6 @@ class EventManDB(object):
         db = self.connect()
         if not isinstance(_id_or_query, dict):
             _id_or_query = {'_id': _id_or_query}
-        _id_or_query = self.convert(_id_or_query)
+        _id_or_query = convert(_id_or_query)
         db[collection].remove(_id_or_query)
 

+ 2 - 0
eventman_server.py

@@ -169,11 +169,13 @@ class CollectionHandler(BaseHandler):
         :param results: the list to be filtered
         :type results: list
         :param params: a dictionary of items that must all be present in an original list item to be included in the return
+        :type params: dict
 
         :return: list of items that have all the keys with the same values as params
         :rtype: list"""
         if not params:
             return results
+        params = backend.convert(params)
         filtered = []
         for result in results:
             add = True