# coding: utf-8
from __future__ import unicode_literals
from django.conf import settings
from .cache import cachalot_caches
from .utils import _get_table_cache_key, _invalidate_table_cache_keys
__all__ = ('invalidate_tables', 'invalidate_models', 'invalidate_all')
def _aliases_iterator(cache_alias, db_alias):
cache_aliases = settings.CACHES if cache_alias is None else (cache_alias,)
db_aliases = settings.DATABASES if db_alias is None else (db_alias,)
for cache_alias in cache_aliases:
for db_alias in db_aliases:
yield cache_alias, db_alias
[docs]def invalidate_tables(tables, cache_alias=None, db_alias=None):
"""
Clears what was cached by django-cachalot implying one or more SQL tables
from ``tables``.
If ``cache_alias`` is specified, it only clears the SQL queries stored
on this cache, otherwise queries from all caches are cleared.
If ``db_alias`` is specified, it only clears the SQL queries executed
on this database, otherwise queries from all databases are cleared.
:arg tables: SQL tables names
:type tables: iterable of strings
:arg cache_alias: Alias from the Django ``CACHES`` setting
:type cache_alias: string or NoneType
:arg db_alias: Alias from the Django ``DATABASES`` setting
:type db_alias: string or NoneType
:returns: Nothing
:rtype: NoneType
"""
for cache_alias, db_alias in _aliases_iterator(cache_alias, db_alias):
table_cache_keys = [_get_table_cache_key(db_alias, t) for t in tables]
cache = cachalot_caches.get_cache(cache_alias)
_invalidate_table_cache_keys(cache, table_cache_keys)
[docs]def invalidate_models(models, cache_alias=None, db_alias=None):
"""
Shortcut for ``invalidate_tables`` where you can specify Django models
instead of SQL table names.
:arg models: Django models
:type models: iterable of ``django.db.models.Model`` subclasses
:arg cache_alias: Alias from the Django ``CACHES`` setting
:type cache_alias: string or NoneType
:arg db_alias: Alias from the Django ``DATABASES`` setting
:type db_alias: string or NoneType
:returns: Nothing
:rtype: NoneType
"""
invalidate_tables([model._meta.db_table for model in models],
cache_alias, db_alias)
[docs]def invalidate_all(cache_alias=None, db_alias=None):
"""
Clears everything that was cached by django-cachalot.
If ``cache_alias`` is specified, it only clears the SQL queries stored
on this cache, otherwise queries from all caches are cleared.
If ``db_alias`` is specified, it only clears the SQL queries executed
on this database, otherwise queries from all databases are cleared.
:arg cache_alias: Alias from the Django ``CACHES`` setting
:type cache_alias: string or NoneType
:arg db_alias: Alias from the Django ``DATABASES`` setting
:type cache_alias: string or NoneType
:returns: Nothing
:rtype: NoneType
"""
for cache_alias, db_alias in _aliases_iterator(cache_alias, db_alias):
cachalot_caches.invalidate_all(cache_alias, db_alias)