registration functions. service request resolved
27
smartsoltech/static/assets/css/service_request_modal.css
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/* Добавляем стили для анимации появления модального окна */
|
||||||
|
#serviceModal {
|
||||||
|
display: none;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 1;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
position: relative;
|
||||||
|
background-color: #fefefe;
|
||||||
|
margin: auto;
|
||||||
|
padding: 20px;
|
||||||
|
border: 1px solid #888;
|
||||||
|
width: 80%;
|
||||||
|
max-width: 600px;
|
||||||
|
transform: scale(0);
|
||||||
|
transition: transform 0.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal.show .modal-content {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
@@ -13,3 +13,98 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const generateQrButton = document.getElementById('generateQrButton');
|
||||||
|
|
||||||
|
if (generateQrButton) {
|
||||||
|
generateQrButton.addEventListener('click', function () {
|
||||||
|
const clientEmail = document.getElementById('clientEmail').value;
|
||||||
|
const clientPhone = document.getElementById('clientPhone').value;
|
||||||
|
const clientName = document.getElementById('clientName').value;
|
||||||
|
const description = document.getElementById('description').value;
|
||||||
|
const serviceId = generateQrButton.getAttribute('data-service-id');
|
||||||
|
|
||||||
|
// Проверка заполненности полей
|
||||||
|
if (!clientEmail || !clientPhone || !clientName || !description || !serviceId) {
|
||||||
|
alert('Все поля должны быть заполнены.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Получение CSRF токена из cookies
|
||||||
|
function getCookie(name) {
|
||||||
|
let cookieValue = null;
|
||||||
|
if (document.cookie && document.cookie !== '') {
|
||||||
|
const cookies = document.cookie.split(';');
|
||||||
|
for (let i = 0; i < cookies.length; i++) {
|
||||||
|
const cookie = cookies[i].trim();
|
||||||
|
if (cookie.substring(0, name.length + 1) === (name + '=')) {
|
||||||
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookieValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const csrftoken = getCookie('csrftoken');
|
||||||
|
|
||||||
|
// Отправка POST запроса на создание заявки
|
||||||
|
fetch('/service/create_request/', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': csrftoken
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
client_email: clientEmail,
|
||||||
|
client_phone: clientPhone,
|
||||||
|
client_name: clientName,
|
||||||
|
service_id: serviceId,
|
||||||
|
description: description
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Ошибка при создании заявки');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(data => {
|
||||||
|
if (data.status === 'success') {
|
||||||
|
alert(data.message);
|
||||||
|
} else if (data.status === 'existing_request') {
|
||||||
|
alert(data.message);
|
||||||
|
} else {
|
||||||
|
alert('Неизвестная ошибка. Пожалуйста, попробуйте снова.');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Ошибка при создании заявки:', error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function checkVerificationStatus(serviceRequestId, interval) {
|
||||||
|
fetch(`/service/request_status/${serviceRequestId}/`)
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Ошибка при проверке статуса заявки');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(data => {
|
||||||
|
if (data.is_verified) {
|
||||||
|
// Закрываем форму и показываем окно подтверждения
|
||||||
|
document.getElementById('serviceModal').style.display = 'none';
|
||||||
|
document.getElementById('confirmationModal').style.display = 'block';
|
||||||
|
|
||||||
|
// Останавливаем интервал проверки статуса
|
||||||
|
clearInterval(interval);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Ошибка при проверке статуса заявки:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
BIN
smartsoltech/static/qr_codes/request_334.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_335.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_336.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_337.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_338.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_339.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
smartsoltech/static/qr_codes/request_340.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_341.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_342.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_343.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_344.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_345.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
smartsoltech/static/qr_codes/request_346.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,3 +1,4 @@
|
|||||||
|
{% load static %}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>
|
<head>
|
||||||
@@ -57,26 +58,29 @@
|
|||||||
<div id="serviceModal" class="modal">
|
<div id="serviceModal" class="modal">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<span class="close">×</span>
|
<span class="close">×</span>
|
||||||
<h4>Заполните заявку на услугу</h4>
|
|
||||||
<form id="serviceRequestForm">
|
<form id="serviceRequestForm">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="clientName">Ваше имя:</label>
|
||||||
|
<input type="text" class="form-control" id="clientName" name="client_name" required>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="clientEmail">Ваш email:</label>
|
<label for="clientEmail">Ваш email:</label>
|
||||||
<input type="email" class="form-control" id="clientEmail" name="client_email" placeholder="Введите ваш email" required>
|
<input type="email" class="form-control" id="clientEmail" name="client_email" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="clientPhone">Ваш телефон:</label>
|
<label for="clientPhone">Ваш телефон:</label>
|
||||||
<input type="text" class="form-control" id="clientPhone" name="client_phone" placeholder="Введите ваш телефон" required pattern="^\+?[0-9\s\-]{7,15}$">
|
<input type="text" class="form-control" id="clientPhone" name="client_phone" required pattern="^\+?[0-9\s\-]{7,15}$">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="description">Описание заявки:</label>
|
<label for="description">Описание заявки:</label>
|
||||||
<textarea class="form-control" id="description" name="description" placeholder="Опишите вашу заявку" required></textarea>
|
<textarea class="form-control" id="description" name="description" required></textarea>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="btn btn-primary" id="generateQrButton">Продолжить</button>
|
|
||||||
</form>
|
|
||||||
<div id="qrCodeContainer">
|
<div id="qrCodeContainer">
|
||||||
<p>QR-код для завершения регистрации:</p>
|
<p>QR-код для завершения регистрации:</p>
|
||||||
<img id="qrCodeImg" src="" alt="QR Code">
|
<img id="qrCodeImg" src="" alt="QR Code">
|
||||||
</div>
|
</div>
|
||||||
|
<button type="button" id="generateQrButton" class="btn btn-primary">Продолжить</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -88,140 +92,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script <script src="{% static 'assets/js/modal-init.js' %}"> </script>
|
||||||
// Обработчик открытия модального окна
|
|
||||||
document.getElementById('openModalBtn').addEventListener('click', function () {
|
|
||||||
// Открываем модальное окно
|
|
||||||
document.getElementById('serviceModal').style.display = 'block';
|
|
||||||
});
|
|
||||||
|
|
||||||
// Обработчик закрытия модального окна
|
|
||||||
document.querySelectorAll('.close').forEach(closeBtn => {
|
|
||||||
closeBtn.addEventListener('click', function () {
|
|
||||||
document.getElementById('serviceModal').style.display = 'none';
|
|
||||||
document.getElementById('confirmationModal').style.display = 'none';
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Обработчик кнопки "Продолжить" для генерации QR-кода
|
|
||||||
document.getElementById('generateQrButton').addEventListener('click', function () {
|
|
||||||
const clientEmail = document.getElementById('clientEmail').value;
|
|
||||||
const clientPhone = document.getElementById('clientPhone').value;
|
|
||||||
const description = document.getElementById('description').value;
|
|
||||||
|
|
||||||
if (clientEmail && clientPhone && description) {
|
|
||||||
// Выполняем запрос на генерацию QR-кода
|
|
||||||
const openModalBtn = document.getElementById('openModalBtn');
|
|
||||||
if (!openModalBtn) {
|
|
||||||
console.error('Не удалось найти элемент openModalBtn');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const serviceId = openModalBtn.getAttribute('data-service-id');
|
|
||||||
if (!serviceId) {
|
|
||||||
console.error('Не удалось найти идентификатор услуги');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch(`/service/generate_qr_code/${serviceId}/`)
|
|
||||||
.then(response => {
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('Ошибка при генерации QR-кода');
|
|
||||||
}
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then(data => {
|
|
||||||
// Проверка наличия ссылки на QR-код в ответе
|
|
||||||
if (!data.qr_code_url) {
|
|
||||||
throw new Error('Ответ не содержит QR-код');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Обновляем src изображения QR-кода и показываем его
|
|
||||||
const qrCodeImg = document.getElementById('qrCodeImg');
|
|
||||||
qrCodeImg.src = data.qr_code_url;
|
|
||||||
qrCodeImg.style.display = 'block';
|
|
||||||
|
|
||||||
// Запуск проверки статуса каждые 5 секунд
|
|
||||||
const interval = setInterval(() => {
|
|
||||||
checkVerificationStatus(data.service_request_id, interval, clientEmail, clientPhone, description);
|
|
||||||
}, 5000);
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.error('Ошибка при генерации QR-кода:', error);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.error('Поля email, телефон и описание обязательны');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Проверка статуса заявки на наличие подтверждения Telegram
|
|
||||||
const checkVerificationStatus = (serviceRequestId, interval, clientEmail, clientPhone, description) => {
|
|
||||||
fetch(`/service/request_status/${serviceRequestId}/`)
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(data => {
|
|
||||||
if (data.is_verified) {
|
|
||||||
// Закрываем форму и открываем окно подтверждения
|
|
||||||
document.getElementById('serviceModal').style.display = 'none';
|
|
||||||
document.getElementById('confirmationModal').style.display = 'block';
|
|
||||||
|
|
||||||
// Создание заявки с использованием данных формы и Telegram
|
|
||||||
createServiceRequest(serviceRequestId, data.client_name, data.client_chat_id, clientEmail, clientPhone, description);
|
|
||||||
|
|
||||||
// Останавливаем интервал проверки статуса
|
|
||||||
clearInterval(interval);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(error => console.error('Ошибка при проверке статуса заявки:', error));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Создание заявки с использованием данных из формы и Telegram
|
|
||||||
const createServiceRequest = (serviceRequestId, clientName, chatId, clientEmail, clientPhone, description) => {
|
|
||||||
fetch('/service/create_request/', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
service_request_id: serviceRequestId,
|
|
||||||
client_name: clientName,
|
|
||||||
client_chat_id: chatId,
|
|
||||||
client_email: clientEmail,
|
|
||||||
client_phone: clientPhone,
|
|
||||||
description: description
|
|
||||||
})
|
|
||||||
}).then(response => {
|
|
||||||
if (response.ok) {
|
|
||||||
console.log('Заявка успешно создана');
|
|
||||||
sendTelegramNotification({ client_name: clientName, client_chat_id: chatId, description: description });
|
|
||||||
} else {
|
|
||||||
console.error('Ошибка при создании заявки');
|
|
||||||
}
|
|
||||||
}).catch(error => console.error('Ошибка при создании заявки:', error));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Функция для отправки уведомления в Telegram
|
|
||||||
const sendTelegramNotification = (data) => {
|
|
||||||
const clientName = data.client_name;
|
|
||||||
const serviceDescription = data.description;
|
|
||||||
const chatId = data.client_chat_id;
|
|
||||||
const message = `Здравствуйте, ${clientName}! Ваша заявка успешно зарегистрирована. Детали: ${serviceDescription}`;
|
|
||||||
|
|
||||||
fetch('/service/send_telegram_notification/', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ chat_id: chatId, message: message })
|
|
||||||
}).then(response => {
|
|
||||||
if (response.ok) {
|
|
||||||
console.log('Уведомление успешно отправлено в Telegram');
|
|
||||||
} else {
|
|
||||||
console.error('Ошибка при отправке уведомления в Telegram');
|
|
||||||
}
|
|
||||||
}).catch(error => console.error('Ошибка при отправке уведомления в Telegram:', error));
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
<!-- web/templates/web/service_detail.html -->
|
|
||||||
{% extends 'web/base.html' %}
|
{% extends 'web/base.html' %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% block title %}Услуга - {{ service.name }}{% endblock %}
|
{% block title %}Услуга - {{ service.name }}{% endblock %}
|
||||||
@@ -16,14 +15,13 @@
|
|||||||
<p class="my-3">{{ service.description }}</p>
|
<p class="my-3">{{ service.description }}</p>
|
||||||
<!-- Кнопка открытия модального окна -->
|
<!-- Кнопка открытия модального окна -->
|
||||||
<button id="openModalBtn" class="btn btn-primary" data-service-id="{{ service.id }}">Открыть заявку на услугу</button>
|
<button id="openModalBtn" class="btn btn-primary" data-service-id="{{ service.id }}">Открыть заявку на услугу</button>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% include "web/modal_order_form.html" %}
|
{% include "web/modal_order_form.html" %}
|
||||||
|
|
||||||
<div class="container py-4">
|
<div class="container py-4">
|
||||||
<div class="row-cols-auto">
|
<div class="row-cols-auto">
|
||||||
<div class="col-md-8 col-xl-6 text-center mx-auto">
|
<div class="col-md-8 col-xl-6 text-center mx-auto">
|
||||||
@@ -80,17 +78,174 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<style>
|
||||||
// JavaScript для дополнительной проверки формы
|
/* Добавляем стили для анимации появления модального окна */
|
||||||
document.getElementById('orderForm').addEventListener('submit', function (event) {
|
#serviceModal {
|
||||||
let phoneInput = document.getElementById('client_phone');
|
display: none;
|
||||||
let phonePattern = /^\+?[0-9\s\-]{7,15}$/;
|
position: fixed;
|
||||||
|
z-index: 1;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
if (!phonePattern.test(phoneInput.value)) {
|
.modal-content {
|
||||||
|
position: relative;
|
||||||
|
background-color: #fefefe;
|
||||||
|
margin: auto;
|
||||||
|
padding: 20px;
|
||||||
|
border: 1px solid #888;
|
||||||
|
width: 80%;
|
||||||
|
max-width: 600px;
|
||||||
|
transform: scale(0);
|
||||||
|
transition: transform 0.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal.show .modal-content {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script <script src="{% static 'assets/js/modal-init.js' %}"> </script>
|
||||||
|
<script>
|
||||||
|
function checkVerificationStatus(serviceRequestId, interval) {
|
||||||
|
fetch(`/service/request_status/${serviceRequestId}/`)
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Ошибка при проверке статуса заявки');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(data => {
|
||||||
|
if (data.is_verified) {
|
||||||
|
// Закрываем форму и показываем окно подтверждения
|
||||||
|
document.getElementById('serviceModal').style.display = 'none';
|
||||||
|
document.getElementById('confirmationModal').style.display = 'block';
|
||||||
|
|
||||||
|
// Останавливаем интервал проверки статуса
|
||||||
|
clearInterval(interval);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Ошибка при проверке статуса заявки:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
// Получение CSRF токена
|
||||||
|
function getCookie(name) {
|
||||||
|
let cookieValue = null;
|
||||||
|
if (document.cookie && document.cookie !== '') {
|
||||||
|
const cookies = document.cookie.split(';');
|
||||||
|
for (let i = 0; i < cookies.length; i++) {
|
||||||
|
const cookie = cookies[i].trim();
|
||||||
|
if (cookie.substring(0, name.length + 1) === (name + '=')) {
|
||||||
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookieValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const csrftoken = getCookie('csrftoken');
|
||||||
|
|
||||||
|
// Открытие модального окна
|
||||||
|
const openModalBtn = document.getElementById('openModalBtn');
|
||||||
|
const serviceModal = document.getElementById('serviceModal');
|
||||||
|
if (openModalBtn) {
|
||||||
|
openModalBtn.addEventListener('click', function (event) {
|
||||||
|
event.preventDefault(); // Предотвращаем отправку формы при нажатии на кнопку
|
||||||
|
serviceModal.classList.add('show');
|
||||||
|
serviceModal.style.display = 'block';
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error('Не удалось найти элемент с id openModalBtn.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Закрытие модальных окон
|
||||||
|
document.querySelectorAll('.close').forEach(closeBtn => {
|
||||||
|
closeBtn.addEventListener('click', function () {
|
||||||
|
serviceModal.classList.remove('show');
|
||||||
|
setTimeout(() => {
|
||||||
|
serviceModal.style.display = 'none';
|
||||||
|
}, 500); // Ждем, пока завершится анимация закрытия
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Обработчик кнопки "Продолжить" для генерации QR-кода
|
||||||
|
const generateQrButton = document.getElementById('generateQrButton');
|
||||||
|
if (generateQrButton) {
|
||||||
|
generateQrButton.addEventListener('click', function () {
|
||||||
|
const clientEmail = document.getElementById('clientEmail').value;
|
||||||
|
const clientPhone = document.getElementById('clientPhone').value;
|
||||||
|
const clientName = document.getElementById('clientName').value;
|
||||||
|
const description = document.getElementById('description').value;
|
||||||
|
|
||||||
|
// Проверяем, чтобы все поля были заполнены
|
||||||
|
if (!clientEmail || !clientPhone || !clientName || !description) {
|
||||||
|
alert('Все поля должны быть заполнены.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Выполняем валидацию телефона перед продолжением
|
||||||
|
let phonePattern = /^\+?[0-9\s\-]{7,15}$/;
|
||||||
|
if (!phonePattern.test(clientPhone)) {
|
||||||
alert('Введите правильный номер телефона.');
|
alert('Введите правильный номер телефона.');
|
||||||
event.preventDefault(); // Останавливаем отправку формы
|
return; // Останавливаем выполнение, если телефон не валиден
|
||||||
|
}
|
||||||
|
|
||||||
|
// Получаем serviceId из кнопки открытия модального окна
|
||||||
|
const serviceId = openModalBtn.getAttribute('data-service-id');
|
||||||
|
if (!serviceId) {
|
||||||
|
console.error('Не удалось найти идентификатор услуги');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Запрос на генерацию QR-кода с использованием метода POST
|
||||||
|
fetch(`/service/generate_qr_code/${serviceId}/`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRFToken': csrftoken // Добавляем CSRF токен в заголовок
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
client_email: clientEmail,
|
||||||
|
client_phone: clientPhone,
|
||||||
|
client_name: clientName,
|
||||||
|
description: description
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Ошибка при генерации QR-кода');
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(data => {
|
||||||
|
if (!data.qr_code_url) {
|
||||||
|
throw new Error('Ответ не содержит URL QR-кода');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновляем src изображения QR-кода и показываем его
|
||||||
|
const qrCodeImg = document.getElementById('qrCodeImg');
|
||||||
|
qrCodeImg.src = data.qr_code_url;
|
||||||
|
qrCodeImg.style.display = 'block';
|
||||||
|
|
||||||
|
// Запуск проверки статуса каждые 5 секунд
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
checkVerificationStatus(data.service_request_id, interval, clientEmail, clientPhone, description);
|
||||||
|
}, 5000);
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Ошибка при генерации QR-кода:', error);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -22,6 +22,7 @@ urlpatterns = [
|
|||||||
path('client/orders/', views.client_orders, name='client_orders'),
|
path('client/orders/', views.client_orders, name='client_orders'),
|
||||||
path('order/<int:pk>/', views.order_detail, name='order_detail'),
|
path('order/<int:pk>/', views.order_detail, name='order_detail'),
|
||||||
path('service/send_telegram_notification/', views.send_telegram_notification, name='send_telegram_notification'),
|
path('service/send_telegram_notification/', views.send_telegram_notification, name='send_telegram_notification'),
|
||||||
|
path('service/create_request/', views.create_service_request_basic, name='create_service_request_basic'),
|
||||||
]
|
]
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
@@ -20,7 +20,9 @@ import hmac
|
|||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
# sens
|
# sens
|
||||||
try:
|
try:
|
||||||
bot = TelegramBot()
|
bot = TelegramBot()
|
||||||
@@ -64,94 +66,104 @@ def services_view(request):
|
|||||||
def about_view(request):
|
def about_view(request):
|
||||||
return render(request, 'web/about.html')
|
return render(request, 'web/about.html')
|
||||||
|
|
||||||
# def create_service_request(request, service_id):
|
|
||||||
# service = get_object_or_404(Service, pk=service_id)
|
|
||||||
# if request.method == 'POST':
|
|
||||||
# client_name = request.POST.get('client_name')
|
|
||||||
# client_email = request.POST.get('client_email')
|
|
||||||
# client_phone = request.POST.get('client_phone')
|
|
||||||
# description = request.POST.get('description')
|
|
||||||
# chat_id = request.POST.get('chat_id')
|
|
||||||
# token = uuid.uuid4().hex
|
|
||||||
|
|
||||||
# # Создаем заявку
|
|
||||||
# service_request = ServiceRequest.objects.create(
|
|
||||||
# service=service,
|
|
||||||
# client_name=client_name,
|
|
||||||
# client_email=client_email,
|
|
||||||
# client_phone=client_phone,
|
|
||||||
# chat_id=chat_id,
|
|
||||||
# token=token
|
|
||||||
# )
|
|
||||||
|
|
||||||
# # Генерация уникальных данных для пользователя
|
|
||||||
# username = f"{client_email.split('@')[0]}_{get_random_string(5)}"
|
|
||||||
# password = get_random_string(8)
|
|
||||||
|
|
||||||
# # Создание пользователя
|
|
||||||
# user = User.objects.create_user(username=username, password=password)
|
|
||||||
# user.first_name = client_name.split()[0] if client_name else ""
|
|
||||||
# user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else ""
|
|
||||||
# user.email = client_email
|
|
||||||
# user.save()
|
|
||||||
|
|
||||||
# # Создание клиента и привязка к пользователю
|
|
||||||
# client, created = Client.objects.get_or_create(
|
|
||||||
# email=client_email,
|
|
||||||
# defaults={
|
|
||||||
# 'user': user,
|
|
||||||
# 'first_name': user.first_name,
|
|
||||||
# 'last_name': user.last_name,
|
|
||||||
# 'phone_number': client_phone,
|
|
||||||
# 'chat_id': chat_id,
|
|
||||||
# }
|
|
||||||
# )
|
|
||||||
|
|
||||||
# # Создание заказа на основе заявки
|
|
||||||
# order = Order.objects.create(
|
|
||||||
# service_request=service_request,
|
|
||||||
# client=client,
|
|
||||||
# service=service,
|
|
||||||
# message=description,
|
|
||||||
# status="pending"
|
|
||||||
# )
|
|
||||||
|
|
||||||
# # Отправка сообщения в Telegram
|
|
||||||
# if chat_id:
|
|
||||||
# bot.send_telegram_message(client.id, service_request.id, "Ваши данные для входа на сайт.", order.id)
|
|
||||||
|
|
||||||
# return redirect(reverse('order_detail', args=[order.pk]))
|
|
||||||
|
|
||||||
# return render(request, 'web/create_service_request.html', {'service': service})
|
|
||||||
|
|
||||||
def create_service_request(request, service_id):
|
def create_service_request(request, service_id):
|
||||||
service = get_object_or_404(Service, pk=service_id)
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
# Извлечение данных формы
|
try:
|
||||||
client_email = request.POST.get('client_email')
|
# Извлечение данных из запроса
|
||||||
client_phone = request.POST.get('client_phone')
|
data = json.loads(request.body)
|
||||||
description = request.POST.get('description')
|
client_email = data.get('client_email')
|
||||||
chat_id = request.POST.get('client_chat_id')
|
client_phone = data.get('client_phone')
|
||||||
client_name = request.POST.get('client_name')
|
client_name = data.get('client_name')
|
||||||
|
|
||||||
# Проверка на наличие существующей заявки
|
# Проверка на наличие всех необходимых данных
|
||||||
service_request = get_object_or_404(ServiceRequest, chat_id=chat_id)
|
if not all([client_email, client_phone, client_name]):
|
||||||
|
return JsonResponse({'status': 'error', 'message': 'Все поля должны быть заполнены'}, status=400)
|
||||||
|
|
||||||
# Обновление данных заявки
|
# Получение услуги
|
||||||
service_request.client_email = client_email
|
service = get_object_or_404(Service, pk=service_id)
|
||||||
service_request.client_phone = client_phone
|
|
||||||
service_request.message = description
|
|
||||||
service_request.save()
|
|
||||||
|
|
||||||
# Создание клиента и пользователя, если необходимо
|
# Создаем или получаем клиента
|
||||||
user, _ = User.objects.get_or_create(
|
client, created = Client.objects.get_or_create(
|
||||||
|
email=client_email,
|
||||||
|
defaults={
|
||||||
|
'first_name': client_name.split()[0] if client_name else "",
|
||||||
|
'last_name': client_name.split()[-1] if len(client_name.split()) > 1 else "",
|
||||||
|
'phone_number': client_phone,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Обновляем данные клиента, если он уже существовал
|
||||||
|
if not created:
|
||||||
|
client.first_name = client_name.split()[0]
|
||||||
|
client.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else ""
|
||||||
|
client.phone_number = client_phone
|
||||||
|
client.save()
|
||||||
|
|
||||||
|
# Проверяем, есть ли у клиента уже активная заявка
|
||||||
|
existing_requests = ServiceRequest.objects.filter(client=client, service=service, chat_id__isnull=True)
|
||||||
|
if existing_requests.exists():
|
||||||
|
return JsonResponse({
|
||||||
|
'status': 'existing_request',
|
||||||
|
'message': 'У вас уже есть активная заявка на данную услугу. Пожалуйста, проверьте ваш Telegram для завершения процесса.'
|
||||||
|
})
|
||||||
|
|
||||||
|
# Создание новой заявки на услугу
|
||||||
|
token = uuid.uuid4().hex
|
||||||
|
service_request = ServiceRequest.objects.create(
|
||||||
|
service=service,
|
||||||
|
client=client,
|
||||||
|
token=token
|
||||||
|
)
|
||||||
|
|
||||||
|
return JsonResponse({
|
||||||
|
'status': 'success',
|
||||||
|
'message': 'Заявка успешно создана. Пожалуйста, проверьте ваш Telegram для подтверждения.',
|
||||||
|
'service_request_id': service_request.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return JsonResponse({'status': 'error', 'message': 'Неверный формат данных'}, status=400)
|
||||||
|
|
||||||
|
return JsonResponse({'status': 'error', 'message': 'Метод запроса должен быть POST'}, status=405)
|
||||||
|
|
||||||
|
def create_service_request_basic(request):
|
||||||
|
if request.method == 'POST':
|
||||||
|
try:
|
||||||
|
# Извлечение данных из тела запроса
|
||||||
|
data = json.loads(request.body)
|
||||||
|
client_email = data.get('client_email')
|
||||||
|
client_phone = data.get('client_phone')
|
||||||
|
client_name = data.get('client_name')
|
||||||
|
service_id = data.get('service_id')
|
||||||
|
description = data.get('description')
|
||||||
|
|
||||||
|
# Проверка на наличие всех необходимых данных
|
||||||
|
if not all([client_email, client_phone, client_name, service_id, description]):
|
||||||
|
return JsonResponse({'status': 'error', 'message': 'Все поля должны быть заполнены'}, status=400)
|
||||||
|
|
||||||
|
# Получаем услугу по ID
|
||||||
|
service = get_object_or_404(Service, pk=service_id)
|
||||||
|
|
||||||
|
# Проверка на существование активной заявки для клиента на данную услугу
|
||||||
|
existing_requests = ServiceRequest.objects.filter(client__email=client_email, service=service, chat_id__isnull=True)
|
||||||
|
if existing_requests.exists():
|
||||||
|
return JsonResponse({
|
||||||
|
'status': 'existing_request',
|
||||||
|
'message': 'У вас уже есть активная заявка на данную услугу. Пожалуйста, проверьте ваш Telegram для завершения процесса.'
|
||||||
|
})
|
||||||
|
|
||||||
|
# Создаем или получаем клиента
|
||||||
|
user, created = User.objects.get_or_create(
|
||||||
username=f"{client_email.split('@')[0]}_{get_random_string(5)}",
|
username=f"{client_email.split('@')[0]}_{get_random_string(5)}",
|
||||||
defaults={"email": client_email}
|
defaults={"email": client_email}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Обновляем данные пользователя, если он уже существовал
|
||||||
user.first_name = client_name.split()[0] if client_name else ""
|
user.first_name = client_name.split()[0] if client_name else ""
|
||||||
user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else ""
|
user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else ""
|
||||||
user.save()
|
user.save()
|
||||||
|
|
||||||
|
# Создаем или получаем объект клиента
|
||||||
client, _ = Client.objects.get_or_create(
|
client, _ = Client.objects.get_or_create(
|
||||||
email=client_email,
|
email=client_email,
|
||||||
defaults={
|
defaults={
|
||||||
@@ -159,41 +171,67 @@ def create_service_request(request, service_id):
|
|||||||
'first_name': user.first_name,
|
'first_name': user.first_name,
|
||||||
'last_name': user.last_name,
|
'last_name': user.last_name,
|
||||||
'phone_number': client_phone,
|
'phone_number': client_phone,
|
||||||
'chat_id': chat_id,
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Создание заказа, связанного с заявкой
|
# Создаем заявку на услугу
|
||||||
|
token = uuid.uuid4().hex
|
||||||
|
service_request = ServiceRequest.objects.create(
|
||||||
|
service=service,
|
||||||
|
client=client,
|
||||||
|
token=token
|
||||||
|
)
|
||||||
|
|
||||||
|
# Создаем заказ на основе заявки
|
||||||
order = Order.objects.create(
|
order = Order.objects.create(
|
||||||
service_request=service_request,
|
service_request=service_request,
|
||||||
client=client,
|
client=client,
|
||||||
service=service_request.service,
|
service=service,
|
||||||
message=description,
|
message=description,
|
||||||
status="pending"
|
status="pending"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Отправка уведомления в Telegram
|
# Отправляем уведомление в Telegram, если chat_id у клиента заполнен
|
||||||
|
if client.chat_id:
|
||||||
|
# Предполагается, что bot.send_telegram_message() уже настроен
|
||||||
bot.send_telegram_message(
|
bot.send_telegram_message(
|
||||||
client.id,
|
client.chat_id,
|
||||||
service_request.id,
|
f"Ваш заказ на услугу '{service.name}' был успешно создан. Пожалуйста, завершите процесс регистрации в Telegram."
|
||||||
f"Ваш заказ на услугу '{service_request.service.name}' был успешно создан.",
|
|
||||||
order.id
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return redirect(reverse('order_detail', args=[order.pk]))
|
return JsonResponse({
|
||||||
|
'status': 'success',
|
||||||
return render(request, 'web/create_service_request.html', {'service': service})
|
'message': 'Заявка успешно создана. Пожалуйста, проверьте ваш Telegram для подтверждения.',
|
||||||
|
'service_request_id': service_request.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return JsonResponse({'status': 'error', 'message': 'Неверный формат данных'}, status=400)
|
||||||
|
except Exception as e:
|
||||||
|
return JsonResponse({'status': 'error', 'message': str(e)}, status=500)
|
||||||
|
|
||||||
|
return JsonResponse({'status': 'error', 'message': 'Метод запроса должен быть POST'}, status=405)
|
||||||
|
|
||||||
def generate_qr_code(request, service_id):
|
def generate_qr_code(request, service_id):
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
client_email = request.POST.get('client_email')
|
try:
|
||||||
client_phone = request.POST.get('client_phone')
|
data = json.loads(request.body)
|
||||||
client_name = request.POST.get('client_name')
|
client_email = data.get('client_email')
|
||||||
|
client_phone = data.get('client_phone')
|
||||||
|
client_name = data.get('client_name')
|
||||||
|
|
||||||
|
# Проверка на наличие всех необходимых данных
|
||||||
|
if not all([client_email, client_phone, client_name]):
|
||||||
|
logger.error("Не все поля заполнены.")
|
||||||
|
return JsonResponse({'error': 'Все поля должны быть заполнены'}, status=400)
|
||||||
|
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
logger.error(f"Ошибка JSONDecodeError: {str(e)}")
|
||||||
|
return JsonResponse({'error': 'Неверный формат данных'}, status=400)
|
||||||
|
|
||||||
# Создание или получение клиента
|
# Создание или получение клиента
|
||||||
user, _ = User.objects.get_or_create(
|
try:
|
||||||
|
user, created = User.objects.get_or_create(
|
||||||
username=f"{client_email.split('@')[0]}_{get_random_string(5)}",
|
username=f"{client_email.split('@')[0]}_{get_random_string(5)}",
|
||||||
defaults={"email": client_email}
|
defaults={"email": client_email}
|
||||||
)
|
)
|
||||||
@@ -210,8 +248,12 @@ def generate_qr_code(request, service_id):
|
|||||||
'phone_number': client_phone
|
'phone_number': client_phone
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Ошибка при создании или получении клиента: {str(e)}")
|
||||||
|
return JsonResponse({'error': f'Ошибка при создании клиента: {str(e)}'}, status=500)
|
||||||
|
|
||||||
# Создание новой заявки на услугу
|
# Создание новой заявки на услугу
|
||||||
|
try:
|
||||||
service = get_object_or_404(Service, pk=service_id)
|
service = get_object_or_404(Service, pk=service_id)
|
||||||
token = uuid.uuid4().hex
|
token = uuid.uuid4().hex
|
||||||
|
|
||||||
@@ -220,12 +262,20 @@ def generate_qr_code(request, service_id):
|
|||||||
client=client,
|
client=client,
|
||||||
token=token
|
token=token
|
||||||
)
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Ошибка при создании заявки: {str(e)}")
|
||||||
|
return JsonResponse({'error': f'Ошибка при создании заявки: {str(e)}'}, status=500)
|
||||||
|
|
||||||
# Генерация ссылки для регистрации в Telegram
|
# Генерация ссылки для регистрации в Telegram
|
||||||
|
try:
|
||||||
telegram_settings = get_object_or_404(TelegramSettings, pk=1)
|
telegram_settings = get_object_or_404(TelegramSettings, pk=1)
|
||||||
registration_link = f'https://t.me/{telegram_settings.bot_name}?start=request_{service_request.id}_token_{urlsafe_base64_encode(force_bytes(token))}'
|
registration_link = f'https://t.me/{telegram_settings.bot_name}?start=request_{service_request.id}_token_{urlsafe_base64_encode(force_bytes(token))}'
|
||||||
|
except TelegramSettings.DoesNotExist:
|
||||||
|
logger.error("Не удалось получить настройки Telegram.")
|
||||||
|
return JsonResponse({'error': 'Не удалось получить настройки Telegram'}, status=500)
|
||||||
|
|
||||||
# Генерация QR-кода
|
# Генерация QR-кода
|
||||||
|
try:
|
||||||
qr = qrcode.make(registration_link)
|
qr = qrcode.make(registration_link)
|
||||||
qr_code_dir = os.path.join(settings.STATICFILES_DIRS[0], 'qr_codes')
|
qr_code_dir = os.path.join(settings.STATICFILES_DIRS[0], 'qr_codes')
|
||||||
qr_code_path = os.path.join(qr_code_dir, f"request_{service_request.id}.png")
|
qr_code_path = os.path.join(qr_code_dir, f"request_{service_request.id}.png")
|
||||||
@@ -235,44 +285,71 @@ def generate_qr_code(request, service_id):
|
|||||||
os.makedirs(qr_code_dir)
|
os.makedirs(qr_code_dir)
|
||||||
|
|
||||||
qr.save(qr_code_path)
|
qr.save(qr_code_path)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Ошибка при генерации QR-кода: {str(e)}")
|
||||||
|
return JsonResponse({'error': f'Ошибка при генерации QR-кода: {str(e)}'}, status=500)
|
||||||
|
|
||||||
|
# Возвращаем ответ, включающий все необходимые данные
|
||||||
return JsonResponse({
|
return JsonResponse({
|
||||||
'registration_link': registration_link,
|
'registration_link': registration_link,
|
||||||
'qr_code_url': f"/{external_qr_link}",
|
'qr_code_url': f"/{external_qr_link}",
|
||||||
'service_request_id': service_request.id
|
'service_request_id': service_request.id,
|
||||||
|
'client_email': client_email,
|
||||||
|
'client_phone': client_phone,
|
||||||
|
'client_name': client_name
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
|
logger.error("Неправильный метод запроса")
|
||||||
return JsonResponse({'error': 'Метод запроса должен быть POST'}, status=405)
|
return JsonResponse({'error': 'Метод запроса должен быть POST'}, status=405)
|
||||||
|
|
||||||
|
|
||||||
def complete_registration(request, request_id):
|
def complete_registration(request, request_id):
|
||||||
# Завершение регистрации по идентификатору заявки
|
# Завершение регистрации по идентификатору заявки
|
||||||
service_request = get_object_or_404(ServiceRequest, pk=request_id)
|
service_request = get_object_or_404(ServiceRequest, pk=request_id)
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
client_name = request.POST.get('client_name', service_request.client_name)
|
client_email = request.POST.get('client_email', service_request.client.email)
|
||||||
client_email = request.POST.get('client_email', service_request.client_email)
|
client_phone = request.POST.get('client_phone', service_request.client.phone_number)
|
||||||
client_phone = request.POST.get('client_phone', service_request.client_phone)
|
|
||||||
chat_id = request.POST.get('chat_id', service_request.chat_id)
|
chat_id = request.POST.get('chat_id', service_request.chat_id)
|
||||||
|
|
||||||
# Обновляем данные заявки
|
# Проверка корректности данных
|
||||||
service_request.client_name = client_name
|
if not all([client_email, client_phone, chat_id]):
|
||||||
service_request.client_email = client_email
|
return JsonResponse({'status': 'error', 'message': 'Все поля должны быть заполнены.'}, status=400)
|
||||||
service_request.client_phone = client_phone
|
|
||||||
|
# Обновляем данные клиента
|
||||||
|
client = service_request.client
|
||||||
|
client.email = client_email
|
||||||
|
client.phone_number = client_phone
|
||||||
|
client.save()
|
||||||
|
|
||||||
|
# Обновляем заявку
|
||||||
service_request.chat_id = chat_id
|
service_request.chat_id = chat_id
|
||||||
service_request.save()
|
service_request.save()
|
||||||
|
|
||||||
return redirect('home')
|
return JsonResponse({'status': 'success', 'message': 'Регистрация успешно завершена.'})
|
||||||
|
|
||||||
|
return render(request, 'web/complete_registration.html', {'service_request': service_request})
|
||||||
|
|
||||||
|
|
||||||
return render(request, 'web/complete_registration.html', {'service_request': service_request})
|
return render(request, 'web/complete_registration.html', {'service_request': service_request})
|
||||||
def request_status(request, service_id):
|
def request_status(request, service_id):
|
||||||
# Проверяем статус заявки на услугу
|
try:
|
||||||
|
# Получаем заявку на услугу по ID
|
||||||
service_request = get_object_or_404(ServiceRequest, pk=service_id)
|
service_request = get_object_or_404(ServiceRequest, pk=service_id)
|
||||||
is_verified = service_request.client_name != '' and service_request.chat_id != ''
|
|
||||||
|
|
||||||
|
# Получаем объект клиента через связанное поле client
|
||||||
|
client = service_request.client
|
||||||
|
|
||||||
|
# Проверка, что клиент существует и его Telegram chat_id заполнен
|
||||||
|
is_verified = bool(client and client.chat_id)
|
||||||
|
|
||||||
|
# Возвращаем данные клиента и статус верификации
|
||||||
return JsonResponse({
|
return JsonResponse({
|
||||||
'is_verified': is_verified,
|
'is_verified': is_verified,
|
||||||
'client_name': service_request.client_name,
|
'client_name': client.first_name if client else "Неизвестно",
|
||||||
'client_chat_id' : service_request.chat_id,
|
'client_chat_id': client.chat_id if client else None,
|
||||||
})
|
})
|
||||||
|
except Exception as e:
|
||||||
|
return JsonResponse({'error': str(e)}, status=500)
|
||||||
|
|
||||||
def complete_registration_basic(request):
|
def complete_registration_basic(request):
|
||||||
# Базовая регистрация без идентификатора заявки
|
# Базовая регистрация без идентификатора заявки
|
||||||
@@ -355,8 +432,9 @@ def send_telegram_notification(request):
|
|||||||
if not chat_id:
|
if not chat_id:
|
||||||
return JsonResponse({'error': 'Нет chat_id для отправки сообщения'}, status=400)
|
return JsonResponse({'error': 'Нет chat_id для отправки сообщения'}, status=400)
|
||||||
|
|
||||||
|
# Составление и отправка сообщения
|
||||||
message = (
|
message = (
|
||||||
f"Здравствуйте, {service_request.client_name}!\n"
|
f"Здравствуйте, {service_request.client.first_name}!\n"
|
||||||
f"Ваша заявка на услугу '{service_request.service.name}' успешно зарегистрирована."
|
f"Ваша заявка на услугу '{service_request.service.name}' успешно зарегистрирована."
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -364,6 +442,8 @@ def send_telegram_notification(request):
|
|||||||
|
|
||||||
return JsonResponse({'status': 'Уведомление успешно отправлено в Telegram'})
|
return JsonResponse({'status': 'Уведомление успешно отправлено в Telegram'})
|
||||||
|
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return JsonResponse({'error': 'Неверный формат данных'}, status=400)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return JsonResponse({'error': str(e)}, status=500)
|
return JsonResponse({'error': str(e)}, status=500)
|
||||||
|
|
||||||
|
|||||||