| #!/usr/bin/python2.5 | |
| # Copyright (C) 2010 The Android Open Source Project | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not | |
| # use this file except in compliance with the License. You may obtain a copy of | |
| # the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
| # License for the specific language governing permissions and limitations under | |
| # the License. | |
| """ | |
| Defines Django forms for inserting/updating/viewing contact data | |
| to/from SampleSyncAdapter datastore. | |
| """ | |
| import cgi | |
| import datetime | |
| import os | |
| from google.appengine.ext import db | |
| from google.appengine.ext import webapp | |
| from google.appengine.ext.webapp import template | |
| from google.appengine.ext.db import djangoforms | |
| from model import datastore | |
| from google.appengine.api import images | |
| import wsgiref.handlers | |
| class BaseRequestHandler(webapp.RequestHandler): | |
| """ | |
| Base class for our page-based request handlers that contains | |
| some helper functions we use in most pages. | |
| """ | |
| """ | |
| Return a form (potentially partially filled-in) to | |
| the user. | |
| """ | |
| def send_form(self, title, action, contactId, handle, content_obj): | |
| if (contactId >= 0): | |
| idInfo = '<input type="hidden" name="_id" value="%s">' | |
| else: | |
| idInfo = '' | |
| template_values = { | |
| 'title': title, | |
| 'header': title, | |
| 'action': action, | |
| 'contactId': contactId, | |
| 'handle': handle, | |
| 'has_contactId': (contactId >= 0), | |
| 'has_handle': (handle != None), | |
| 'form_data_rows': str(content_obj) | |
| } | |
| path = os.path.join(os.path.dirname(__file__), 'templates', 'simple_form.html') | |
| self.response.out.write(template.render(path, template_values)) | |
| class ContactForm(djangoforms.ModelForm): | |
| """Represents django form for entering contact info.""" | |
| class Meta: | |
| model = datastore.Contact | |
| class ContactInsertPage(BaseRequestHandler): | |
| """ | |
| Processes requests to add a new contact. GET presents an empty | |
| contact form for the user to fill in. POST saves the new contact | |
| with the POSTed information. | |
| """ | |
| def get(self): | |
| self.send_form('Add Contact', '/add_contact', -1, None, ContactForm()) | |
| def post(self): | |
| data = ContactForm(data=self.request.POST) | |
| if data.is_valid(): | |
| # Save the data, and redirect to the view page | |
| entity = data.save(commit=False) | |
| entity.put() | |
| self.redirect('/') | |
| else: | |
| # Reprint the form | |
| self.send_form('Add Contact', '/add_contact', -1, None, data) | |
| class ContactEditPage(BaseRequestHandler): | |
| """ | |
| Process requests to edit a contact's information. GET presents a form | |
| with the current contact information filled in. POST saves new information | |
| into the contact record. | |
| """ | |
| def get(self): | |
| id = int(self.request.get('id')) | |
| contact = datastore.Contact.get(db.Key.from_path('Contact', id)) | |
| self.send_form('Edit Contact', '/edit_contact', id, contact.handle, | |
| ContactForm(instance=contact)) | |
| def post(self): | |
| id = int(self.request.get('id')) | |
| contact = datastore.Contact.get(db.Key.from_path('Contact', id)) | |
| data = ContactForm(data=self.request.POST, instance=contact) | |
| if data.is_valid(): | |
| # Save the data, and redirect to the view page | |
| entity = data.save(commit=False) | |
| entity.updated = datetime.datetime.utcnow() | |
| entity.put() | |
| self.redirect('/') | |
| else: | |
| # Reprint the form | |
| self.send_form('Edit Contact', '/edit_contact', id, contact.handle, data) | |
| class ContactDeletePage(BaseRequestHandler): | |
| """Processes delete contact request.""" | |
| def get(self): | |
| id = int(self.request.get('id')) | |
| contact = datastore.Contact.get(db.Key.from_path('Contact', id)) | |
| contact.deleted = True | |
| contact.updated = datetime.datetime.utcnow() | |
| contact.put() | |
| self.redirect('/') | |
| class AvatarEditPage(webapp.RequestHandler): | |
| """ | |
| Processes requests to edit contact's avatar. GET is used to fetch | |
| a page that displays the contact's current avatar and allows the user | |
| to specify a file containing a new avatar image. POST is used to | |
| submit the form which will change the contact's avatar. | |
| """ | |
| def get(self): | |
| id = int(self.request.get('id')) | |
| contact = datastore.Contact.get(db.Key.from_path('Contact', id)) | |
| template_values = { | |
| 'avatar': contact.avatar, | |
| 'contactId': id | |
| } | |
| path = os.path.join(os.path.dirname(__file__), 'templates', 'edit_avatar.html') | |
| self.response.out.write(template.render(path, template_values)) | |
| def post(self): | |
| id = int(self.request.get('id')) | |
| contact = datastore.Contact.get(db.Key.from_path('Contact', id)) | |
| #avatar = images.resize(self.request.get("avatar"), 128, 128) | |
| avatar = self.request.get("avatar") | |
| contact.avatar = db.Blob(avatar) | |
| contact.updated = datetime.datetime.utcnow() | |
| contact.put() | |
| self.redirect('/') | |
| class AvatarViewPage(BaseRequestHandler): | |
| """ | |
| Processes request to view contact's avatar. This is different from | |
| the GET AvatarEditPage request in that this doesn't return a page - | |
| it just returns the raw image itself. | |
| """ | |
| def get(self): | |
| id = int(self.request.get('id')) | |
| contact = datastore.Contact.get(db.Key.from_path('Contact', id)) | |
| if (contact.avatar): | |
| self.response.headers['Content-Type'] = "image/png" | |
| self.response.out.write(contact.avatar) | |
| else: | |
| self.redirect(self.request.host_url + '/static/img/default_avatar.gif') | |
| class ContactsListPage(webapp.RequestHandler): | |
| """ | |
| Display a page that lists all the contacts associated with | |
| the specifies user account. | |
| """ | |
| def get(self): | |
| contacts = datastore.Contact.all() | |
| template_values = { | |
| 'contacts': contacts, | |
| 'username': 'user' | |
| } | |
| path = os.path.join(os.path.dirname(__file__), 'templates', 'contacts.html') | |
| self.response.out.write(template.render(path, template_values)) | |
| def main(): | |
| application = webapp.WSGIApplication( | |
| [('/', ContactsListPage), | |
| ('/add_contact', ContactInsertPage), | |
| ('/edit_contact', ContactEditPage), | |
| ('/delete_contact', ContactDeletePage), | |
| ('/avatar', AvatarViewPage), | |
| ('/edit_avatar', AvatarEditPage) | |
| ], | |
| debug=True) | |
| wsgiref.handlers.CGIHandler().run(application) | |
| if __name__ == '__main__': | |
| main() |