Skip to content

Commit 523958e

Browse files
committed
fix: use algoliasearch v4 syntax
1 parent 5907b3e commit 523958e

File tree

5 files changed

+86
-81
lines changed

5 files changed

+86
-81
lines changed

algoliasearch_django/decorators.py

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
try:
2-
# ContextDecorator was introduced in Python 3.2
3-
from contextlib import ContextDecorator
4-
except ImportError:
5-
ContextDecorator = None
6-
from functools import WRAPPER_ASSIGNMENTS, wraps
1+
from contextlib import ContextDecorator
2+
from functools import WRAPPER_ASSIGNMENTS
73

84
from django.db.models.signals import post_save, pre_delete
95

@@ -19,23 +15,6 @@ def available_attrs(fn):
1915
return WRAPPER_ASSIGNMENTS
2016

2117

22-
if ContextDecorator is None:
23-
# ContextDecorator was introduced in Python 3.2
24-
# See https://docs.python.org/3/library/contextlib.html#contextlib.ContextDecorator
25-
class ContextDecorator:
26-
"""
27-
A base class that enables a context manager to also be used as a decorator.
28-
"""
29-
30-
def __call__(self, func):
31-
@wraps(func, assigned=available_attrs(func))
32-
def inner(*args, **kwargs):
33-
with self:
34-
return func(*args, **kwargs)
35-
36-
return inner
37-
38-
3918
def register(model):
4019
"""
4120
Register the given model class and wrapped AlgoliaIndex class with the Algolia engine:

algoliasearch_django/models.py

Lines changed: 73 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import logging
77

88
from algoliasearch.http.exceptions import AlgoliaException
9+
from algoliasearch.search.models.operation_index_params import OperationIndexParams
10+
from algoliasearch.search.models.operation_type import OperationType
11+
from algoliasearch.search.models.search_params_object import SearchParamsObject
912
from django.db.models.query_utils import DeferredAttribute
1013

1114
from .settings import DEBUG
@@ -71,7 +74,7 @@ class AlgoliaIndex(object):
7174

7275
def __init__(self, model, client, settings):
7376
"""Initializes the index."""
74-
self.__init_index(client, model, settings)
77+
self.__init_index(model, settings)
7578

7679
self.model = model
7780
self.__client = client
@@ -170,7 +173,7 @@ def __init__(self, model, client, settings):
170173
)
171174
)
172175

173-
def __init_index(self, client, model, settings):
176+
def __init_index(self, model, settings):
174177
if not self.index_name:
175178
self.index_name = model.__name__
176179

@@ -189,9 +192,6 @@ def __init_index(self, client, model, settings):
189192

190193
self.tmp_index_name = tmp_index_name
191194

192-
self.__index = client.init_index(self.index_name)
193-
self.__tmp_index = client.init_index(self.tmp_index_name)
194-
195195
@staticmethod
196196
def _validate_geolocation(geolocation):
197197
"""
@@ -315,10 +315,14 @@ def save_record(self, instance, update_fields=None, **kwargs):
315315
try:
316316
if update_fields:
317317
obj = self.get_raw_record(instance, update_fields=update_fields)
318-
result = self.__index.partial_update_object(obj)
318+
result = self.__client.partial_update_object(
319+
self.index_name, obj.get("objectID"), obj
320+
)
319321
else:
320322
obj = self.get_raw_record(instance)
321-
result = self.__index.save_object(obj)
323+
result = self.__client.save_object(
324+
self.index_name, obj.get("objectID"), obj
325+
)
322326
logger.info("SAVE %s FROM %s", obj["objectID"], self.model)
323327
return result
324328
except AlgoliaException as e:
@@ -333,7 +337,7 @@ def delete_record(self, instance):
333337
"""Deletes the record."""
334338
objectID = self.objectID(instance)
335339
try:
336-
self.__index.delete_object(objectID)
340+
self.__client.delete_object(self.index_name, objectID)
337341
logger.info("DELETE %s FROM %s", objectID, self.model)
338342
except AlgoliaException as e:
339343
if DEBUG:
@@ -369,19 +373,21 @@ def update_records(self, qs, batch_size=1000, **kwargs):
369373
batch.append(dict(tmp))
370374

371375
if len(batch) >= batch_size:
372-
self.__index.partial_update_objects(batch)
376+
self.__client.partial_update_objects(self.index_name, batch)
373377
batch = []
374378

375379
if len(batch) > 0:
376-
self.__index.partial_update_objects(batch)
380+
self.__client.partial_update_objects(self.index_name, batch)
377381

378382
def raw_search(self, query="", params=None):
379383
"""Performs a search query and returns the parsed JSON."""
380384
if params is None:
381-
params = {}
385+
params = SearchParamsObject()
386+
387+
params.query = query
382388

