Successfully read course children out of mongodb

This commit is contained in:
Calen Pennington
2012-06-14 16:15:50 -04:00
committed by Matthew Mongeau
parent 432a8e5fd8
commit 22f5c5c73d
5 changed files with 109 additions and 26 deletions

View File

@@ -60,6 +60,40 @@ class KeyStore(object):
with the specified location.
If no object is found at that location, raises keystore.exceptions.ItemNotFoundError
Searches for all matches of a partially specifed location, but raises an
keystore.exceptions.InsufficientSpecificationError if more
than a single object matches the query.
location: Something that can be passed to Location
"""
raise NotImplementedError
def create_item(self, location, editor):
"""
Create an empty item at the specified location with the supplied editor
location: Something that can be passed to Location
"""
raise NotImplementedError
def update_item(self, location, data):
"""
Set the data in the item specified by the location to
data
location: Something that can be passed to Location
data: A nested dictionary of problem data
"""
raise NotImplementedError
def update_children(self, location, children):
"""
Set the children for the item specified by the location to
data
location: Something that can be passed to Location
children: A list of child item identifiers
"""
raise NotImplementedError

View File

@@ -5,3 +5,7 @@ Exceptions thrown by KeyStore objects
class ItemNotFoundError(Exception):
pass
class InsufficientSpecificationError(Exception):
pass

View File

@@ -1,6 +1,6 @@
import pymongo
from . import KeyStore
from .exceptions import ItemNotFoundError
from . import KeyStore, Location
from .exceptions import ItemNotFoundError, InsufficientSpecificationError
class MongoKeyStore(KeyStore):
@@ -12,15 +12,64 @@ class MongoKeyStore(KeyStore):
host=host,
port=port
)[db][collection]
# Force mongo to report errors, at the expense of performance
self.collection.safe = True
def get_children_for_item(self, location):
item = self.collection.find_one(
{'location': location.dict()},
query = dict(
('location.{key}'.format(key=key), val)
for (key, val)
in Location(location).dict().items()
if val is not None
)
items = self.collection.find(
query,
fields={'children': True},
sort=[('revision', pymongo.ASCENDING)],
limit=1,
)
if items.count() > 1:
raise InsufficientSpecificationError(location)
if items.count() == 0:
raise ItemNotFoundError(location)
return items[0]['children']
def create_item(self, location, editor):
"""
Create an empty item at the specified location with the supplied editor
location: Something that can be passed to Location
"""
self.collection.insert({
'location': Location(location).dict(),
'editor': editor
})
def update_item(self, location, data):
"""
Set the data in the item specified by the location to
data
location: Something that can be passed to Location
data: A nested dictionary of problem data
"""
self.collection.update(
{'location': Location(location).dict()},
{'$set': {'data': data}}
)
if item is None:
raise ItemNotFoundError()
def update_children(self, location, children):
"""
Set the children for the item specified by the location to
data
return item['children']
location: Something that can be passed to Location
children: A list of child item identifiers
"""
self.collection.update(
{'location': Location(location).dict()},
{'$set': {'children': children}}
)