Introducing support for removing indexed nodes

Nodes are deindexed if they have a 'status' property that is different
from 'published'. Nodes are deindexed also when they are deleted.
This commit is contained in:
Francesco Siddi 2016-07-20 15:15:13 +02:00
parent 49bd2720fa
commit 6d68753b1b
2 changed files with 43 additions and 12 deletions

View File

@ -13,6 +13,8 @@ from application.utils import str2id, jsonify
from application.utils.authorization import check_permissions, require_login from application.utils.authorization import check_permissions, require_login
from application.utils.gcs import update_file_name from application.utils.gcs import update_file_name
from application.utils.activities import activity_subscribe, activity_object_add from application.utils.activities import activity_subscribe, activity_object_add
from application.utils.algolia import algolia_index_node_delete
from application.utils.algolia import algolia_index_node_save
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
blueprint = Blueprint('nodes', __name__) blueprint = Blueprint('nodes', __name__)
@ -200,13 +202,20 @@ def after_replacing_node(item, original):
return return
from algoliasearch.client import AlgoliaException from algoliasearch.client import AlgoliaException
from application.utils.algolia import algolia_index_node_save status = item['properties'].get('status', 'unpublished')
try: if status == 'published':
algolia_index_node_save(item) try:
except AlgoliaException as ex: algolia_index_node_save(item)
log.warning('Unable to push node info to Algolia for node %s; %s', except AlgoliaException as ex:
item.get('_id'), ex) log.warning('Unable to push node info to Algolia for node %s; %s',
item.get('_id'), ex)
else:
try:
algolia_index_node_delete(item)
except AlgoliaException as ex:
log.warning('Unable to delete node info to Algolia for node %s; %s',
item.get('_id'), ex)
def before_inserting_nodes(items): def before_inserting_nodes(items):
@ -369,6 +378,15 @@ def nodes_set_default_picture(nodes):
node_set_default_picture(node) node_set_default_picture(node)
def after_deleting_node(item):
from algoliasearch.client import AlgoliaException
try:
algolia_index_node_delete(item)
except AlgoliaException as ex:
log.warning('Unable to delete node info to Algolia for node %s; %s',
item.get('_id'), ex)
def setup_app(app, url_prefix): def setup_app(app, url_prefix):
app.on_fetched_item_nodes += before_returning_node app.on_fetched_item_nodes += before_returning_node
app.on_fetched_resource_nodes += before_returning_nodes app.on_fetched_resource_nodes += before_returning_nodes
@ -386,4 +404,6 @@ def setup_app(app, url_prefix):
app.on_insert_nodes += nodes_set_default_picture app.on_insert_nodes += nodes_set_default_picture
app.on_inserted_nodes += after_inserting_nodes app.on_inserted_nodes += after_inserting_nodes
app.on_deleted_item_nodes += after_deleting_node
app.register_blueprint(blueprint, url_prefix=url_prefix) app.register_blueprint(blueprint, url_prefix=url_prefix)

View File

@ -10,13 +10,17 @@ from . import skip_when_testing
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
INDEX_ALLOWED_USER_ROLES = {'admin', 'subscriber', 'demo'}
INDEX_ALLOWED_NODE_TYPES = {'asset', 'texture', 'group', 'hdri'}
@skip_when_testing @skip_when_testing
def algolia_index_user_save(user): def algolia_index_user_save(user):
# Define accepted roles if algolia_index_users is None:
accepted_roles = ['admin', 'subscriber', 'demo'] return
# Strip unneeded roles # Strip unneeded roles
if 'roles' in user: if 'roles' in user:
roles = [r for r in user['roles'] if r in accepted_roles] roles = set(user['roles']).intersection(INDEX_ALLOWED_USER_ROLES)
else: else:
roles = None roles = None
if algolia_index_users: if algolia_index_users:
@ -25,15 +29,15 @@ def algolia_index_user_save(user):
'objectID': user['_id'], 'objectID': user['_id'],
'full_name': user['full_name'], 'full_name': user['full_name'],
'username': user['username'], 'username': user['username'],
'roles': roles, 'roles': list(roles),
'groups': user['groups'], 'groups': user['groups'],
'email': user['email'] 'email': user['email']
}) })
@skip_when_testing @skip_when_testing
def algolia_index_node_save(node): def algolia_index_node_save(node):
accepted_node_types = ['asset', 'texture', 'group'] if node['node_type'] in INDEX_ALLOWED_NODE_TYPES and algolia_index_nodes:
if node['node_type'] in accepted_node_types and algolia_index_nodes:
# If a nodes does not have status published, do not index # If a nodes does not have status published, do not index
if 'status' in node['properties'] \ if 'status' in node['properties'] \
and node['properties']['status'] != 'published': and node['properties']['status'] != 'published':
@ -85,3 +89,10 @@ def algolia_index_node_save(node):
node_ob['tags'] = node['properties']['tags'] node_ob['tags'] = node['properties']['tags']
algolia_index_nodes.save_object(node_ob) algolia_index_nodes.save_object(node_ob)
@skip_when_testing
def algolia_index_node_delete(node):
if algolia_index_nodes is None:
return
algolia_index_nodes.delete_object(node['_id'])