7 from google
.appengine
.api
import users
8 from google
.appengine
.ext
import webapp
9 from google
.appengine
.ext
.webapp
.util
import run_wsgi_app
10 from google
.appengine
.ext
import db
11 from google
.appengine
.ext
.webapp
import template
12 from google
.appengine
.api
import memcache
17 class GreetingUser(db
.Model
):
18 greeting_user
= db
.UserProperty()
19 joined
= db
.DateTimeProperty(auto_now_add
=True)
20 picture
= db
.StringProperty()
21 seated
= db
.StringProperty()
22 website
= db
.StringProperty()
24 class Greeting(db
.Model
):
25 author
= db
.UserProperty()
26 content
= db
.StringProperty(multiline
=True)
27 date
= db
.DateTimeProperty(auto_now_add
=True)
29 class BaseRequestHandler(webapp
.RequestHandler
):
30 """Base request handler extends webapp.Request handler
32 It defines the generate method, which renders a Django template
33 in response to a web request
36 def generate(self
, template_name
, template_values
={}):
37 """Generate takes renders and HTML template along with values
38 passed to that template
41 template_name: A string that represents the name of the HTML template
42 template_values: A dictionary that associates objects with a string
43 assigned to that object to call in the HTML template. The defualt
44 is an empty dictionary.
46 # We check if there is a current user and generate a login or logout URL
47 user
= users
.get_current_user()
50 log_in_out_url
= users
.create_logout_url('/')
52 log_in_out_url
= users
.create_login_url(self
.request
.path
)
54 # We'll display the user name if available and the URL on all pages
55 values
= {'user': user
, 'log_in_out_url': log_in_out_url
}
56 values
.update(template_values
)
58 # Construct the path to the template
59 directory
= os
.path
.dirname(__file__
)
60 path
= os
.path
.join(directory
, 'templates', template_name
)
62 # Respond to the request by rendering the template
63 return template
.render(path
, values
, debug
=_DEBUG
)
65 class MainRequestHandler(BaseRequestHandler
):
67 if users
.get_current_user():
68 url
= users
.create_logout_url(self
.request
.uri
)
69 url_linktext
= 'Logout'
71 url
= users
.create_login_url(self
.request
.uri
)
72 url_linktext
= 'Login'
76 'url_linktext': url_linktext
,
79 self
.response
.out
.write(self
.generate('index.html', template_values
));
81 class ChatsRequestHandler(BaseRequestHandler
):
82 MEMCACHE_KEY
= 'greetings'
83 MEMCACHE_TEMPLATE
= 'greetings_template'
86 template
= memcache
.get(self
.MEMCACHE_TEMPLATE
)
87 self
.response
.out
.write(template
)
92 if users
.get_current_user():
93 greeting
.author
= users
.get_current_user()
95 greeting
.content
= self
.request
.get('content')
98 greetingsString
= memcache
.get(self
.MEMCACHE_KEY
)
99 if greetingsString
is None:
102 greetingsList
= pickle
.loads(greetingsString
)
103 if len(greetingsList
) >= 40:
105 greetingsList
.append(greeting
)
107 if not memcache
.set(self
.MEMCACHE_KEY
, pickle
.dumps(greetingsList
)):
108 logging
.debug("Memcache set failed:")
111 'greetings': greetingsList
,
113 template
= self
.generate('chats.html', template_values
)
114 if not memcache
.set(self
.MEMCACHE_TEMPLATE
, template
):
115 logging
.debug("Memcache set failed:")
117 self
.response
.out
.write(template
)
120 class EditUserProfileHandler(BaseRequestHandler
):
121 """This allows a user to edit his or her wiki profile. The user can upload
122 a picture and set a feed URL for personal data
125 # Get the user information
126 unescaped_user
= urllib
.unquote(user
)
127 greeting_user_object
= users
.User(unescaped_user
)
128 # Only that user can edit his or her profile
129 if users
.get_current_user() != greeting_user_object
:
130 self
.redirect('/view/StartPage')
132 greeting_user
= GreetingUser
.gql('WHERE greeting_user = :1', greeting_user_object
).get()
133 if not greeting_user
:
134 greeting_user
= GreetingUser(greeting_user
=greeting_user_object
)
137 self
.response
.out
.write(self
.generate('edit_user.html', template_values
={'queried_user': greeting_user
}))
139 def post(self
, user
):
140 # Get the user information
141 unescaped_user
= urllib
.unquote(user
)
142 greeting_user_object
= users
.User(unescaped_user
)
143 # Only that user can edit his or her profile
144 if users
.get_current_user() != greeting_user_object
:
147 greeting_user
= GreetingUser
.gql('WHERE greeting_user = :1', greeting_user_object
).get()
149 greeting_user
.picture
= self
.request
.get('user_picture')
150 greeting_user
.website
= self
.request
.get('user_website')
151 greeting_user
.seated
= self
.request
.get('user_seated')
155 self
.redirect('/user/%s' % user
)
157 class UserProfileHandler(BaseRequestHandler
):
158 """Allows a user to view another user's profile. All users are able to
159 view this information by requesting http://wikiapp.appspot.com/user/*
163 """When requesting the URL, we find out that user's WikiUser information.
164 We also retrieve articles written by the user
166 # Webob over quotes the request URI, so we have to unquote twice
167 unescaped_user
= urllib
.unquote(urllib
.unquote(user
))
169 # Query for the user information
170 greeting_user_object
= users
.User(unescaped_user
)
171 greeting_user
= GreetingUser
.gql('WHERE greeting_user = :1', greeting_user_object
).get()
173 # Generate the user profile
174 self
.response
.out
.write(self
.generate('user.html', template_values
={'queried_user': greeting_user
}))
177 application
= webapp
.WSGIApplication(
178 [('/', MainRequestHandler
),
179 ('/getchats', ChatsRequestHandler
),
180 ('/user/([^/]+)', UserProfileHandler
),
181 ('/edituser/([^/]+)', EditUserProfileHandler
)],
185 run_wsgi_app(application
)
187 if __name__
== "__main__":