Commit 7ba7f4e6be1ee5ae0b58cec0878af1abfc260363

Authored by Sergio Oliveira
1 parent 4a4ddcb1

Importing data asynchronously

Signed-off-by: Sergio Oliveira <sergio@tracy.com.br>
colab/plugins/apps.py
1 1  
2 2 from django.apps import AppConfig
3 3  
  4 +from .utils.data import register_tasks
4 5 from .utils.signals import connect_signal, register_signal
5 6  
6 7  
... ... @@ -10,3 +11,5 @@ class PluginAppConfig(AppConfig):
10 11 def ready(self):
11 12 register_signal()
12 13 connect_signal()
  14 +
  15 + register_tasks()
... ...
colab/plugins/tasks.py 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +
  2 +from datetime import timedelta
  3 +from celery.decorators import periodic_task
  4 +
  5 +from .utils import data
  6 +
  7 +
  8 +@periodic_task(run_every=timedelta(minutes=1))
  9 +def import_plugin_data():
  10 + for task in data.TASKS:
  11 + task.delay()
... ...
colab/plugins/utils/data.py 0 → 100644
... ... @@ -0,0 +1,40 @@
  1 +#!/usr/bin/env python
  2 +
  3 +import importlib
  4 +
  5 +from django.conf import settings
  6 +
  7 +from colab.celery import app
  8 +from proxy_data_api import ProxyDataAPI
  9 +
  10 +
  11 +TASKS = set()
  12 +
  13 +
  14 +def register_tasks():
  15 +
  16 + global TASKS
  17 +
  18 + for app_name in settings.INSTALLED_APPS:
  19 +
  20 + try:
  21 + module = importlib.import_module('{}.data_api'.format(app_name))
  22 + except ImportError as e:
  23 + continue
  24 +
  25 + for item_name in dir(module):
  26 + item = getattr(module, item_name)
  27 + if item is ProxyDataAPI:
  28 + continue
  29 +
  30 + if callable(getattr(item, 'fetch_data', None)):
  31 + instance = item()
  32 + task = app.task(bind=True)(instance.fetch_data)
  33 + TASKS.add(task)
  34 +
  35 + return TASKS
  36 +
  37 +
  38 +def data_import(self):
  39 + for task in TASKS:
  40 + task.delay()
... ...
colab/plugins/utils/proxy_data_api.py
1 1  
  2 +import abc
2 3  
3 4 class ProxyDataAPI(object):
4 5  
  6 + @abc.abstractmethod
5 7 def fetch_data(self):
6 8 raise NotImplementedError('fetchData not yet implemented')
... ...
vagrant/misc/etc/default/celerybeat
... ... @@ -15,7 +15,7 @@ CELERTBEAT_LOG_FILE=&quot;/var/log/celery/beat.log&quot;
15 15 CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
16 16  
17 17 CELERYBEAT_USER="vagrant"
18   -CELERYBEAT_GROUP="CELERYBEAT_GROUP"
  18 +CELERYBEAT_GROUP="vagrant"
19 19  
20 20 # If enabled pid and log directories will be created if missing,
21 21 # and owned by the userid/group configured.
... ...
vagrant/provision.sh
... ... @@ -45,6 +45,9 @@ colab-admin loaddata /vagrant/tests/test_data.json
45 45 # Init.d Celery files
46 46 sudo cp $basedir/vagrant/misc/etc/init.d/celery* /etc/init.d/
47 47 sudo cp $basedir/vagrant/misc/etc/default/celery* /etc/default/
  48 +sudo service celeryd stop || echo
  49 +sudo service celerybeat stop || echo
  50 +sleep 2
48 51 sudo service celeryd start
49 52 sudo service celerybeat start
50 53  
... ...