Update Zotero.Relations.updateUser() for new relations schema
Also adds Zotero.DataObjects::getLoaded(), which returns an array of all loaded objects of the given type. This is useful for selective reloading, for example with item.reload(['relations'], true).
This commit is contained in:
parent
195a737049
commit
aa2e0a8582
3 changed files with 70 additions and 23 deletions
|
@ -190,6 +190,16 @@ Zotero.DataObjects.prototype.getAsync = Zotero.Promise.coroutine(function* (ids,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all loaded objects
|
||||||
|
*
|
||||||
|
* @return {Zotero.DataObject[]}
|
||||||
|
*/
|
||||||
|
Zotero.DataObjects.prototype.getLoaded = function () {
|
||||||
|
return Object.keys(this._objectCache).map(id => this._objectCache[id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated - use .libraryKey
|
* @deprecated - use .libraryKey
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -83,32 +83,27 @@ Zotero.Relations = new function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
this.updateUser = Zotero.Promise.coroutine(function* (fromUserID, fromLibraryID, toUserID, toLibraryID) {
|
this.updateUser = Zotero.Promise.coroutine(function* (toUserID) {
|
||||||
|
var fromUserID = Zotero.Users.getCurrentUserID();
|
||||||
if (!fromUserID) {
|
if (!fromUserID) {
|
||||||
throw ("Invalid source userID " + fromUserID + " in Zotero.Relations.updateUserID");
|
fromUserID = "local/" + Zotero.Users.getLocalUserKey();
|
||||||
}
|
|
||||||
if (!fromLibraryID) {
|
|
||||||
throw ("Invalid source libraryID " + fromLibraryID + " in Zotero.Relations.updateUserID");
|
|
||||||
}
|
}
|
||||||
if (!toUserID) {
|
if (!toUserID) {
|
||||||
throw ("Invalid target userID " + toUserID + " in Zotero.Relations.updateUserID");
|
throw new Error("Invalid target userID " + toUserID);
|
||||||
}
|
}
|
||||||
if (!toLibraryID) {
|
Zotero.DB.requireTransaction();
|
||||||
throw ("Invalid target libraryID " + toLibraryID + " in Zotero.Relations.updateUserID");
|
for (let type of _types) {
|
||||||
}
|
var sql = "UPDATE " + type + "Relations SET "
|
||||||
|
+ "object=REPLACE(object, 'zotero.org/users/" + fromUserID + "', "
|
||||||
yield Zotero.DB.executeTransaction(function* () {
|
+ "'zotero.org/users/" + toUserID + "')";
|
||||||
var sql = "UPDATE relations SET libraryID=? WHERE libraryID=?";
|
yield Zotero.DB.queryAsync(sql);
|
||||||
yield Zotero.DB.queryAsync(sql, [toLibraryID, fromLibraryID]);
|
|
||||||
|
|
||||||
sql = "UPDATE relations SET "
|
var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type);
|
||||||
+ "subject=REPLACE(subject, 'zotero.org/users/" + fromUserID + "', "
|
var objects = objectsClass.getLoaded();
|
||||||
+ "'zotero.org/users/" + toUserID + "'), "
|
for (let object of objects) {
|
||||||
+ "object=REPLACE(object, 'zotero.org/users/" + fromUserID + "', "
|
yield object.reload(['relations'], true);
|
||||||
+ "'zotero.org/users/" + toUserID + "') "
|
}
|
||||||
+ "WHERE predicate IN (?, ?)";
|
}
|
||||||
yield Zotero.DB.queryAsync(sql, [this.linkedObjectPredicate, this.replacedItemPredicate]);
|
|
||||||
}.bind(this));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,8 +113,7 @@ Zotero.Relations = new function () {
|
||||||
Zotero.DB.requireTransaction();
|
Zotero.DB.requireTransaction();
|
||||||
var t = new Date;
|
var t = new Date;
|
||||||
let prefix = Zotero.URI.defaultPrefix;
|
let prefix = Zotero.URI.defaultPrefix;
|
||||||
var types = ['collection', 'item'];
|
for (let type of _types) {
|
||||||
for (let type of types) {
|
|
||||||
let objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type);
|
let objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type);
|
||||||
let getFunc = "getURI" + Zotero.Utilities.capitalize(type);
|
let getFunc = "getURI" + Zotero.Utilities.capitalize(type);
|
||||||
let objects = {};
|
let objects = {};
|
||||||
|
|
|
@ -21,4 +21,47 @@ describe("Zotero.Relations", function () {
|
||||||
assert.equal(objects[0], item);
|
assert.equal(objects[0], item);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("#updateUser", function () {
|
||||||
|
beforeEach(function* () {
|
||||||
|
yield Zotero.DB.queryAsync("DELETE FROM settings WHERE setting='account'");
|
||||||
|
yield Zotero.Users.init();
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should update relations using local user key to use userID", function* () {
|
||||||
|
var item1 = yield createDataObject('item');
|
||||||
|
var item2 = createUnsavedDataObject('item');
|
||||||
|
item2.addRelatedItem(item1);
|
||||||
|
yield item2.save();
|
||||||
|
|
||||||
|
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
|
||||||
|
assert.include(rels[0], "/users/local");
|
||||||
|
|
||||||
|
yield Zotero.DB.executeTransaction(function* () {
|
||||||
|
yield Zotero.Relations.updateUser(1);
|
||||||
|
})
|
||||||
|
|
||||||
|
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
|
||||||
|
assert.include(rels[0], "/users/1");
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should update relations from one userID to another", function* () {
|
||||||
|
yield Zotero.Users.setCurrentUserID(1);
|
||||||
|
|
||||||
|
var item1 = yield createDataObject('item');
|
||||||
|
var item2 = createUnsavedDataObject('item');
|
||||||
|
item2.addRelatedItem(item1);
|
||||||
|
yield item2.save();
|
||||||
|
|
||||||
|
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
|
||||||
|
assert.include(rels[0], "/users/1");
|
||||||
|
|
||||||
|
yield Zotero.DB.executeTransaction(function* () {
|
||||||
|
yield Zotero.Relations.updateUser(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
var rels = item2.getRelationsByPredicate(Zotero.Relations.relatedItemPredicate);
|
||||||
|
assert.include(rels[0], "/users/2");
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue