diff --git a/apps/collection/models.py b/apps/collection/models.py index dc925e0c..bda5e9e3 100644 --- a/apps/collection/models.py +++ b/apps/collection/models.py @@ -866,19 +866,22 @@ class GuideElementManager(models.Manager): city=city_qs.first()) return None, False - def get_or_create_establishment_section_node(self, city_node: int, establishment_node_name: str): + def get_or_create_establishment_section_node(self, city_node_id: int, establishment_node_name: str, + guide_id: int): """Get or Create (Restaurant|Shop...)SectionNode.""" - parent_node_qs = GuideElement.objects.filter(id=city_node) + parent_node_qs = GuideElement.objects.filter(id=city_node_id) guide_element_type_qs = GuideElementType.objects.filter(name__iexact=establishment_node_name) + guide_qs = Guide.objects.filter(id=guide_id) - if parent_node_qs.exists() and guide_element_type_qs.exists(): + if parent_node_qs.exists() and guide_element_type_qs.exists() and guide_qs.exists(): parent_node = parent_node_qs.first() + return self.get_or_create(guide_element_type=guide_element_type_qs.first(), parent=parent_node, - guide=parent_node.parent.guide) + guide=guide_qs.first()) return None, False - def get_or_create_establishment_node(self, restaurant_section_node_id: int, + def get_or_create_establishment_node(self, restaurant_section_node_id: int, guide_id: int, establishment_id: int, review_id: int = None): """Get or Create EstablishmentNode.""" from establishment.models import Establishment @@ -887,14 +890,16 @@ class GuideElementManager(models.Manager): guide_element_type_qs = GuideElementType.objects.filter(name='EstablishmentNode') parent_node_qs = GuideElement.objects.filter(id=restaurant_section_node_id) establishment_qs = Establishment.objects.filter(id=establishment_id) + guide_qs = Guide.objects.filter(id=guide_id) - if parent_node_qs.exists() and establishment_qs.exists() and guide_element_type_qs.exists(): + if (parent_node_qs.exists() and establishment_qs.exists() + and guide_element_type_qs.exists() and guide_qs.exists()): establishment = establishment_qs.first() parent_node = parent_node_qs.first() data.update({ 'guide_element_type': guide_element_type_qs.first(), 'parent': parent_node, - 'guide': parent_node.get_root().guide, + 'guide': guide_qs.first(), 'establishment': establishment }) if review_id: @@ -903,44 +908,47 @@ class GuideElementManager(models.Manager): return self.get_or_create(**data) return None, False - def get_or_create_wine_region_node(self, root_node_id: int, wine_region_id: int): + def get_or_create_wine_region_node(self, root_node_id: int, wine_region_id: int, guide_id: int): """Get or Create WineRegionNode.""" guide_element_type_qs = GuideElementType.objects.filter(name='RegionNode') parent_node_qs = GuideElement.objects.filter(id=root_node_id) wine_region_qs = WineRegion.objects.filter(id=wine_region_id) + guide_qs = Guide.objects.filter(id=guide_id) - if parent_node_qs.exists() and parent_node_qs.first().guide and wine_region_qs.exists() and guide_element_type_qs.exists(): + if (parent_node_qs.exists() and parent_node_qs.first().guide and + wine_region_qs.exists() and guide_element_type_qs.exists() and + guide_qs.exists()): root_node = parent_node_qs.first() return self.get_or_create(guide_element_type=guide_element_type_qs.first(), parent=root_node, - guide=root_node.guide, + guide=guide_qs.first(), wine_region=wine_region_qs.first()) return None, False - def get_or_create_yard_node(self, product_id: int, wine_region_node_id: int): + def get_or_create_yard_node(self, product_id: int, wine_region_node_id: int, guide_id: int): """Make YardNode.""" from establishment.models import Establishment guide_element_type_qs = GuideElementType.objects.filter(name='YardNode') wine_region_node_qs = GuideElement.objects.filter(id=wine_region_node_id) product_qs = Product.objects.filter(id=product_id) + guide_qs = Guide.objects.filter(id=guide_id) - if product_qs.exists() and wine_region_node_qs.exists(): + if product_qs.exists() and wine_region_node_qs.exists() and guide_qs.exists(): wine_region_node = wine_region_node_qs.first() - root_node = wine_region_node.get_root() product = product_qs.first() - - if product.establishment: - return self.get_or_create(guide_element_type=guide_element_type_qs.first(), - parent=wine_region_node, - guide=root_node.guide, - establishment=product.establishment) + return self.get_or_create(guide_element_type=guide_element_type_qs.first(), + parent=wine_region_node, + guide=guide_qs.first(), + establishment=product.establishment) return None, False - def get_or_create_color_wine_section_node(self, wine_color_name: str, yard_node_id: int): + def get_or_create_color_wine_section_node(self, wine_color_name: str, + yard_node_id: int, guide_id: int): """Get or Create WineSectionNode.""" guide_element_type_qs = GuideElementType.objects.filter(name='ColorWineSectionNode') parent_node_qs = GuideElement.objects.filter(id=yard_node_id) + guide_qs = Guide.objects.filter(id=guide_id) if not wine_color_name.endswith('SectionNode'): wine_color_name = transform_into_section_name(wine_color_name) @@ -951,27 +959,30 @@ class GuideElementManager(models.Manager): 'name': wine_color_name }) - if parent_node_qs.exists() and guide_element_type_qs.exists(): + if parent_node_qs.exists() and guide_element_type_qs.exists() and guide_qs.exists(): root_node = parent_node_qs.first() return self.get_or_create(guide_element_type=guide_element_type_qs.first(), parent=root_node, wine_color_section=wine_color_section, - guide=root_node.guide) + guide=guide_qs.first()) return None, False - def get_or_create_wine_node(self, color_wine_section_node_id: int, wine_id: int, review_id: int): + def get_or_create_wine_node(self, color_wine_section_node_id: int, + wine_id: int, review_id: int, guide_id: int): """Get or Create WineNode.""" guide_element_type_qs = GuideElementType.objects.filter(name='WineNode') parent_node_qs = GuideElement.objects.filter(id=color_wine_section_node_id) wine_qs = Product.objects.wines().filter(id=wine_id) review_qs = Review.objects.filter(id=review_id) + guide_qs = Guide.objects.filter(id=guide_id) - if parent_node_qs.exists() and wine_qs.exists() and review_qs.exists() and guide_element_type_qs.exists(): + if (parent_node_qs.exists() and wine_qs.exists() and + review_qs.exists() and guide_element_type_qs.exists() and guide_qs.exists()): root_node = parent_node_qs.first() return self.get_or_create(guide_element_type=guide_element_type_qs.first(), parent=root_node, product=wine_qs.first(), - guide=root_node.guide, + guide=guide_qs.first(), review=review_qs.first()) return None, False diff --git a/apps/collection/tasks.py b/apps/collection/tasks.py index 24ac6686..8efc4eec 100644 --- a/apps/collection/tasks.py +++ b/apps/collection/tasks.py @@ -9,23 +9,25 @@ logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) -def get_additional_establishment_data(section_node, establishment): - data = [ - section_node.id, - establishment.id, - ] +def get_additional_establishment_data(section_node, establishment, guide): + data = { + 'restaurant_section_node_id': section_node.id, + 'guide_id': guide.id, + 'establishment_id': establishment.id, + } if establishment.last_published_review: - data.append(establishment.last_published_review.id) + data.update({'review_id': establishment.last_published_review.id}) return data -def get_additional_product_data(section_node, product): - data = [ - section_node.id, - product.id, - ] +def get_additional_product_data(section_node, product, guide): + data = { + 'color_wine_section_node_id': section_node.id, + 'wine_id': product.id, + 'guide_id': guide.id, + } if product.last_published_review: - data.append(product.last_published_review.id) + data.update({'review_id': product.last_published_review.id}) return data @@ -70,11 +72,13 @@ def populate_establishment_guide(guide_id: int, establishment_id: int): section_node, _ = GuideElement.objects.get_or_create_establishment_section_node( city_node.id, transform_into_section_name(establishment.establishment_type.index_name), + guide_id, ) if section_node: GuideElement.objects.get_or_create_establishment_node( - *get_additional_establishment_data(section_node=section_node, - establishment=establishment)) + **get_additional_establishment_data(section_node=section_node, + establishment=establishment, + guide=guide)) else: logger.error( f'METHOD_NAME: {generate_establishment_guide_elements.__name__}\n' @@ -87,7 +91,7 @@ def populate_establishment_guide(guide_id: int, establishment_id: int): f'DETAIL: Guide ID {guide_id} - RootNode is not exists.') else: logger.error(f'METHOD_NAME: {generate_establishment_guide_elements.__name__}\n' - f'DETAIL: Guide ID {guide_id} - Establishment {establishment_id} id is not exists.') + f'DETAIL: Guide ID {guide_id} - Establishment {establishment_id} id is not exists.') except Exception as e: guide.change_state(Guide.WAITING) logger.error(f'METHOD_NAME: {generate_establishment_guide_elements.__name__}\n' @@ -152,24 +156,27 @@ def generate_product_guide_elements(guide_id: int, filter_set: dict): if root_node: wine_region_node, _ = GuideElement.objects.get_or_create_wine_region_node( root_node.id, - wine.wine_region.id) + wine.wine_region.id, + guide_id) if wine_region_node: yard_node, _ = GuideElement.objects.get_or_create_yard_node( - product_id=wine.id, - wine_region_node_id=wine_region_node.id - ) + wine.id, + wine_region_node.id, + guide_id) if yard_node: wine_color_qs = wine.wine_colors if wine_color_qs.exists(): wine_color_section, _ = GuideElement.objects.get_or_create_color_wine_section_node( - wine_color_name=wine_color_qs.first().value, - yard_node_id=yard_node.id + wine_color_qs.first().value, + yard_node.id, + guide_id ) if wine_color_section: GuideElement.objects.get_or_create_wine_node( - *get_additional_product_data( - section_node=wine_color_section, - product=wine)) + **get_additional_product_data( + wine_color_section, + wine, + guide)) else: logger.error( f'METHOD_NAME: {generate_product_guide_elements.__name__}\n'