383389
try:
384-
return self.__index.search(query, params)
390+
return self.__client.search_single_index(self.index_name, params)
385391
except AlgoliaException as e:
386392
if DEBUG:
387393
raise e
@@ -392,7 +398,7 @@ def get_settings(self):
392398
"""Returns the settings of the index."""
393399
try:
394400
logger.info("GET SETTINGS ON %s", self.index_name)
395-
return self.__index.get_settings()
401+
return self.__client.get_settings(self.index_name)
396402
except AlgoliaException as e:
397403
if DEBUG:
398404
raise e
@@ -405,7 +411,7 @@ def set_settings(self):
405411
return
406412

407413
try:
408-
self.__index.set_settings(self.settings)
414+
self.__client.set_settings(self.index_name, self.settings)
409415
logger.info("APPLY SETTINGS ON %s", self.index_name)
410416
except AlgoliaException as e:
411417
if DEBUG:
@@ -416,7 +422,7 @@ def set_settings(self):
416422
def clear_objects(self):
417423
"""Clears all objects of an index."""
418424
try:
419-
self.__index.clear_objects()
425+
self.__client.clear_objects(self.index_name)
420426
logger.info("CLEAR INDEX %s", self.index_name)
421427
except AlgoliaException as e:
422428
if DEBUG:
@@ -430,7 +436,7 @@ def clear_index(self):
430436

431437
def wait_task(self, task_id):
432438
try:
433-
self.__index.wait_task(task_id)
439+
self.__client.wait_for_task(self.index_name, task_id)
434440
logger.info("WAIT TASK %s", self.index_name)
435441
except AlgoliaException as e:
436442
if DEBUG:
@@ -439,9 +445,9 @@ def wait_task(self, task_id):
439445
logger.warning("%s NOT WAIT: %s", self.model, e)
440446

441447
def delete(self):
442-
self.__index.delete()
443-
if self.__tmp_index:
444-
self.__tmp_index.delete()
448+
self.__client.delete_index(self.index_name)
449+
if self.tmp_index_name:
450+
self.__client.delete_index(self.tmp_index_name)
445451

