• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python2.5
2
3# Copyright (C) 2010 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may not
6# use this file except in compliance with the License. You may obtain a copy of
7# the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations under
15# the License.
16
17"""Defines Django forms for inserting/updating/viewing data
18   to/from SampleSyncAdapter datastore."""
19
20import cgi
21import datetime
22import os
23
24from google.appengine.ext import db
25from google.appengine.ext import webapp
26from google.appengine.ext.webapp import template
27from google.appengine.ext.db import djangoforms
28from model import datastore
29
30import wsgiref.handlers
31
32
33class UserForm(djangoforms.ModelForm):
34  """Represents django form for entering user info."""
35
36  class Meta:
37    model = datastore.User
38
39
40class UserInsertPage(webapp.RequestHandler):
41  """Inserts new users. GET presents a blank form. POST processes it."""
42
43  def get(self):
44    self.response.out.write('<html><body>'
45                            '<form method="POST" '
46                            'action="/add_user">'
47                            '<table>')
48    # This generates our shopping list form and writes it in the response
49    self.response.out.write(UserForm())
50    self.response.out.write('</table>'
51                            '<input type="submit">'
52                            '</form></body></html>')
53
54  def post(self):
55    data = UserForm(data=self.request.POST)
56    if data.is_valid():
57      # Save the data, and redirect to the view page
58      entity = data.save(commit=False)
59      entity.put()
60      self.redirect('/users')
61    else:
62      # Reprint the form
63      self.response.out.write('<html><body>'
64                              '<form method="POST" '
65                              'action="/">'
66                              '<table>')
67      self.response.out.write(data)
68      self.response.out.write('</table>'
69                              '<input type="submit">'
70                              '</form></body></html>')
71
72
73class UserEditPage(webapp.RequestHandler):
74  """Edits users. GET presents a form prefilled with user info
75     from datastore. POST processes it."""
76
77  def get(self):
78    id = int(self.request.get('user'))
79    user = datastore.User.get(db.Key.from_path('User', id))
80    self.response.out.write('<html><body>'
81                            '<form method="POST" '
82                            'action="/edit_user">'
83                            '<table>')
84    # This generates our shopping list form and writes it in the response
85    self.response.out.write(UserForm(instance=user))
86    self.response.out.write('</table>'
87                            '<input type="hidden" name="_id" value="%s">'
88                            '<input type="submit">'
89                            '</form></body></html>' % id)
90
91  def post(self):
92    id = int(self.request.get('_id'))
93    user = datastore.User.get(db.Key.from_path('User', id))
94    data = UserForm(data=self.request.POST, instance=user)
95    if data.is_valid():
96      # Save the data, and redirect to the view page
97      entity = data.save(commit=False)
98      entity.updated = datetime.datetime.utcnow()
99      entity.put()
100      self.redirect('/users')
101    else:
102      # Reprint the form
103      self.response.out.write('<html><body>'
104                              '<form method="POST" '
105                              'action="/edit_user">'
106                              '<table>')
107      self.response.out.write(data)
108      self.response.out.write('</table>'
109                              '<input type="hidden" name="_id" value="%s">'
110                              '<input type="submit">'
111                              '</form></body></html>' % id)
112
113
114class UsersListPage(webapp.RequestHandler):
115  """Lists all Users. In addition displays links for editing user info,
116     viewing user's friends and adding new users."""
117
118  def get(self):
119    users = datastore.User.all()
120    template_values = {
121        'users': users
122        }
123
124    path = os.path.join(os.path.dirname(__file__), 'templates', 'users.html')
125    self.response.out.write(template.render(path, template_values))
126
127
128class UserCredentialsForm(djangoforms.ModelForm):
129  """Represents django form for entering user's credentials."""
130
131  class Meta:
132    model = datastore.UserCredentials
133
134
135class UserCredentialsInsertPage(webapp.RequestHandler):
136  """Inserts user credentials. GET shows a blank form, POST processes it."""
137
138  def get(self):
139    self.response.out.write('<html><body>'
140                            '<form method="POST" '
141                            'action="/add_credentials">'
142                            '<table>')
143    # This generates our shopping list form and writes it in the response
144    self.response.out.write(UserCredentialsForm())
145    self.response.out.write('</table>'
146                            '<input type="submit">'
147                            '</form></body></html>')
148
149  def post(self):
150    data = UserCredentialsForm(data=self.request.POST)
151    if data.is_valid():
152      # Save the data, and redirect to the view page
153      entity = data.save(commit=False)
154      entity.put()
155      self.redirect('/users')
156    else:
157      # Reprint the form
158      self.response.out.write('<html><body>'
159                              '<form method="POST" '
160                              'action="/add_credentials">'
161                              '<table>')
162      self.response.out.write(data)
163      self.response.out.write('</table>'
164                              '<input type="submit">'
165                              '</form></body></html>')
166
167
168class UserFriendsForm(djangoforms.ModelForm):
169  """Represents django form for entering user's friends."""
170
171  class Meta:
172    model = datastore.UserFriends
173    exclude = ['deleted', 'username']
174
175
176class UserFriendsInsertPage(webapp.RequestHandler):
177  """Inserts user's new friends. GET shows a blank form, POST processes it."""
178
179  def get(self):
180    user = self.request.get('user')
181    self.response.out.write('<html><body>'
182                            '<form method="POST" '
183                            'action="/add_friend">'
184                            '<table>')
185    # This generates our shopping list form and writes it in the response
186    self.response.out.write(UserFriendsForm())
187    self.response.out.write('</table>'
188                            '<input type = hidden name = "user" value = "%s">'
189                            '<input type="submit">'
190                            '</form></body></html>' % user)
191
192  def post(self):
193    data = UserFriendsForm(data=self.request.POST)
194    if data.is_valid():
195      user = self.request.get('user')
196      # Save the data, and redirect to the view page
197      entity = data.save(commit=False)
198      entity.username = user
199      query = datastore.UserFriends.all()
200      query.filter('username = ', user)
201      query.filter('friend_handle = ', entity.friend_handle)
202      result = query.get()
203      if result:
204	result.deleted = False
205	result.updated = datetime.datetime.utcnow()
206	result.put()
207      else:
208        entity.deleted = False
209        entity.put()
210      self.redirect('/user_friends?user=' + user)
211    else:
212      # Reprint the form
213      self.response.out.write('<html><body>'
214                              '<form method="POST" '
215                              'action="/add_friend">'
216                              '<table>')
217      self.response.out.write(data)
218      self.response.out.write('</table>'
219                              '<input type="submit">'
220                              '</form></body></html>')
221
222
223class UserFriendsListPage(webapp.RequestHandler):
224  """Lists all friends for a user. In addition displays links for removing
225     friends and adding new friends."""
226
227  def get(self):
228    user = self.request.get('user')
229    query = datastore.UserFriends.all()
230    query.filter('deleted = ', False)
231    query.filter('username = ', user)
232    friends = query.fetch(50)
233    template_values = {
234        'friends': friends,
235        'user': user
236        }
237    path = os.path.join(os.path.dirname(__file__),
238                        'templates', 'view_friends.html')
239    self.response.out.write(template.render(path, template_values))
240
241
242class DeleteFriendPage(webapp.RequestHandler):
243  """Processes delete friend request."""
244
245  def get(self):
246    user = self.request.get('user')
247    friend = self.request.get('friend')
248    query = datastore.UserFriends.all()
249    query.filter('username =', user)
250    query.filter('friend_handle =', friend)
251    result = query.get()
252    result.deleted = True
253    result.updated = datetime.datetime.utcnow()
254    result.put()
255
256    self.redirect('/user_friends?user=' + user)
257
258
259def main():
260  application = webapp.WSGIApplication(
261      [('/add_user', UserInsertPage),
262       ('/users', UsersListPage),
263       ('/add_credentials', UserCredentialsInsertPage),
264       ('/add_friend', UserFriendsInsertPage),
265       ('/user_friends', UserFriendsListPage),
266       ('/delete_friend', DeleteFriendPage),
267       ('/edit_user', UserEditPage)
268      ],
269      debug=True)
270  wsgiref.handlers.CGIHandler().run(application)
271
272if __name__ == '__main__':
273  main()