From 3f899d3fc694b37ca1a89cfaf287dceed7be2007 Mon Sep 17 00:00:00 2001 From: pilot <657434@03b.ru> Date: Mon, 10 Aug 2026 15:08:55 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D1=91=D0=BD:=20restoran=5Fmax=5Fbot/settings.py=20?= =?UTF-8?q?=E2=80=94=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8?= =?UTF-8?q?=20MEDIA=5FROOT=20=D0=B8=20MEDIA=5FURL=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD=D0=B0=D0=BC=D0=B8=D1=87=D0=B5=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2.=20?= =?UTF-8?q?=E2=9C=85=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=91=D0=BD:?= =?UTF-8?q?=20restoran=5Fmax=5Fbot/promo=5Fhandlers.py=20=E2=80=94=20?= =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20QR-=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=B2=20MEDIA=5FROOT=20=D0=B8=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BE=D0=BA=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=20MEDIA=5FURL.=20=E2=9C=85=20=D0=9E?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=91=D0=BD:=20restoran=5Fmax=5F?= =?UTF-8?q?bot/command=5Fhandlers.py=20=E2=80=94=20=D0=98=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BE=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20QR-=D0=BA=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=BE=D0=BD=D1=83=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20MEDIA=5FROOT=20=D0=B8=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BE=D0=BA=20=D1=87=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=20MEDIA=5FURL.=20=E2=9C=85=20=D0=9E=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D1=91=D0=BD:=20restoran=5Fmax=5Fbot/urls.py=20?= =?UTF-8?q?=E2=80=94=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=81=D0=BB=D1=83=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BC=D0=B5=D0=B4=D0=B8=D0=B0=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Django=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20DEBUG=3DTrue.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../restoran_max_bot/command_handlers.py | 10 +++++++--- restoran_max_bot/restoran_max_bot/promo_handlers.py | 12 +++++++++--- restoran_max_bot/restoran_max_bot/urls.py | 6 ++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/restoran_max_bot/restoran_max_bot/command_handlers.py b/restoran_max_bot/restoran_max_bot/command_handlers.py index 286c452..cd95a71 100644 --- a/restoran_max_bot/restoran_max_bot/command_handlers.py +++ b/restoran_max_bot/restoran_max_bot/command_handlers.py @@ -1,12 +1,13 @@ # command_handlers.py import json import qrcode +import os from max_bot.models import Client, Contact from restoran_max_bot.common import common_get_data, common_get_integration from restoran_max_bot.iiko_api import customer_info, customer_create, customer_wallet from restoran_max_bot.rkiper_api import rkiper_customer_info, rkiper_customer_create from restoran_max_bot.message_sender import send_text, send_image, send_menu, send_feedback_buttons, send_booking_people_buttons, send_link_button -from restoran_max_bot.settings import STATICFILES_DIRS, BASE_URL +from restoran_max_bot.settings import BASE_URL, MEDIA_ROOT, MEDIA_URL from restoran_max_bot.utils import is_json from restoran_max_bot.bot_started import check_registration from restoran_max_bot.promo_handlers import bot_promo @@ -108,8 +109,11 @@ def _handle_bonus(client: Client, chat_id: str, token: str, contact: Contact) -> """Обработка команды бонусов: генерация QR и запрос баланса.""" # Генерируем QR-код img = qrcode.make(contact.phone) - img.save(f"{STATICFILES_DIRS[0]}/client_qr/{contact.phone}.png") - qr_url = f"https://maxbot.telefon-ip.ru/static/client_qr/{contact.phone}.png" + file_name = f"{contact.phone}.png" + client_qr_dir = os.path.join(MEDIA_ROOT, 'client_qr') + os.makedirs(client_qr_dir, exist_ok=True) + img.save(os.path.join(client_qr_dir, file_name)) + qr_url = f"{BASE_URL}{MEDIA_URL}client_qr/{file_name}" send_image(chat_id, token, qr_url, 'QR-код для начисления, списания бонусов.') # Получаем баланс diff --git a/restoran_max_bot/restoran_max_bot/promo_handlers.py b/restoran_max_bot/restoran_max_bot/promo_handlers.py index 1a5cd79..16a801c 100644 --- a/restoran_max_bot/restoran_max_bot/promo_handlers.py +++ b/restoran_max_bot/restoran_max_bot/promo_handlers.py @@ -1,9 +1,10 @@ # promo_handlers.py import qrcode +import os from max_bot.models import Client, PromoCode from restoran_max_bot.common import common_get_data from restoran_max_bot.message_sender import send_text, send_image -from restoran_max_bot.settings import STATICFILES_DIRS, BASE_URL +from restoran_max_bot.settings import BASE_URL, MEDIA_ROOT, MEDIA_URL from restoran_max_bot.user_logger import log_user_action @@ -68,8 +69,13 @@ def bot_promo(client: Client, message: dict, settings_max: dict) -> bool: url_promo = f"{base_url}{promo}/{chat_id}/{client_id}" img = qrcode.make(url_promo) file_name = f"{promo}-{chat_id}-{client_id}.png" - img.save(f"{STATICFILES_DIRS[0]}/client_qr/{file_name}") - qr_url = f"{BASE_URL}/static/client_qr/{file_name}" + + # Сохраняем в медиа-папку + client_qr_dir = os.path.join(MEDIA_ROOT, 'client_qr') + os.makedirs(client_qr_dir, exist_ok=True) + img.save(os.path.join(client_qr_dir, file_name)) + + qr_url = f"{BASE_URL}{MEDIA_URL}client_qr/{file_name}" # Выводим ссылки в консоль для отладки print(f"🔍 PROMO DEBUG: статус-ссылка = {url_promo}") diff --git a/restoran_max_bot/restoran_max_bot/urls.py b/restoran_max_bot/restoran_max_bot/urls.py index f71d750..7ed6966 100644 --- a/restoran_max_bot/restoran_max_bot/urls.py +++ b/restoran_max_bot/restoran_max_bot/urls.py @@ -1,5 +1,7 @@ from django.contrib import admin from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static from max_bot.views import promo_status, promo_activate @@ -10,3 +12,7 @@ urlpatterns = [ path('promo/status///', promo_status), path('promo/activate///', promo_activate), ] + +# Обслуживание медиафайлов в режиме разработки +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)