gault-millau/apps/search_indexes/signals.py
2020-01-22 20:50:55 +03:00

72 lines
2.6 KiB
Python

"""Search indexes app signals."""
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_elasticsearch_dsl.registries import registry
@receiver(post_save)
def update_document(sender, **kwargs):
from establishment.models import Establishment
from search_indexes.tasks import es_update
app_label = sender._meta.app_label
model_name = sender._meta.model_name
instance = kwargs['instance']
app_label_model_name_to_filter = {
('location', 'country'): 'address__city__country',
('location', 'city'): 'address__city',
('location', 'address'): 'address',
# todo: remove after migration
('establishment', 'establishmenttype'): 'establishment_type',
('establishment', 'establishmentsubtype'): 'establishment_subtypes',
('tag', 'tag'): 'tags',
}
filter_name = app_label_model_name_to_filter.get((app_label, model_name))
if filter_name:
qs = Establishment.objects.filter(**{filter_name: instance})
for item in qs:
es_update(item)
@receiver(post_save)
def update_news(sender, **kwargs):
from news.models import News
app_label = sender._meta.app_label
model_name = sender._meta.model_name
instance = kwargs['instance']
app_label_model_name_to_filter = {
('location', 'country'): 'country',
('news', 'newstype'): 'news_type',
('tag', 'tag'): 'tags',
}
filter_name = app_label_model_name_to_filter.get((app_label, model_name))
if filter_name:
if filter_name == 'news_type':
registry.update_related(instance)
return
qs = News.objects.filter(**{filter_name: instance})
for product in qs:
registry.update(product)
@receiver(post_save)
def update_product(sender, **kwargs):
from product.models import Product
app_label = sender._meta.app_label
model_name = sender._meta.model_name
instance = kwargs['instance']
app_label_model_name_to_filter = {
('product', 'productstandard'): 'standards',
('product', 'producttype'): 'product_type',
('tag', 'tag'): 'tags',
# ('location', 'wineregion'): 'wine_region',
# ('location', 'winesubregion'): 'wine_sub_region',
# ('location', 'winevillage'): 'wine_village',
('establishment', 'establishment'): 'establishment',
}
filter_name = app_label_model_name_to_filter.get((app_label, model_name))
if filter_name:
qs = Product.objects.filter(**{filter_name: instance})
for product in qs:
registry.update(product)