You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
6.9 KiB
208 lines
6.9 KiB
#!/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() |