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