0.2.2 feedback_form, contacts models

This commit is contained in:
SDE
2023-12-09 18:43:22 +03:00
parent 170e679dda
commit 02eb295acc
17 changed files with 382 additions and 100 deletions

View File

@@ -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)

View File

@@ -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))

9
GeneralApp/js_urls.py Normal file
View 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
View 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)

View 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'],
},
),
]

View File

@@ -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']
# ordering = ['order', 'name']