From e7d268bde66700d684f7ac7d4f14c98a38366400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 1 Jun 2017 15:47:39 +0200 Subject: [PATCH] Algolia: Use Celery to push user updates in a background task. --- pillar/api/users/hooks.py | 9 ++------- pillar/celery/algolia_tasks.py | 28 ++++++++++++++++++++++++++++ pillar/celery/celery_cfg.py | 1 + 3 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 pillar/celery/algolia_tasks.py diff --git a/pillar/api/users/hooks.py b/pillar/api/users/hooks.py index f6acede6..75655dab 100644 --- a/pillar/api/users/hooks.py +++ b/pillar/api/users/hooks.py @@ -62,14 +62,9 @@ def before_replacing_user(request, lookup): def push_updated_user_to_algolia(user, original): """Push an update to the Algolia index when a user item is updated""" - from algoliasearch.helpers import AlgoliaException - from pillar.api.utils.algolia import algolia_index_user_save + from pillar.celery import algolia_tasks - try: - algolia_index_user_save(user) - except AlgoliaException as ex: - log.warning('Unable to push user info to Algolia for user "%s", id=%s; %s', - user.get('username'), user.get('_id'), ex) + algolia_tasks.push_updated_user_to_algolia.delay(str(user['_id'])) def send_blinker_signal_roles_changed(user, original): diff --git a/pillar/celery/algolia_tasks.py b/pillar/celery/algolia_tasks.py new file mode 100644 index 00000000..c8dad3d6 --- /dev/null +++ b/pillar/celery/algolia_tasks.py @@ -0,0 +1,28 @@ +import logging + +import bson + +from pillar import current_app + +from .celery_cfg import celery_cfg + +log = logging.getLogger(__name__) + + +@celery_cfg.task(ignore_result=True) +def push_updated_user_to_algolia(user_id: str): + """Push an update to the Algolia index when a user item is updated""" + + from algoliasearch.helpers import AlgoliaException + from pillar.api.utils.algolia import algolia_index_user_save + + user_oid = bson.ObjectId(user_id) + log.info('Retrieving user %s', user_oid) + users_coll = current_app.db('users') + user = users_coll.find_one({'_id': user_oid}) + + try: + algolia_index_user_save(user) + except AlgoliaException as ex: + log.warning('Unable to push user info to Algolia for user "%s", id=%s; %s', + user.get('username'), user.get('_id'), ex) diff --git a/pillar/celery/celery_cfg.py b/pillar/celery/celery_cfg.py index 377932e8..505f58f1 100644 --- a/pillar/celery/celery_cfg.py +++ b/pillar/celery/celery_cfg.py @@ -2,6 +2,7 @@ from celery import Celery task_modules = [ 'pillar.celery.tasks', + 'pillar.celery.algolia_tasks', ] celery_cfg = Celery('proj',