diff --git a/ArticlesApp/admin.py b/ArticlesApp/admin.py index 4e47232..0a4eb0b 100644 --- a/ArticlesApp/admin.py +++ b/ArticlesApp/admin.py @@ -149,7 +149,7 @@ class Admin_UserPage(Admin_Trans_BaseModelViewPage): if request.user.is_superuser: return True - if obj and obj.url in ('for-partners', 'dealers', 'about-truenergy', 'contacts'): + if obj and obj.url in ('for-partners', 'dealers', 'contacts'): return False return True diff --git a/ArticlesApp/views.py b/ArticlesApp/views.py index 3451081..ce36403 100644 --- a/ArticlesApp/views.py +++ b/ArticlesApp/views.py @@ -18,7 +18,7 @@ from django.utils.translation import gettext_lazy as _ def get_flat_pages_links_Dict(site): flat_pages_links = UserPageModel.objects.filter( - url__in=('about-truenergy', 'for-partners', 'contacts'), + url__in=('for-partners', 'contacts'), sites=site ).values_list('url', flat=True) diff --git a/AuthApp/views.py b/AuthApp/views.py index 96e1faa..872eeda 100644 --- a/AuthApp/views.py +++ b/AuthApp/views.py @@ -205,7 +205,7 @@ def create_temporary_user(): from django.utils.translation import gettext as _ user_id = str(uuid1().hex)[:10] user_name = u'user'+user_id - mail = user_id+u'@truenergy.by' + mail = user_id+u'@domain' user = User.objects.create_user(mail, mail,user_id) user.first_name = _(u'незарег. пользователь') user.last_name = u'' diff --git a/BaseModels/mailSender.py b/BaseModels/mailSender.py index dbbb987..551febb 100644 --- a/BaseModels/mailSender.py +++ b/BaseModels/mailSender.py @@ -241,49 +241,7 @@ def sendMail(subject, text_content, from_email, to, html_content): return u'Accept' -# def techSendMail_for_top_management(html_content, title=None): -# try: -# -# # if not prod_server: -# # msg = '{0}. Not sended because is local'.format(html_content) -# # print(msg) -# # return msg -# from AuthApp.models import User -# from django.db.models import Q -# -# # to = ['web@syncsystems.net'] -# to = User.objects.filter( -# Q(is_superuser=True) | Q(groups__name__in=[ -# 'Отдел продаж: Начальник отдела продаж', 'Управляющий', -# 'Бухгалтерия: Главный бухгалтер' -# ]), -# is_active=True, -# is_staff=True -# ).values_list('email', flat=True) -# to = list(to) -# to.append('office@truenergy.by') -# -# print('techSendMail_for_top_management') -# if title: -# subject = title -# else: -# subject = u'truEnergy Data техническое оповещение' -# from_email = 'support@truenergy.by' -# -# res = admin_send_mail_by_SMTPlib(subject, from_email, to, html_content) -# -# # msg = EmailMultiAlternatives(subject, text_content, from_email, to) -# # msg.attach_alternative(html_content, "text/html") -# # msg.send() -# print(res) -# return u'Accept' -# -# except Exception as e: -# msg = 'techSendMail_for_top_management error={0}'.format(str(e)) -# techSendMail(msg) -# print(msg) -# -# return 'Fail' + def techSendMail_for_specified_email_list(html_content, email_list, title=None): diff --git a/BaseModels/search_optimization/ld_json/ld_search.py b/BaseModels/search_optimization/ld_json/ld_search.py index 9161def..1d19313 100644 --- a/BaseModels/search_optimization/ld_json/ld_search.py +++ b/BaseModels/search_optimization/ld_json/ld_search.py @@ -8,7 +8,7 @@ def get_ld_search(domain): data = { "@context": "https://schema.org", "@type": "WebSite", - "url": domain, #"https://truenergy.by/", + "url": domain, "potentialAction": { "@type": "SearchAction", "target": { diff --git a/BaseModels/seo_text_generators.py b/BaseModels/seo_text_generators.py index c5e36eb..ffb9a8e 100644 --- a/BaseModels/seo_text_generators.py +++ b/BaseModels/seo_text_generators.py @@ -1,258 +1,75 @@ from BaseModels.inter import cut_to_number_w_point -def generate_seotext_by_properties(product_data_Dict): - - power_txt = '' - ip_txt = '' - lm_txt = '' - temp_txt = '' - install_txt = '' - diametr_txt = '' - - try: - - if 'diameter' in product_data_Dict: - val = int(product_data_Dict['diameter']) - else: - val = int(product_data_Dict['width']) - - diametr_txt = '{0} truEnergy {1} серии {2}.
'.format( - product_data_Dict['product_type']['name'].upper(), - product_data_Dict['article'], - product_data_Dict['product_series']['name'].upper() - ) - - # if product_data_Dict['product_type']['name'] == 'Светильник светодиодный': - # - # if val < 100: - # diametr_txt = '{0} truEnergy {1} серии {2} - это хорошее решение для дома.
'.format( - # product_data_Dict['product_type']['name'].upper(), - # product_data_Dict['article'], - # product_data_Dict['product_series']['name'].upper() - # ) - # - # elif val < 150: - # diametr_txt = '{0} truEnergy {1} серии {2} отлично подойдет для освещения вашей квартиры, дома или офиса.
'.format( - # product_data_Dict['product_type']['name'].upper(), - # product_data_Dict['article'], - # product_data_Dict['product_series']['name'].upper() - # ) - # - # else: - # diametr_txt = '{0} truEnergy {1} серии {2} - это энергоэффективное освещение для различных площадей и объектов.
'.format( - # product_data_Dict['product_type']['name'].upper(), - # product_data_Dict['article'], - # product_data_Dict['product_series']['name'].upper() - # ) - # # не светильник - # else: - # diametr_txt = '{0} truEnergy {1} серии {2} - это энергоэффективное решение для освещения различных пространств.
'.format( - # product_data_Dict['product_type']['name'].upper(), - # product_data_Dict['article'], - # product_data_Dict['product_series']['name'].upper() - # ) - except Exception as e: - pass - - # --------- - for property in product_data_Dict['properties_w_values_filtred']: - - # ------ - - try: - - if property['property']['name'] == 'Мощность': - power = int(property['property_value']) - - if power < 7: - power_txt = 'Обладая низким энергопотреблением, этот {0} является заменой лампочки накаливания мощностью до 40 Ватт.
'.format( - product_data_Dict['product_type']['name'].lower(), - ) - - elif power < 13: - power_txt = 'Энергоэффективность этого устройства позволяет использовть его в местах, ' \ - 'где ранее использовались светильники с лампами накаливания мощностью до 75 Ватт.
'.format( - ) - elif power < 19: - power_txt = 'Этот {0} мощностью {1} Ватт легко заменит старые лампы накаливания мощностью до 100 Ватт ' \ - 'или люминесцентные лампы мощностью до 40 Ватт.
'.format( - product_data_Dict['product_type']['name'].lower(), - str(power) - ) - - elif power < 37: - power_txt = 'Данная модель подходит для освещения больших пространств. ' \ - 'Она не только поможет решить вопрос освещения, но и существенно сэкономит бюджет, ' \ - 'выделенный на решение этой задачи.
'.format( - product_data_Dict['product_type']['name'].lower(), - ) - else: - power_txt = '{0} Ватт, в данной модели обеспечивает мощный световой поток. ' \ - 'Это дает возможность установки одного изделия для освещения помещений с большой ' \ - 'площадью или открытых пространств.
'.format( - str(power), - product_data_Dict['product_type']['name'].lower(), - ) - - except Exception as e: - pass - - # ------ - - try: - - if property['property']['name'] == 'Световой поток' and product_data_Dict['article'] != '11043': - val = int(property['property_value']) - - if product_data_Dict['product_type']['name'] == 'Светильник светодиодный': - lm_txt = 'Один {0} данной модели способен осветить до {1} м.кв. площади ' \ - 'для рабочих зон и жилых комнат, и до {2} м.кв. площади для проходных и подсобных помещений ' \ - '(при стандартной высоте потолка и нормальной освещенности помещения).
'.format( - product_data_Dict['product_type']['name'].lower(), - str(round(val / 300,2)), - str(round(val / 120, 2)), - ) - - except Exception as e: - pass - - # ------- - - try: - - if property['property']['name'] == 'IP (пылевлагозащита)': - val = int(property['property_value']) - - if val > 66: - ip_txt = 'Максимальная защита IP{0} способна выдержать самые сильные испытания водой. ' \ - 'Освещение с такой защитой используют для фонтанов и бассейнов.
'.format( - str(val), - ) - - elif val > 64: - ip_txt = 'Данный продукт имеет высокую степень пылевлагозащиты - IP{0}. В связи с этим данная модель прекрасно подходит как ' \ - 'для отапливаемых помещений с нормальным уровнем влажности, так и для помещений неотапливаемых, ' \ - 'а также для эксплуатации на улице. Устройство с данной степенью защиты не боится пыли и влаги' \ - 'а так же имеет защиту от струй воды со всех направлений.
'.format( - str(val), - ) - - elif val > 60: - ip_txt = 'Степень защиты IP{0} обозначает полную защиту от брызг с любых сторон и имеет полную пылинепроницаемость ' \ - '(никакая пыль не может проникнуть внутрь корпуса устройства). ' \ - 'Светильники подходят для установки в помещении и на улице, при рабочих температурах -20 до +40 градусов.
'.format( - str(val), - ) - - elif val > 53: - ip_txt = 'У изделия с степенью защиты IP{0} снижена возможность попадания пыли внутрь корпуса ' \ - 'и обеспечена полная защита расположенной внутри устройстав электроники.' \ - 'Часто используют для рабочих помещений с повышенным содержанием пыли и влаги, а также под навесами.
'.format( - str(val), - product_data_Dict['product_type']['name'].lower(), - product_data_Dict['product_type']['name_plural'].lower(), - ) - - elif val > 40: - ip_txt = 'Могут устанавливаться в помещения с повышенным уровнем пыли.'.format( - product_data_Dict['product_type']['name'].lower(), - ) - else: - ip_txt = 'IP{0} - степень защиты данной модели, в связи с этим могут устанавливаться в' \ - ' отапливаемые помещения с умеренным уровнем влажности.
'.format( - str(val), - ) - - except Exception as e: - pass - - # ------- - - try: - - if property['property']['name'] == 'Цветовая температура': - val = int(property['property_value']) - - if val < 3001: - temp_txt = 'Теплый свет, генерируемый этой моделью способствует отдыху и расслаблению. ' \ - 'Он приятен для глаз. В связи с этим рекомендуется устанавливать {0} ' \ - 'с температурой {1}К в зоны отдыха, жилые комнаты и спальни, кафе, лаундж зоны. ' \ - 'Очень удачное решение для обеденных и гостинных комнат.
'.format( - product_data_Dict['product_type']['name_plural'].lower(), - str(val), - ) - - elif val < 4601: - temp_txt = 'Модель обладает нейтральным цветом свечения, который прекрасно подходит и как для жилых помещений и комнат, ' \ - 'так и для рабочих зон (офисов, кабинетов, производств) . ' \ - 'Данный свет стимулирует к работе не вызывая перенапряжения глаз и не искажая цветопередачу. ' \ - 'Универсальное и наиболее распространенное решение.
'.format( - str(val), - ) - - elif val < 7001: - temp_txt = 'Цветовая температура {0}К - наиболее оптимально использование в помещениях промышленного назначения, ' \ - 'административных зданиях, на производствах, складах, гаражах, паркингах. ' \ - 'Однако могут применяться и в интерьере для создания акцентов в дизайне, ' \ - 'либо если предпочтения потребителя отданы в пользу белого света.
'.format( - str(val), - ) - - - - else: - temp_txt = 'От показателя цветовой температуры зависит то, как Вы будут воспринимать предметы и другие объекты освещенные устройством. ' \ - 'С помощью цветовой температуры можно сделать более приятным отдых и улучшить эффективность работы. ' \ - 'Отниситесь внимательно к выбору устройства по этому параметру.
'.format( - str(val), - ) - except Exception as e: - pass - - # ------- - - try: - - if property['property']['name'] == 'Тип монтажа': - val = property['property_value'] - - if val == 'встраиваемый': - install_txt = 'Устройство устанавливается в предварительно вырезанное в поверхности отверстие. ' \ - 'Этот вариант монтажа используется для подвесных и натяжных потолков, а так же для фальш-стен и ниш.'.format( - str(val), - ) - - elif val == 'накладной': - install_txt = 'Способ крепления - накладной. Значит эта модель может быть закреплена на любую ровную поверхность.'.format( - str(val), - ) - - elif val == 'встраиваемый/накладной': - install_txt = '{0} обладает возможностью монтажа как в отверстия на поверхности плоскостей, так и на любую ровную поверхность.'.format( - product_data_Dict['article'], - ) - - else: - pass - - if 'height_visible_part' in product_data_Dict and product_data_Dict['height_visible_part']: - install_txt = install_txt + ' Высота видимой части устройства после монтажа составит {0}мм.
'.format( - str(round(product_data_Dict['height_visible_part'])) - ) - else: - install_txt = install_txt + '
' - - except Exception as e: - pass - - product_data_Dict['seo_text'] = '{0}{1}{2}{3}{4}{5}'.format( - diametr_txt, - power_txt, - lm_txt, - ip_txt, - temp_txt, - install_txt - ) - - return product_data_Dict \ No newline at end of file +# def generate_seotext_by_properties(product_data_Dict): +# +# power_txt = '' +# ip_txt = '' +# lm_txt = '' +# temp_txt = '' +# install_txt = '' +# diametr_txt = '' +# +# try: +# +# +# +# except Exception as e: +# pass +# +# # --------- +# for property in product_data_Dict['properties_w_values_filtred']: +# +# # ------ +# +# try: +# +# +# except Exception as e: +# pass +# +# # ------ +# +# try: +# +# +# +# except Exception as e: +# pass +# +# # ------- +# +# try: +# +# +# +# except Exception as e: +# pass +# +# # ------- +# +# try: +# +# +# except Exception as e: +# pass +# +# # ------- +# +# try: +# +# +# +# except Exception as e: +# pass +# +# product_data_Dict['seo_text'] = '{0}{1}{2}{3}{4}{5}'.format( +# diametr_txt, +# power_txt, +# lm_txt, +# ip_txt, +# temp_txt, +# install_txt +# ) +# +# return product_data_Dict \ No newline at end of file diff --git a/GeneralApp/admin.py b/GeneralApp/admin.py index e724391..7399cfa 100644 --- a/GeneralApp/admin.py +++ b/GeneralApp/admin.py @@ -80,17 +80,31 @@ admin.site.register(Block,Admin_Block) class Admin_Option(Admin_BaseModel): - def get_fieldsets(self, request, obj=None): - fieldsets = super(type(self), self).get_fieldsets(request, obj) - fieldsets.insert( - 1, ('Контент', { - 'classes': ['wide'], - 'fields': ( - 'opt_type', 'prefix', 'value', 'picture' - ) + # def get_fieldsets(self, request, obj=None): + # fieldsets = super(type(self), self).get_fieldsets(request, obj) + # fieldsets.insert( + # 1, ('Контент', { + # 'classes': ['wide'], + # 'fields': ( + # 'opt_type', 'prefix', 'value', 'picture' + # ) + # + # }) + # ) + # return fieldsets - }) - ) - return fieldsets + + fieldsets = [ + ('Контент', { + 'classes': ['wide'], + 'fields': ( + 'name', 'opt_type', 'prefix', 'value', 'picture' + ) + }), + ] + + list_display = ['image_thumb', 'opt_type', 'name', 'prefix', 'value'] + list_editable = ['value', 'prefix'] + list_filter = ['opt_type'] admin.site.register(Option,Admin_Option) diff --git a/GeneralApp/init_options.py b/GeneralApp/init_options.py index 5f534bb..d262c4b 100644 --- a/GeneralApp/init_options.py +++ b/GeneralApp/init_options.py @@ -1,7 +1,49 @@ from .models import * -def init(): + +required_options_Dict = { + 'Адрес почтового сервера': { + 'name': 'Адрес почтового сервера', + 'opt_type': 'mail_server_url', + }, + 'SMTP порт почтового сервера': { + 'name': 'SMTP порт почтового сервера', + 'opt_type': 'mail_server_smtp_port', + }, + 'email для отправки писем с сайта': { + 'name': 'email для отправки писем с сайта', + 'opt_type': 'sender_mail_login', + }, + 'Пароль для отправки писем с сайта': { + 'name': 'пароль для отправки писем с сайта', + 'opt_type': 'sender_mail_password', + }, + 'Название проекта': { + 'name': 'Название проекта', + 'opt_type': 'project_name', + 'value': 'TWB' + }, + 'Адрес сайта': { + 'name': 'Адрес сайта', + 'opt_type': 'domain', + }, + 'email техподдержки': { + 'name': 'email техподдержки', + 'opt_type': 'support_email', + }, + + } + +def init_options(): options = Option.objects.all() option_names = options.values_list('name', flat=True) - # - # if not 'mail_server_url': + + opts_for_create = [] + for name, data_Dict in required_options_Dict.items(): + if not name in option_names: + opt = Option(**data_Dict) + opts_for_create.append(opt) + + Option.objects.bulk_create(opts_for_create) + + return True diff --git a/GeneralApp/views.py b/GeneralApp/views.py index 0ced57a..0e65373 100644 --- a/GeneralApp/views.py +++ b/GeneralApp/views.py @@ -39,6 +39,10 @@ def test_code(request): def MainPage(request): from RoutesApp.forms import RouteForm + from .init_options import init_options + init_options() + + print(f'LOCALE_PATHS = {str(settings.LOCALE_PATHS)}') page = StaticPage.objects.get(url='main') diff --git a/static/css/styles(boris).css b/static/css/styles(boris).css index 19ed2aa..442ac67 100644 --- a/static/css/styles(boris).css +++ b/static/css/styles(boris).css @@ -412,8 +412,8 @@ height: 100px; width: 100px; position: absolute; - top: 35%; - left: 47%; + top: 40%; + left: 45%; } .loader_chat_f_sw_chats.support.show{ @@ -446,13 +446,28 @@ background: #ffffff; box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20); float: right; + position: relative; +} +.block_loader_chat{ + width: 63%; + height: calc(100vh - 120px); + border-radius: 10px; + border: none; + background: none; + box-shadow: none; + float: right; + position: relative; } .block-chat.support{ height: calc(100vh - 154px); } +.block_loader_chat.support{ + height: calc(100vh - 154px); +} + .block-list-of-users{ width: 30%; margin-left: 20px; diff --git a/static/js/user_profile_2.js b/static/js/user_profile_2.js index 29e457a..ddcb458 100644 --- a/static/js/user_profile_2.js +++ b/static/js/user_profile_2.js @@ -457,8 +457,10 @@ function selectedUserMessenger (ticket_id=null,user_id=null,el){ if (loader){ loader.classList.toggle("show") if (block_chat) { - block_chat.innerHTML = null + block_chat.innerHTML = '' } + } else if (block_chat){ + block_chat.innerHTML = `loader` } let data = null let url = null diff --git a/templates/blocks/profile/b_chats.html b/templates/blocks/profile/b_chats.html index 8b778b5..a1d14fe 100644 --- a/templates/blocks/profile/b_chats.html +++ b/templates/blocks/profile/b_chats.html @@ -50,9 +50,14 @@ {# #} {# #} {##} -loader +{% if not cur_receiver %} +
+ loader +
+{% endif %} {% if cur_receiver %}
+
diff --git a/templates/blocks/profile/b_support_chat.html b/templates/blocks/profile/b_support_chat.html index 793d149..525e7e8 100644 --- a/templates/blocks/profile/b_support_chat.html +++ b/templates/blocks/profile/b_support_chat.html @@ -12,7 +12,6 @@ {#
#} {#

Техническая поддержка

#} {#
#} - loader {% if user.is_staff or staff %} {% endif %} + {% if not ticket %} +
+ loader +
+ {% endif %} {% if ticket %}
{{ ticket.name }}