gdata calendar interface

7 views
Skip to first unread message

Mike Metcalfe

unread,
Oct 28, 2008, 5:46:43 PM10/28/08
to google-a...@googlegroups.com
Hi,

I'm new to GAE and I've started building an accommodation booking app with gdata calendar. So far I have a BookingAgent, a Resource (a room) and a Booking. The Getting Started stuff commuicates with the calendar with simple methods but I would prefer to use interfaces. So I will make the Resource implement the calendar interface and the Booking that of the event. I was hoping someone has sample code with classes that implements one or both of these interfaces to help me on my way.

Thanx in advance.
Mike

Jeff S

unread,
Oct 29, 2008, 2:37:20 PM10/29/08
to Google App Engine
Hi Mike,

I'm not sure what you mean by the two interfaces. Could you describe
these in more detail? As far as using the Google Calendar Data API
from within App Engine, I have some sample code if you are interested.

Happy coding,

Jeff

Mike Metcalfe

unread,
Oct 29, 2008, 4:15:35 PM10/29/08
to google-a...@googlegroups.com
Hi Jeff,

2008/10/29 Jeff S <j...@google.com>
I'm not sure what you mean by the two interfaces. Could you describe
these in more detail?
The only python development I've done before is using Zope and Plone which allow interface classes and the base classes have an 'implements'  method. This allows you to have one class implement another class's behaviour without subclassing it - allowing inheritance from more than one super class. I was hoping to have my Resource class implement the Calendar's behaviour. I suppose it should just use normal subclassing.

As far as using the Google Calendar Data API
from within App Engine, I have some sample code if you are interested.
I'm interested!

Mike

Jeff S

unread,
Oct 30, 2008, 2:04:01 PM10/30/08
to Google App Engine
Hi Mike,

I have been working on a sample app here and there which allows users
to create an event and optionally add it to their Google Calendar.
Since the primary storage for these events in my example app is in the
App Engine datastore, I've defined a model for an event:

class Event(db.Model):
title = db.StringProperty(required=True)
description = db.TextProperty()
time = db.DateTimeProperty()
creator = db.UserProperty()
edit_link = db.TextProperty()
gcal_event_link = db.TextProperty()

class Attendee(db.Model):
email = db.StringProperty()
event = db.ReferenceProperty(Event)

You probably don't need this, but I point it out because I use these
models to construct the Google Caledar event Atom entry which I send
using the gdata-python-client. Adding the event to Google Calendar in
my sample app looks like this:

# Create a Google Calendar client to talk to the Google Calendar
service.
self.calendar_client = gdata.calendar.service.CalendarService()
# Modify the client to search for auth tokens in the datastore and
use
# urlfetch instead of httplib to make HTTP requests to Google
Calendar.
gdata.alt.appengine.run_on_appengine(self.calendar_client)

...

# Create a new Google Calendar event.
event_entry = gdata.calendar.CalendarEventEntry()
event_entry.title = atom.Title(text=event.title)
event_entry.content = atom.Content(text=event.description)
start_time = '%s.000Z' % event.time.isoformat()

event_entry.when.append(gdata.calendar.When(start_time=start_time))
# Add a who element for each attendee.
if attendee_list:
for attendee in attendee_list:
new_attendee = gdata.calendar.Who()
new_attendee.email = attendee.email
event_entry.who.append(new_attendee)

# Send the event information to Google Calendar and receive a
# Google Calendar event.
try:
cal_event = self.calendar_client.InsertEvent(event_entry,
'http://www.google.com/calendar/feeds/default/private/
full')
edit_link = cal_event.GetEditLink()
if edit_link and edit_link.href:
# Add the edit link to the Calendar event to use for making
changes.
event.edit_link = edit_link.href
alternate_link = cal_event.GetHtmlLink()
if alternate_link and alternate_link.href:
# Add a link to the event in the Google Calendar HTML web
UI.
event.gcal_event_link = alternate_link.href
event.put()
except gdata.service.RequestError, request_exception:
request_error = request_exception[0]
# Handle any insert failures here.

Note in the above I require the user to be signed in to the app before
getting to the event creation step. Note also, I'm interested in
saving the edit link from the Google Calendar event entry, which is
the URL which needs to be used when sending event changes to Google
Calendar. I also save the alternate link which is the ULR of the event
in the Google Calendar UI.

Please refer to the Google Calendar developer's guide for a more
detailed list of the what and how of using the Python client library
with Google Calendar:

http://code.google.com/apis/calendar/developers_guide_python.html

Happy coding,

Jeff

Jeff S

unread,
Oct 30, 2008, 2:10:27 PM10/30/08
to Google App Engine
Hi again Mike,

I neglected to mention obtaining an AuthSub token to allow your app to
write to a user's Google Calendar. This process can be found in the
following article:

http://code.google.com/appengine/articles/gdata.html

And in the sample app that I'm currently writing, I use the following
to generate the AuthSub token request URL which the user needs to
visit the first time they try to create a Google Calendar event:

# Check to see if the app has permission to write to the user's
# Google Calendar.
if not isinstance(self.calendar_client.token_store.find_token(
'http://www.google.com/calendar/feeds/default/private/
full'),
gdata.auth.AuthSubToken):
token_request_url =
gdata.auth.generate_auth_sub_url(self.request.uri,
('http://www.google.com/calendar/feeds/default/private/
full',))

When the user authorizes the app and is redirected back to this page,
I obtain the AuthSub token and store it for future use:

# Find an AuthSub token in the current URL if we arrived at this
page from
# an AuthSub redirect.
auth_token =
gdata.auth.extract_auth_sub_token_from_url(self.request.uri)
if auth_token:
self.calendar_client.SetAuthSubToken(
self.calendar_client.upgrade_to_session_token(auth_token))

Thank you,

Jeff
Reply all
Reply to author
Forward
0 new messages