Just read Jeff Scudder's comment on my recent UpgradeSessionToken post. He pointed out that there is a newer gdata API which externally appears to be a minor change in the API usage. OK. Here goes!
He references the gdata docs which for my app required these changes (consolidated in a diff-like listing):
-import gdata.spreadsheet.service
+import gdata.service
+import gdata.alt.appengine
-gdata.service.http_request_handler = gdata.urlfetch
-gd_client = gdata.spreadsheet.service.SpreadsheetsService()
+gd_client = gdata.service.GDataService()
+gdata.alt.appengine.run_on_appengine(gd_client)
Great! Now we run the app and...
<class 'django.core.exceptions.ViewDoesNotExist'>: Could not import myapp.admin.views. Error was: No module named alt.appengine
Traceback (most recent call last):
File "/base/data/home/apps/rightreply/1.73/main.py", line 45, in <module>
main()
File "/base/data/home/apps/rightreply/1.73/main.py", line 42, in main
util.run_wsgi_app(application)
File "/base/python_lib/versions/1/google/appengine/ext/webapp/util.py", line 76, in run_wsgi_app
result = application(env, _start_response)
File "/base/data/home/apps/rightreply/1.73/django/core/handlers/wsgi.py", line 222, in __call__
response = self.get_response(request)
File "/base/data/home/apps/rightreply/1.73/django/core/handlers/base.py", line 67, in get_response
response = middleware_method(request)
File "/base/data/home/apps/rightreply/1.73/django/middleware/common.py", line 72, in process_request
urlresolvers.resolve("%s/" % request.path_info)
File "/base/data/home/apps/rightreply/1.73/django/core/urlresolvers.py", line 299, in resolve
return get_resolver(urlconf).resolve(path)
File "/base/data/home/apps/rightreply/1.73/django/core/urlresolvers.py", line 240, in resolve
sub_match = pattern.resolve(new_path)
File "/base/data/home/apps/rightreply/1.73/django/core/urlresolvers.py", line 179, in resolve
return self.callback, args, kwargs
File "/base/data/home/apps/rightreply/1.73/django/core/urlresolvers.py", line 188, in _get_callback
raise ViewDoesNotExist, "Could not import %s. Error was: %s" % (mod_name, str(e))
<class 'django.core.exceptions.ViewDoesNotExist'>: Could not import myapp.admin.views. Error was: No module named alt.appengine
Realized the article referenced an updated codebase released two days ago. The code affects the gdata and atom packages/directories. I'm not sure whether I downloaded the client code previously, or if it was created by google's app creation helper, but I had aging copies of the library in my project locally. So, I downloaded the updates and replaced the files:
jonathan$ wget http://gdata-python-client.googlecode.com/files/gdata.py-1.2.0.tar.gz
--2008-09-13 01:51:13-- http://gdata-python-client.googlecode.com/files/gdata.py-1.2.0.tar.gz
Resolving gdata-python-client.googlecode.com... 74.125.47.82
Connecting to gdata-python-client.googlecode.com|74.125.47.82|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 451038 (440K) [application/x-gzip]
Saving to: `gdata.py-1.2.0.tar.gz'
100%[=============================================================================================>] 451,038 92.5K/s in 4.8s
2008-09-13 01:51:20 (92.5 KB/s) - `gdata.py-1.2.0.tar.gz' saved [451038/451038]
jonathan$ tar xvzf gdata.py-1.2.0.tar.gz
gdata.py-1.2.0/
gdata.py-1.2.0/pydocs/
gdata.py-1.2.0/pydocs/atom.html
gdata.py-1.2.0/pydocs/atom.http_interface.html
gdata.py-1.2.0/pydocs/atom.mock_http.html
gdata.py-1.2.0/pydocs/atom.mock_service.html
gdata.py-1.2.0/pydocs/atom.service.html
gdata.py-1.2.0/pydocs/atom.token_store.html
gdata.py-1.2.0/pydocs/atom.url.html
gdata.py-1.2.0/pydocs/gdata.alt.appengine.html
gdata.py-1.2.0/pydocs/gdata.apps.html
gdata.py-1.2.0/pydocs/gdata.apps.service.html
gdata.py-1.2.0/pydocs/gdata.auth.html
gdata.py-1.2.0/pydocs/gdata.base.html
gdata.py-1.2.0/pydocs/gdata.base.service.html
gdata.py-1.2.0/pydocs/gdata.blogger.html
gdata.py-1.2.0/pydocs/gdata.blogger.service.html
gdata.py-1.2.0/pydocs/gdata.calendar.html
gdata.py-1.2.0/pydocs/gdata.calendar.service.html
gdata.py-1.2.0/pydocs/gdata.client.html
gdata.py-1.2.0/pydocs/gdata.codesearch.html
gdata.py-1.2.0/pydocs/gdata.codesearch.service.html
gdata.py-1.2.0/pydocs/gdata.contacts.html
gdata.py-1.2.0/pydocs/gdata.contacts.service.html
gdata.py-1.2.0/pydocs/gdata.docs.html
gdata.py-1.2.0/pydocs/gdata.docs.service.html
gdata.py-1.2.0/pydocs/gdata.exif.html
gdata.py-1.2.0/pydocs/gdata.geo.html
gdata.py-1.2.0/pydocs/gdata.html
gdata.py-1.2.0/pydocs/gdata.media.html
gdata.py-1.2.0/pydocs/gdata.photos.html
gdata.py-1.2.0/pydocs/gdata.photos.service.html
gdata.py-1.2.0/pydocs/gdata.service.html
gdata.py-1.2.0/pydocs/gdata.spreadsheet.html
gdata.py-1.2.0/pydocs/gdata.spreadsheet.service.html
gdata.py-1.2.0/pydocs/gdata.spreadsheet.text_db.html
gdata.py-1.2.0/pydocs/gdata.urlfetch.html
gdata.py-1.2.0/pydocs/gdata.youtube.html
gdata.py-1.2.0/pydocs/gdata.youtube.service.html
gdata.py-1.2.0/pydocs/generate_docs
gdata.py-1.2.0/samples/
gdata.py-1.2.0/samples/base/
gdata.py-1.2.0/samples/base/baseQueryExample.py
gdata.py-1.2.0/samples/base/dryRunInsert.py
gdata.py-1.2.0/samples/blogger/
gdata.py-1.2.0/samples/blogger/BloggerExample.py
gdata.py-1.2.0/samples/calendar/
gdata.py-1.2.0/samples/calendar/calendarExample.py
gdata.py-1.2.0/samples/contacts/
gdata.py-1.2.0/samples/contacts/contacts_example.py
gdata.py-1.2.0/samples/docs/
gdata.py-1.2.0/samples/docs/docs_example.py
gdata.py-1.2.0/samples/mashups/
gdata.py-1.2.0/samples/mashups/birthdaySample.py
gdata.py-1.2.0/samples/spreadsheets/
gdata.py-1.2.0/samples/spreadsheets/spreadsheetExample.py
gdata.py-1.2.0/src/
gdata.py-1.2.0/src/atom/
gdata.py-1.2.0/src/atom/__init__.py
gdata.py-1.2.0/src/atom/http.py
gdata.py-1.2.0/src/atom/http_interface.py
gdata.py-1.2.0/src/atom/mock_http.py
gdata.py-1.2.0/src/atom/mock_service.py
gdata.py-1.2.0/src/atom/service.py
gdata.py-1.2.0/src/atom/token_store.py
gdata.py-1.2.0/src/atom/url.py
gdata.py-1.2.0/src/gdata/
gdata.py-1.2.0/src/gdata/alt/
gdata.py-1.2.0/src/gdata/alt/__init__.py
gdata.py-1.2.0/src/gdata/alt/appengine.py
gdata.py-1.2.0/src/gdata/apps/
gdata.py-1.2.0/src/gdata/apps/__init__.py
gdata.py-1.2.0/src/gdata/apps/service.py
gdata.py-1.2.0/src/gdata/base/
gdata.py-1.2.0/src/gdata/base/__init__.py
gdata.py-1.2.0/src/gdata/base/service.py
gdata.py-1.2.0/src/gdata/blogger/
gdata.py-1.2.0/src/gdata/blogger/__init__.py
gdata.py-1.2.0/src/gdata/blogger/service.py
gdata.py-1.2.0/src/gdata/calendar/
gdata.py-1.2.0/src/gdata/calendar/__init__.py
gdata.py-1.2.0/src/gdata/calendar/service.py
gdata.py-1.2.0/src/gdata/codesearch/
gdata.py-1.2.0/src/gdata/codesearch/__init__.py
gdata.py-1.2.0/src/gdata/codesearch/service.py
gdata.py-1.2.0/src/gdata/contacts/
gdata.py-1.2.0/src/gdata/contacts/__init__.py
gdata.py-1.2.0/src/gdata/contacts/service.py
gdata.py-1.2.0/src/gdata/docs/
gdata.py-1.2.0/src/gdata/docs/__init__.py
gdata.py-1.2.0/src/gdata/docs/service.py
gdata.py-1.2.0/src/gdata/exif/
gdata.py-1.2.0/src/gdata/exif/__init__.py
gdata.py-1.2.0/src/gdata/geo/
gdata.py-1.2.0/src/gdata/geo/__init__.py
gdata.py-1.2.0/src/gdata/media/
gdata.py-1.2.0/src/gdata/media/__init__.py
gdata.py-1.2.0/src/gdata/photos/
gdata.py-1.2.0/src/gdata/photos/__init__.py
gdata.py-1.2.0/src/gdata/photos/service.py
gdata.py-1.2.0/src/gdata/spreadsheet/
gdata.py-1.2.0/src/gdata/spreadsheet/__init__.py
gdata.py-1.2.0/src/gdata/spreadsheet/service.py
gdata.py-1.2.0/src/gdata/spreadsheet/text_db.py
gdata.py-1.2.0/src/gdata/youtube/
gdata.py-1.2.0/src/gdata/youtube/__init__.py
gdata.py-1.2.0/src/gdata/youtube/service.py
gdata.py-1.2.0/src/gdata/__init__.py
gdata.py-1.2.0/src/gdata/auth.py
gdata.py-1.2.0/src/gdata/client.py
gdata.py-1.2.0/src/gdata/service.py
gdata.py-1.2.0/src/gdata/test_data.py
gdata.py-1.2.0/src/gdata/urlfetch.py
gdata.py-1.2.0/tests/
gdata.py-1.2.0/tests/atom_tests/
gdata.py-1.2.0/tests/atom_tests/__init__.py
gdata.py-1.2.0/tests/atom_tests/http_interface_test.py
gdata.py-1.2.0/tests/atom_tests/mock_http_test.py
gdata.py-1.2.0/tests/atom_tests/mock_server_test.py
gdata.py-1.2.0/tests/atom_tests/service_test.py
gdata.py-1.2.0/tests/atom_tests/token_store_test.py
gdata.py-1.2.0/tests/atom_tests/url_test.py
gdata.py-1.2.0/tests/gdata_tests/
gdata.py-1.2.0/tests/gdata_tests/apps/
gdata.py-1.2.0/tests/gdata_tests/apps/__init__.py
gdata.py-1.2.0/tests/gdata_tests/apps/service_test.py
gdata.py-1.2.0/tests/gdata_tests/base/
gdata.py-1.2.0/tests/gdata_tests/base/__init__.py
gdata.py-1.2.0/tests/gdata_tests/base/service_test.py
gdata.py-1.2.0/tests/gdata_tests/blogger/
gdata.py-1.2.0/tests/gdata_tests/blogger/__init__.py
gdata.py-1.2.0/tests/gdata_tests/blogger/service_test.py
gdata.py-1.2.0/tests/gdata_tests/calendar/
gdata.py-1.2.0/tests/gdata_tests/calendar/__init__.py
gdata.py-1.2.0/tests/gdata_tests/calendar/calendar_acl_test.py
gdata.py-1.2.0/tests/gdata_tests/calendar/service_test.py
gdata.py-1.2.0/tests/gdata_tests/contacts/
gdata.py-1.2.0/tests/gdata_tests/contacts/__init__.py
gdata.py-1.2.0/tests/gdata_tests/contacts/service_test.py
gdata.py-1.2.0/tests/gdata_tests/docs/
gdata.py-1.2.0/tests/gdata_tests/docs/__init__.py
gdata.py-1.2.0/tests/gdata_tests/docs/service_test.py
gdata.py-1.2.0/tests/gdata_tests/photos/
gdata.py-1.2.0/tests/gdata_tests/photos/__init__.py
gdata.py-1.2.0/tests/gdata_tests/photos/service_test.py
gdata.py-1.2.0/tests/gdata_tests/spreadsheet/
gdata.py-1.2.0/tests/gdata_tests/spreadsheet/__init__.py
gdata.py-1.2.0/tests/gdata_tests/spreadsheet/service_test.py
gdata.py-1.2.0/tests/gdata_tests/spreadsheet/text_db_test.py
gdata.py-1.2.0/tests/gdata_tests/youtube/
gdata.py-1.2.0/tests/gdata_tests/youtube/__init__.py
gdata.py-1.2.0/tests/gdata_tests/youtube/service_test.py
gdata.py-1.2.0/tests/gdata_tests/__init__.py
gdata.py-1.2.0/tests/gdata_tests/apps_test.py
gdata.py-1.2.0/tests/gdata_tests/auth_test.py
gdata.py-1.2.0/tests/gdata_tests/base_test.py
gdata.py-1.2.0/tests/gdata_tests/blogger_test.py
gdata.py-1.2.0/tests/gdata_tests/calendar_test.py
gdata.py-1.2.0/tests/gdata_tests/client_online_test.py
gdata.py-1.2.0/tests/gdata_tests/client_test.py
gdata.py-1.2.0/tests/gdata_tests/codesearch_test.py
gdata.py-1.2.0/tests/gdata_tests/contacts_test.py
gdata.py-1.2.0/tests/gdata_tests/docs_test.py
gdata.py-1.2.0/tests/gdata_tests/photos_test.py
gdata.py-1.2.0/tests/gdata_tests/service_test.py
gdata.py-1.2.0/tests/gdata_tests/spreadsheet_test.py
gdata.py-1.2.0/tests/gdata_tests/youtube_test.py
gdata.py-1.2.0/tests/__init__.py
gdata.py-1.2.0/tests/atom_test.py
gdata.py-1.2.0/tests/gdata_test.py
gdata.py-1.2.0/tests/module_test_runner.py
gdata.py-1.2.0/tests/run_all_tests.py
gdata.py-1.2.0/tests/run_data_tests.py
gdata.py-1.2.0/tests/run_service_tests.py
gdata.py-1.2.0/tests/testimage.jpg
gdata.py-1.2.0/README.txt
gdata.py-1.2.0/RELEASE_NOTES.txt
gdata.py-1.2.0/INSTALL.txt
gdata.py-1.2.0/MANIFEST
gdata.py-1.2.0/setup.py
gdata.py-1.2.0/PKG-INFO
# And finally... replace the local copies with the updated API libs.
jonathan$ cp -r gdata.py-1.2.0/src/gdata gdata.py-1.2.0/src/atom .
Try again and... Resolved! Thanks again for the pointer Jeff