Skip to content
This repository has been archived by the owner on Nov 28, 2019. It is now read-only.

Commit

Permalink
Added support for purging URLs on deleting specific models instance (c…
Browse files Browse the repository at this point in the history
…loses #5)

Now it's possible to do something like this (example based on flatpages):

for f in FlatPage.objects.all():
    purge(f.url).on_save(f)
    purge(f.url).on_delete(f)
  • Loading branch information
fsouza committed Nov 20, 2011
1 parent 9737799 commit 7e2c842
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
19 changes: 9 additions & 10 deletions roan/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,23 @@ def purger(sender, instance, **kw):
self.requests.get(purge_url)

model = type(obj)
signal.connect(purger, sender=model, weak=False, dispatch_uid='purge_%s_on_save_%s' % (self.url, model._meta.verbose_name))
getattr(signals, signal).connect(purger, sender=model, weak=False, dispatch_uid='purge_%s_%s_%s' % (self.url, signal, model._meta.verbose_name))

def _purge_class(self, model, signal):
def purger(sender, **kw):
purge_url = self.purge_url + self.url
self.requests.get(purge_url)

signal.connect(purger, sender=model, weak=False, dispatch_uid='purge_%s_on_save_%s' % (self.url, model._meta.verbose_name))
getattr(signals, signal).connect(purger, sender=model, weak=False, dispatch_uid='purge_%s_%s_%s' % (self.url, signal, model._meta.verbose_name))

def on_save(self, obj):
if isinstance(obj, django_models.Model):
self._purge_instance(obj, signals.post_save)
self._purge_instance(obj, "post_save")
else:
self._purge_class(obj, signals.post_save)
self._purge_class(obj, "post_save")

def on_delete(self, model):
def purger(sender, **kw):
purge_url = self.purge_url + self.url
self.requests.get(purge_url)

signals.post_delete.connect(purger, sender=model, weak=False, dispatch_uid='purge_%s_on_delete_%s' % (self.url, model._meta.verbose_name))
def on_delete(self, obj):
if isinstance(obj, django_models.Model):
self._purge_instance(obj, "post_delete")
else:
self._purge_class(obj, "post_delete")
33 changes: 28 additions & 5 deletions roan/tests/test_purge.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,12 @@ def test_purge_should_receive_and_store_url(self):

def test_purge_should_connect_to_save_signal_of_a_model_with_unique_dispatch_uid(self):
roan.purge("/").on_save(models.Poll)
expected_uid = "purge_/_on_save_%s" % models.Poll._meta.verbose_name
expected_uid = "purge_/_post_save_%s" % models.Poll._meta.verbose_name
uuids = [r[0][0] for r in signals.post_save.receivers]
self.assertIn(expected_uid, uuids)

def test_purge_should_connect_to_save_signal_without_a_weak_reference(self):
uid = "purge_/_on_save_%s" % models.Poll._meta.verbose_name
uid = "purge_/_post_save_%s" % models.Poll._meta.verbose_name
roan.purge("/").on_save(models.Poll)
f = [r[1] for r in signals.post_save.receivers if r[0][0] == uid][0]
self.assertNotIsInstance(f, weakref.ref)
Expand All @@ -76,12 +76,12 @@ def test_when_the_model_is_saved_the_url_should_be_purged(self):

def test_purge_should_connect_to_delete_signal_of_a_model_with_unique_dispatch_uid(self):
roan.purge("/").on_delete(models.Poll)
expected_uid = "purge_/_on_delete_%s" % models.Poll._meta.verbose_name
expected_uid = "purge_/_post_delete_%s" % models.Poll._meta.verbose_name
uuids = [r[0][0] for r in signals.post_delete.receivers]
self.assertIn(expected_uid, uuids)

def test_purge_should_to_delete_sginal_without_a_weak_reference(self):
uid = "purge_/_on_delete_%s" % models.Poll._meta.verbose_name
uid = "purge_/_post_delete_%s" % models.Poll._meta.verbose_name
roan.purge("/").on_delete(models.Poll)
f = [r[1] for r in signals.post_delete.receivers if r[0][0] == uid][0]
self.assertNotIsInstance(f, weakref.ref)
Expand Down Expand Up @@ -116,5 +116,28 @@ def test_should_not_purge_on_saving_an_object_that_was_not_connected_to_the_url(
p.requests = mocks.RequestsMock(200, purge_url)
p.on_save(poll)

models.Poll.objects.create(title=u'What is your favorite car?')
models.Poll.objects.get_or_create(title=u'What is your favorite car?')
self.assertFalse(p.requests.done)

def test_should_be_able_to_purge_an_url_on_delete_a_model_instance(self):
poll, created = models.Poll.objects.get_or_create(title=u'Do you think Roan should work?')

purge_url = "http://localhost/purge/polls/%d" % poll.id
p = roan.purge("/polls/%d" % poll.id)
p.requests = mocks.RequestsMock(200, purge_url)
p.on_delete(poll)

poll.delete()
self.assertTrue(p.requests.done)

def test_should_not_purge_on_deleting_an_object_that_was_not_connected_to_the_url(self):
poll, created = models.Poll.objects.get_or_create(title=u'Do you think Roan should work?')
other, created = models.Poll.objects.get_or_create(title=u'What is your favorite car?')

purge_url = "http://localhost/purge/polls/%d" % poll.id
p = roan.purge("/polls/%d" % poll.id)
p.requests = mocks.RequestsMock(200, purge_url)
p.on_delete(poll)

other.delete()
self.assertFalse(p.requests.done)

0 comments on commit 7e2c842

Please sign in to comment.