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}})
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
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
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
def _pre_delete(self): gridfs = dbutil.get_gridfs(self.request) gridfs._GridFS__files.update({'parents':self._id}, {"$pull":{"parents":self._id}}, multi=True)