Clock4
index.yaml
indexes:
# AUTOGENERATED
# This index.yaml is automatically updated whenever the dev_appserver
# detects that a new type of query is run. If you want to manage the
# index.yaml file manually, remove the above marker line (the line
# saying "# AUTOGENERATED"). If you want to manage some indexes
# manually, move them above the marker line. The index.yaml file is
# automatically uploaded to the admin console when you next deploy
# your application using appcfg.py.
app.yaml
application: clock
version: 1
runtime: python
api_version: 1
handlers:
- url: /prefs
script: prefs.py
login: required
- url: /.*
script: main.py
main.py
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import datetime
import models
class MainPage(webapp.RequestHandler):
def get(self):
time = datetime.datetime.now()
user = users.get_current_user()
if not user:
navbar = ('<p>Welcome! <a href="%s">Sign in or register</a> to customize.</p>'
% (users.create_login_url(self.request.path)))
tz_form = ''
else:
userprefs = models.get_userprefs()
navbar = ('<p>Welcome, %s! You can <a href="%s">sign out</a>.</p>'
% (user.nickname(), users.create_logout_url(self.request.path)))
tz_form = '''
<form action="/prefs" method="post">
<label for="tz_offset">
Timezone offset from UTC (can be negative):
</label>
<input name="tz_offset" id="tz_offset" type="text"
size="4" value="%d" />
<input type="submit" value="Set" />
</form>
''' % userprefs.tz_offset
time += datetime.timedelta(0, 0, 0, 0, 0, userprefs.tz_offset)
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('''
<html>
<head>
<title>The Time Is...</title>
</head>
<body>
%s
<p>The time is: %s</p>
%s
</body>
</html>
''' % (navbar, str(time), tz_form))
application = webapp.WSGIApplication([('/', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
models.py
from google.appengine.api import users
from google.appengine.ext import db
class UserPrefs(db.Model):
tz_offset = db.IntegerProperty(default=0)
user = db.UserProperty(auto_current_user_add=True)
def get_userprefs(user_id=None):
if not user_id:
user = users.get_current_user()
if not user:
return None
user_id = user.user_id()
key = db.Key.from_path('UserPrefs', user_id)
userprefs = db.get(key)
if not userprefs:
userprefs = UserPrefs(key_name=user_id)
return userprefs
prefs.py
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import models
class PrefsPage(webapp.RequestHandler):
def post(self):
userprefs = models.get_userprefs()
try:
tz_offset = int(self.request.get('tz_offset'))
userprefs.tz_offset = tz_offset
userprefs.put()
except ValueError:
# User entered a value that wasn't an integer. Ignore for now.
pass
self.redirect('/')
application = webapp.WSGIApplication([('/prefs', PrefsPage)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()