fix guide

This commit is contained in:
Anatoly 2020-02-04 18:41:55 +03:00
parent 49d6a983d9
commit 68ceb44acf
2 changed files with 67 additions and 49 deletions

View File

@ -866,19 +866,22 @@ class GuideElementManager(models.Manager):
city=city_qs.first()) city=city_qs.first())
return None, False 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.""" """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_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() parent_node = parent_node_qs.first()
return self.get_or_create(guide_element_type=guide_element_type_qs.first(), return self.get_or_create(guide_element_type=guide_element_type_qs.first(),
parent=parent_node, parent=parent_node,
guide=parent_node.parent.guide) guide=guide_qs.first())
return None, False 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): establishment_id: int, review_id: int = None):
"""Get or Create EstablishmentNode.""" """Get or Create EstablishmentNode."""
from establishment.models import Establishment from establishment.models import Establishment
@ -887,14 +890,16 @@ class GuideElementManager(models.Manager):
guide_element_type_qs = GuideElementType.objects.filter(name='EstablishmentNode') guide_element_type_qs = GuideElementType.objects.filter(name='EstablishmentNode')
parent_node_qs = GuideElement.objects.filter(id=restaurant_section_node_id) parent_node_qs = GuideElement.objects.filter(id=restaurant_section_node_id)
establishment_qs = Establishment.objects.filter(id=establishment_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() establishment = establishment_qs.first()
parent_node = parent_node_qs.first() parent_node = parent_node_qs.first()
data.update({ data.update({
'guide_element_type': guide_element_type_qs.first(), 'guide_element_type': guide_element_type_qs.first(),
'parent': parent_node, 'parent': parent_node,
'guide': parent_node.get_root().guide, 'guide': guide_qs.first(),
'establishment': establishment 'establishment': establishment
}) })
if review_id: if review_id:
@ -903,44 +908,47 @@ class GuideElementManager(models.Manager):
return self.get_or_create(**data) return self.get_or_create(**data)
return None, False 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.""" """Get or Create WineRegionNode."""
guide_element_type_qs = GuideElementType.objects.filter(name='RegionNode') guide_element_type_qs = GuideElementType.objects.filter(name='RegionNode')
parent_node_qs = GuideElement.objects.filter(id=root_node_id) parent_node_qs = GuideElement.objects.filter(id=root_node_id)
wine_region_qs = WineRegion.objects.filter(id=wine_region_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() root_node = parent_node_qs.first()
return self.get_or_create(guide_element_type=guide_element_type_qs.first(), return self.get_or_create(guide_element_type=guide_element_type_qs.first(),
parent=root_node, parent=root_node,
guide=root_node.guide, guide=guide_qs.first(),
wine_region=wine_region_qs.first()) wine_region=wine_region_qs.first())
return None, False 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.""" """Make YardNode."""
from establishment.models import Establishment from establishment.models import Establishment
guide_element_type_qs = GuideElementType.objects.filter(name='YardNode') guide_element_type_qs = GuideElementType.objects.filter(name='YardNode')
wine_region_node_qs = GuideElement.objects.filter(id=wine_region_node_id) wine_region_node_qs = GuideElement.objects.filter(id=wine_region_node_id)
product_qs = Product.objects.filter(id=product_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() wine_region_node = wine_region_node_qs.first()
root_node = wine_region_node.get_root()
product = product_qs.first() product = product_qs.first()
return self.get_or_create(guide_element_type=guide_element_type_qs.first(),
if product.establishment: parent=wine_region_node,
return self.get_or_create(guide_element_type=guide_element_type_qs.first(), guide=guide_qs.first(),
parent=wine_region_node, establishment=product.establishment)
guide=root_node.guide,
establishment=product.establishment)
return None, False 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.""" """Get or Create WineSectionNode."""
guide_element_type_qs = GuideElementType.objects.filter(name='ColorWineSectionNode') guide_element_type_qs = GuideElementType.objects.filter(name='ColorWineSectionNode')
parent_node_qs = GuideElement.objects.filter(id=yard_node_id) 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'): if not wine_color_name.endswith('SectionNode'):
wine_color_name = transform_into_section_name(wine_color_name) wine_color_name = transform_into_section_name(wine_color_name)
@ -951,27 +959,30 @@ class GuideElementManager(models.Manager):
'name': wine_color_name '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() root_node = parent_node_qs.first()
return self.get_or_create(guide_element_type=guide_element_type_qs.first(), return self.get_or_create(guide_element_type=guide_element_type_qs.first(),
parent=root_node, parent=root_node,
wine_color_section=wine_color_section, wine_color_section=wine_color_section,
guide=root_node.guide) guide=guide_qs.first())
return None, False 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.""" """Get or Create WineNode."""
guide_element_type_qs = GuideElementType.objects.filter(name='WineNode') guide_element_type_qs = GuideElementType.objects.filter(name='WineNode')
parent_node_qs = GuideElement.objects.filter(id=color_wine_section_node_id) parent_node_qs = GuideElement.objects.filter(id=color_wine_section_node_id)
wine_qs = Product.objects.wines().filter(id=wine_id) wine_qs = Product.objects.wines().filter(id=wine_id)
review_qs = Review.objects.filter(id=review_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() root_node = parent_node_qs.first()
return self.get_or_create(guide_element_type=guide_element_type_qs.first(), return self.get_or_create(guide_element_type=guide_element_type_qs.first(),
parent=root_node, parent=root_node,
product=wine_qs.first(), product=wine_qs.first(),
guide=root_node.guide, guide=guide_qs.first(),
review=review_qs.first()) review=review_qs.first())
return None, False return None, False

View File

@ -9,23 +9,25 @@ logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def get_additional_establishment_data(section_node, establishment): def get_additional_establishment_data(section_node, establishment, guide):
data = [ data = {
section_node.id, 'restaurant_section_node_id': section_node.id,
establishment.id, 'guide_id': guide.id,
] 'establishment_id': establishment.id,
}
if establishment.last_published_review: if establishment.last_published_review:
data.append(establishment.last_published_review.id) data.update({'review_id': establishment.last_published_review.id})
return data return data
def get_additional_product_data(section_node, product): def get_additional_product_data(section_node, product, guide):
data = [ data = {
section_node.id, 'color_wine_section_node_id': section_node.id,
product.id, 'wine_id': product.id,
] 'guide_id': guide.id,
}
if product.last_published_review: if product.last_published_review:
data.append(product.last_published_review.id) data.update({'review_id': product.last_published_review.id})
return data 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( section_node, _ = GuideElement.objects.get_or_create_establishment_section_node(
city_node.id, city_node.id,
transform_into_section_name(establishment.establishment_type.index_name), transform_into_section_name(establishment.establishment_type.index_name),
guide_id,
) )
if section_node: if section_node:
GuideElement.objects.get_or_create_establishment_node( GuideElement.objects.get_or_create_establishment_node(
*get_additional_establishment_data(section_node=section_node, **get_additional_establishment_data(section_node=section_node,
establishment=establishment)) establishment=establishment,
guide=guide))
else: else:
logger.error( logger.error(
f'METHOD_NAME: {generate_establishment_guide_elements.__name__}\n' 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.') f'DETAIL: Guide ID {guide_id} - RootNode is not exists.')
else: else:
logger.error(f'METHOD_NAME: {generate_establishment_guide_elements.__name__}\n' 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: except Exception as e:
guide.change_state(Guide.WAITING) guide.change_state(Guide.WAITING)
logger.error(f'METHOD_NAME: {generate_establishment_guide_elements.__name__}\n' 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: if root_node:
wine_region_node, _ = GuideElement.objects.get_or_create_wine_region_node( wine_region_node, _ = GuideElement.objects.get_or_create_wine_region_node(
root_node.id, root_node.id,
wine.wine_region.id) wine.wine_region.id,
guide_id)
if wine_region_node: if wine_region_node:
yard_node, _ = GuideElement.objects.get_or_create_yard_node( yard_node, _ = GuideElement.objects.get_or_create_yard_node(
product_id=wine.id, wine.id,
wine_region_node_id=wine_region_node.id wine_region_node.id,
) guide_id)
if yard_node: if yard_node:
wine_color_qs = wine.wine_colors wine_color_qs = wine.wine_colors
if wine_color_qs.exists(): if wine_color_qs.exists():
wine_color_section, _ = GuideElement.objects.get_or_create_color_wine_section_node( wine_color_section, _ = GuideElement.objects.get_or_create_color_wine_section_node(
wine_color_name=wine_color_qs.first().value, wine_color_qs.first().value,
yard_node_id=yard_node.id yard_node.id,
guide_id
) )
if wine_color_section: if wine_color_section:
GuideElement.objects.get_or_create_wine_node( GuideElement.objects.get_or_create_wine_node(
*get_additional_product_data( **get_additional_product_data(
section_node=wine_color_section, wine_color_section,
product=wine)) wine,
guide))
else: else:
logger.error( logger.error(
f'METHOD_NAME: {generate_product_guide_elements.__name__}\n' f'METHOD_NAME: {generate_product_guide_elements.__name__}\n'