title: How to create a click counter using Kombu and celery in Django
body: <p>I'm trying to customize <a href="https://ask.github.io/celery/tutorials/clickcounter.html" rel="nofollow">this tutorial</a> for creating click counter using Kombu and Celery in Django. The tutorial explains how to do it for url's, but what I want to do is to create a Click model, define Posts as <code>ForeignKey</code> field and then each time someone view that post, I'd call increment clicks for that post.</p>
  
  <p>I had two problems:
  first one is where should I put the function call in views, since I'm using generic views (see below) ?
  second one is how should I work with <code>message</code>? Did I pass the object write to the function?</p>
  
  <p>models.py</p>
  
  <pre><code>class ClickManager(models.Manager):
  
      def increment_clicks(self, for_url, increment_by=1):
          click, created = self.get_or_create(url=for_url, defaults={"click_count": increment_by})
          if not created:
              click.click_count += increment_by
              click.save()
  
          return click.click_count
  
  class Click(models.Model):
      obj = models.ForeignKey(Post)
      click_count = models.PositiveIntegerField(_(u"click_count"), default=0)
  
      objects = ClickManager()
  
      def __unicode__(self):
          return self.obj
  </code></pre>
  
  <p>messaging.py </p>
  
  <pre><code>def send_increment_clicks(obj):
      connection = establish_connection()
      publisher = Publisher(connection=connection, exchange="clicks", routing_key="increment_click", exchange_type="direct")
  
      publisher.send(obj)
  
      publisher.close()
      connection.close()
  
  
  def process_clicks():
      connection = establish_connection()
      consumer = Consumer(connection=connection, queue="clicks", exchange="clicks", routing_key="increment_click", exchange_type="direct")
  
      clicks_for_url = {}
      message_for_url = {}
  
      for message in consumer.iterqueue():
          obj = message.body
          clicks_for_url[obj]= clicks_for_url.get(obj, 0) + 1
          if obj in messages_for_url:
              messages_for_url[obj].append(message)
          else:
              messages_for_url[obj] = [message]
  
      for obj, click_count in clicks_for_url.items():
          Click.objects.increment_click(obj, click_count)
          [message.ack() for message in messages_for_url[obj]]
  
      consumer.close()
      connection.close()
  </code></pre>
  
  <p>views.py</p>
  
  <pre><code>class LinkDetailView(FormMixin, DetailView):
      models      = Post
      queryset    = Post.objects.all()
  
      """DON'T KNOW HOW TO PASS SELF.OBJECT TO THE FUNCTION """
      send_increment_clicks[self.object] 
  
      def get_success_url(self):
          ...
  
      def get_context_data(self, **kwargs):
          ...
  </code></pre>