446452
def reindex_all(self, batch_size=1000):
447453
"""
@@ -469,6 +475,11 @@ def reindex_all(self, batch_size=1000):
469475
else:
470476
raise e # Unexpected error while getting settings
471477
try:
478+
should_keep_replicas = False
479+
should_keep_slaves = False
480+
replicas = None
481+
slaves = None
482+
472483
if self.settings:
473484
replicas = self.settings.get("replicas", None)
474485
slaves = self.settings.get("slaves", None)
@@ -483,22 +494,31 @@ def reindex_all(self, batch_size=1000):
483494
self.settings["slaves"] = []
484495
logger.debug("REMOVE SLAVES FROM SETTINGS")
485496

486-
self.__tmp_index.set_settings(self.settings).wait()
497+
set_settings_response = self.__client.set_settings(
498+
self.tmp_index_name, self.settings
499+
)
500+
self.__client.wait_for_task(
501+
self.tmp_index_name, set_settings_response.task_id
502+
)
487503
logger.debug("APPLY SETTINGS ON %s_tmp", self.index_name)
504+
488505
rules = []
489-
synonyms = []
490-
for r in self.__index.browse_rules():
491-
rules.append(r)
492-
for s in self.__index.browse_synonyms():
493-
synonyms.append(s)
506+
self.__client.browse_rules(
507+
self.index_name, lambda _resp: rules.append(_resp)
508+
)
494509
if len(rules):
495510
logger.debug("Got rules for index %s: %s", self.index_name, rules)
496511
should_keep_rules = True
512+
513+
synonyms = []
514+
self.__client.browse_synonyms(
515+
self.index_name, lambda _resp: synonyms.append(_resp)
516+
)
497517
if len(synonyms):
498518
logger.debug("Got synonyms for index %s: %s", self.index_name, rules)
499519
should_keep_synonyms = True
500520

501-
self.__tmp_index.clear_objects()
521+
self.__client.clear_objects(self.tmp_index_name)
502522
logger.debug("CLEAR INDEX %s_tmp", self.index_name)
503523

504524
counts = 0
@@ -515,18 +535,23 @@ def reindex_all(self, batch_size=1000):
515535

516536
batch.append(self.get_raw_record(instance))
517537
if len(batch) >= batch_size:
518-
self.__tmp_index.save_objects(batch)
538+
self.__client.save_objects(self.tmp_index_name, batch, True)
519539
logger.info(
520-
"SAVE %d OBJECTS TO %s_tmp", len(batch), self.index_name
540+
"SAVE %d OBJECTS TO %s", len(batch), self.tmp_index_name
521541
)
522542
batch = []
523543
counts += 1
524544
if len(batch) > 0:
525-
self.__tmp_index.save_objects(batch)
526-
logger.info("SAVE %d OBJECTS TO %s_tmp", len(batch), self.index_name)
527-
528-
self.__client.move_index(self.tmp_index_name, self.index_name)
529-
logger.info("MOVE INDEX %s_tmp TO %s", self.index_name, self.index_name)
545+
self.__client.save_objects(self.tmp_index_name, batch, True)
546+
logger.info("SAVE %d OBJECTS TO %s", len(batch), self.tmp_index_name)
547+
548+
self.__client.operation_index(
549+
self.tmp_index_name,
550+
OperationIndexParams(
551+
operation=OperationType.MOVE, destination=self.index_name
552+
),
553+
)
554+
logger.info("MOVE INDEX %s TO %s", self.tmp_index_name, self.index_name)
530555

531556
if self.settings:
532557
if should_keep_replicas:
@@ -536,24 +561,30 @@ def reindex_all(self, batch_size=1000):
536561
self.settings["slaves"] = slaves
537562
logger.debug("RESTORE SLAVES")
538563
if should_keep_replicas or should_keep_slaves:
539-
self.__index.set_settings(self.settings)
564+
self.__client.set_settings(self.index_name, self.settings)
540565
if should_keep_rules:
541-
response = self.__index.save_rules(
542-
rules, {"forwardToReplicas": True}
566+
save_rules_response = self.__client.save_rules(
567+
self.index_name, rules, True
568+
)
569+
self.__client.wait_for_task(
570+
self.index_name, save_rules_response.task_id
543571
)
544-
response.wait()
545572
logger.info(
546-
"Saved rules for index %s with response: {}".format(response),
573+
"Saved rules for index %s with response: {}".format(
574+
save_rules_response
575+
),
547576
self.index_name,
548577
)
549578
if should_keep_synonyms:
550-
response = self.__index.save_synonyms(
551-
synonyms, {"forwardToReplicas": True}
579+
save_synonyms_response = self.__client.save_synonyms(
580+
self.index_name, synonyms, True
581+
)
582+
self.__client.wait_for_task(
583+
self.index_name, save_synonyms_response.task_id
552584
)
553-
response.wait()
554585
logger.info(
555586
"Saved synonyms for index %s with response: {}".format(
556-
response
587+
save_synonyms_response
557588
),
558589
self.index_name,
559590
)

algoliasearch_django/registration.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
from django.db.models.signals import post_save
55
from django.db.models.signals import pre_delete
6-
from algoliasearch.search_client import SearchClient
7-
from algoliasearch.user_agent import UserAgent
6+
from algoliasearch.search.client import SearchClientSync
87

98
from .models import AlgoliaIndex
109
from .settings import SETTINGS
@@ -13,9 +12,6 @@
1312

1413
logger = logging.getLogger(__name__)
1514

16-
UserAgent.add("Algolia for Django", VERSION)
17-
UserAgent.add("Django", django_version())
18-
1915

2016
class AlgoliaEngineError(Exception):
2117
"""Something went wrong with Algolia Engine."""
@@ -39,7 +35,10 @@ def __init__(self, settings=SETTINGS):
3935
self.__settings = settings
4036

4137
self.__registered_models = {}
42-
self.client = SearchClient.create(app_id, api_key)
38+
self.client = SearchClientSync(app_id, api_key)
39+
self.client._config.user_agent.add("Algolia for Django", VERSION).add(
40+
"Django", django_version()
41+
)
4342

4443
def is_registered(self, model):
4544
"""Checks whether the given models is registered with Algolia engine"""

tests/test_commands.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ def tearDownClass(cls):
1616
user_index_name = get_adapter(User).index_name
1717
website_index_name = get_adapter(Website).index_name
1818

19-
algolia_engine.client.init_index(user_index_name).delete()
20-
algolia_engine.client.init_index(website_index_name).delete()
19+
algolia_engine.client.delete_index(user_index_name)
20+
algolia_engine.client.delete_index(website_index_name)
2121

2222
def setUp(self):
2323
# Create some records

tests/test_engine.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import six
2-
import re
32

43
from django.conf import settings
54
from django.test import TestCase
65

7-
from algoliasearch.user_agent import UserAgent
86
from django import get_version as django_version
97
from algoliasearch_django.version import VERSION
108
from algoliasearch_django import algolia_engine
@@ -34,12 +32,10 @@ def test_init_exception(self):
3432
AlgoliaEngine(settings=settings.ALGOLIA)
3533

3634
def test_user_agent(self):
37-
user_agent = UserAgent.get()
38-
39-
parts = re.split("\s*;\s*", user_agent)
40-
41-
self.assertIn("Django (%s)" % django_version(), parts)
42-
self.assertIn("Algolia for Django (%s)" % VERSION, parts)
35+
self.assertIn(
36+
"Algolia for Django (%s); Django (%s)" % VERSION % django_version(),
37+
self.engine.client._config.user_agent.get(),
38+
)
4339

4440
def test_auto_discover_indexes(self):
4541
"""Test that the `index` module was auto-discovered and the models registered"""

0 commit comments

Comments
 (0)