0.2.2 feedback_form, contacts models
This commit is contained in:
@@ -148,6 +148,13 @@ class BaseModelViewPage(BaseModel):
|
|||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
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):
|
def get_slides(self):
|
||||||
return self.slides.filter(enable=True).order_by('order')
|
return self.slides.filter(enable=True).order_by('order')
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from django.forms import widgets
|
|||||||
|
|
||||||
class FeedbackForm(forms.Form):
|
class FeedbackForm(forms.Form):
|
||||||
# account_type = forms.ChoiceField(choices=account_type_choices, initial='sender', required=True)
|
# 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)
|
name = forms.CharField(label=_('Имя'), required=True)
|
||||||
company = forms.CharField(label=_('Компания'), required=True)
|
company = forms.CharField(label=_('Компания'), required=True)
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,33 @@
|
|||||||
from django.http import HttpResponse, Http404, FileResponse
|
from django.http import HttpResponse, Http404, FileResponse
|
||||||
from admin_interface.templatetags.admin_interface_tags import get_admin_interface_theme
|
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 = {}
|
Dict = {}
|
||||||
|
|
||||||
from ServicesApp.funcs import get_sections
|
from ServicesApp.funcs import get_sections
|
||||||
sections = 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
|
from .forms import FeedbackForm
|
||||||
|
feedback_form = FeedbackForm()
|
||||||
|
if form_name:
|
||||||
|
feedback_form.initial = {'form_name': form_name}
|
||||||
|
|
||||||
Dict.update({
|
Dict.update({
|
||||||
'sections': sections,
|
'sections': sections,
|
||||||
'logo': theme.logo.url,
|
'logo': get_logo_url(),
|
||||||
'feedback_form': FeedbackForm(),
|
'feedback_form': feedback_form,
|
||||||
})
|
})
|
||||||
# from SubscribesApp.funcs import get_cur_user_subscribe
|
# from SubscribesApp.funcs import get_cur_user_subscribe
|
||||||
# user_subscribe = get_cur_user_subscribe(user)
|
# 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):
|
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))
|
return HttpResponse(template_obj.render(context_Dict, request))
|
||||||
9
GeneralApp/js_urls.py
Normal file
9
GeneralApp/js_urls.py
Normal file
@@ -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'),
|
||||||
|
]
|
||||||
94
GeneralApp/js_views.py
Normal file
94
GeneralApp/js_views.py
Normal file
@@ -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'<p><b>{_("ДАННЫЕ ЗАПРОСА")}</b></p>'
|
||||||
|
f'<p style="padding-left: 20px; line-height: 30px;">')
|
||||||
|
for f_name, f_val in data.items():
|
||||||
|
message_text += f'<b>{f_name}:</b> {f_val}<br>'
|
||||||
|
|
||||||
|
message_text += f'</p>'
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
74
GeneralApp/migrations/0018_office_contact.py
Normal file
74
GeneralApp/migrations/0018_office_contact.py
Normal file
@@ -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'],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -178,28 +178,28 @@ class Office(BaseModelViewPage):
|
|||||||
work_time_to = models.TimeField(verbose_name=_('Время работы до'), default=work_time_default_to())
|
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)
|
# 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_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)
|
# 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)
|
# unp = models.CharField(max_length=250, verbose_name=_(u'Номер налогоплательщика'), null=True, blank=True)
|
||||||
urInfo = RichTextUploadingField(verbose_name=_(u'Юридическая информация'), null=True, blank=True)
|
# urInfo = RichTextUploadingField(verbose_name=_(u'Юридическая информация'), null=True, blank=True)
|
||||||
legal_docs_text = models.TextField(
|
# legal_docs_text = models.TextField(
|
||||||
verbose_name=_(u'Данные о свидетельствах и сертификатах'), null=True, blank=True
|
# verbose_name=_(u'Данные о свидетельствах и сертификатах'), null=True, blank=True
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
fullContactInfo = RichTextUploadingField(
|
# fullContactInfo = RichTextUploadingField(
|
||||||
verbose_name=_(u'Контактные данные'), null=True, blank=True)
|
# verbose_name=_(u'Контактные данные'), null=True, blank=True)
|
||||||
map_code = models.TextField(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)
|
# main_office = models.BooleanField(verbose_name='Главный офис', default=False)
|
||||||
|
#
|
||||||
gps_longitude = models.DecimalField(
|
# gps_longitude = models.DecimalField(
|
||||||
max_digits=22, decimal_places=16, verbose_name='GPS Долгота', blank=True, null=True
|
# max_digits=22, decimal_places=16, verbose_name='GPS Долгота', blank=True, null=True
|
||||||
)
|
# )
|
||||||
gps_latitude = models.DecimalField(
|
# gps_latitude = models.DecimalField(
|
||||||
max_digits=22, decimal_places=16, verbose_name='GPS Широта', blank=True, null=True
|
# max_digits=22, decimal_places=16, verbose_name='GPS Широта', blank=True, null=True
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
footer_info = RichTextUploadingField(verbose_name=_('Информация в подвале'), null=True, blank=True)
|
# footer_info = RichTextUploadingField(verbose_name=_('Информация в подвале'), null=True, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
@@ -239,20 +239,22 @@ class Office(BaseModelViewPage):
|
|||||||
|
|
||||||
|
|
||||||
contact_type_choice = (
|
contact_type_choice = (
|
||||||
('phone', 'Телефон'),
|
('phone', _('Телефон')),
|
||||||
('email', 'email'),
|
('fax', _('Факс')),
|
||||||
('messenger', 'Мессенджер'),
|
('email', _('email')),
|
||||||
|
('messenger', _('Мессенджер')),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Contact(BaseModel):
|
class Contact(BaseModel):
|
||||||
contact_type = models.CharField(
|
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_label = models.CharField(max_length=50, verbose_name=_('Метка контакта'), null=True, blank=True)
|
||||||
contact_prefix = models.CharField(max_length=50, verbose_name=_(u'Префикс контакта'), 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=_(u'Номер телефона'))
|
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)
|
office = models.ForeignKey(
|
||||||
|
Office, verbose_name=_('Офис'), related_name='rel_contacts_for_office', on_delete=models.CASCADE)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if self.name:
|
if self.name:
|
||||||
@@ -271,62 +273,62 @@ class Contact(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name=_(u'Контакт')
|
verbose_name=_('Контакт')
|
||||||
verbose_name_plural = _(u'Контакты')
|
verbose_name_plural = _('Контакты')
|
||||||
ordering = ['order', 'contact_type', 'contact_label']
|
ordering = ['order', 'contact_type', 'contact_label']
|
||||||
|
|
||||||
|
|
||||||
class FooterBlockModel(BaseModel):
|
# class FooterBlockModel(BaseModel):
|
||||||
url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы', help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
|
# 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='Включить метки')
|
# enable_bullets = models.BooleanField(default=False, verbose_name='Включить метки')
|
||||||
|
#
|
||||||
def __str__(self):
|
# def __str__(self):
|
||||||
if self.name:
|
# if self.name:
|
||||||
return self.name
|
# return self.name
|
||||||
else:
|
# else:
|
||||||
return self.id
|
# return self.id
|
||||||
|
#
|
||||||
class Meta:
|
# class Meta:
|
||||||
verbose_name=u'Блок подвала'
|
# verbose_name=u'Блок подвала'
|
||||||
verbose_name_plural =u'Блоки подвала'
|
# verbose_name_plural =u'Блоки подвала'
|
||||||
ordering = ['order', 'name']
|
# ordering = ['order', 'name']
|
||||||
|
#
|
||||||
class FooterLinkModel(BaseModel):
|
# class FooterLinkModel(BaseModel):
|
||||||
footer_block = models.ForeignKey(FooterBlockModel,verbose_name='Блок', related_name='rel_footer_block', on_delete=models.CASCADE)
|
# 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)
|
# url = models.CharField(max_length=250, verbose_name=u'URL привязанной страницы', help_text=u'адрес страницы на которую ведет данная ссылка)', null=True, blank=True)
|
||||||
|
#
|
||||||
def __str__(self):
|
# def __str__(self):
|
||||||
if self.name:
|
# if self.name:
|
||||||
return self.name
|
# return self.name
|
||||||
else:
|
# else:
|
||||||
return self.id
|
# return self.id
|
||||||
|
#
|
||||||
class Meta:
|
# class Meta:
|
||||||
verbose_name=u'Ссылка подвала'
|
# verbose_name=u'Ссылка подвала'
|
||||||
verbose_name_plural =u'Ссылки подвала'
|
# verbose_name_plural =u'Ссылки подвала'
|
||||||
ordering = ['order', 'name']
|
# ordering = ['order', 'name']
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
# class HeaderLinkModel(FooterLinkModel):
|
# # 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:
|
# class Meta:
|
||||||
# verbose_name=u'Ссылка козырька'
|
# verbose_name=u'Ссылка козырька'
|
||||||
# verbose_name_plural =u'Ссылки козырька'
|
# verbose_name_plural =u'Ссылки козырька'
|
||||||
# ordering = ['order', 'name']
|
# 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']
|
|
||||||
@@ -9,6 +9,7 @@ urlpatterns = [
|
|||||||
path('i18n/', include('django.conf.urls.i18n')),
|
path('i18n/', include('django.conf.urls.i18n')),
|
||||||
|
|
||||||
path('', include('ServicesApp.js_urls')),
|
path('', include('ServicesApp.js_urls')),
|
||||||
|
path('', include('GeneralApp.js_urls'))
|
||||||
]
|
]
|
||||||
|
|
||||||
from django.conf.urls.i18n import i18n_patterns
|
from django.conf.urls.i18n import i18n_patterns
|
||||||
|
|||||||
@@ -94,8 +94,8 @@ body.n_scroll{
|
|||||||
/*font-family: Spline Sans;*/
|
/*font-family: Spline Sans;*/
|
||||||
/*font-family: -apple-system, 'Raleway-Regular', sans-serif;*/
|
/*font-family: -apple-system, 'Raleway-Regular', sans-serif;*/
|
||||||
|
|
||||||
font-size: 16px;
|
font-size: 14px;
|
||||||
font-weight: 500;
|
/*font-weight: 500;*/
|
||||||
line-height: normal;
|
line-height: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1111,7 +1111,7 @@ body.n_scroll{
|
|||||||
.title_w_one_present{
|
.title_w_one_present{
|
||||||
color: #000000;
|
color: #000000;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
font-size: 36px;
|
font-size: 30px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -245,9 +245,9 @@ function sendFormConsultation (el){
|
|||||||
// async: true,
|
// async: true,
|
||||||
cache: false,
|
cache: false,
|
||||||
processData: false,
|
processData: false,
|
||||||
// contentType: false,
|
enctype: 'multipart/form-data',
|
||||||
// enctype: 'json',
|
contentType: false,
|
||||||
contentType: "application/json; charset=utf-8",
|
// contentType: "application/json; charset=utf-8",
|
||||||
data: formData,
|
data: formData,
|
||||||
success: function(data){
|
success: function(data){
|
||||||
document.querySelector(".container_content_form_consultation").innerHTML = data.html
|
document.querySelector(".container_content_form_consultation").innerHTML = data.html
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div class="how_dev_widget">
|
<div class="how_dev_widget">
|
||||||
<div class="first_line_widget_how_dev">
|
<div class="first_line_widget_how_dev">
|
||||||
<div class="medium_small_bold_txt how_dev_widget_txt">
|
<div class="medium_small_bold_txt how_dev_widget_txt">
|
||||||
0{{ forloop.counter }} {{ w.name }}
|
0{{ forloop.counter }}. {{ w.name }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="how_dev_widget_description standart_txt">
|
<div class="how_dev_widget_description standart_txt">
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<div class="top_border_gradient"></div>
|
<div class="top_border_gradient"></div>
|
||||||
<form name="form_consultation" class="form_consultation">
|
<form name="form_consultation" class="form_consultation">
|
||||||
<div class="container_content_form_consultation">
|
<div class="container_content_form_consultation">
|
||||||
{% include 'forms/f_consultation_form.html' %}
|
{% include 'forms/f_feedback.html' %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,12 +6,15 @@
|
|||||||
<div class="standart_txt description_form_consultation_txt">
|
<div class="standart_txt description_form_consultation_txt">
|
||||||
{{ block.description|linebreaksbr }}
|
{{ block.description|linebreaksbr }}
|
||||||
</div>
|
</div>
|
||||||
|
<input type="checkbox" class="input_form_consultation" id="id_agreement" name="agreement" />
|
||||||
|
<label class="label_consultation_form standart_txt" for="id_agreement">{{ feedback_form.agreement.label }}</label>
|
||||||
<button onclick="sendFormConsultation(this)" class="button_form_consultation">{{ block.but_title }}</button>
|
<button onclick="sendFormConsultation(this)" class="button_form_consultation">{{ block.but_title }}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="form_consultation_content">
|
<div class="form_consultation_content">
|
||||||
|
<input hidden="hidden" class="input_form_consultation" id="id_form_name" name="form_name" value="{{ feedback_form.initial.form_name }}">
|
||||||
<input class="input_form_consultation" id="id_name" name="name" placeholder="{{ feedback_form.name.label }}">
|
<input class="input_form_consultation" id="id_name" name="name" placeholder="{{ feedback_form.name.label }}">
|
||||||
<input class="input_form_consultation" id="id_company" name="company" placeholder="{{ feedback_form.company.label }}">
|
<input class="input_form_consultation" id="id_company" name="company" placeholder="{{ feedback_form.company.label }}">
|
||||||
<input class="input_form_consultation" id="id_contacts" name="contacs" placeholder="{{ feedback_form.contacts.label }}">
|
<input class="input_form_consultation" id="id_contacts" name="contacts" placeholder="{{ feedback_form.contacts.label }}">
|
||||||
<label class="label_consultation_form standart_txt" for="id_consultation_topic">{{ feedback_form.description.label }}</label>
|
<label class="label_consultation_form standart_txt" for="id_description">{{ feedback_form.description.label }}</label>
|
||||||
<textarea class="textarea_form_consultation" id="id_consultation_topic" name="consultation_topic"></textarea>
|
<textarea class="textarea_form_consultation" id="id_description" name="description"></textarea>
|
||||||
</div>
|
</div>
|
||||||
73
templates/mail/mt_simple_letter.html
Normal file
73
templates/mail/mt_simple_letter.html
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
|
||||||
|
<div style="font-family:Calibri,Candara,Segoe,'Segoe UI',Optima,Arial,sans-serif;
|
||||||
|
padding:10px; background-color: #F8F8F8;"
|
||||||
|
>
|
||||||
|
<div style="line-height:1.0em; width: 660px">
|
||||||
|
<div style="padding:5px; text-align: center;">
|
||||||
|
<img src="{{ logo }}" alt="{{ project_name }}" style="margin:0;padding:0;">
|
||||||
|
</div>
|
||||||
|
<p style="font-weight:700; font-size:25px; text-align:center;
|
||||||
|
padding:0; line-height:1em; text-transform: uppercase; color: #ff613a;
|
||||||
|
margin: auto; max-width: 90%;
|
||||||
|
">
|
||||||
|
{{ message_title|safe }}
|
||||||
|
</p>
|
||||||
|
<div style="line-height:1.0em; font-size:18px; margin: 5px 30px;
|
||||||
|
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
|
||||||
|
padding: 30px; border-radius: 10px; background-color: #FFF;"
|
||||||
|
>
|
||||||
|
{# <p style="line-height:1.0em;font-size:18px;margin-top: 5px; margin-left: 80px">#}
|
||||||
|
{{ message_text|safe|linebreaksbr }}
|
||||||
|
{# </p>#}
|
||||||
|
</div>
|
||||||
|
{% for button in message_buttons %}
|
||||||
|
<div style="text-align:center;font-weight: 700;">
|
||||||
|
<a href="{{ button.url }}">
|
||||||
|
<div style="display:inline-block;text-align:center;font-size:18px;padding:5px 10px;margin:5px;border-radius:2px;background-color:#61aeb6;color:#fff;text-decoration:none;line-height:1.0em;cursor:pointer">
|
||||||
|
{{ button.caption }}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
<div style="text-align:center;width: 660px;line-height:1.1em">
|
||||||
|
<div style="margin: 40px 10px 10px;">
|
||||||
|
<hr>
|
||||||
|
{# <nobr><b>Адрес кафе:</b> Минск, ул. Будславская, 2</nobr>#}
|
||||||
|
{# <br>#}
|
||||||
|
{# <nobr><b>График работы:</b> пн-вс 12:00 - 24:00</nobr>#}
|
||||||
|
{# <br>#}
|
||||||
|
{# <nobr><b>Телефоны кафе:</b> +375 44 77 321 77</nobr>#}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="text-align: center;margin-top:5px">
|
||||||
|
{# <a href="https://baldenini.by/event/dostavka-edy" style="text-decoration: none;">#}
|
||||||
|
{# <div style="color: #311A12;#}
|
||||||
|
{# padding: 10px;#}
|
||||||
|
{# margin: 5px 10px 0 10px;#}
|
||||||
|
{# border: 2px solid #311A12;#}
|
||||||
|
{# border-radius: 5px;#}
|
||||||
|
{# font-size: 20px;#}
|
||||||
|
{# display: inline-block;#}
|
||||||
|
{# font-weight: 700;#}
|
||||||
|
{# text-transform: uppercase;">О ДОСТАВКЕ#}
|
||||||
|
{# </div>#}
|
||||||
|
{# </a>#}
|
||||||
|
{# <a href="https://baldenini.by/page/baldenini-cafe-o-nas" style="text-decoration: none;">#}
|
||||||
|
{# <div style="color: #311A12;#}
|
||||||
|
{# padding: 10px;#}
|
||||||
|
{# margin: 5px 10px 0 10px;#}
|
||||||
|
{# border: 2px solid #311A12;#}
|
||||||
|
{# border-radius: 5px;#}
|
||||||
|
{# font-size: 20px;#}
|
||||||
|
{# display: inline-block;#}
|
||||||
|
{# font-weight: 700;#}
|
||||||
|
{# text-transform: uppercase;">О BALDENINI CAFE#}
|
||||||
|
{# </div>#}
|
||||||
|
{# </a>#}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<div class="cut-width">
|
<div class="cut-width">
|
||||||
<div style="padding-top: 40px;">
|
<div style="padding-top: 40px;">
|
||||||
{% if page.description or page.title %}
|
{% if page.description or page.title or page.text %}
|
||||||
|
|
||||||
{% if page.description %}
|
{% if page.description %}
|
||||||
<div class="description_page standart_txt">{{ page.description }}</div>
|
<div class="description_page standart_txt">{{ page.description }}</div>
|
||||||
@@ -12,6 +12,9 @@
|
|||||||
{% if page.title %}
|
{% if page.title %}
|
||||||
<div class="title_page standart_txt">{{ page.title }}</div>
|
<div class="title_page standart_txt">{{ page.title }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if page.text %}
|
||||||
|
<div class="title_page standart_txt">{{ page.text|safe }}</div>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
3
templates/widgets/w_form_after_send.html
Normal file
3
templates/widgets/w_form_after_send.html
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<div>
|
||||||
|
Сообщение отправлено
|
||||||
|
</div>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
{% if widget.description %}
|
{% if widget.description %}
|
||||||
<div class="splinner_w_one_present"></div>
|
<div class="splinner_w_one_present"></div>
|
||||||
<div class="description_w_one_present standart_txt">
|
<div class="description_w_one_present standart_txt">
|
||||||
{{ widget.description }}
|
{{ widget.description|safe|linebreaksbr }}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% with name_w='presentAerBim' %}
|
{% with name_w='presentAerBim' %}
|
||||||
|
|||||||
Reference in New Issue
Block a user