示例#1
0
文件: object.py 项目: eugeneai/recms
    def save(self, set_modified=True, pull_parent_from_old_files=True):
        if set_modified:
            self._modified = dateutil.utcnow()
            if not getattr(self, '_created', None): self._created = self._modified
        doc = self._get_nonschema_mongo_save_document()

        old_file_ids = []
        new_file_ids = []
        gridfs = dbutil.get_gridfs(self.request)
        if self._id:
            doc['_id'] =  self._id
            for item in gridfs._GridFS__files.find({'parents':self._id}, fields=[]):
                old_file_ids.append(item['_id'])

        schema_values = _prep_schema_values_for_save(self.get_schema_values(), gridfs, new_file_ids)
        doc.update(schema_values)

        _id = self._get_collection().save(doc, safe=True)
        if not self._id: self._id = _id

        # Update file parents:
        # FIXME: Reduce to at most 2 updates by using "$in" queries for "_id".

        if pull_parent_from_old_files:
            for id in old_file_ids:
                if id not in new_file_ids:
                    gridfs._GridFS__files.update({'_id':id}, {"$pull":{"parents":self._id}})
        for id in new_file_ids:
            if id not in old_file_ids:
                gridfs._GridFS__files.update({'_id':id}, {"$addToSet":{"parents":self._id}})
示例#2
0
文件: object.py 项目: eugeneai/recms
 def get_file_by_filename(self, attname, filename):
     """ Try to return a GridFS file with the given "filename".  Potential files
     are identified by a sequence of IDs stored in the attribute "attname".
     Return None on failure.
     """
     value = getattr(self, attname, None)
     if value:
         gridfs = dbutil.get_gridfs(self.request)
         try:
             return gridfs.get_last_version(filename=filename, _id={'$in':value})
         except NoFile:
             pass
     return None
示例#3
0
文件: object.py 项目: eugeneai/recms
 def get_files_for_attribute(self, name):
     """ Try to return a sequence of GridFS files for the IDs whose values are stored
     in this object's attribute named "name".
     May return an empty list.
     """
     result = []
     value = getattr(self, name, None)
     if value:
         for id in value:
             gridfs_file = dbutil.get_gridfs(self.request).get(id)
             if gridfs_file:
                 result.append(gridfs_file)
     return result
示例#4
0
文件: object.py 项目: eugeneai/recms
 def get_file_for_attribute(self, name):
     """ Try to return a GridFS file for the ID whose value is stored in this object's
     attribute named "name".  If the attribute value is a list, try to use the first list item as the ID.
     Return None on failure.
     """
     value = getattr(self, name, None)
     if type(value) == list:
         if len(value):
             value = value[0]
     if value:
         gridfs_file = dbutil.get_gridfs(self.request).get(value)
         if gridfs_file:
             return gridfs_file
     return None
示例#5
0
文件: object.py 项目: eugeneai/recms
 def _pre_delete(self):
     gridfs = dbutil.get_gridfs(self.request)
     gridfs._GridFS__files.update({'parents':self._id}, {"$pull":{"parents":self._id}}, multi=True)