From 151c0175614bf83f9dbe8577f0957a19ca17dde6 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 27 Dec 2019 17:49:56 +0300 Subject: [PATCH] see changes --- apps/collection/models.py | 5 ++++ apps/collection/serializers/common.py | 11 ++++--- apps/collection/views/back.py | 1 + apps/establishment/admin.py | 2 ++ .../migrations/0070_auto_20191227_1443.py | 23 ++++++++++++++ apps/establishment/models.py | 14 +++++---- .../migrations/0025_auto_20191227_1443.py | 18 +++++++++++ apps/product/models.py | 1 + apps/utils/export.py | 30 ++++++++++++++----- apps/utils/methods.py | 2 +- project/settings/local.py | 27 +++++++---------- 11 files changed, 100 insertions(+), 34 deletions(-) create mode 100644 apps/establishment/migrations/0070_auto_20191227_1443.py create mode 100644 apps/product/migrations/0025_auto_20191227_1443.py diff --git a/apps/collection/models.py b/apps/collection/models.py index c871f634..fcffe393 100644 --- a/apps/collection/models.py +++ b/apps/collection/models.py @@ -965,3 +965,8 @@ class GuideElement(ProjectBaseMixin, MPTTModel): def __str__(self): """Overridden dunder method.""" return self.guide_element_type.name if self.guide_element_type else self.id + + @property + def advertorial_page(self): + if self.advertorial: + return self.advertorial.right_pages diff --git a/apps/collection/serializers/common.py b/apps/collection/serializers/common.py index bbb5d337..8751b02b 100644 --- a/apps/collection/serializers/common.py +++ b/apps/collection/serializers/common.py @@ -220,7 +220,7 @@ class GuideElementExportSerializer(GuideElementBaseSerializer): # establishment = EstablishmentGuideElementSerializer(read_only=True,) name = serializers.CharField(source='establishment.name', default=None) public_mark = serializers.CharField(source='establishment.public_mark_display', default=None) - toque_number = serializers.CharField(source='establishment.toque_number', default=None) + toque_number = serializers.IntegerField(source='establishment.toque_number', default=None) schedule = serializers.DictField(source='establishment.schedule_display', default=None) address = serializers.CharField(source='establishment.address.full_address', @@ -235,13 +235,15 @@ class GuideElementExportSerializer(GuideElementBaseSerializer): default=None) price_level = serializers.CharField(source='establishment.price_level_display', default=None) - # metadata = serializers.ListField(source='establishment.metadata', - # default=None) + metadata = serializers.ListField(source='establishment.metadata', + default=None) + advertorial_page = serializers.IntegerField(default=None) class Meta: model = models.GuideElement fields = [ 'id', + 'guide', 'node_name', # 'establishment', # 'review', @@ -263,5 +265,6 @@ class GuideElementExportSerializer(GuideElementBaseSerializer): 'establishment_subtypes', 'review', 'price_level', - # 'metadata', + 'metadata', + 'advertorial_page', ] diff --git a/apps/collection/views/back.py b/apps/collection/views/back.py index 73e650b5..d6ddd1e0 100644 --- a/apps/collection/views/back.py +++ b/apps/collection/views/back.py @@ -197,6 +197,7 @@ class GuideElementExportDOCView(generics.ListAPIView): """Overridden get_queryset method.""" guide = get_object_or_404( models.Guide.objects.all(), pk=self.kwargs.get('pk')) + # todo: put in GuideElement model tasks.export_guide(guide_id=guide.id, user_id=request.user.id, file_type='doc') return Response({"success": _('The file will be sent to your email.')}, status=status.HTTP_200_OK) diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 81301ddc..5792cf94 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -14,11 +14,13 @@ from review import models as review_models @admin.register(models.EstablishmentType) class EstablishmentTypeAdmin(BaseModelAdminMixin, admin.ModelAdmin): """EstablishmentType admin.""" + raw_id_fields = ('tag_categories', 'default_image', ) @admin.register(models.EstablishmentSubType) class EstablishmentSubTypeAdmin(BaseModelAdminMixin, admin.ModelAdmin): """EstablishmentSubType admin.""" + raw_id_fields = ('tag_categories', 'default_image', ) class AwardInline(GenericTabularInline): diff --git a/apps/establishment/migrations/0070_auto_20191227_1443.py b/apps/establishment/migrations/0070_auto_20191227_1443.py new file mode 100644 index 00000000..04e8aa9b --- /dev/null +++ b/apps/establishment/migrations/0070_auto_20191227_1443.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.7 on 2019-12-27 14:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0069_auto_20191220_1007'), + ] + + operations = [ + migrations.AlterField( + model_name='establishmentsubtype', + name='tag_categories', + field=models.ManyToManyField(blank=True, related_name='establishment_subtypes', to='tag.TagCategory', verbose_name='Tag categories'), + ), + migrations.AlterField( + model_name='establishmenttype', + name='tag_categories', + field=models.ManyToManyField(blank=True, related_name='establishment_types', to='tag.TagCategory', verbose_name='Tag categories'), + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 1acffeb1..d4c31579 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -50,8 +50,9 @@ class EstablishmentType(TypeDefaultImageMixin, TranslatedFieldsMixin, ProjectBas verbose_name=_('Index name')) use_subtypes = models.BooleanField(_('Use subtypes'), default=True) tag_categories = models.ManyToManyField('tag.TagCategory', + blank=True, related_name='establishment_types', - verbose_name=_('Tag')) + verbose_name=_('Tag categories')) default_image = models.ForeignKey('gallery.Image', on_delete=models.SET_NULL, related_name='establishment_types', blank=True, null=True, default=None, @@ -92,8 +93,9 @@ class EstablishmentSubType(TypeDefaultImageMixin, TranslatedFieldsMixin, Project on_delete=models.CASCADE, verbose_name=_('Type')) tag_categories = models.ManyToManyField('tag.TagCategory', + blank=True, related_name='establishment_subtypes', - verbose_name=_('Tag')) + verbose_name=_('Tag categories')) default_image = models.ForeignKey('gallery.Image', on_delete=models.SET_NULL, related_name='establishment_sub_types', blank=True, null=True, default=None, @@ -746,7 +748,7 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, @property def contact_phones(self): if self.phones: - return [phone.as_e164 for phone in self.phones.all()] + return [phone.phone.as_e164 for phone in self.phones.all()] @property def establishment_subtype_labels(self): @@ -780,7 +782,8 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, @property def public_mark_display(self): - return f'{self.public_mark}/20' + if self.public_mark and self.public_mark > 1: + return f'{self.public_mark}/20' @property def metadata(self): @@ -790,7 +793,8 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, self.establishment_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']).values_list('index_name', flat=True) + '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) diff --git a/apps/product/migrations/0025_auto_20191227_1443.py b/apps/product/migrations/0025_auto_20191227_1443.py new file mode 100644 index 00000000..0e7dc496 --- /dev/null +++ b/apps/product/migrations/0025_auto_20191227_1443.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.7 on 2019-12-27 14:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0024_merge_20191223_1405'), + ] + + operations = [ + migrations.AlterField( + model_name='producttype', + name='tag_categories', + field=models.ManyToManyField(blank=True, related_name='product_types', to='tag.TagCategory', verbose_name='Tag categories'), + ), + ] diff --git a/apps/product/models.py b/apps/product/models.py index bb8550ca..be99e5b8 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -43,6 +43,7 @@ class ProductType(TypeDefaultImageMixin, TranslatedFieldsMixin, ProjectBaseMixin verbose_name=_('Index name'), choices=INDEX_CHOICES) use_subtypes = models.BooleanField(_('Use subtypes'), default=True) tag_categories = models.ManyToManyField('tag.TagCategory', + blank=True, related_name='product_types', verbose_name=_('Tag categories')) default_image = models.ForeignKey('gallery.Image', on_delete=models.SET_NULL, diff --git a/apps/utils/export.py b/apps/utils/export.py index 66671aab..9a91b409 100644 --- a/apps/utils/export.py +++ b/apps/utils/export.py @@ -9,9 +9,8 @@ import docx import xlsxwriter from django.conf import settings from django.core.mail import EmailMultiAlternatives -from docx.blkcntnr import BlockItemContainer -from timetable.models import Timetable from docx.shared import RGBColor, Pt + from utils.methods import section_name_into_index_name logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO) @@ -27,7 +26,6 @@ class DocTemplate: def __init__(self): self.document = docx.Document() style = self.document.styles['Normal'] - style.paragraph_format.space_before = Pt(12) style.font.size = self.DOCUMENT_FONT_SIZE style.font.name = self.DOCUMENT_FONT_NAME style.font.color.rgb = self.DOCUMENT_FONT_COLOR @@ -37,7 +35,6 @@ class DocTemplate: def add_empty_line(self): self.document.add_paragraph() - self.document.add_paragraph() def add_horizontal_line(self): return self.document.add_paragraph(f'{"_" * 50}') @@ -48,7 +45,9 @@ class DocTemplate: 'size': Pt(10) } for element in elements: - bullet = self.document.add_paragraph(style='List Bullet').add_run(element) + bullet = self.document.add_paragraph(style='List Bullet') + bullet.paragraph_format.space_before = Pt(10) + bullet = bullet.add_run(element) self.apply_font_style(bullet, params=styles) def add_heading(self, name: str, level: int = 2, font_style: dict = None, @@ -59,7 +58,9 @@ class DocTemplate: self.apply_font_color(heading, color_rgb) def add_paragraph(self, name: str, font_style: dict = None, color_rgb: tuple = (0, 0, 0)): - paragraph = self.document.add_paragraph().add_run(name) + paragraph = self.document.add_paragraph() + paragraph.paragraph_format.space_before = Pt(10) + paragraph.add_run(name) self.apply_font_style(paragraph, font_style) if color_rgb: self.apply_font_color(paragraph, color_rgb) @@ -81,6 +82,7 @@ class DocTemplate: for instance in data: instance = dict(instance) + element_id = instance.get('id') index_name = section_name_into_index_name(instance.get('section_name')) # ESTABLISHMENT HEADING (LEVEL 1) @@ -117,6 +119,7 @@ class DocTemplate: # REVIEW TEXT PARAGRAPH self.add_paragraph(name=text, font_style={'size': Pt(10), 'name': 'Arial'}) + self.add_empty_line() # PHONE HEADING (LEVEL 2) phones = instance.get('phones') @@ -147,7 +150,9 @@ class DocTemplate: level=2) # TIMETABLE ITEMS PARAGRAPH for weekday, working_hours in schedule.items(): - bullet = self.document.add_paragraph(style='List Bullet').add_run(f'{weekday}: {working_hours}') + bullet = self.document.add_paragraph(style='List Bullet') + bullet.paragraph_format.space_before = Pt(10) + bullet = bullet.add_run(f'{weekday}: {working_hours}') self.apply_font_style(bullet, {'name': 'Arial', 'size': Pt(10)}) self.add_empty_line() @@ -160,6 +165,7 @@ class DocTemplate: self.add_heading(name=public_mark, font_style={'size': Pt(10), 'name': 'Arial'}, level=2) + self.add_empty_line() # TOQUE HEADING (LEVEL 2) toque = instance.get('toque_number') @@ -170,6 +176,7 @@ class DocTemplate: self.add_heading(name=toque, font_style={'size': Pt(10), 'name': 'Arial'}, level=2) + self.add_empty_line() # TOQUE HEADING (LEVEL 2) price_level = instance.get('price_level') @@ -180,6 +187,7 @@ class DocTemplate: self.add_heading(name=price_level, font_style={'size': Pt(10), 'name': 'Arial'}, level=2) + self.add_empty_line() # SERVICES HEADING (LEVEL 2) services = instance.get('services') @@ -196,6 +204,7 @@ class DocTemplate: if metadata: for obj in metadata: for section, tags in obj.items(): + section = section.capitalize() self.add_heading(name=section, font_style={'size': Pt(13), 'name': 'Arial', 'bold': True}, level=2) @@ -390,8 +399,15 @@ class SendGuideExport(SendExportBase): objects = [] city_name = None section_name = None + advertorial_page = None for instance in init_data: + row_advertorial_page = instance.get('advertorial_page') + if row_advertorial_page: + advertorial_page = row_advertorial_page + else: + instance['advertorial_page'] = advertorial_page + row_city = instance.get('city_name') if row_city: city_name = row_city diff --git a/apps/utils/methods.py b/apps/utils/methods.py index c925d447..7bf97222 100644 --- a/apps/utils/methods.py +++ b/apps/utils/methods.py @@ -154,7 +154,7 @@ def transform_into_readable_str(raw_string: str, postfix: str = 'SectionNode'): re_exp = r'[\w]+' result = re.findall(re_exp, raw_string) if result: - return f"{''.join([i.capitalize() for i in result])}{postfix}" + return f"{''.join([i.capitalize() for i in result])}" def section_name_into_index_name(section_name: str): diff --git a/project/settings/local.py b/project/settings/local.py index 311da9f9..78d677cb 100644 --- a/project/settings/local.py +++ b/project/settings/local.py @@ -7,7 +7,7 @@ ALLOWED_HOSTS = ['*', ] SEND_SMS = False SMS_CODE_SHOW = True -USE_CELERY = True +USE_CELERY = False SCHEMA_URI = 'http' DEFAULT_SUBDOMAIN = 'www' @@ -85,11 +85,11 @@ LOGGING = { 'py.warnings': { 'handlers': ['console'], }, - # 'django.db.backends': { - # 'handlers': ['console', ], - # 'level': 'DEBUG', - # 'propagate': False, - # }, + 'django.db.backends': { + 'handlers': ['console', ], + 'level': 'DEBUG', + 'propagate': False, + }, } } @@ -114,15 +114,8 @@ if TESTING: ELASTICSEARCH_DSL_AUTOSYNC = False # Email settings -SERVER_EMAIL = 'honyl@yandex.ru' -EMAIL_HOST = 'smtp.yandex.ru' -EMAIL_HOST_USER = 'honyl@yandex.ru' -EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD') -EMAIL_PORT = '587' EMAIL_USE_TLS = True -EMAIL_SUBJECT = 'Technical email from LunchBox' -EMAIL_FROM = 'honyl@yandex.ru' -EMAIL_TO = [ - 'd.kuzmenko@spider.ru', - # 'g.baranova@spider.ru' -] \ No newline at end of file +EMAIL_HOST = 'smtp.gmail.com' +EMAIL_HOST_USER = 'anatolyfeteleu@gmail.com' +EMAIL_HOST_PASSWORD = 'nggrlnbehzksgmbt' +EMAIL_PORT = 587