0

还有人看到这个吗?Google 多域配置 API 似乎发生了一些变化。我有长时间运行的代码可以恢复已停止工作的暂停用户。我使用 Python 和 Python GData 库的 2.0.17 和 UpdateUser 方法来执行此操作。我还注意到同一个库中的 RetrieveUser 不再返回暂停用户的名字和姓氏。我已在 Google Apps-api-issues 提交了一个问题,如果您看到此问题,请加注星标。

http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3281

4

3 回答 3

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))
于 2012-11-24T16:59:54.317 回答
1

感谢 user1803418,这解释了为什么恢复用户使用 GAM 而不是您的代码。RetrieveUser API 调用中缺少 firstName 和 lastName 绝对是 Google 需要解决的问题。但是,我将 unsuspend 问题描述为客户端库缺陷,该缺陷因 firstName/lastName 问题而加剧。

API 只要求在更新用户 API 调用中提交正在更新的属性。无需指定用户的名字、姓氏和其他对象详细信息。这意味着检索用户以执行更新只会使更新过程花费更长的时间,实际上只需要一个 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 的文件来亲自看到这一点:

游戏更新用户暂停

对 Google 的 XML 请求将是最小的,只显示几个字段,包括用户的暂停状态。firstName 和 lastName 不会包含在请求中。

所以我认为你在这里有3个选择:

1) 等待 Google 解决 firstName/lastName 问题。这也应该解决 unsuspend 问题。

2) 重写 multidomain/client.py UpdateUser() 函数,使其不需要设置所有用户属性即可执行更新。

3) 切换您的代码以使用 GAM 的自定义 multidomain/service.py 库,因为它支持仅更新为用户提供的属性。

于 2012-11-25T19:24:37.930 回答
0

我希望 Google 能尽快修复缺失的名称。在多域客户​​端 (gdata.apps.multidomain.client) 中修改 UpdateUser 似乎可以让事情继续进行:

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)
于 2012-11-26T18:44:56.423 回答