Ensures we never send the signal during a transaction.

This commit is contained in:
Bertrand Bordage 2016-09-29 13:55:40 +02:00
parent a42082e05c
commit 2b2c662deb
1 changed files with 9 additions and 4 deletions

View File

@ -8,6 +8,7 @@ from django.utils.six import string_types
from .cache import cachalot_caches
from .signals import post_invalidation
from .transaction import AtomicCache
from .utils import _get_table_cache_key, _invalidate_tables
@ -60,15 +61,19 @@ def invalidate(*tables_or_models, **kwargs):
raise TypeError(
"invalidate() got an unexpected keyword argument '%s'" % k)
send_signal = False
invalidated = set()
for cache_alias, db_alias, tables in _cache_db_tables_iterator(
_get_tables(tables_or_models), cache_alias, db_alias):
_invalidate_tables(
cachalot_caches.get_cache(cache_alias, db_alias), db_alias, tables)
cache = cachalot_caches.get_cache(cache_alias, db_alias)
if not isinstance(cache, AtomicCache):
send_signal = True
_invalidate_tables(cache, db_alias, tables)
invalidated.update(tables)
for table in invalidated:
post_invalidation.send(table, db_alias=db_alias)
if send_signal:
for table in invalidated:
post_invalidation.send(table, db_alias=db_alias)
def get_last_invalidation(*tables_or_models, **kwargs):