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()