|
1 | 1 | import logging |
| 2 | +import threading |
2 | 3 | from functools import wraps |
3 | 4 |
|
4 | 5 | from django.conf import settings |
|
12 | 13 | logger = logging.getLogger(__name__) |
13 | 14 |
|
14 | 15 |
|
| 16 | +class ThreadLocalTaskCounter: |
| 17 | + def __init__(self): |
| 18 | + self._thread_local = threading.local() |
| 19 | + |
| 20 | + def _get_task_list(self): |
| 21 | + if not hasattr(self._thread_local, "tasks"): |
| 22 | + self._thread_local.tasks = [] |
| 23 | + return self._thread_local.tasks |
| 24 | + |
| 25 | + def _get_recording(self): |
| 26 | + return getattr(self._thread_local, "recording", False) |
| 27 | + |
| 28 | + def start(self): |
| 29 | + self._thread_local.recording = True |
| 30 | + self._get_task_list().clear() |
| 31 | + |
| 32 | + def stop(self): |
| 33 | + self._thread_local.recording = False |
| 34 | + |
| 35 | + def incr(self, task_name, model_id=None, args=None, kwargs=None): |
| 36 | + if not self._get_recording(): |
| 37 | + return |
| 38 | + tasks = self._get_task_list() |
| 39 | + tasks.append({ |
| 40 | + "task": task_name, |
| 41 | + "id": model_id, |
| 42 | + "args": args if args is not None else [], |
| 43 | + "kwargs": kwargs if kwargs is not None else {}, |
| 44 | + }) |
| 45 | + |
| 46 | + def get(self): |
| 47 | + return len(self._get_task_list()) |
| 48 | + |
| 49 | + def get_tasks(self): |
| 50 | + return list(self._get_task_list()) |
| 51 | + |
| 52 | + |
| 53 | +# Create a shared instance |
| 54 | +dojo_async_task_counter = ThreadLocalTaskCounter() |
| 55 | + |
| 56 | + |
15 | 57 | def we_want_async(*args, func=None, **kwargs): |
16 | 58 | from dojo.models import Dojo_User |
17 | 59 | from dojo.utils import get_current_user |
@@ -40,6 +82,13 @@ def __wrapper__(*args, **kwargs): |
40 | 82 | from dojo.utils import get_current_user |
41 | 83 | user = get_current_user() |
42 | 84 | kwargs["async_user"] = user |
| 85 | + |
| 86 | + dojo_async_task_counter.incr( |
| 87 | + func.__name__, |
| 88 | + args=args, |
| 89 | + kwargs=kwargs, |
| 90 | + ) |
| 91 | + |
43 | 92 | countdown = kwargs.pop("countdown", 0) |
44 | 93 | if we_want_async(*args, func=func, **kwargs): |
45 | 94 | return func.apply_async(args=args, kwargs=kwargs, countdown=countdown) |
|
0 commit comments