def handle_disconnection(client_id): """Handles a channel disconnection for a Clio channel.""" # Find all their subscriptions and delete them. q = model.Subscription.all().filter('client_id =', client_id) subscriptions = q.fetch(1000) for sub in subscriptions: prospective_search.unsubscribe(model.RequestRecord, str(sub.key())) db.delete(subscriptions)
def post(self): record = prospective_search.get_document(self.request) record_value = simplejson.loads(record.value) subscriber_keys = map(db.Key, self.request.get_all("id")) subscribers = db.get(subscriber_keys) datapoints = [] stats_json = [] for subscriber_key, subscriber in zip(subscriber_keys, subscribers): if not subscriber: prospective_search.unsubscribe(stats.StatsRecord, subscriber_key) else: datapoints.append(models.getStats(subscriber.datapoint, record.timestamp, duration="day")) datapoints.append(models.getStats(subscriber.datapoint, record.timestamp, duration="hour")) for datapoint in datapoints: if datapoint.datapoint == "active_users": try: user = models.getUser(record_value["user"], False) except models.UserDoesNotExistError: continue last_seen = user.last_seen new_last_seen = timestamp.now() if datapoint.duration == "day": last_seen = last_seen.replace(hour=0, minute=0, second=0, microsecond=0) new_last_seen = new_last_seen.replace(hour=0, minute=0, second=0, microsecond=0) if last_seen < new_last_seen: user.updateLastSeen(new_last_seen) user.save() else: continue if datapoint.datapoint == "quota": datapoint.count = models.getQuota().amount else: datapoint.increment() json = { "datapoint": datapoint.datapoint, "value": datapoint.count, "date": datapoint.date.strftime("%D, %M %d %y"), "datestamp": int(time.mktime(datapoint.date.date().timetuple())) * 1000, "hour": datapoint.date.hour, } if datapoint.duration == "day": json["hour"] = "total" stats_json.append(json) db.put(datapoints) push = channels.Channel("[email protected]/Web", False) push.message = {"stats": stats_json} push.send() logging.debug(simplejson.dumps(stats_json))
def post(self): # Fetch the log record record = prospective_search.get_document(self.request) record_data = record.to_json() # Fetch the set of subscribers to send this record to subscriber_keys = map(db.Key, self.request.get_all('id')) subscribers = db.get(subscriber_keys) for subscriber_key, subscriber in zip(subscriber_keys, subscribers): # If the subscription has been deleted from the datastore, delete it # from the matcher API. if not subscriber: logging.error("Subscription %s deleted!", subscriber_key) prospective_search.unsubscribe(model.RequestRecord, subscriber_key) else: data = simplejson.dumps({ 'subscription_key': str(subscriber_key), 'data': record_data, }) channel.send_message(subscriber.client_id, data)
def post(self): record = prospective_search.get_document(self.request) record_value = simplejson.loads(record.value) subscriber_keys = map(db.Key, self.request.get_all('id')) subscribers = db.get(subscriber_keys) datapoints = [] stats_json = [] for subscriber_key, subscriber in zip(subscriber_keys, subscribers): if not subscriber: prospective_search.unsubscribe(stats.StatsRecord, subscriber_key) else: datapoints.append( models.getStats(subscriber.datapoint, record.timestamp, duration='day')) datapoints.append( models.getStats(subscriber.datapoint, record.timestamp, duration='hour')) for datapoint in datapoints: if datapoint.datapoint == 'active_users': try: user = models.getUser(record_value['user'], False) except models.UserDoesNotExistError: continue last_seen = user.last_seen new_last_seen = timestamp.now() if datapoint.duration == "day": last_seen = last_seen.replace(hour=0, minute=0, second=0, microsecond=0) new_last_seen = new_last_seen.replace(hour=0, minute=0, second=0, microsecond=0) if last_seen < new_last_seen: user.updateLastSeen(new_last_seen) user.save() else: continue if datapoint.datapoint == 'quota': datapoint.count = models.getQuota().amount else: datapoint.increment() json = { 'datapoint': datapoint.datapoint, 'value': datapoint.count, 'date': datapoint.date.strftime("%D, %M %d %y"), 'datestamp': int(time.mktime(datapoint.date.date().timetuple())) * 1000, 'hour': datapoint.date.hour } if datapoint.duration == "day": json['hour'] = "total" stats_json.append(json) db.put(datapoints) push = channels.Channel("[email protected]/Web", False) push.message = {"stats": stats_json} push.send() logging.debug(simplejson.dumps(stats_json))
def unsubscribe(document_class, sub_id, topic=None): topic = _get_document_topic(document_class, topic) prospective_search.unsubscribe(datastore.Entity, sub_id, topic=topic)