Event cleanup pipeline.
This commit is contained in:
3
api.py
3
api.py
@@ -56,6 +56,9 @@ def Poll(google_user, client, client_address, instance_id, args):
|
|||||||
instance = models.Instance.FindOrCreate(instance_id, polling=True, active=True)
|
instance = models.Instance.FindOrCreate(instance_id, polling=True, active=True)
|
||||||
assert instance.polling
|
assert instance.polling
|
||||||
|
|
||||||
|
# Update last_poll
|
||||||
|
instance.save()
|
||||||
|
|
||||||
events = []
|
events = []
|
||||||
if google_user:
|
if google_user:
|
||||||
events.append({
|
events.append({
|
||||||
|
|||||||
15
channel.py
15
channel.py
@@ -29,7 +29,6 @@ class OnChannelConnect(webapp2.RequestHandler):
|
|||||||
@db.transactional()
|
@db.transactional()
|
||||||
def post(self):
|
def post(self):
|
||||||
instance_id = self.request.get('from')
|
instance_id = self.request.get('from')
|
||||||
logging.info('Instance: %s', instance_id)
|
|
||||||
instance = models.Instance.FromID(instance_id)
|
instance = models.Instance.FromID(instance_id)
|
||||||
if not instance:
|
if not instance:
|
||||||
logging.warning('Channel opened with invalid instance_id: %s', instance_id)
|
logging.warning('Channel opened with invalid instance_id: %s', instance_id)
|
||||||
@@ -47,18 +46,8 @@ class OnChannelDisconnect(webapp2.RequestHandler):
|
|||||||
@utils.local_namespace
|
@utils.local_namespace
|
||||||
def post(self):
|
def post(self):
|
||||||
instance_id = self.request.get('from')
|
instance_id = self.request.get('from')
|
||||||
logging.info('Instance: %s', instance_id)
|
instance = models.Instance.FromID(instance_id)
|
||||||
instance_key = db.Key.from_path('Instance', instance_id)
|
instance.Delete()
|
||||||
|
|
||||||
subscriptions = list(models.Subscription.all().filter('instance =', instance_key))
|
|
||||||
if subscriptions:
|
|
||||||
db.delete(subscriptions)
|
|
||||||
|
|
||||||
pins = models.Pin.all().filter('instance =', instance_key)
|
|
||||||
for pin in pins:
|
|
||||||
pin.Delete()
|
|
||||||
|
|
||||||
db.delete(instance_key)
|
|
||||||
|
|
||||||
|
|
||||||
app = webapp2.WSGIApplication([
|
app = webapp2.WSGIApplication([
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ handlers:
|
|||||||
script: cosmopolite.auth.app
|
script: cosmopolite.auth.app
|
||||||
secure: always
|
secure: always
|
||||||
|
|
||||||
|
- url: /cosmopolite/cron/.*
|
||||||
|
script: cosmopolite.cron.app
|
||||||
|
login: admin
|
||||||
|
|
||||||
- url: /_ah/channel/.*
|
- url: /_ah/channel/.*
|
||||||
script: cosmopolite.channel.app
|
script: cosmopolite.channel.app
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ class Instance(db.Model):
|
|||||||
# key_name=instance_id
|
# key_name=instance_id
|
||||||
active = db.BooleanProperty(required=True, default=False)
|
active = db.BooleanProperty(required=True, default=False)
|
||||||
polling = db.BooleanProperty(required=True, default=False)
|
polling = db.BooleanProperty(required=True, default=False)
|
||||||
|
last_poll = db.DateTimeProperty(required=True, auto_now=True)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def FromID(cls, instance_id):
|
def FromID(cls, instance_id):
|
||||||
@@ -105,6 +106,19 @@ class Instance(db.Model):
|
|||||||
logging.info('Instance: %s', instance_id)
|
logging.info('Instance: %s', instance_id)
|
||||||
return cls.get_or_insert(instance_id, **kwargs)
|
return cls.get_or_insert(instance_id, **kwargs)
|
||||||
|
|
||||||
|
def Delete(self):
|
||||||
|
logging.info('Deleting instance %s', self.key().name())
|
||||||
|
|
||||||
|
subscriptions = Subscription.all().filter('instance =', self)
|
||||||
|
for subscription in subscriptions:
|
||||||
|
subscription.Delete()
|
||||||
|
|
||||||
|
pins = Pin.all().filter('instance =', self)
|
||||||
|
for pin in pins:
|
||||||
|
pin.Delete()
|
||||||
|
|
||||||
|
self.delete()
|
||||||
|
|
||||||
def GetSubscriptions(self):
|
def GetSubscriptions(self):
|
||||||
return (
|
return (
|
||||||
Subscription.all()
|
Subscription.all()
|
||||||
@@ -327,6 +341,7 @@ class Subject(db.Model):
|
|||||||
.filter('instance =', instance_key))
|
.filter('instance =', instance_key))
|
||||||
|
|
||||||
events = []
|
events = []
|
||||||
|
# TODO: bulk delete
|
||||||
for pin in pins:
|
for pin in pins:
|
||||||
events.append(pin.ToEvent(event_type='unpin'))
|
events.append(pin.ToEvent(event_type='unpin'))
|
||||||
pin.delete()
|
pin.delete()
|
||||||
@@ -428,7 +443,7 @@ class Subscription(db.Model):
|
|||||||
.filter('readable_only_by_me =', readable_only_by_me)
|
.filter('readable_only_by_me =', readable_only_by_me)
|
||||||
.filter('writable_only_by_me =', writable_only_by_me))
|
.filter('writable_only_by_me =', writable_only_by_me))
|
||||||
for subscription in subscriptions:
|
for subscription in subscriptions:
|
||||||
subscription.delete()
|
subscription.Delete()
|
||||||
|
|
||||||
def SendMessage(self, msg):
|
def SendMessage(self, msg):
|
||||||
encoded = json.dumps(msg, default=utils.EncodeJSON)
|
encoded = json.dumps(msg, default=utils.EncodeJSON)
|
||||||
@@ -445,13 +460,23 @@ class Subscription(db.Model):
|
|||||||
Event.all()
|
Event.all()
|
||||||
.ancestor(self))
|
.ancestor(self))
|
||||||
ret = []
|
ret = []
|
||||||
|
to_delete = []
|
||||||
for e in events:
|
for e in events:
|
||||||
if str(e.key().id()) in acks:
|
if str(e.key().id()) in acks:
|
||||||
e.delete()
|
to_delete.append(e)
|
||||||
else:
|
else:
|
||||||
ret.append(e.ToEvent())
|
ret.append(e.ToEvent())
|
||||||
|
db.delete(events)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def Delete(self):
|
||||||
|
events = (
|
||||||
|
Event.all()
|
||||||
|
.ancestor(self))
|
||||||
|
db.delete(events)
|
||||||
|
|
||||||
|
self.delete()
|
||||||
|
|
||||||
|
|
||||||
class Event(db.Model):
|
class Event(db.Model):
|
||||||
# parent=Subscription
|
# parent=Subscription
|
||||||
|
|||||||
Reference in New Issue
Block a user