为 Google 个 App Maker 记录添加多个所有者
Adding multiple owners for Google App Maker records
我需要 Google App Maker 数据模型安全方面的帮助。我想为一个记录设置多个所有者。比如当前用户+分配的管理员+超级管理员。
我需要这个,因为所有记录都可以有不同的所有者和 super-owners/admins。
我知道我们可以将 google app maker 指向包含记录所有者电子邮件的字段,我们可以在创建记录时将该字段设置为当前用户。
record.Owner = Session.getActiveUser().getEmail();
我想知道是否可以拥有字段所有者或拥有多个字段(如 owner1、owner2),然后将访问级别分配给 owner1、owner2...
或者我们如何以编程方式控制记录的access/security/permissions?
我将用于此解决方案的解决方案肯定涉及记录中的一个字段,该字段包含应该有权访问它的所有用户的逗号分隔字符串。我已经研究了以下示例以更好地解释我的想法。
我创建了一个模型,名为 documents,看起来像这样:
在一个页面中,我有一个 table 和一个添加新文档记录的按钮。该页面如下所示:
当我单击 添加文档 按钮时,会弹出一个对话框,如下所示:
上面表格中 SUBMIT 按钮的逻辑如下:
widget.datasource.item.owners = app.user.email;
widget.datasource.createItem(function(){
app.closeDialog();
});
这将自动为记录的创建者分配所有权。要添加其他所有者,我在编辑表单上进行。单击记录行内的 edit 按钮时,会弹出编辑表单。它看起来像这样:
如您所见,我正在使用列表小部件来控制所有者。为此,有必要在编辑对话框中使用 <List>String
自定义 属性,这将是列表小部件的数据源。在这种情况下,我将其称为 owners。我已将以下内容应用于编辑按钮的 onClick 事件:
var owners = widget.datasource.item.owners;
owners = owners ? owners.split(",") : [];
app.pageFragments.documentEdit.properties.owners = owners;
app.showDialog(app.pageFragments.documentEdit);
列表小部件上方的 add 按钮具有以下用于 onClick 事件处理程序的逻辑:
widget.root.properties.owners.push("");
列表小部件行内的 TextBox 小部件对于 onValueEdit 事件处理程序具有以下逻辑:
widget.root.properties.owners[widget.parent.childIndex] = newValue;
并且 CLOSE 按钮具有以下用于 onClick 事件处理程序的逻辑:
var owners = widget.root.properties.owners || [];
if(owners && owners.length){
owners = owners.filter(function(owner){
return owner != false; //jshint ignore:line
});
}
widget.datasource.item.owners = owners.join();
app.closeDialog();
因为我想创建一个只为授权用户加载记录的逻辑,所以我不得不在数据源中使用一个查询脚本来实现这个目的。为此,我在服务器脚本上创建了这个函数:
function getAuthorizedRecords(){
var authorized = [];
var userRoles = app.getActiveUserRoles();
var allRecs = app.models.documents.newQuery().run();
if(userRoles.indexOf(app.roles.Admins) > -1){
return allRecs;
} else {
for(var r=0; r<allRecs.length; r++){
var rec = allRecs[r];
if(rec.owners && rec.owners.indexOf(Session.getActiveUser().getEmail()) > -1){
authorized.push(rec);
}
}
return authorized;
}
}
然后在 documents 数据源上,我将以下内容添加到查询脚本中:
return getAuthorizedRecords();
此解决方案将为管理员用户加载所有记录,但对于非管理员用户,它只会加载其电子邮件位于记录的 owners 字段中的记录。这是我能想到的最优雅的解决方案,我希望它能满足您的目的。
参考文献:
https://developers.google.com/appmaker/models/datasources#query_script
https://developers.google.com/appmaker/ui/binding#custom_properties
https://developers.google.com/appmaker/ui/logic#events
https://developers-dot-devsite-v2-prod.appspot.com/appmaker/scripting/api/client#Record
我需要 Google App Maker 数据模型安全方面的帮助。我想为一个记录设置多个所有者。比如当前用户+分配的管理员+超级管理员。 我需要这个,因为所有记录都可以有不同的所有者和 super-owners/admins。 我知道我们可以将 google app maker 指向包含记录所有者电子邮件的字段,我们可以在创建记录时将该字段设置为当前用户。
record.Owner = Session.getActiveUser().getEmail();
我想知道是否可以拥有字段所有者或拥有多个字段(如 owner1、owner2),然后将访问级别分配给 owner1、owner2...
或者我们如何以编程方式控制记录的access/security/permissions?
我将用于此解决方案的解决方案肯定涉及记录中的一个字段,该字段包含应该有权访问它的所有用户的逗号分隔字符串。我已经研究了以下示例以更好地解释我的想法。
我创建了一个模型,名为 documents,看起来像这样:
在一个页面中,我有一个 table 和一个添加新文档记录的按钮。该页面如下所示:
当我单击 添加文档 按钮时,会弹出一个对话框,如下所示:
上面表格中 SUBMIT 按钮的逻辑如下:
widget.datasource.item.owners = app.user.email;
widget.datasource.createItem(function(){
app.closeDialog();
});
这将自动为记录的创建者分配所有权。要添加其他所有者,我在编辑表单上进行。单击记录行内的 edit 按钮时,会弹出编辑表单。它看起来像这样:
如您所见,我正在使用列表小部件来控制所有者。为此,有必要在编辑对话框中使用 <List>String
自定义 属性,这将是列表小部件的数据源。在这种情况下,我将其称为 owners。我已将以下内容应用于编辑按钮的 onClick 事件:
var owners = widget.datasource.item.owners;
owners = owners ? owners.split(",") : [];
app.pageFragments.documentEdit.properties.owners = owners;
app.showDialog(app.pageFragments.documentEdit);
列表小部件上方的 add 按钮具有以下用于 onClick 事件处理程序的逻辑:
widget.root.properties.owners.push("");
列表小部件行内的 TextBox 小部件对于 onValueEdit 事件处理程序具有以下逻辑:
widget.root.properties.owners[widget.parent.childIndex] = newValue;
并且 CLOSE 按钮具有以下用于 onClick 事件处理程序的逻辑:
var owners = widget.root.properties.owners || [];
if(owners && owners.length){
owners = owners.filter(function(owner){
return owner != false; //jshint ignore:line
});
}
widget.datasource.item.owners = owners.join();
app.closeDialog();
因为我想创建一个只为授权用户加载记录的逻辑,所以我不得不在数据源中使用一个查询脚本来实现这个目的。为此,我在服务器脚本上创建了这个函数:
function getAuthorizedRecords(){
var authorized = [];
var userRoles = app.getActiveUserRoles();
var allRecs = app.models.documents.newQuery().run();
if(userRoles.indexOf(app.roles.Admins) > -1){
return allRecs;
} else {
for(var r=0; r<allRecs.length; r++){
var rec = allRecs[r];
if(rec.owners && rec.owners.indexOf(Session.getActiveUser().getEmail()) > -1){
authorized.push(rec);
}
}
return authorized;
}
}
然后在 documents 数据源上,我将以下内容添加到查询脚本中:
return getAuthorizedRecords();
此解决方案将为管理员用户加载所有记录,但对于非管理员用户,它只会加载其电子邮件位于记录的 owners 字段中的记录。这是我能想到的最优雅的解决方案,我希望它能满足您的目的。
参考文献:
https://developers.google.com/appmaker/models/datasources#query_script
https://developers.google.com/appmaker/ui/binding#custom_properties
https://developers.google.com/appmaker/ui/logic#events
https://developers-dot-devsite-v2-prod.appspot.com/appmaker/scripting/api/client#Record