forked from codeinthehole/django-cacheback
-
Notifications
You must be signed in to change notification settings - Fork 1
/
tasks.py
66 lines (55 loc) · 1.98 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import time
from celery.task import task
from celery.utils.log import get_task_logger
from django.utils import importlib
logger = get_task_logger(__name__)
@task()
def refresh_cache(klass_str, obj_args, obj_kwargs, call_args, call_kwargs):
"""
Re-populate cache using the given job class.
The job class is instantiated with the passed constructor args and the
refresh method is called with the passed call args. That is::
data = klass(*obj_args, **obj_kwargs).refresh(
*call_args, **call_kwargs)
:klass_str: String repr of class (eg 'apps.twitter.jobs:FetchTweetsJob')
:obj_args: Constructor args
:obj_kwargs: Constructor kwargs
:call_args: Refresh args
:call_kwargs: Refresh kwargs
"""
klass = _get_job_class(klass_str)
if klass is None:
logger.error("Unable to construct %s with args %r and kwargs %r",
klass_str, obj_args, obj_kwargs)
return
logger.info("Using %s with constructor args %r and kwargs %r",
klass_str, obj_args, obj_kwargs)
logger.info("Calling refresh with args %r and kwargs %r", call_args,
call_kwargs)
start = time.time()
try:
klass(*obj_args, **obj_kwargs).refresh(
*call_args, **call_kwargs)
except Exception, e:
logger.error("Error running job: '%s'", e)
logger.exception(e)
else:
duration = time.time() - start
logger.info("Refreshed cache in %.6f seconds", duration)
def _get_job_class(klass_str):
"""
Return the job class
"""
mod_name, klass_name = klass_str.rsplit('.', 1)
try:
mod = importlib.import_module(mod_name)
except ImportError, e:
logger.error("Error importing job module %s: '%s'", mod_name, e)
return
try:
klass = getattr(mod, klass_name)
except AttributeError:
logger.error("Module '%s' does not define a '%s' class", mod_name,
klass_name)
return
return klass