diff --git a/.gitignore b/.gitignore index 733b23c..c4da2ab 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__ .venv .history +static/qr_codes \ No newline at end of file diff --git a/smartsoltech/.gitignore b/smartsoltech/.gitignore new file mode 100644 index 0000000..16a6505 --- /dev/null +++ b/smartsoltech/.gitignore @@ -0,0 +1 @@ +static/qr-qr_codes \ No newline at end of file diff --git a/smartsoltech/comunication/telegram_bot.py b/smartsoltech/comunication/telegram_bot.py index c28742a..d67cbc8 100644 --- a/smartsoltech/comunication/telegram_bot.py +++ b/smartsoltech/comunication/telegram_bot.py @@ -126,6 +126,7 @@ import telebot +from telebot import types from decouple import config from django.shortcuts import get_object_or_404 from web.models import Client, ServiceRequest, Order @@ -152,7 +153,10 @@ class TelegramBot: if match: self.handle_confirm_command(message, match) elif message.text.strip() == '/start': - self.bot.reply_to(message, "Ошибка: Некорректная команда. Пожалуйста, используйте ссылку, предоставленную на сайте для регистрации.") + kbd = types.InlineKeyboardMarkup() + url_btn = types.InlineKeyboardButton('Перейти на сайт', url=config("URL")) + kbd.add(url_btn) + self.bot.reply_to(message, "Здравствуйте! Данный бот предназначен для информирования клиентов SmartSolTech и регистрации на сайте. Пройдите на сайт для получения информации.", reply_markup = kbd) else: self.bot.reply_to(message, "Здравствуйте! Пожалуйста, используйте команду /start с корректными параметрами для подтверждения регистрации.") @@ -161,11 +165,14 @@ class TelegramBot: chat_id = message.chat.id client = Client.objects.filter(chat_id=chat_id).first() if client: - service_requests = ServiceRequest.objects.filter(client_email=client.email) + service_requests = ServiceRequest.objects.filter(chat_id=client.chat_id) if service_requests.exists(): response = "Ваши заявки:\n" for req in service_requests: - response += f"Номер заявки: {req.id}, Услуга: {req.service.name}, Дата создания: {req.created_at.strftime('%d-%m-%Y')}\n" + response += f"Номер заявки: {req.id}\n" \ + f"Услуга: {req.service.name}\n" \ + f"Дата создания: {req.created_at.strftime('%Y-%m-%d')}\n" \ + f"UID заявки: {req.token}\n" else: response = "У вас нет активных заявок." else: @@ -198,16 +205,14 @@ class TelegramBot: request_id = match.group(1) encoded_token = match.group(2) - # Декодируем токен из base64 + # Декодируем токен try: token = base64.urlsafe_b64decode(encoded_token + '==').decode('utf-8') - logging.info(f"Декодированный токен: {token}") except Exception as e: - logging.error(f"Ошибка при декодировании токена: {e}") self.bot.send_message(chat_id, "Ошибка: Некорректный токен. Пожалуйста, повторите попытку позже.") return - # Получаем заявку по ID и токену + # Получаем заявку service_request = ServiceRequest.objects.filter(id=request_id, token=token).first() if service_request: # Обновляем chat_id клиента @@ -215,12 +220,19 @@ class TelegramBot: service_request.client_name = message.from_user.first_name service_request.save() - response_message = ( - f"Здравствуйте, {message.from_user.first_name}!\n" - f"Ваш Telegram аккаунт успешно подтвержден. Пожалуйста, вернитесь на сайт для заполнения остальных данных." - ) + # Отправляем данные обратно на сервер для создания заявки + data = { + "service_request_id": request_id, + "client_name": message.from_user.first_name, + "client_chat_id": chat_id + } + response = requests.post('http://localhost:8000/service/send_telegram_notification/', json=data) + if response.status_code == 200: + self.bot.send_message(chat_id, "Ваш аккаунт успешно подтвержден! Вернитесь на сайт для продолжения.") + else: + self.bot.send_message(chat_id, "Ошибка при подтверждении. Пожалуйста, повторите попытку позже.") else: - response_message = "Ошибка: Неверная заявка или токен. Пожалуйста, проверьте ссылку." + self.bot.send_message(chat_id, "Ошибка: Неверная заявка или токен. Пожалуйста, проверьте ссылку.") self.bot.send_message(chat_id, response_message) else: diff --git a/smartsoltech/static/qr_codes/request_277.png b/smartsoltech/static/qr_codes/request_277.png deleted file mode 100644 index 2992841..0000000 Binary files a/smartsoltech/static/qr_codes/request_277.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_278.png b/smartsoltech/static/qr_codes/request_278.png deleted file mode 100644 index ca0f05c..0000000 Binary files a/smartsoltech/static/qr_codes/request_278.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_279.png b/smartsoltech/static/qr_codes/request_279.png deleted file mode 100644 index 482f216..0000000 Binary files a/smartsoltech/static/qr_codes/request_279.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_280.png b/smartsoltech/static/qr_codes/request_280.png deleted file mode 100644 index 3490f31..0000000 Binary files a/smartsoltech/static/qr_codes/request_280.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_281.png b/smartsoltech/static/qr_codes/request_281.png deleted file mode 100644 index 592425f..0000000 Binary files a/smartsoltech/static/qr_codes/request_281.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_282.png b/smartsoltech/static/qr_codes/request_282.png deleted file mode 100644 index 8a4c799..0000000 Binary files a/smartsoltech/static/qr_codes/request_282.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_283.png b/smartsoltech/static/qr_codes/request_283.png deleted file mode 100644 index f653db9..0000000 Binary files a/smartsoltech/static/qr_codes/request_283.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_284.png b/smartsoltech/static/qr_codes/request_284.png deleted file mode 100644 index 1d72cfc..0000000 Binary files a/smartsoltech/static/qr_codes/request_284.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_285.png b/smartsoltech/static/qr_codes/request_285.png deleted file mode 100644 index 627aa2b..0000000 Binary files a/smartsoltech/static/qr_codes/request_285.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_286.png b/smartsoltech/static/qr_codes/request_286.png deleted file mode 100644 index 820480e..0000000 Binary files a/smartsoltech/static/qr_codes/request_286.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_287.png b/smartsoltech/static/qr_codes/request_287.png deleted file mode 100644 index 9bbd672..0000000 Binary files a/smartsoltech/static/qr_codes/request_287.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_288.png b/smartsoltech/static/qr_codes/request_288.png deleted file mode 100644 index 49e1334..0000000 Binary files a/smartsoltech/static/qr_codes/request_288.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_289.png b/smartsoltech/static/qr_codes/request_289.png deleted file mode 100644 index b8bf68a..0000000 Binary files a/smartsoltech/static/qr_codes/request_289.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_290.png b/smartsoltech/static/qr_codes/request_290.png deleted file mode 100644 index f7e5dc3..0000000 Binary files a/smartsoltech/static/qr_codes/request_290.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_291.png b/smartsoltech/static/qr_codes/request_291.png deleted file mode 100644 index b73a652..0000000 Binary files a/smartsoltech/static/qr_codes/request_291.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_292.png b/smartsoltech/static/qr_codes/request_292.png deleted file mode 100644 index 7607264..0000000 Binary files a/smartsoltech/static/qr_codes/request_292.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_293.png b/smartsoltech/static/qr_codes/request_293.png deleted file mode 100644 index 7b523be..0000000 Binary files a/smartsoltech/static/qr_codes/request_293.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_294.png b/smartsoltech/static/qr_codes/request_294.png deleted file mode 100644 index 3f39fb1..0000000 Binary files a/smartsoltech/static/qr_codes/request_294.png and /dev/null differ diff --git a/smartsoltech/static/qr_codes/request_330.png b/smartsoltech/static/qr_codes/request_330.png new file mode 100644 index 0000000..0b5e24f Binary files /dev/null and b/smartsoltech/static/qr_codes/request_330.png differ diff --git a/smartsoltech/static/qr_codes/request_331.png b/smartsoltech/static/qr_codes/request_331.png new file mode 100644 index 0000000..b78d908 Binary files /dev/null and b/smartsoltech/static/qr_codes/request_331.png differ diff --git a/smartsoltech/static/qr_codes/request_332.png b/smartsoltech/static/qr_codes/request_332.png new file mode 100644 index 0000000..67b4b11 Binary files /dev/null and b/smartsoltech/static/qr_codes/request_332.png differ diff --git a/smartsoltech/static/qr_codes/request_333.png b/smartsoltech/static/qr_codes/request_333.png new file mode 100644 index 0000000..c6bc383 Binary files /dev/null and b/smartsoltech/static/qr_codes/request_333.png differ diff --git a/smartsoltech/web/admin.py b/smartsoltech/web/admin.py index 406d641..29b0498 100644 --- a/smartsoltech/web/admin.py +++ b/smartsoltech/web/admin.py @@ -43,6 +43,6 @@ class CategoryAdmin(admin.ModelAdmin): @admin.register(ServiceRequest) class ServiceRequestAdmin(admin.ModelAdmin): - list_display = ('service','token', 'chat_id','client_name', 'client_email', 'client_phone', 'created_at') - search_fields = ('service','token','client_name', 'client_email', 'client_phone') - list_filter = ('service','token','client_name', 'client_phone') \ No newline at end of file + list_display = ('service','token', 'client', 'created_at') + search_fields = ('service','token', 'client') + list_filter = ('service','token','client') \ No newline at end of file diff --git a/smartsoltech/web/migrations/0006_order_service_request.py b/smartsoltech/web/migrations/0006_order_service_request.py new file mode 100644 index 0000000..6ef8e68 --- /dev/null +++ b/smartsoltech/web/migrations/0006_order_service_request.py @@ -0,0 +1,20 @@ +# Generated by Django 5.1.1 on 2024-10-14 11:10 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0005_alter_blogpost_options_alter_category_options_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='service_request', + field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='related_order', to='web.servicerequest'), + preserve_default=False, + ), + ] diff --git a/smartsoltech/web/migrations/0007_remove_servicerequest_client_email_and_more.py b/smartsoltech/web/migrations/0007_remove_servicerequest_client_email_and_more.py new file mode 100644 index 0000000..06915a0 --- /dev/null +++ b/smartsoltech/web/migrations/0007_remove_servicerequest_client_email_and_more.py @@ -0,0 +1,32 @@ +# Generated by Django 5.1.1 on 2024-10-14 11:46 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0006_order_service_request'), + ] + + operations = [ + migrations.RemoveField( + model_name='servicerequest', + name='client_email', + ), + migrations.RemoveField( + model_name='servicerequest', + name='client_name', + ), + migrations.RemoveField( + model_name='servicerequest', + name='client_phone', + ), + migrations.AddField( + model_name='servicerequest', + name='client', + field=models.ForeignKey(default=12, on_delete=django.db.models.deletion.CASCADE, related_name='related_service_requests', to='web.client'), + preserve_default=False, + ), + ] diff --git a/smartsoltech/web/migrations/0008_alter_servicerequest_client.py b/smartsoltech/web/migrations/0008_alter_servicerequest_client.py new file mode 100644 index 0000000..82e07db --- /dev/null +++ b/smartsoltech/web/migrations/0008_alter_servicerequest_client.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.1 on 2024-10-14 11:48 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0007_remove_servicerequest_client_email_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='servicerequest', + name='client', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='related_service_requests', to='web.client'), + ), + ] diff --git a/smartsoltech/web/models.py b/smartsoltech/web/models.py index 7d03fef..061fccd 100644 --- a/smartsoltech/web/models.py +++ b/smartsoltech/web/models.py @@ -70,9 +70,25 @@ class BlogPost(models.Model): def __str__(self): return self.title +class ServiceRequest(models.Model): + service = models.ForeignKey(Service, on_delete=models.CASCADE) + client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='related_service_requests', null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + token = models.UUIDField(default=uuid.uuid4, unique=True) # Генерация уникального токена + chat_id = models.CharField(max_length=100, blank=True, null=True) # Telegram chat ID + + class Meta: + verbose_name = 'Заявка на услугу' + verbose_name_plural = 'Заявки на услуги' + ordering = ['-created_at'] + + def __str__(self): + return f"Request for {self.service.name} by {self.client.first_name}" + class Order(models.Model): - service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name='related_orders') + service_request = models.OneToOneField(ServiceRequest, on_delete=models.CASCADE, related_name='related_order') client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='related_orders') + service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name='related_orders') message = models.TextField(blank=True, null=True) order_date = models.DateTimeField(auto_now_add=True) status = models.CharField( @@ -136,19 +152,3 @@ class Review(models.Model): def __str__(self): return f"Review by {self.client.first_name} {self.client.last_name} for {self.service.name}" -class ServiceRequest(models.Model): - service = models.ForeignKey(Service, on_delete=models.CASCADE) - client_name = models.CharField(max_length=100) - client_email = models.EmailField() - client_phone = models.CharField(max_length=20) - created_at = models.DateTimeField(auto_now_add=True) - token = models.UUIDField(default=uuid.uuid4, unique=True) # Генерация уникального токена - chat_id = models.CharField(max_length=100, blank=True, null=True) # Telegram chat ID - - class Meta: - verbose_name = 'Заявка на услугу' - verbose_name_plural = 'Заявки на услуги' - ordering = ['-created_at'] - - def __str__(self): - return f"Request for {self.service.name} by {self.client_name}" \ No newline at end of file diff --git a/smartsoltech/web/templates/web/modal_order_form.html b/smartsoltech/web/templates/web/modal_order_form.html index ef8083a..69fe28d 100644 --- a/smartsoltech/web/templates/web/modal_order_form.html +++ b/smartsoltech/web/templates/web/modal_order_form.html @@ -44,7 +44,7 @@ } #qrCodeImg { - display: block; + display: none; margin: 20px auto; width: 200px; height: 200px; @@ -58,17 +58,7 @@
+ + +