diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py
index 788ccce..5ef46b8 100644
--- a/BaseModels/base_models.py
+++ b/BaseModels/base_models.py
@@ -148,6 +148,13 @@ class BaseModelViewPage(BaseModel):
class Meta:
abstract = True
+ def get_feedback_block(self):
+ blocks = self.get_blocks()
+ for block in blocks:
+ if block.block_type == 'feedback_form':
+ return block
+ return None
+
def get_slides(self):
return self.slides.filter(enable=True).order_by('order')
diff --git a/GeneralApp/forms.py b/GeneralApp/forms.py
index 827be09..4dbda2b 100644
--- a/GeneralApp/forms.py
+++ b/GeneralApp/forms.py
@@ -9,6 +9,7 @@ from django.forms import widgets
class FeedbackForm(forms.Form):
# account_type = forms.ChoiceField(choices=account_type_choices, initial='sender', required=True)
+ form_name = forms.CharField(label=_('Название формы'), required=True)
name = forms.CharField(label=_('Имя'), required=True)
company = forms.CharField(label=_('Компания'), required=True)
diff --git a/GeneralApp/funcs.py b/GeneralApp/funcs.py
index 0a84d88..d893d0f 100644
--- a/GeneralApp/funcs.py
+++ b/GeneralApp/funcs.py
@@ -1,21 +1,33 @@
from django.http import HttpResponse, Http404, FileResponse
from admin_interface.templatetags.admin_interface_tags import get_admin_interface_theme
+def get_logo_url():
+ theme = get_admin_interface_theme()
+ return theme.logo.url
-def get_inter_Dict(user):
+def get_inter_Dict(user, context_Dict):
+ form_name = None
Dict = {}
from ServicesApp.funcs import get_sections
sections = get_sections()
- theme = get_admin_interface_theme()
+
+ if 'page' in context_Dict and context_Dict['page']:
+ fb_block = context_Dict['page'].get_feedback_block()
+ if fb_block:
+ form_name = fb_block.name
+
from .forms import FeedbackForm
+ feedback_form = FeedbackForm()
+ if form_name:
+ feedback_form.initial = {'form_name': form_name}
Dict.update({
'sections': sections,
- 'logo': theme.logo.url,
- 'feedback_form': FeedbackForm(),
+ 'logo': get_logo_url(),
+ 'feedback_form': feedback_form,
})
# from SubscribesApp.funcs import get_cur_user_subscribe
# user_subscribe = get_cur_user_subscribe(user)
@@ -26,6 +38,6 @@ def get_inter_Dict(user):
def get_inter_http_respose(template_obj, context_Dict, request):
- context_Dict.update(get_inter_Dict(request.user))
+ context_Dict.update(get_inter_Dict(request.user, context_Dict))
return HttpResponse(template_obj.render(context_Dict, request))
\ No newline at end of file
diff --git a/GeneralApp/js_urls.py b/GeneralApp/js_urls.py
new file mode 100644
index 0000000..4df4231
--- /dev/null
+++ b/GeneralApp/js_urls.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.urls import path, include
+from django.conf.urls.static import static
+from django.conf import settings
+from .js_views import *
+
+urlpatterns = [
+ path('send_feedback_form/', send_feedback_form_ajax, name='send_feedback_form_ajax'),
+]
\ No newline at end of file
diff --git a/GeneralApp/js_views.py b/GeneralApp/js_views.py
new file mode 100644
index 0000000..3377c06
--- /dev/null
+++ b/GeneralApp/js_views.py
@@ -0,0 +1,94 @@
+import json
+
+from django.shortcuts import render
+
+from uuid import uuid1
+
+from .forms import FeedbackForm
+from .models import *
+from django.contrib import auth
+from django.http import HttpResponse, Http404, JsonResponse
+from django.template import loader, RequestContext
+from django.contrib.auth.decorators import login_required
+from BaseModels.mailSender import techSendMail
+from django.utils.translation import gettext as _
+from datetime import datetime
+from django.template.loader import render_to_string
+from django.urls import reverse
+from .funcs import *
+from django.utils.translation import activate, get_language_info
+from BaseModels.mailSender import admin_send_mail_by_SMTPlib
+from .funcs_options import get_mail_send_options, get_first_option_value_by_opt_type, get_options_by_opt_types
+
+
+def send_feedback_form_ajax(request):
+
+ if request.method != 'POST':
+ raise Http404
+
+ try:
+
+ data = request.POST
+ # if not data and request.body:
+ # data = json.loads(request.body)
+
+ feedback_form = FeedbackForm(data=data)
+
+ if not feedback_form.is_valid():
+ feedback_form.initial = data
+ Dict = {'feedback_form': feedback_form}
+ html = render_to_string('forms/f_feedback.html', Dict, request=request)
+ return JsonResponse({'html': html}, status=400)
+
+ subject = f'Сообщение из формы "{data["form_name"]}"'
+
+ sets = get_options_by_opt_types(['domain', 'project_name'], only_vals=True)
+
+ message_text = (f'
{_("ДАННЫЕ ЗАПРОСА")}
'
+ f'')
+ for f_name, f_val in data.items():
+ message_text += f'{f_name}: {f_val} '
+
+ message_text += f'
'
+
+ Dict = {
+ 'logo': f'{request.scheme}://{sets["domain"]}{get_logo_url()}',
+ 'project_name': sets['project_name'],
+ 'message_title': subject,
+ 'message_text': message_text
+ }
+
+
+ html = render_to_string('mail/mt_simple_letter.html', Dict, request=request)
+
+
+ to = [get_first_option_value_by_opt_type('corp_email'), 'web@syncsystems.net']
+
+ mail_sets = get_mail_send_options()
+ msg = admin_send_mail_by_SMTPlib(
+ mail_sets, subject=subject,
+ from_email=mail_sets['sender_email'], to=to, html_content=html,
+ )
+ print(msg)
+
+
+ Dict = {
+ }
+
+ html = render_to_string('widgets/w_form_after_send.html', Dict, request=request)
+
+ res_Dict = {
+ 'html': html,
+ }
+
+ return JsonResponse(res_Dict)
+
+ except Exception as e:
+ msg = f' send_feedback_form_ajax ошибка в запросе = {str(e)}'
+ print(msg)
+ errors_Dict = {
+ 'errors': msg
+ }
+ return JsonResponse(errors_Dict, status=400)
+
+
diff --git a/GeneralApp/migrations/0018_office_contact.py b/GeneralApp/migrations/0018_office_contact.py
new file mode 100644
index 0000000..5e361bc
--- /dev/null
+++ b/GeneralApp/migrations/0018_office_contact.py
@@ -0,0 +1,74 @@
+# Generated by Django 4.2.7 on 2023-12-09 18:42
+
+import BaseModels.base_models
+import ckeditor_uploader.fields
+import datetime
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('GeneralApp', '0017_block_bg_video_url_block_video_url_and_more'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Office',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
+ ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')),
+ ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')),
+ ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')),
+ ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')),
+ ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')),
+ ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')),
+ ('url', models.TextField(help_text='можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)', unique=True, verbose_name='URL привязанной страницы')),
+ ('title', models.TextField(blank=True, null=True, verbose_name='Заголовок')),
+ ('description', ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание')),
+ ('text', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание')),
+ ('picture', models.FileField(blank=True, null=True, upload_to='uploads/', validators=[BaseModels.base_models.validate_file_extension], verbose_name='Картинка')),
+ ('visible', models.BooleanField(default=True, verbose_name='Отображать')),
+ ('seo_title', models.CharField(blank=True, max_length=250, null=True, verbose_name='Title (80 знаков)')),
+ ('seo_description', models.CharField(blank=True, max_length=250, null=True, verbose_name='Description (150 знаков)')),
+ ('seo_keywords', models.CharField(blank=True, max_length=250, null=True, verbose_name='Keywords (200 знаков)')),
+ ('seo_text', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи')),
+ ('FAQ_title', models.CharField(blank=True, max_length=250, null=True, verbose_name='FAQ Заголовок')),
+ ('city', models.CharField(max_length=250, verbose_name='Город')),
+ ('address', models.CharField(blank=True, max_length=250, null=True, verbose_name='Адрес')),
+ ('workTime', models.CharField(max_length=220, verbose_name='Комментарий к времени работы')),
+ ('work_time_from', models.TimeField(default=datetime.datetime(2023, 12, 9, 9, 0), verbose_name='Время работы с')),
+ ('work_time_to', models.TimeField(default=datetime.datetime(2023, 12, 9, 18, 0), verbose_name='Время работы до')),
+ ],
+ options={
+ 'verbose_name': 'Подразделения',
+ 'verbose_name_plural': 'Подразделение',
+ 'ordering': ['order', 'city', 'name'],
+ },
+ ),
+ migrations.CreateModel(
+ name='Contact',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
+ ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')),
+ ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')),
+ ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')),
+ ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')),
+ ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')),
+ ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')),
+ ('contact_type', models.CharField(choices=[('phone', 'Телефон'), ('fax', 'Факс'), ('email', 'email'), ('messenger', 'Мессенджер')], default='phone', max_length=50, verbose_name='Тип контакта')),
+ ('contact_label', models.CharField(blank=True, max_length=50, null=True, verbose_name='Метка контакта')),
+ ('contact_prefix', models.CharField(blank=True, max_length=50, null=True, verbose_name='Префикс контакта')),
+ ('contact_data', models.CharField(max_length=50, verbose_name='Номер телефона')),
+ ('office', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rel_contacts_for_office', to='GeneralApp.office', verbose_name='Офис')),
+ ],
+ options={
+ 'verbose_name': 'Контакт',
+ 'verbose_name_plural': 'Контакты',
+ 'ordering': ['order', 'contact_type', 'contact_label'],
+ },
+ ),
+ ]
diff --git a/GeneralApp/models.py b/GeneralApp/models.py
index 010f32f..bd3b7f1 100644
--- a/GeneralApp/models.py
+++ b/GeneralApp/models.py
@@ -178,28 +178,28 @@ class Office(BaseModelViewPage):
work_time_to = models.TimeField(verbose_name=_('Время работы до'), default=work_time_default_to())
# email = models.CharField(max_length=50,verbose_name=_(u'e-mail'), null=True, blank=True)
- legal_name = models.CharField(max_length=250, verbose_name=_(u'Юридическое название'), null=True, blank=True)
- legal_address = models.CharField(max_length=250, verbose_name=_(u'Адрес'), null=True, blank=True)
- unp = models.CharField(max_length=250, verbose_name=_(u'Номер налогоплательщика'), null=True, blank=True)
- urInfo = RichTextUploadingField(verbose_name=_(u'Юридическая информация'), null=True, blank=True)
- legal_docs_text = models.TextField(
- verbose_name=_(u'Данные о свидетельствах и сертификатах'), null=True, blank=True
- )
-
- fullContactInfo = RichTextUploadingField(
- verbose_name=_(u'Контактные данные'), null=True, blank=True)
- map_code = models.TextField(verbose_name=_(u'код карты'), null=True, blank=True)
-
- main_office = models.BooleanField(verbose_name='Главный офис', default=False)
-
- gps_longitude = models.DecimalField(
- max_digits=22, decimal_places=16, verbose_name='GPS Долгота', blank=True, null=True
- )
- gps_latitude = models.DecimalField(
- max_digits=22, decimal_places=16, verbose_name='GPS Широта', blank=True, null=True
- )
-
- footer_info = RichTextUploadingField(verbose_name=_('Информация в подвале'), null=True, blank=True)
+ # legal_name = models.CharField(max_length=250, verbose_name=_(u'Юридическое название'), null=True, blank=True)
+ # legal_address = models.CharField(max_length=250, verbose_name=_(u'Адрес'), null=True, blank=True)
+ # unp = models.CharField(max_length=250, verbose_name=_(u'Номер налогоплательщика'), null=True, blank=True)
+ # urInfo = RichTextUploadingField(verbose_name=_(u'Юридическая информация'), null=True, blank=True)
+ # legal_docs_text = models.TextField(
+ # verbose_name=_(u'Данные о свидетельствах и сертификатах'), null=True, blank=True
+ # )
+ #
+ # fullContactInfo = RichTextUploadingField(
+ # verbose_name=_(u'Контактные данные'), null=True, blank=True)
+ # map_code = models.TextField(verbose_name=_(u'код карты'), null=True, blank=True)
+ #
+ # main_office = models.BooleanField(verbose_name='Главный офис', default=False)
+ #
+ # gps_longitude = models.DecimalField(
+ # max_digits=22, decimal_places=16, verbose_name='GPS Долгота', blank=True, null=True
+ # )
+ # gps_latitude = models.DecimalField(
+ # max_digits=22, decimal_places=16, verbose_name='GPS Широта', blank=True, null=True
+ # )
+ #
+ # footer_info = RichTextUploadingField(verbose_name=_('Информация в подвале'), null=True, blank=True)
def __str__(self):
return self.name
@@ -239,20 +239,22 @@ class Office(BaseModelViewPage):
contact_type_choice = (
- ('phone', 'Телефон'),
- ('email', 'email'),
- ('messenger', 'Мессенджер'),
+ ('phone', _('Телефон')),
+ ('fax', _('Факс')),
+ ('email', _('email')),
+ ('messenger', _('Мессенджер')),
)
class Contact(BaseModel):
contact_type = models.CharField(
- max_length=50, choices=contact_type_choice, verbose_name=_(u'Тип контакта'), default='phone'
+ max_length=50, choices=contact_type_choice, verbose_name=_('Тип контакта'), default='phone'
)
- contact_label = models.CharField(max_length=50, verbose_name=_(u'Метка контакта'), null=True, blank=True)
- contact_prefix = models.CharField(max_length=50, verbose_name=_(u'Префикс контакта'), null=True, blank=True)
- contact_data = models.CharField(max_length=50, verbose_name=_(u'Номер телефона'))
- office = models.ForeignKey(Office, verbose_name='Офис', related_name='rel_contacts_for_office', on_delete=models.CASCADE)
+ contact_label = models.CharField(max_length=50, verbose_name=_('Метка контакта'), null=True, blank=True)
+ contact_prefix = models.CharField(max_length=50, verbose_name=_('Префикс контакта'), null=True, blank=True)
+ contact_data = models.CharField(max_length=50, verbose_name=_('Номер телефона'))
+ office = models.ForeignKey(
+ Office, verbose_name=_('Офис'), related_name='rel_contacts_for_office', on_delete=models.CASCADE)
def __str__(self):
if self.name:
@@ -271,62 +273,62 @@ class Contact(BaseModel):
class Meta:
- verbose_name=_(u'Контакт')
- verbose_name_plural = _(u'Контакты')
+ verbose_name=_('Контакт')
+ verbose_name_plural = _('Контакты')
ordering = ['order', 'contact_type', 'contact_label']
-class FooterBlockModel(BaseModel):
- url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы', help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
- enable_bullets = models.BooleanField(default=False, verbose_name='Включить метки')
-
- def __str__(self):
- if self.name:
- return self.name
- else:
- return self.id
-
- class Meta:
- verbose_name=u'Блок подвала'
- verbose_name_plural =u'Блоки подвала'
- ordering = ['order', 'name']
-
-class FooterLinkModel(BaseModel):
- footer_block = models.ForeignKey(FooterBlockModel,verbose_name='Блок', related_name='rel_footer_block', on_delete=models.CASCADE)
- url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы', help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
-
- def __str__(self):
- if self.name:
- return self.name
- else:
- return self.id
-
- class Meta:
- verbose_name=u'Ссылка подвала'
- verbose_name_plural =u'Ссылки подвала'
- ordering = ['order', 'name']
-
-
-
-# class HeaderLinkModel(FooterLinkModel):
+# class FooterBlockModel(BaseModel):
+# url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы', help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
+# enable_bullets = models.BooleanField(default=False, verbose_name='Включить метки')
+#
+# def __str__(self):
+# if self.name:
+# return self.name
+# else:
+# return self.id
+#
+# class Meta:
+# verbose_name=u'Блок подвала'
+# verbose_name_plural =u'Блоки подвала'
+# ordering = ['order', 'name']
+#
+# class FooterLinkModel(BaseModel):
+# footer_block = models.ForeignKey(FooterBlockModel,verbose_name='Блок', related_name='rel_footer_block', on_delete=models.CASCADE)
+# url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы', help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
+#
+# def __str__(self):
+# if self.name:
+# return self.name
+# else:
+# return self.id
+#
+# class Meta:
+# verbose_name=u'Ссылка подвала'
+# verbose_name_plural =u'Ссылки подвала'
+# ordering = ['order', 'name']
+#
+#
+#
+# # class HeaderLinkModel(FooterLinkModel):
+# #
+# # class Meta:
+# # verbose_name=u'Ссылка козырька'
+# # verbose_name_plural =u'Ссылки козырька'
+# # ordering = ['order', 'name']
+#
+#
+# class HeaderLink(BaseModel):
+# url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы',
+# help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
+#
+# def __str__(self):
+# if self.name:
+# return self.name
+# else:
+# return self.id
#
# class Meta:
# verbose_name=u'Ссылка козырька'
# verbose_name_plural =u'Ссылки козырька'
-# ordering = ['order', 'name']
-
-
-class HeaderLink(BaseModel):
- url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы',
- help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
-
- def __str__(self):
- if self.name:
- return self.name
- else:
- return self.id
-
- class Meta:
- verbose_name=u'Ссылка козырька'
- verbose_name_plural =u'Ссылки козырька'
- ordering = ['order', 'name']
\ No newline at end of file
+# ordering = ['order', 'name']
\ No newline at end of file
diff --git a/pAerBim/urls.py b/pAerBim/urls.py
index 45109b5..1aa9686 100644
--- a/pAerBim/urls.py
+++ b/pAerBim/urls.py
@@ -9,6 +9,7 @@ urlpatterns = [
path('i18n/', include('django.conf.urls.i18n')),
path('', include('ServicesApp.js_urls')),
+ path('', include('GeneralApp.js_urls'))
]
from django.conf.urls.i18n import i18n_patterns
diff --git a/static/aerbimCSS.css b/static/aerbimCSS.css
index 0b3b8a1..d9d7d83 100644
--- a/static/aerbimCSS.css
+++ b/static/aerbimCSS.css
@@ -94,8 +94,8 @@ body.n_scroll{
/*font-family: Spline Sans;*/
/*font-family: -apple-system, 'Raleway-Regular', sans-serif;*/
- font-size: 16px;
- font-weight: 500;
+ font-size: 14px;
+ /*font-weight: 500;*/
line-height: normal;
}
@@ -1111,7 +1111,7 @@ body.n_scroll{
.title_w_one_present{
color: #000000;
text-transform: uppercase;
- font-size: 36px;
+ font-size: 30px;
font-weight: 600;
}
diff --git a/static/aerbimJS.js b/static/aerbimJS.js
index 4520f80..897579e 100644
--- a/static/aerbimJS.js
+++ b/static/aerbimJS.js
@@ -245,9 +245,9 @@ function sendFormConsultation (el){
// async: true,
cache: false,
processData: false,
- // contentType: false,
- // enctype: 'json',
- contentType: "application/json; charset=utf-8",
+ enctype: 'multipart/form-data',
+ contentType: false,
+ // contentType: "application/json; charset=utf-8",
data: formData,
success: function(data){
document.querySelector(".container_content_form_consultation").innerHTML = data.html
diff --git a/templates/blocks/b_how_dev.html b/templates/blocks/b_how_dev.html
index 51c22ee..32c30dd 100644
--- a/templates/blocks/b_how_dev.html
+++ b/templates/blocks/b_how_dev.html
@@ -11,7 +11,7 @@
+
-
- {{ feedback_form.description.label }}
-
+
+ {{ feedback_form.description.label }}
+
\ No newline at end of file
diff --git a/templates/mail/mt_simple_letter.html b/templates/mail/mt_simple_letter.html
new file mode 100644
index 0000000..2dcc133
--- /dev/null
+++ b/templates/mail/mt_simple_letter.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+ {{ message_title|safe }}
+
+
+{#
#}
+ {{ message_text|safe|linebreaksbr }}
+{#
#}
+
+ {% for button in message_buttons %}
+
+ {% endfor %}
+
+
+
+
+
+{# Адрес кафе: Минск, ул. Будславская, 2 #}
+{# #}
+{# График работы: пн-вс 12:00 - 24:00 #}
+{# #}
+{# Телефоны кафе: +375 44 77 321 77 #}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/pages/content/c_section_content.html b/templates/pages/content/c_section_content.html
index d3aa5f5..b1b8398 100644
--- a/templates/pages/content/c_section_content.html
+++ b/templates/pages/content/c_section_content.html
@@ -4,7 +4,7 @@
- {% if page.description or page.title %}
+ {% if page.description or page.title or page.text %}
{% if page.description %}
{{ page.description }}
@@ -12,6 +12,9 @@
{% if page.title %}
{{ page.title }}
{% endif %}
+ {% if page.text %}
+
{{ page.text|safe }}
+ {% endif %}
{% endif %}
diff --git a/templates/widgets/w_form_after_send.html b/templates/widgets/w_form_after_send.html
new file mode 100644
index 0000000..b3f22dd
--- /dev/null
+++ b/templates/widgets/w_form_after_send.html
@@ -0,0 +1,3 @@
+
+ Сообщение отправлено
+
\ No newline at end of file
diff --git a/templates/widgets/w_one_present_aerBim.html b/templates/widgets/w_one_present_aerBim.html
index 9b02b8c..a864a8c 100644
--- a/templates/widgets/w_one_present_aerBim.html
+++ b/templates/widgets/w_one_present_aerBim.html
@@ -9,7 +9,7 @@
{% if widget.description %}
- {{ widget.description }}
+ {{ widget.description|safe|linebreaksbr }}
{% endif %}
{% with name_w='presentAerBim' %}