Establish a definite ordering and sequential IDs for messages, at the expense of another datastore read/write pair.
This commit is contained in:
@@ -96,6 +96,8 @@ class Subject(db.Model):
|
|||||||
writable_only_by = db.ReferenceProperty(
|
writable_only_by = db.ReferenceProperty(
|
||||||
reference_class=Profile, collection_name='writable_subject_set')
|
reference_class=Profile, collection_name='writable_subject_set')
|
||||||
|
|
||||||
|
next_message_id = db.IntegerProperty(required=True, default=1)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def FindOrCreate(cls, name):
|
def FindOrCreate(cls, name):
|
||||||
subjects = cls.all().filter('name =', name).fetch(1)
|
subjects = cls.all().filter('name =', name).fetch(1)
|
||||||
@@ -110,7 +112,7 @@ class Subject(db.Model):
|
|||||||
query = (
|
query = (
|
||||||
Message.all()
|
Message.all()
|
||||||
.ancestor(self)
|
.ancestor(self)
|
||||||
.order('-created'))
|
.order('-id_'))
|
||||||
if num_messages <= 0:
|
if num_messages <= 0:
|
||||||
num_messages = None
|
num_messages = None
|
||||||
return reversed(query.fetch(limit=num_messages))
|
return reversed(query.fetch(limit=num_messages))
|
||||||
@@ -121,7 +123,7 @@ class Subject(db.Model):
|
|||||||
Message.all()
|
Message.all()
|
||||||
.ancestor(self)
|
.ancestor(self)
|
||||||
.filter('key_ =', key)
|
.filter('key_ =', key)
|
||||||
.order('-created')
|
.order('-id_')
|
||||||
.fetch(1))
|
.fetch(1))
|
||||||
if messages:
|
if messages:
|
||||||
return messages[0]
|
return messages[0]
|
||||||
@@ -145,11 +147,16 @@ class Subject(db.Model):
|
|||||||
if messages:
|
if messages:
|
||||||
raise DuplicateMessage(sender_message_id)
|
raise DuplicateMessage(sender_message_id)
|
||||||
|
|
||||||
|
message_id = self.next_message_id
|
||||||
|
self.next_message_id += 1
|
||||||
|
self.put()
|
||||||
|
|
||||||
obj = Message(
|
obj = Message(
|
||||||
parent=self,
|
parent=self,
|
||||||
message=message,
|
message=message,
|
||||||
sender=sender,
|
sender=sender,
|
||||||
sender_message_id=sender_message_id,
|
sender_message_id=sender_message_id,
|
||||||
|
id_=message_id,
|
||||||
key_=key)
|
key_=key)
|
||||||
obj.put()
|
obj.put()
|
||||||
|
|
||||||
@@ -202,13 +209,15 @@ class Message(db.Model):
|
|||||||
message = db.TextProperty(required=True)
|
message = db.TextProperty(required=True)
|
||||||
sender = db.ReferenceProperty(required=True, reference_class=Profile)
|
sender = db.ReferenceProperty(required=True, reference_class=Profile)
|
||||||
sender_message_id = db.StringProperty(required=True)
|
sender_message_id = db.StringProperty(required=True)
|
||||||
|
# id is reserved
|
||||||
|
id_ = db.IntegerProperty(required=True)
|
||||||
# key and key_name are reserved
|
# key and key_name are reserved
|
||||||
key_ = db.StringProperty()
|
key_ = db.StringProperty()
|
||||||
|
|
||||||
def ToEvent(self):
|
def ToEvent(self):
|
||||||
ret = {
|
ret = {
|
||||||
'event_type': 'message',
|
'event_type': 'message',
|
||||||
'id': self.key().id(),
|
'id': self.id_,
|
||||||
'sender': str(Message.sender.get_value_for_datastore(self)),
|
'sender': str(Message.sender.get_value_for_datastore(self)),
|
||||||
'subject': {
|
'subject': {
|
||||||
'name': self.parent().name,
|
'name': self.parent().name,
|
||||||
|
|||||||
Reference in New Issue
Block a user