New version of SampleSyncAdapter sample code that allows local editing
The changes made were pretty sweeping. The biggest addition was to allow on-device contact creation/editing, and supporting 2-way sync to the sample server that runs in Google App Engine. The client-side sample code also includes examples of how to support the user of AuthTokens (instead of always sending username/password to the server), how to change a contact's picture, and how to set IM-style status messages for each contact. I also greatly simplified the server code so that instead of mimicking both an addressbook and an IM-style status update system for multiple users, it really just simulates an addressbook for a single user. The server code also includes a cron job that (once a week) blows away the contact database, so that it's relatively self-cleaning. Change-Id: I017f1d3f9320a02fe05a20f1613846963107145e
This commit is contained in:
@@ -14,80 +14,51 @@
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
|
||||
"""Represents user's contact information, friends and credentials."""
|
||||
"""Represents user's contact information"""
|
||||
|
||||
from google.appengine.ext import db
|
||||
|
||||
|
||||
class User(db.Model):
|
||||
class Contact(db.Model):
|
||||
"""Data model class to hold user objects."""
|
||||
|
||||
handle = db.StringProperty(required=True)
|
||||
firstname = db.TextProperty()
|
||||
lastname = db.TextProperty()
|
||||
status = db.TextProperty()
|
||||
firstname = db.StringProperty()
|
||||
lastname = db.StringProperty()
|
||||
phone_home = db.PhoneNumberProperty()
|
||||
phone_office = db.PhoneNumberProperty()
|
||||
phone_mobile = db.PhoneNumberProperty()
|
||||
email = db.EmailProperty()
|
||||
status = db.TextProperty()
|
||||
avatar = db.BlobProperty()
|
||||
deleted = db.BooleanProperty()
|
||||
updated = db.DateTimeProperty(auto_now_add=True)
|
||||
|
||||
@classmethod
|
||||
def get_user_info(cls, username):
|
||||
def get_contact_info(cls, username):
|
||||
if username not in (None, ''):
|
||||
query = cls.gql('WHERE handle = :1', username)
|
||||
return query.get()
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def get_user_last_updated(cls, username):
|
||||
def get_contact_last_updated(cls, username):
|
||||
if username not in (None, ''):
|
||||
query = cls.gql('WHERE handle = :1', username)
|
||||
return query.get().updated
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def get_user_id(cls, username):
|
||||
def get_contact_id(cls, username):
|
||||
if username not in (None, ''):
|
||||
query = cls.gql('WHERE handle = :1', username)
|
||||
return query.get().key().id()
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def get_user_status(cls, username):
|
||||
def get_contact_status(cls, username):
|
||||
if username not in (None, ''):
|
||||
query = cls.gql('WHERE handle = :1', username)
|
||||
return query.get().status
|
||||
return None
|
||||
|
||||
|
||||
class UserCredentials(db.Model):
|
||||
"""Data model class to hold credentials for a Voiper user."""
|
||||
|
||||
username = db.StringProperty(required=True)
|
||||
password = db.StringProperty()
|
||||
|
||||
@classmethod
|
||||
def get(cls, username):
|
||||
if username not in (None, ''):
|
||||
query = cls.gql('WHERE username = :1', username)
|
||||
return query.get().password
|
||||
return None
|
||||
|
||||
|
||||
class UserFriends(db.Model):
|
||||
"""Data model class to hold user's friendlist info."""
|
||||
|
||||
username = db.StringProperty()
|
||||
friend_handle = db.StringProperty(required=True)
|
||||
updated = db.DateTimeProperty(auto_now_add=True)
|
||||
deleted = db.BooleanProperty()
|
||||
|
||||
@classmethod
|
||||
def get_friends(cls, username):
|
||||
if username not in (None, ''):
|
||||
query = cls.gql('WHERE username = :1', username)
|
||||
friends = query.fetch(50)
|
||||
return friends
|
||||
return None
|
||||
Reference in New Issue
Block a user