--- Revision None +++ Revision 633436626234 @@ -0,0 +1,29 @@ + def update_fields(self, record_id, fields): + """Safely update a number of fields. 'fields' being a + dictionary with path_tuple: value for only the fields we want + to change the value of, where path_tuple is a tuple of + fieldnames indicating the path to the possibly nested field + we're interested in. + """ + while True: + record = self.db[record_id] + modified = False + for path, value in fields.items(): + if not isinstance(path, tuple): + path = (path,) + parent = record + for field in path[:-1]: + parent = parent.setdefault(field, {}) + if parent.get(path[-1]) == value: + continue + modified = True + parent[path[-1]] = value + if modified: + try: + self.db[record.id] = record + except ResourceConflict: + logger.debug( + "Update of record with id %s in database %s failed." % ( + record_id, self.db.name)) + continue + break