Esempio n. 1
0
  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))
Esempio n. 2
0
  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)
Esempio n. 3
0
  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)
Esempio n. 4
0
  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))
Esempio n. 5
0
def delete_all_subscribers():
    while Subscriber.all().fetch(CHUNK):
        db.delete(Subscriber.all().fetch(CHUNK))
Esempio n. 6
0
def delete_all_subscribers():
  while Subscriber.all().fetch(CHUNK):
    db.delete(Subscriber.all().fetch(CHUNK))