还有人看到这个吗? 对多域的Google配置API似乎进行了一些更改。我有长时间运行的代码,可以恢复已停止工作的已暂停用户。我使用Python和2.0.1的Python GData库和UpdateUser方法来做到这一点。我还注意到,同一个库中的RetrieveUser不再返回已暂停用户的名字和姓氏。我已经在Google apps-api-issues上提出了一个问题,如果你看到这个问题,请加星标。
http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3281
答案 0 :(得分:1)
这是一个简单的例子,将解决问题。请注意,从已挂起用户的RetrieveUser()返回的user_entry对象将不具有名字或姓氏的属性值。修改后的user_entry对象将传递给UpdateUser(),后者不允许使用名字和名字的缺失值。
#!/usr/bin/python
import sys
import gdata.apps.multidomain.client
if len(sys.argv) < 4:
print "\nUsage:"
print sys.argv[0], "admin_email admin_password user_email\n"
sys.exit(0)
admin = sys.argv[1]
password = sys.argv[2]
email = sys.argv[3]
domain = ""
if '@' in admin:
admin_name,domain = admin.split('@', 1)
else:
print "Specify full email address of administrator.\n"
print "\nUsage:"
print sys.argv[0], "admin_email admin_password user_email\n"
sys.exit(0)
if '@' not in email:
print "Specify full email address of user.\n"
print "\nUsage:"
print sys.argv[0], "admin_email admin_password user_email\n"
sys.exit(0)
md_client = gdata.apps.multidomain.client.MultiDomainProvisioningClient(
domain=domain)
md_client.ClientLogin(email=admin, password=password, source='MDPROVISIONING')
print "Retrieve user: %s\n" %(email)
user_entry = md_client.RetrieveUser(email)
print user_entry
print ('\nRetrieve results: email: %s, suspended: %s,'
' first name: %s, last name: %s\n'
%(user_entry.email,user_entry.suspended,
user_entry.first_name,user_entry.last_name))
print "Update user (suspend): %s\n" %(email)
user_entry.suspended = 'true'
updated_user_entry = md_client.UpdateUser(email, user_entry)
print updated_user_entry
print ('\nSuspend results: email: %s, suspended: %s,'
' first name: %s, last name: %s\n'
%(updated_user_entry.email,updated_user_entry.suspended,
updated_user_entry.first_name,updated_user_entry.last_name))
print "Retrieve user: %s\n" %(email)
user_entry = md_client.RetrieveUser(email)
print user_entry
print ('\nRetrieve results: email: %s, suspended: %s,'
' first name: %s, last name: %s\n'
%(user_entry.email,user_entry.suspended,
user_entry.first_name,user_entry.last_name))
print "Update user (restore): %s\n" %(email)
user_entry.suspended = 'false'
updated_user_entry = md_client.UpdateUser(email, user_entry)
print updated_user_entry
print ('\nRestore results: email: %s, suspended: %s,'
' first name: %s, last name: %s\n'
%(updated_user_entry.email,updated_user_entry.suspended,
updated_user_entry.first_name,updated_user_entry.last_name))
答案 1 :(得分:1)
感谢user1803418,这解释了为什么还原用户可以使用GAM而不是代码。在RetrieveUser API调用中缺少firstName和lastName绝对是Google最终需要解决的问题。但是,我将未解决的问题描述为由firstName / lastName问题激发的客户端库缺陷。
API仅需要在更新用户API调用中提交要更新的属性。无需指定用户的firstName,lastName和其他对象详细信息。这意味着检索用户以执行更新只会使更新过程花费更长时间,实际上只需要一次API调用。
GAM使用它自己实现的多域API调用,这是我在发布multidomain / client.py之前编写的。 GAM的实现不要求设置所有用户属性以执行更新。您可以通过以下方式看到: http://code.google.com/p/google-apps-manager/source/browse/trunk/gdata/apps/multidomain/service.py#69
只有调用UpdateUser()时设置的属性才会发送给Google。您可以通过安装GAM并在使用GAM命令取消挂起用户之前创建名为debug.gam的文件来自行查看:
gam更新用户暂停
对Google的XML请求将是最小的,仅显示一些字段,包括用户的暂停状态。 firstName和lastName将不包含在请求中。
所以我认为你有三个选择:
1)等待Google修复firstName / lastName问题。这也应解决悬而未决的问题。
2)重写multidomain / client.py UpdateUser()函数,以便它不需要设置所有用户属性来执行更新。
3)切换代码以使用GAM的自定义multidomain / service.py库,因为它支持仅更新用户提供的属性。
答案 2 :(得分:0)
我希望Google尽快修复丢失的名字。 在多域客户端中修改UpdateUser (gdata.apps.multidomain.client)似乎让事情继续下去:
def update_user(self, email, user_entry, **kwargs):
user_entry = gdata.apps.multidomain.data.UserEntry(
email=email,first_name=user_entry.first_name,
last_name=user_entry.last_name,password=user_entry.password,
change_password=user_entry.change_password_at_next_login,
suspended=user_entry.suspended, is_admin=user_entry.is_admin,
ip_whitelisted=user_entry.ip_whitelisted, quota=user_entry.quota)
return self.update(user_entry,
uri=self.MakeMultidomainUserProvisioningUri(email),
**kwargs)