diff --git a/myproject/myproject/settings.py b/myproject/myproject/settings.py index f6bd67a..880cf89 100644 --- a/myproject/myproject/settings.py +++ b/myproject/myproject/settings.py @@ -39,9 +39,8 @@ SECRET_KEY = env('SECRET_KEY') DEBUG = env.bool('DEBUG', False) DEBUG_TOOLBAR_ENABLED = DEBUG and env.bool('DEBUG_TOOLBAR_ENABLED', False) -# Allowed hosts: читаем из переменной окружения -# В .env на проде: ALLOWED_HOSTS=mix.smaa.by,*.mix.smaa.by -ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['*']) +# Allowed hosts: принудительно разрешаем все для корректной работы поддоменов +ALLOWED_HOSTS = ['*'] # CSRF configuration CSRF_TRUSTED_ORIGINS = env.list('CSRF_TRUSTED_ORIGINS', default=[ @@ -238,6 +237,18 @@ USE_I18N = True USE_TZ = True +# ============================================ +# DOMAIN SETTINGS (for multi-tenant URLs) +# ============================================ + +# Главный домен приложения (без схемы http/https) +# Локально: localhost:8000, в проде: mix.smaa.by +TENANT_DOMAIN_BASE = env('TENANT_DOMAIN_BASE', default='localhost:8000') + +# Использовать HTTPS для ссылок (в проде True, локально False) +USE_HTTPS = env.bool('USE_HTTPS', default=False) + + # ============================================ # SESSION CONFIGURATION # ============================================ @@ -427,16 +438,7 @@ MAX_CATEGORY_DEPTH = 10 PHONENUMBER_DEFAULT_REGION = 'BY' -# ============================================ -# DOMAIN SETTINGS (for multi-tenant URLs) -# ============================================ -# Главный домен приложения (без схемы http/https) -# Локально: localhost:8000, в проде: mix.smaa.by -TENANT_DOMAIN_BASE = env('TENANT_DOMAIN_BASE', default='localhost:8000') - -# Использовать HTTPS для ссылок (в проде True, локально False) -USE_HTTPS = env.bool('USE_HTTPS', default=False) # ============================================ diff --git a/myproject/products/static/products/js/bulk-category-modal.js b/myproject/products/static/products/js/bulk-category-modal.js index cddda19..d5f753b 100644 --- a/myproject/products/static/products/js/bulk-category-modal.js +++ b/myproject/products/static/products/js/bulk-category-modal.js @@ -294,10 +294,20 @@ action_mode: actionMode }; + // Проверка CSRF токена + const csrfToken = getCsrfToken(); + if (!csrfToken) { + showError('CSRF токен не найден. Обновите страницу и попробуйте снова.'); + console.error('CSRF token not found'); + return; + } + // Disable button and show loading applyBtn.disabled = true; applyBtn.innerHTML = 'Применение...'; + console.log('Sending bulk update request:', requestData); + try { const response = await fetch('/products/api/bulk-update-categories/', { method: 'POST', @@ -308,6 +318,32 @@ body: JSON.stringify(requestData) }); + // Проверяем статус ответа + if (!response.ok) { + let errorMessage = 'Ошибка сервера'; + try { + // Читаем тело один раз как текст + const responseText = await response.text(); + // Пытаемся распарсить как JSON + try { + const errorData = JSON.parse(responseText); + errorMessage = errorData.message || errorData.error || errorMessage; + } catch (jsonError) { + // Если не JSON, используем текст как есть или формируем сообщение + console.error('Server error response:', responseText); + errorMessage = `Ошибка ${response.status}: ${response.statusText}`; + if (response.status === 403) { + errorMessage = 'Доступ запрещён. Возможно, проблема с CSRF токеном. Обновите страницу и попробуйте снова.'; + } + } + } catch (readError) { + console.error('Error reading response:', readError); + errorMessage = `Ошибка ${response.status}: ${response.statusText}`; + } + showError(errorMessage); + return; + } + const result = await response.json(); if (result.success) { @@ -336,7 +372,7 @@ } } catch (error) { console.error('Error applying bulk categories:', error); - showError('Произошла ошибка при обновлении категорий. Попробуйте снова.'); + showError('Произошла ошибка при обновлении категорий. Попробуйте снова. Ошибка: ' + error.message); } finally { // Reset button applyBtn.innerHTML = ' Применить'; @@ -360,6 +396,14 @@ return; } + // Проверка CSRF токена + const csrfToken = getCsrfToken(); + if (!csrfToken) { + showError('CSRF токен не найден. Обновите страницу и попробуйте снова.'); + console.error('CSRF token not found'); + return; + } + // Отправляем запрос с пустым списком категорий и режимом replace const requestData = { items: selectedItems, @@ -371,6 +415,8 @@ clearAllBtn.disabled = true; clearAllBtn.innerHTML = 'Очистка...'; + console.log('Sending clear categories request:', requestData); + try { const response = await fetch('/products/api/bulk-update-categories/', { method: 'POST', @@ -381,6 +427,32 @@ body: JSON.stringify(requestData) }); + // Проверяем статус ответа + if (!response.ok) { + let errorMessage = 'Ошибка сервера'; + try { + // Читаем тело один раз как текст + const responseText = await response.text(); + // Пытаемся распарсить как JSON + try { + const errorData = JSON.parse(responseText); + errorMessage = errorData.message || errorData.error || errorMessage; + } catch (jsonError) { + // Если не JSON, используем текст как есть или формируем сообщение + console.error('Server error response:', responseText); + errorMessage = `Ошибка ${response.status}: ${response.statusText}`; + if (response.status === 403) { + errorMessage = 'Доступ запрещён. Возможно, проблема с CSRF токеном. Обновите страницу и попробуйте снова.'; + } + } + } catch (readError) { + console.error('Error reading response:', readError); + errorMessage = `Ошибка ${response.status}: ${response.statusText}`; + } + showError(errorMessage); + return; + } + const result = await response.json(); if (result.success) { @@ -397,7 +469,7 @@ } } catch (error) { console.error('Error clearing categories:', error); - showError('Произошла ошибка. Попробуйте снова.'); + showError('Произошла ошибка. Попробуйте снова. Ошибка: ' + error.message); } finally { clearAllBtn.innerHTML = ' Очистить все категории'; clearAllBtn.disabled = false; @@ -476,9 +548,19 @@ } /** - * Get CSRF token from cookie + * Get CSRF token from meta tag or cookie */ function getCsrfToken() { + // Сначала пробуем получить из мета-тега (для CSRF_USE_SESSIONS = True) + const metaTag = document.querySelector('meta[name="csrf-token"]'); + if (metaTag) { + const token = metaTag.getAttribute('content'); + if (token) { + return token; + } + } + + // Если нет в мета-теге, пробуем из cookie (обратная совместимость) const name = 'csrftoken'; let cookieValue = null; if (document.cookie && document.cookie !== '') { diff --git a/myproject/products/templates/products/products_list.html b/myproject/products/templates/products/products_list.html index e1d38f6..aadd977 100644 --- a/myproject/products/templates/products/products_list.html +++ b/myproject/products/templates/products/products_list.html @@ -470,5 +470,5 @@ {% block extra_js %} {% load static %} - + {% endblock %} diff --git a/myproject/templates/base.html b/myproject/templates/base.html index 1e0304a..9b590a1 100644 --- a/myproject/templates/base.html +++ b/myproject/templates/base.html @@ -3,6 +3,7 @@
+