I am attempting to write a command line script that works with Organization Units within our Google Apps domain. Therefore, using the many convoluted documentation from Google on this, I have successfully created the application in the API Console, turned on Admin SDK, and have successfully connected within my script. However, when I create the directory service object (which seems to be successful) I am having issues interacting with it because I receive that message. I HAVE installed the Python API package as well. Here is my current code:
import argparse
import httplib2
import os
import sys
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
f = file("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-privatekey.p12", "rb")
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com",
key,
scope = "https://www.googleapis.com/auth/admin.directory.orgunit"
)
http = httplib2.Http()
http = credentials.authorize(http)
directoryservice = build("admin", "directory_v1", http=http)
orgunits = directoryservice.orgunits()
thelist = orgunits.list('my_customer')
When I run that code I receive the error message:
Traceback (most recent call last):
File "test.py", line 33, in <module>
orgunits.list('my_customer')
TypeError: method() takes exactly 1 argument (2 given)
I tried without using the "my_customer" alias, but then the error complains that I haven't provided it. Any help would be appreciated, I haven't use Python in a very long time; it very well may be user error.
I'm not familiar with the google apps API, but it appears that
orgunits.list() is defined like:
class FactoryObject(object):
# ... Code Here ...
def list(self, **kwargs):
if 'some_parameter' not in kwargs:
raise Exception('some_parameter required argument')
# ... code that uses kwargs['some_parameter']
return True
So if I run these commands:
>>> orgunits.list()
Exception: some_parameter required argument
>>> orgunits.list('my_customer')
TypeError: list() takes exactly 1 argument (2 given)
>>> orgunits.list(some_parameter='my_customer')
True
So next time you see the error, try adding the parameter name to your arguments list and see if that resolves your issue.
More information:
The dictionary unpack operator (**) doesn't act like a normal argument in a parameter list. If you pass a positional argument, when this is the only argument in the list, then it will throw an error (like you saw) because the code is expecting a keyword argument instead.
The unpack operator can accept arbitrary keyword arguments and use them in a dictionary.