def get(self, channelid): """Return general information on the channel""" channel = self._getentity(Channel, channelid) if channel is None: return anysubscribers = Subscriber.all().filter('channel =', channel).fetch(1) template_values = { 'channel': channel, 'anysubscribers': anysubscribers, } path = os.path.join(os.path.dirname(__file__), 'channel_detail.html') self.response.out.write(template.render(path, template_values))
def delete(self, channelid): """Handle deletion of a channel. Only allow if there are no subscribers""" channel = self._getentity(Channel, channelid) if channel is None: return # Check the subscribers nrsubscribers = Subscriber.all().filter('channel =', channel).count() if nrsubscribers: # Can't delete if subscribers still exist self.response.set_status(405, "CANNOT DELETE - %s SUBSCRIBERS" % nrsubscribers) self.response.headers['Allow'] = "GET, POST" else: channel.delete() self.response.set_status(204)
def post(self, channelid): """Handles a message publish to this channel""" channel = self._getentity(Channel, channelid) if channel is None: return contenttype = self.request.headers['Content-Type'] # Save message message = Message( contenttype = contenttype, body = self.request.body, channel = channel, ) message.put() # for subscriber in Subscriber.all().filter('channel =', channel): subscribers = Subscriber.all().filter('channel =', channel) if subscribers.count(): for subscriber in subscribers: # Set up delivery of message to subscriber delivery = Delivery( message = message, recipient = subscriber, ) delivery.put() # Kick off a task to distribute message taskqueue.Task( url='/distributor/' + str(message.key()) ).add(QUEUE_DISTRIBUTION) logging.debug("Delivery queued for %d subscribers of channel %s" % (subscribers.count(), channelid)) else: logging.debug("No subscribers for channel %s" % (channelid, )) # TODO should we return a 202 instead of a 302? # Actually I think it's just a 201, as we've created a new (message) resource # self.redirect(self.request.url + 'message/' + str(message.key())) # Try to detect whether we're from the coffeeshop browser, and if so, return a 302 self.response.headers['Location'] = self.request.url + "message/%s" % str(message.key()) if contenttype == "application/x-www-form-urlencoded" and self.request.get('messagesubmissionform') == "coffeeshop": self.response.set_status(302) else: self.response.set_status(201)
def get(self, channelid): """Handles a GET to the /channel/{id}/subscriber/ resource """ channel = Channel.get_by_id(int(channelid)) if channel is None: self.response.out.write("Channel %s not found" % (channelid, )) self.response.set_status(404) return subscribers = [] for subscriber in Subscriber.all().filter('channel =', channel): subscribers.append({ 'subscriberid': subscriber.key().id(), 'name': subscriber.name, 'resource': subscriber.resource, 'created': subscriber.created, }) template_values = { 'channel': channel, 'subscribers': subscribers, } path = os.path.join(os.path.dirname(__file__), 'channelsubscriber.html') self.response.out.write(template.render(path, template_values))
def delete_all_subscribers(): while Subscriber.all().fetch(CHUNK): db.delete(Subscriber.all().fetch(CHUNK))