Add a key field to messages and allow lookup of most recent message by key.
This commit is contained in:
11
api.py
11
api.py
@@ -50,8 +50,9 @@ def CreateChannel(google_user, client, args):
|
||||
def SendMessage(google_user, client, args):
|
||||
subject = args['subject']
|
||||
message = args['message']
|
||||
key = args.get('key', None)
|
||||
|
||||
models.Subject.FindOrCreate(subject).SendMessage(message, client.parent_key())
|
||||
models.Subject.FindOrCreate(subject).SendMessage(message, client.parent_key(), key)
|
||||
|
||||
return {}
|
||||
|
||||
@@ -90,10 +91,16 @@ def SetValue(google_user, client, args):
|
||||
def Subscribe(google_user, client, args):
|
||||
subject = models.Subject.FindOrCreate(args['subject'])
|
||||
messages = args.get('messages', 0)
|
||||
keys = args.get('keys', [])
|
||||
|
||||
return {
|
||||
ret = {
|
||||
'events': models.Subscription.FindOrCreate(subject, client, messages),
|
||||
}
|
||||
for key in keys:
|
||||
message = models.Subject.GetKey(key)
|
||||
if message:
|
||||
ret['events'].append(message)
|
||||
return ret
|
||||
|
||||
|
||||
def Unsubscribe(google_user, client, args):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -88,11 +88,15 @@ cosmopolite.Client.prototype.unsubscribe = function(subject) {
|
||||
});
|
||||
};
|
||||
|
||||
cosmopolite.Client.prototype.sendMessage = function(subject, message) {
|
||||
this.sendRPC_('sendMessage', {
|
||||
cosmopolite.Client.prototype.sendMessage = function(subject, message, key) {
|
||||
args = {
|
||||
'subject': subject,
|
||||
'message': message,
|
||||
});
|
||||
};
|
||||
if (key) {
|
||||
args['key'] = key;
|
||||
}
|
||||
this.sendRPC_('sendMessage', args);
|
||||
};
|
||||
|
||||
cosmopolite.Client.prototype.getMessages = function(subject) {
|
||||
|
||||
@@ -11,39 +11,49 @@ a {
|
||||
<div>Google user: <span id="google_user"></span></div>
|
||||
|
||||
<div>
|
||||
<div>
|
||||
Key:
|
||||
<select id="keys"></select>
|
||||
<input type="button" id="set" value="Set">
|
||||
<input type="button" id="add" value="Add">
|
||||
</div>
|
||||
<div>
|
||||
Last set:
|
||||
<span id="last_set"></span>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="public"> Public
|
||||
</div>
|
||||
<div>
|
||||
<textarea id="value" rows="10" cols="40"></textarea>
|
||||
</div>
|
||||
Key:
|
||||
<select id="keys"></select>
|
||||
<input type="button" id="set" value="Set">
|
||||
<input type="button" id="add" value="Add">
|
||||
</div>
|
||||
<hr>
|
||||
<div>
|
||||
<div>
|
||||
Subject:
|
||||
<input type="text" id="subject">
|
||||
<input type="button" id="subscribe" value="Subscribe">
|
||||
</div>
|
||||
<div>
|
||||
<select id="subscriptions"></select>
|
||||
<input type="button" id="unsubscribe" value="Unsubscribe">
|
||||
</div>
|
||||
<div>
|
||||
<input type="text" id="message">
|
||||
<input type="button" id="send" value="Send">
|
||||
</div>
|
||||
<div id="messages"></div>
|
||||
Last set:
|
||||
<span id="last_set"></span>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="public"> Public
|
||||
</div>
|
||||
<div>
|
||||
<textarea id="value" rows="10" cols="40"></textarea>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div>
|
||||
Subject: <input type="text" id="subject">
|
||||
<input type="button" id="subscribe" value="Subscribe">
|
||||
</div>
|
||||
<div>
|
||||
<select id="subscriptions"></select>
|
||||
<input type="button" id="unsubscribe" value="Unsubscribe">
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div>
|
||||
Message: <input type="text" id="message">
|
||||
</div>
|
||||
<div>
|
||||
Key: <input type="text" id="key">
|
||||
</div>
|
||||
<div>
|
||||
<input type="button" id="send" value="Send">
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div id="messages"></div>
|
||||
|
||||
<script>
|
||||
var keys = document.getElementById('keys');
|
||||
var value = document.getElementById('value');
|
||||
@@ -52,8 +62,11 @@ var is_public = document.getElementById('public');
|
||||
|
||||
var subject = document.getElementById('subject');
|
||||
var subscriptions = document.getElementById('subscriptions');
|
||||
var messages = document.getElementById('messages');
|
||||
|
||||
var message = document.getElementById('message');
|
||||
var key = document.getElementById('key');
|
||||
|
||||
var messages = document.getElementById('messages');
|
||||
|
||||
var selectKey = function(new_key) {
|
||||
keys.value = new_key;
|
||||
@@ -150,7 +163,7 @@ window.addEventListener('load', function() {
|
||||
});
|
||||
|
||||
document.getElementById('send').addEventListener('click', function() {
|
||||
debug.sendMessage(subscriptions.value, message.value);
|
||||
debug.sendMessage(subscriptions.value, message.value, key.value);
|
||||
});
|
||||
|
||||
document.getElementById('subscriptions').addEventListener('change', function() {
|
||||
|
||||
Reference in New Issue
Block a user