Updated versions
diff --git a/samples/gan/ccoffers/offers.py b/samples/gan/ccoffers/offers.py
index 6e5168c..ddc967a 100644
--- a/samples/gan/ccoffers/offers.py
+++ b/samples/gan/ccoffers/offers.py
@@ -21,7 +21,8 @@
from apiclient.discovery import build
from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run
settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
@@ -30,20 +31,30 @@
FLAGS = gflags.FLAGS
-# Set up a Flow object to be used if we need to authenticate. This
-# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
-# the information it needs to authenticate. Note that it is called
-# the Web Server Flow, but it can also handle the flow for native
-# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
-# The client_id client_secret are copied from the API Access tab on
-# the Google APIs Console <http://code.google.com/apis/console>. When
-# creating credentials for this application be sure to choose an Application
-# type of "Installed application".
-FLOW = OAuth2WebServerFlow(
- client_id='767567128246-ti2q06i1neqm5boe2m1pqdc2riivhk41.apps.googleusercontent.com',
- client_secret='UtdXI8nKD2SEcQRLQDZPkGT9',
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = '../client_secrets.json'
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+ %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/gan.readonly',
- user_agent='gan-ccoffers-sample/1.0')
+ message=MISSING_CLIENT_SECRETS_MESSAGE)
# The gflags module makes defining command-line options easy for
# applications. Run this program with the '--help' argument to see
@@ -55,10 +66,10 @@
gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
'Set how to output the results received from the API')
-gflags.DEFINE_string('credentials_filename', 'offers.dat',
+gflags.DEFINE_string('credentials_filename', '../credentials.dat',
'File to store credentials in', short_name='cf')
-gflags.DEFINE_multistring('advertiser', None,
+gflags.DEFINE_multistring('advertiser', [],
'If given, advertiser we should run as')
@@ -100,16 +111,15 @@
ccOffers = service.ccOffers()
# Retrieve the relevant offers.
- list_call = ccOffers.list(publisher=publisher,
- # TODO(leadpipe): add back when advertiser is repeated
- # advertiser=FLAGS.advertiser,
- projection='full')
- list = list_call.execute()
- list['publisher'] = publisher
+ request = ccOffers.list(publisher=publisher,
+ advertiser=FLAGS.advertiser,
+ projection='full')
+ response = request.execute()
+ response['publisher'] = publisher
if FLAGS.output_type in ["BOTH", "HTML"]:
template = get_template('offers_template.html')
- context = Context(list)
+ context = Context(response)
fname = '%s.html' % publisher
out = open(fname, 'w')
@@ -120,7 +130,7 @@
print 'Wrote %s' % fname
if FLAGS.output_type in ["BOTH", "STDOUT"]:
- print json.dumps(list, sort_keys=True, indent=4)
+ print json.dumps(response, sort_keys=True, indent=4)
if __name__ == '__main__':
main(sys.argv)
diff --git a/samples/gan/ccoffers/offers_template.html b/samples/gan/ccoffers/offers_template.html
index 4d1744a..4e52c03 100644
--- a/samples/gan/ccoffers/offers_template.html
+++ b/samples/gan/ccoffers/offers_template.html
@@ -14,6 +14,11 @@
}
tr.details td {
padding: 0 3ex;
+ min-width: 15%;
+ max-width: 33%;
+ }
+ tr.details td img {
+ max-width: 200px;
}
td pre {
margin: 3ex 3em;
@@ -33,7 +38,8 @@
</head>
<body>
<h1>Credit Card Offers for Publisher {{ publisher }}</h1>
-<table>
+{% if items %}
+<table cellspacing=5>
{% for item in items %}
<tr>
<td colspan=3 class="cardName">
@@ -45,18 +51,22 @@
{% if item.imageUrl %}
<img src="{{ item.imageUrl }}" title="Image from GAN" />
{% endif %}
- {% if item.logoUrl %}
- <img src="{{ item.logoUrl }}" title="Image from AdConnect" />
- {% endif %}
- {% if item.disclaimer %}
- <div>{{ item.disclaimer }}</div>
- {% endif %}
<td>
+ {% if item.aprDisplay %}
<div>APR: {{ item.aprDisplay }}</div>
+ {% endif %}
+ {% if item.annualFeeDisplay %}
<div>Annual Fee: {{ item.annualFeeDisplay }}</div>
+ {% endif %}
+ {% if item.gracePeriodDisplay %}
<div>Grace Period: {{ item.gracePeriodDisplay }}</div>
+ {% endif %}
+ {% if item.latePaymentFee %}
<div>Late Payment Fee: {{ item.latePaymentFee }}</div>
+ {% endif %}
+ {% if item.creditRatingDisplay %}
<div>Credit Rating: {{ item.creditRatingDisplay }}</div>
+ {% endif %}
<td>
{% if item.introAprDisplay %}
<div>Intro APR: {{ item.introAprDisplay }}</div>
@@ -88,12 +98,20 @@
</ul>
-->
</tr>
+<tr>
+ <td colspan=3>
+ {% if item.disclaimer %}
+ <div style="font-size:x-small">{{ item.disclaimer }}</div>
+ {% endif %}
+</tr>
<tr><td colspan=3><pre id="pre{{forloop.counter}}" style="display:none">
{{ item|pprint|linebreaks }}</pre>
-{% empty %}
<tr><td>
-<h2>Whoops, {{ publisher }} has no associated credit card offers.</h2>
{% endfor %}
</table>
+{% else %}
+<h2>Whoops, {{ publisher }} has no associated credit card offers.</h2>
+{% endif %}
+
</body>
</html>
diff --git a/samples/gan/events/events.py b/samples/gan/events/events.py
index 05a42c0..bc45167 100644
--- a/samples/gan/events/events.py
+++ b/samples/gan/events/events.py
@@ -3,7 +3,7 @@
#
# Copyright (C) 2011 Google Inc.
-"""Sample for retrieving credit-card offers from GAN."""
+"""Sample for retrieving event information from GAN."""
__author__ = 'leadpipe@google.com (Luke Blanshard)'
@@ -22,7 +22,8 @@
from apiclient.discovery import build
from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run
settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
@@ -31,20 +32,30 @@
FLAGS = gflags.FLAGS
-# Set up a Flow object to be used if we need to authenticate. This
-# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
-# the information it needs to authenticate. Note that it is called
-# the Web Server Flow, but it can also handle the flow for native
-# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
-# The client_id client_secret are copied from the API Access tab on
-# the Google APIs Console <http://code.google.com/apis/console>. When
-# creating credentials for this application be sure to choose an Application
-# type of "Installed application".
-FLOW = OAuth2WebServerFlow(
- client_id='767567128246-ti2q06i1neqm5boe2m1pqdc2riivhk41.apps.googleusercontent.com',
- client_secret='UtdXI8nKD2SEcQRLQDZPkGT9',
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = '../client_secrets.json'
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+ %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/gan.readonly',
- user_agent='gan-events-sample/1.0')
+ message=MISSING_CLIENT_SECRETS_MESSAGE)
# The gflags module makes defining command-line options easy for
# applications. Run this program with the '--help' argument to see
@@ -56,7 +67,7 @@
gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
'Set how to output the results received from the API')
-gflags.DEFINE_string('credentials_filename', 'events.dat',
+gflags.DEFINE_string('credentials_filename', '../credentials.dat',
'File to store credentials in', short_name='cf')
API_FLAGS = {'eventDateMin':None, 'eventDateMax':None, 'advertiserId':None,
@@ -146,15 +157,22 @@
params[key] = FLAGS[key].value
# Retrieve the relevant events.
+ all_items = []
try:
- list_call = events.list(**params)
- list = list_call.execute()
+ request = events.list(**params)
+ while request:
+ response = request.execute()
+ if FLAGS.output_type in ["BOTH", "STDOUT"]:
+ print json.dumps(response, sort_keys=True, indent=4)
+ all_items.extend(response['items'])
+ request = events.list_next(request, response)
+
except apiclient.errors.HttpError, e:
print json.dumps(e.__dict__, sort_keys=True, indent=4)
if FLAGS.output_type in ["BOTH", "HTML"]:
template = get_template('events_template.html')
- context = Context(list)
+ context = Context({'items':items})
out = open("output.html", 'w')
out.write(template.render(context).encode('UTF-8'))
@@ -163,8 +181,5 @@
print 'Wrote output.html'
- if FLAGS.output_type in ["BOTH", "STDOUT"]:
- print json.dumps(list, sort_keys=True, indent=4)
-
if __name__ == '__main__':
main(sys.argv)