intermediate commit
This commit is contained in:
parent
cb6834b3c0
commit
1468e5cdde
|
|
@ -848,10 +848,13 @@ class GuideElementManager(models.Manager):
|
||||||
if product_qs.exists() and wine_region_node_qs.exists():
|
if product_qs.exists() and wine_region_node_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()
|
root_node = wine_region_node.get_root()
|
||||||
return self.get_or_create(guide_element_type=guide_element_type_qs.first(),
|
product = product_qs.first()
|
||||||
parent=wine_region_node,
|
|
||||||
guide=root_node.guide,
|
if product.establishment:
|
||||||
product=product_qs.first())
|
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 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):
|
||||||
|
|
@ -869,7 +872,7 @@ class GuideElementManager(models.Manager):
|
||||||
})
|
})
|
||||||
|
|
||||||
if parent_node_qs.exists() and guide_element_type_qs.exists():
|
if parent_node_qs.exists() and guide_element_type_qs.exists():
|
||||||
root_node = parent_node_qs.first().get_root()
|
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,
|
||||||
|
|
@ -884,7 +887,7 @@ class GuideElementManager(models.Manager):
|
||||||
review_qs = Review.objects.filter(id=review_id)
|
review_qs = Review.objects.filter(id=review_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():
|
||||||
root_node = parent_node_qs.first().get_root()
|
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(),
|
||||||
|
|
|
||||||
|
|
@ -152,6 +152,8 @@ class GuideElementBaseSerializer(serializers.ModelSerializer):
|
||||||
allow_null=True)
|
allow_null=True)
|
||||||
wine_color_section_name = serializers.CharField(source='wine_color_section.name',
|
wine_color_section_name = serializers.CharField(source='wine_color_section.name',
|
||||||
allow_null=True)
|
allow_null=True)
|
||||||
|
wine_region_name = serializers.CharField(source='wine_region.name',
|
||||||
|
allow_null=True)
|
||||||
node_name = serializers.CharField(source='guide_element_type.name')
|
node_name = serializers.CharField(source='guide_element_type.name')
|
||||||
label_photo = serializers.ImageField(source='label_photo.image', allow_null=True)
|
label_photo = serializers.ImageField(source='label_photo.image', allow_null=True)
|
||||||
city_name = serializers.CharField(source='city.name', allow_null=True)
|
city_name = serializers.CharField(source='city.name', allow_null=True)
|
||||||
|
|
@ -167,12 +169,12 @@ class GuideElementBaseSerializer(serializers.ModelSerializer):
|
||||||
'node_name',
|
'node_name',
|
||||||
'establishment_detail',
|
'establishment_detail',
|
||||||
'review',
|
'review',
|
||||||
'wine_region',
|
|
||||||
'product_detail',
|
'product_detail',
|
||||||
'priority',
|
'priority',
|
||||||
'city_name',
|
'city_name',
|
||||||
'section_name',
|
'section_name',
|
||||||
'wine_color_section_name',
|
'wine_color_section_name',
|
||||||
|
'wine_region_name',
|
||||||
'children',
|
'children',
|
||||||
'label_photo',
|
'label_photo',
|
||||||
]
|
]
|
||||||
|
|
@ -237,19 +239,26 @@ class GuideElementExportSerializer(GuideElementBaseSerializer):
|
||||||
default=None)
|
default=None)
|
||||||
metadata = serializers.ListField(source='establishment.metadata',
|
metadata = serializers.ListField(source='establishment.metadata',
|
||||||
default=None)
|
default=None)
|
||||||
advertorial_page = serializers.IntegerField(default=None)
|
# advertorial_number_of_pages = serializers.IntegerField(source='number_of_pages',
|
||||||
|
# default=None)
|
||||||
|
# advertorial_right_pages = serializers.IntegerField(source='right_pages',
|
||||||
|
# default=None)
|
||||||
|
|
||||||
# PRODUCT
|
# PRODUCT
|
||||||
product_name = serializers.CharField(source='product.name',
|
product_name = serializers.CharField(source='product.name',
|
||||||
default=None)
|
default=None)
|
||||||
product_review = serializers.DictField(source='product.establishment.last_published_review_data',
|
product_review = serializers.DictField(source='product.last_published_review_data',
|
||||||
default=None)
|
default=None)
|
||||||
product_type = serializers.CharField(source='product.product_type_label',
|
product_type = serializers.CharField(source='product.product_type.label',
|
||||||
default=None)
|
default=None)
|
||||||
product_subtypes = serializers.CharField(source='product.product_subtype_labels',
|
product_subtypes = serializers.CharField(source='product.product_subtype_labels',
|
||||||
default=None)
|
default=None)
|
||||||
|
product_city = serializers.CharField(source='product.establishment.address.city.name',
|
||||||
|
default=None)
|
||||||
product_address = serializers.CharField(source='product.establishment.address.full_address',
|
product_address = serializers.CharField(source='product.establishment.address.full_address',
|
||||||
default=None)
|
default=None)
|
||||||
|
product_metadata = serializers.ListField(source='product.metadata',
|
||||||
|
default=None)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.GuideElement
|
model = models.GuideElement
|
||||||
|
|
@ -257,16 +266,8 @@ class GuideElementExportSerializer(GuideElementBaseSerializer):
|
||||||
'id',
|
'id',
|
||||||
'guide',
|
'guide',
|
||||||
'node_name',
|
'node_name',
|
||||||
# 'establishment',
|
|
||||||
# 'review',
|
|
||||||
# 'wine_region',
|
|
||||||
# 'product_detail',
|
|
||||||
# 'priority',
|
|
||||||
'city_name',
|
'city_name',
|
||||||
# 'section_name',
|
'wine_color_section_name',
|
||||||
# 'wine_color_section_name',
|
|
||||||
# 'children',
|
|
||||||
'label_photo_url',
|
|
||||||
'name',
|
'name',
|
||||||
'public_mark',
|
'public_mark',
|
||||||
'toque_number',
|
'toque_number',
|
||||||
|
|
@ -278,5 +279,13 @@ class GuideElementExportSerializer(GuideElementBaseSerializer):
|
||||||
'review',
|
'review',
|
||||||
'price_level',
|
'price_level',
|
||||||
'metadata',
|
'metadata',
|
||||||
'advertorial_page',
|
# 'advertorial_number_of_pages',
|
||||||
|
# 'advertorial_right_pages',
|
||||||
|
'product_name',
|
||||||
|
'product_review',
|
||||||
|
'product_type',
|
||||||
|
'product_subtypes',
|
||||||
|
'product_address',
|
||||||
|
'product_city',
|
||||||
|
'product_metadata',
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ def export_guide(guide_id, user_id, file_type='csv'):
|
||||||
nodes = root.get_descendants().select_related('review', 'establishment', 'wine_region',
|
nodes = root.get_descendants().select_related('review', 'establishment', 'wine_region',
|
||||||
'product', 'city', 'wine_color_section',
|
'product', 'city', 'wine_color_section',
|
||||||
'section', 'label_photo', 'guide',
|
'section', 'label_photo', 'guide',
|
||||||
'city__country', 'establishment__establishment_type')
|
'city__country', 'establishment__establishment_type')[:100]
|
||||||
serializer = GuideElementExportSerializer(nodes, many=True)
|
serializer = GuideElementExportSerializer(nodes, many=True)
|
||||||
data = serializer.data
|
data = serializer.data
|
||||||
SendGuideExport(
|
SendGuideExport(
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,10 @@ class ProductType(TypeDefaultImageMixin, TranslatedFieldsMixin, ProjectBaseMixin
|
||||||
verbose_name = _('Product type')
|
verbose_name = _('Product type')
|
||||||
verbose_name_plural = _('Product types')
|
verbose_name_plural = _('Product types')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def label(self):
|
||||||
|
return transform_into_readable_str(self.index_name)
|
||||||
|
|
||||||
|
|
||||||
class ProductSubType(TypeDefaultImageMixin, TranslatedFieldsMixin, ProjectBaseMixin):
|
class ProductSubType(TypeDefaultImageMixin, TranslatedFieldsMixin, ProjectBaseMixin):
|
||||||
"""ProductSubtype model."""
|
"""ProductSubtype model."""
|
||||||
|
|
@ -410,6 +414,27 @@ class Product(GalleryMixin, TranslatedFieldsMixin, BaseAttributes,
|
||||||
if self.wine_region:
|
if self.wine_region:
|
||||||
return self.wine_region.name
|
return self.wine_region.name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def metadata(self):
|
||||||
|
if self.product_type:
|
||||||
|
metadata = []
|
||||||
|
tag_categories = (
|
||||||
|
self.product_type.tag_categories.exclude(index_name__in=[
|
||||||
|
'business_tag', 'purchased_item', 'accepted_payments_de',
|
||||||
|
'accepted_payments_hr', 'drinks', 'bottles_per_year',
|
||||||
|
'serial_number', 'surface', 'cooperative', 'tag',
|
||||||
|
'outside_sits', 'private_room']).values_list('index_name', flat=True)
|
||||||
|
)
|
||||||
|
for category in tag_categories:
|
||||||
|
tags = self.tags.filter(category__index_name=category).values_list('value', flat=True)
|
||||||
|
|
||||||
|
if tags.exists():
|
||||||
|
category_tags = {category: []}
|
||||||
|
for tag in tags:
|
||||||
|
category_tags[category].append(tag)
|
||||||
|
metadata.append(category_tags)
|
||||||
|
return metadata
|
||||||
|
|
||||||
|
|
||||||
class OnlineProductManager(ProductManager):
|
class OnlineProductManager(ProductManager):
|
||||||
"""Extended manger for OnlineProduct model."""
|
"""Extended manger for OnlineProduct model."""
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,14 @@ import csv
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
from smtplib import SMTPException
|
from smtplib import SMTPException
|
||||||
|
|
||||||
import docx
|
import docx
|
||||||
import xlsxwriter
|
import xlsxwriter
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.mail import EmailMultiAlternatives
|
from django.core.mail import EmailMultiAlternatives
|
||||||
from docx.blkcntnr import BlockItemContainer
|
|
||||||
from timetable.models import Timetable
|
|
||||||
from docx.shared import RGBColor, Pt
|
from docx.shared import RGBColor, Pt
|
||||||
import xml.etree.ElementTree as ET
|
|
||||||
|
|
||||||
from utils.methods import section_name_into_index_name
|
from utils.methods import section_name_into_index_name
|
||||||
|
|
||||||
|
|
@ -382,13 +380,50 @@ class SendGuideExport(SendExportBase):
|
||||||
name = self.guide.slug
|
name = self.guide.slug
|
||||||
return f'export_{name}.{self.file_type}'
|
return f'export_{name}.{self.file_type}'
|
||||||
|
|
||||||
def make_doc_file(self):
|
def get_headers(self):
|
||||||
document = DocTemplate()
|
headers = list(self.data[0].keys())
|
||||||
document.template(self.get_doc_data())
|
headers.pop(headers.index('node_name'))
|
||||||
document.document.save(self.file_path)
|
|
||||||
self.success = True
|
self.success = True
|
||||||
|
return headers
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
|
excluded_data = ['guide', ]
|
||||||
|
if self.guide.guide_type in [self.guide.ARTISAN, self.guide.RESTAURANT]:
|
||||||
|
excluded_data.extend([
|
||||||
|
'product_name',
|
||||||
|
'product_review',
|
||||||
|
'product_type',
|
||||||
|
'product_subtypes',
|
||||||
|
'product_address',
|
||||||
|
'product_city',
|
||||||
|
'product_metadata',
|
||||||
|
'wine_color_section_name',
|
||||||
|
|
||||||
|
])
|
||||||
|
elif self.guide.guide_type == self.guide.WINE:
|
||||||
|
excluded_data.extend([
|
||||||
|
'public_mark',
|
||||||
|
'toque_number',
|
||||||
|
'schedule',
|
||||||
|
'address',
|
||||||
|
'phones',
|
||||||
|
'establishment_type',
|
||||||
|
'establishment_subtypes',
|
||||||
|
'review',
|
||||||
|
'price_level',
|
||||||
|
'metadata',
|
||||||
|
'public_mark',
|
||||||
|
'toque_number',
|
||||||
|
'schedule',
|
||||||
|
'phones',
|
||||||
|
'establishment_type',
|
||||||
|
'establishment_subtypes',
|
||||||
|
'city_name',
|
||||||
|
])
|
||||||
|
|
||||||
|
for obj in self.data:
|
||||||
|
for column in excluded_data:
|
||||||
|
obj.pop(column) if column in obj.keys() else None
|
||||||
return self.data
|
return self.data
|
||||||
|
|
||||||
def get_doc_data(self):
|
def get_doc_data(self):
|
||||||
|
|
@ -426,33 +461,11 @@ class SendGuideExport(SendExportBase):
|
||||||
print(f'ok: {self.file_path}')
|
print(f'ok: {self.file_path}')
|
||||||
self.send_email()
|
self.send_email()
|
||||||
|
|
||||||
def get_headers(self):
|
def make_doc_file(self):
|
||||||
"""Get headers for model Establishment."""
|
document = DocTemplate()
|
||||||
exclude_headers = ['node_name', ]
|
document.template(self.get_doc_data())
|
||||||
headers = list(self.data[0].keys())
|
document.document.save(self.file_path)
|
||||||
|
self.success = True
|
||||||
if self.guide.RESTAURANT or self.guide.ARTISAN:
|
|
||||||
exclude_headers.append('product_name', )
|
|
||||||
if self.guide.WINE:
|
|
||||||
exclude_headers.extend([
|
|
||||||
'name',
|
|
||||||
'public_mark',
|
|
||||||
'toque_number',
|
|
||||||
'schedule',
|
|
||||||
'address',
|
|
||||||
'phones',
|
|
||||||
'establishment_type',
|
|
||||||
'establishment_subtypes',
|
|
||||||
'review',
|
|
||||||
'price_level',
|
|
||||||
'metadata',
|
|
||||||
])
|
|
||||||
|
|
||||||
for name in set(exclude_headers):
|
|
||||||
headers.pop(headers.index(name))
|
|
||||||
else:
|
|
||||||
self.success = True
|
|
||||||
return headers
|
|
||||||
|
|
||||||
def make_csv_file(self):
|
def make_csv_file(self):
|
||||||
file_header = self.get_headers()
|
file_header = self.get_headers()
|
||||||
|
|
@ -475,25 +488,79 @@ class SendGuideExport(SendExportBase):
|
||||||
file_writer.writerow(row.values())
|
file_writer.writerow(row.values())
|
||||||
|
|
||||||
def make_xml_file(self):
|
def make_xml_file(self):
|
||||||
# create the file structure
|
if self.guide.guide_type == self.guide.WINE:
|
||||||
data = ET.Element('data')
|
# products
|
||||||
items = ET.SubElement(data, 'items')
|
city = None
|
||||||
city = None
|
wine_color = None
|
||||||
for row in self.get_data():
|
establishment_name = None
|
||||||
row_city = row.get('city_name')
|
establishment_address = None
|
||||||
if row_city:
|
advertorial = None
|
||||||
city = row_city
|
|
||||||
else:
|
|
||||||
row['city_name'] = city
|
|
||||||
|
|
||||||
if row.pop("node_name") == "EstablishmentNode":
|
# create the file structure
|
||||||
for key, value in row.items():
|
data = ET.Element('data')
|
||||||
item1 = ET.SubElement(items, 'item')
|
products = ET.SubElement(data, 'products')
|
||||||
item1.set('name', key)
|
|
||||||
item1.text = str(value)
|
|
||||||
|
|
||||||
# create a new XML file with the results
|
for row in self.get_data():
|
||||||
tree = ET.ElementTree(data)
|
row_establishment_address = row.get('address')
|
||||||
with open(self.file_path, 'bw') as f:
|
if row_establishment_address:
|
||||||
tree.write(f)
|
establishment_address = row_establishment_address
|
||||||
self.success = True
|
else:
|
||||||
|
row['establishment_name'] = establishment_address
|
||||||
|
|
||||||
|
row_establishment = row.pop('name')
|
||||||
|
if row_establishment:
|
||||||
|
establishment_name = row_establishment
|
||||||
|
else:
|
||||||
|
row['establishment_name'] = establishment_name
|
||||||
|
|
||||||
|
row_city = row.get('product_city')
|
||||||
|
if row_city:
|
||||||
|
city = row_city
|
||||||
|
else:
|
||||||
|
row['city_name'] = city
|
||||||
|
|
||||||
|
row_wine_color = row.pop('wine_color_section_name')
|
||||||
|
if row_wine_color:
|
||||||
|
wine_color = row_wine_color
|
||||||
|
else:
|
||||||
|
row['wine_color'] = wine_color
|
||||||
|
|
||||||
|
if row.pop("node_name") == "WineNode":
|
||||||
|
product = ET.SubElement(products, 'product')
|
||||||
|
for key, value in row.items():
|
||||||
|
prop = ET.SubElement(product, 'prop')
|
||||||
|
prop.set('name', key)
|
||||||
|
prop.text = str(value)
|
||||||
|
|
||||||
|
# create a new XML file with the results
|
||||||
|
tree = ET.ElementTree(data)
|
||||||
|
with open(self.file_path, 'bw') as f:
|
||||||
|
tree.write(f)
|
||||||
|
self.success = True
|
||||||
|
|
||||||
|
elif self.guide.guide_type in [self.guide.ARTISAN, self.guide.RESTAURANT]:
|
||||||
|
# establishment
|
||||||
|
# create the file structure
|
||||||
|
data = ET.Element('data')
|
||||||
|
items = ET.SubElement(data, 'cities')
|
||||||
|
city = None
|
||||||
|
|
||||||
|
for row in self.get_data():
|
||||||
|
row_city = row.get('city_name')
|
||||||
|
if row_city:
|
||||||
|
city = row_city
|
||||||
|
else:
|
||||||
|
row['city_name'] = city
|
||||||
|
|
||||||
|
if row.pop("node_name") == "EstablishmentNode":
|
||||||
|
item = ET.SubElement(items, 'city')
|
||||||
|
for key, value in row.items():
|
||||||
|
prop = ET.SubElement(item, 'prop')
|
||||||
|
prop.set('name', key)
|
||||||
|
prop.text = str(value)
|
||||||
|
|
||||||
|
# create a new XML file with the results
|
||||||
|
tree = ET.ElementTree(data)
|
||||||
|
with open(self.file_path, 'bw') as f:
|
||||||
|
tree.write(f)
|
||||||
|
self.success = True
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user