import couchdb import settings import type class CouchObject(object): ''' Convert between a CouchDB document and Python object. Create Python objects while maintaining a schema-free database. Define object properties without storing null fields. ''' @property def id(self): return self._id @property def rev(self): return self._rev def all_fields(self): # return a list of expected fields raise NotImplementedError("all_fields must return a list of all fields for %s" % self.__class__) def __init__(self, **kwargs): self.server = couchdb.Server(settings.COUCHDB_HOST) self.db = self.server[settings.COUCHDB_NAME] # create object properties for all desired fields for field_name in self.all_fields(): # check if field exists in document if field_name in kwargs and kwargs[field_name] is not None: value = kwargs[field_name] else: value = None setattr(self, field_name, value) def to_dict(self): # dictionary from properties data_dict = {} for field_name in self.all_fields(): value = getattr(self, field_name) if value is not None: # don't store null fields! data_dict[field_name] = value return data_dict def save(self): self.db.update([self.to_dict()]) return self def delete(self): del self.db[self._id] ## example from baconfile class Item(CouchObject): """ A file system item - a folder or a file. url: /leah/code/python/hello.py/ path: 1/code/python/hello.py directory: 1/code/python """ def all_fields(self): return [ '_id', '_rev', 'directory', 'name', 'user_id', 'is_folder', 'time_modified', 'description', 'content_type', 'size' ]