Add a key field to messages and allow lookup of most recent message by key.

This commit is contained in:
Ian Gulliver
2014-05-11 15:43:45 +03:00
parent b7bd396c9b
commit 0575b8918d
4 changed files with 85 additions and 43 deletions

View File

@@ -27,6 +27,7 @@ import utils
# ↳ StateEntry
#
# Subject
# ↳ Message
# ↳ Subscription (⤴︎ Client)
@@ -132,7 +133,7 @@ class Subject(db.Model):
return cls(key_name=name).put()
@db.transactional()
def RecentMessages(self, num_messages):
def GetRecentMessages(self, num_messages):
query = (
Message.all()
.ancestor(self)
@@ -142,8 +143,20 @@ class Subject(db.Model):
return reversed(query.fetch(limit=num_messages))
@db.transactional()
def SendMessage(self, message, sender):
obj = Message(parent=self, message=message, sender=sender)
def GetKey(self, key):
messages = (
Message.all()
.ancestor(self)
.filter('key_ =', key)
.order('-created')
.fetch(1))
if messages:
return messages[0]
return None
@db.transactional()
def SendMessage(self, message, sender, key=None):
obj = Message(parent=self, message=message, sender=sender, key_=key)
obj.put()
event = obj.ToEvent()
@@ -169,7 +182,7 @@ class Subscription(db.Model):
cls(parent=subject, client=client).put()
if messages == 0:
return []
return [m.ToEvent() for m in subject.RecentMessages(messages)]
return [m.ToEvent() for m in subject.GetRecentMessages(messages)]
@classmethod
@db.transactional()
@@ -188,9 +201,11 @@ class Message(db.Model):
created = db.DateTimeProperty(required=True, auto_now_add=True)
message = db.TextProperty(required=True)
sender = db.ReferenceProperty(required=True, reference_class=Profile)
# key and key_name are reserved
key_ = db.StringProperty()
def ToEvent(self):
return {
ret = {
'event_type': 'message',
'id': self.key().id(),
'sender': str(Message.sender.get_value_for_datastore(self)),
@@ -198,3 +213,6 @@ class Message(db.Model):
'created': self.created,
'message': self.message,
}
if self.key_:
ret['key'] = self.key_
return ret