Skip to content

Commit

Permalink
add in tag_stat signals to keep count up to date (bug 635118)
Browse files Browse the repository at this point in the history
  • Loading branch information
Andy McKay committed Mar 2, 2011
1 parent e6130a8 commit f07f4c3
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 3 deletions.
28 changes: 27 additions & 1 deletion apps/tags/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,21 @@ def save_tag(self, addon):

def remove_tag(self, addon):
tag, created = Tag.objects.get_or_create(tag_text=self.tag_text)
AddonTag.objects.filter(addon=addon, tag=tag).delete()
for addon_tag in AddonTag.objects.filter(addon=addon, tag=tag):
addon_tag.delete()
amo.log(amo.LOG.REMOVE_TAG, tag, addon)

def update_stat(self):
if self.blacklisted:
TagStat.objects.filter(tag=self).delete()
return
try:
tagstat = TagStat.objects.get(tag=self)
except TagStat.DoesNotExist:
tagstat = TagStat(tag=self)
tagstat.num_addons = self.addons.count()
tagstat.save()


class TagStat(amo.models.ModelBase):
tag = models.OneToOneField(Tag, primary_key=True)
Expand All @@ -79,3 +91,17 @@ def flush_urls(self):
'*/tag/%s' % self.tag.tag_text, ]

return urls


def update_tag_stat_signal(sender, instance, **kw):
from .tasks import update_tag_stat
if not kw.get('raw'):
try:
update_tag_stat.delay(instance.tag)
except Tag.DoesNotExist:
pass

models.signals.post_save.connect(update_tag_stat_signal, sender=AddonTag,
dispatch_uid='update_tag_stat')
models.signals.post_delete.connect(update_tag_stat_signal, sender=AddonTag,
dispatch_uid='delete_tag_stat')
16 changes: 15 additions & 1 deletion apps/tags/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

from amo.utils import slugify
from tags.models import AddonTag, Tag
from . import cron


task_log = commonware.log.getLogger('z.task')
Expand Down Expand Up @@ -47,3 +46,18 @@ def clean_tag(pk, **kw):

Tag.objects.filter(pk__in=[e.pk for e in existing]).delete()
tag.update(tag_text=new, blacklisted=blacklisted)


@task(rate_limit='10/m')
def update_all_tag_stats(pks, **kw):
task_log.info("[%s@%s] Calculating stats for tags starting with %s" %
(len(pks), update_all_tag_stats.rate_limit, pks[0]))
for tag in Tag.objects.filter(pk__in=pks):
tag.update_stat()


@task(rate_limit='1000/m')
def update_tag_stat(tag, **kw):
task_log.info("[1@%s] Calculating stats for tag %s" %
(update_tag_stat.rate_limit, tag.pk))
tag.update_stat()
57 changes: 56 additions & 1 deletion apps/tags/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import test_utils

from addons.models import Addon
from tags.models import AddonTag, Tag
from tags.models import AddonTag, Tag, TagStat
from tags.tasks import clean_tag


Expand Down Expand Up @@ -109,3 +109,58 @@ def test_blacklisted_inverted(self):
assert Tag.objects.get(tag_text='sun').blacklisted
clean_tag(self.old.pk)
assert Tag.objects.get(tag_text='sun').blacklisted


class TestCount(test_utils.TestCase):
fixtures = ['base/addon_3615',
'base/addon_5369',
'tags/tags.json']

def setUp(self):
self.tag = Tag.objects.get(pk=2652)

def test_count(self):
self.tag.update_stat()
eq_(self.tag.tagstat.num_addons, 1)

def test_count_multiple(self):
AddonTag.objects.create(addon_id=5369, tag_id=self.tag.pk)
self.tag.update_stat()
eq_(self.tag.tagstat.num_addons, 2)

def test_blacklisted(self):
self.tag.update(blacklisted=True)
self.tag.update_stat()
eq_(TagStat.objects.filter(tag=self.tag).count(), 0)

def test_blacklisted_exists(self):
self.tag.update_stat()
self.tag.update(blacklisted=True)
self.tag.update_stat()
eq_(TagStat.objects.filter(tag=self.tag).count(), 0)

def test_save_tag(self):
self.tag.save_tag(addon=Addon.objects.get(pk=5369))
eq_(self.tag.tagstat.num_addons, 2)

def test_remove_tag(self):
self.tag.remove_tag(addon=Addon.objects.get(pk=3615))
eq_(self.tag.tagstat.num_addons, 0)

def test_add_addontag(self):
AddonTag.objects.create(addon=Addon.objects.get(pk=5369),
tag=Tag.objects.get(pk=2652))
eq_(TagStat.objects.count(), 1)

def test_delete_addontag(self):
addontag = AddonTag.objects.all()[0]
addontag.tag.update_stat()
eq_(TagStat.objects.all()[0].num_addons, 1)
addontag.delete()
eq_(TagStat.objects.all()[0].num_addons, 0)

def test_delete_tag(self):
self.tag.update_stat()
eq_(TagStat.objects.count(), 1)
self.tag.delete()
eq_(TagStat.objects.count(), 0)

0 comments on commit f07f4c3

Please sign in to comment.