add files

main
Lowlights 2024-03-20 16:19:34 +06:00
parent f928306d15
commit f0382cc7ee
11 changed files with 86854 additions and 39 deletions

Binary file not shown.

86798
debug.log

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

@ -56,19 +56,15 @@
Пользователь Пользователь
</a> </a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li> <li>
<!-- Добавляем id для динамического изменения стиля отображения -->
<a class="dropdown-item text-white" href="{% url 'main:profile' %}">Личный кабинет</a> <a id="profileLink" class="dropdown-item text-white" href="{% url 'main:profile' %}" style="display: none;">Личный кабинет</a>
<a class="dropdown-item text-white" href="{% url 'main:admin_logout_user' %}">Выйти</a> <a id="logoutLink" class="dropdown-item text-white" href="{% url 'main:admin_logout_user' %}" style="display: none;">Выйти</a>
<a id="loginLink" class="dropdown-item text-white" href="{% url 'keycloak_login' %}">Войти</a>
<a class="dropdown-item text-white" href="{% url 'keycloak_login' %}">Войти</a>
</li> </li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -117,6 +113,25 @@
<script src="{% static "/deps/js/jquery-events.js"%}"></script> <script src="{% static "/deps/js/jquery-events.js"%}"></script>
<script src="{% static "/deps/js/jquery-ajax.js"%}"></script> <script src="{% static "/deps/js/jquery-ajax.js"%}"></script>
<script src="{% static "/deps/js/bootstrap/bootstrap.bundle.min.js"%}"></script> <script src="{% static "/deps/js/bootstrap/bootstrap.bundle.min.js"%}"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
fetch("{%url 'main:check_user_authenticated'%}")
.then(response => response.json())
.then(data => {
if (data.isAuthenticated) {
document.getElementById('loginLink').style.display = 'none';
document.getElementById('profileLink').style.display = 'block';
document.getElementById('logoutLink').style.display = 'block';
} else {
document.getElementById('loginLink').style.display = 'block';
document.getElementById('profileLink').style.display = 'none';
document.getElementById('logoutLink').style.display = 'none';
}
})
.catch(error => console.error('Ошибка:', error));
});
</script>
</body> </body>
</html> </html>

View File

@ -1,11 +0,0 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>LOGOUT</h1>
</body>
</html>

View File

@ -7,9 +7,9 @@ urlpatterns = [
path('admin_logout_user/',views.admin_logout_user,name = 'admin_logout_user'), path('admin_logout_user/',views.admin_logout_user,name = 'admin_logout_user'),
path('callback/', views.callback, name='callback'), path('callback/', views.callback, name='callback'),
path('profile/',views.profile,name='profile'), path('profile/',views.profile,name='profile'),
path('check-user-authenticated/', views.check_user_authenticated, name='check_user_authenticated'),
path('about/', views.about, name='about'), path('about/', views.about, name='about'),
path('', views.callback, name='product_list'),
path('products/', views.callback, name='product_list'), path('products/', views.callback, name='product_list'),
path('<slug:category_slug>/', views.callback, path('<slug:category_slug>/', views.callback,
name='product_list_by_category'), name='product_list_by_category'),

View File

@ -8,10 +8,7 @@ from cart.forms import CartAddProductForm
from jose import jwt from jose import jwt
from django.contrib import messages from django.contrib import messages
YOUR_REDIRECT_URI = 'http://127.0.0.1:8000/callback/'
def home(request):
# Ваш код для отображения главной страницы
return render(request, 'main/base.html')
@ -79,7 +76,7 @@ def callback(request,category_slug=None):
authorization_code = request.GET.get('code') authorization_code = request.GET.get('code')
if authorization_code: if authorization_code:
try: try:
access_token = exchange_code_for_token(authorization_code, YOUR_REDIRECT_URI) access_token = exchange_code_for_token(authorization_code, settings.KEYCLOAK_CONFIG['CALLBACK_URL'])
user_info = decode_access_token(access_token) user_info = decode_access_token(access_token)
request.session['user_info'] = user_info request.session['user_info'] = user_info
@ -172,7 +169,7 @@ def get_user_id_from_session(request):
return None return None
def admin_logout_user(request): def admin_logout_user(request,category_slug = None):
user_id = get_user_id_from_session(request) user_id = get_user_id_from_session(request)
@ -186,7 +183,8 @@ def admin_logout_user(request):
if sessions is None or not sessions: if sessions is None or not sessions:
logger.error("Can't find user sessions.") logger.error("Can't find user sessions.")
messages.error(request, "No active sessions found for user.") messages.error(request, "No active sessions found for user.")
return render(request,'main/logout.html') redirect_uri = settings.KEYCLOAK_CONFIG['CALLBACK_URL']
return redirect(redirect_uri)
all_sessions_logged_out = True all_sessions_logged_out = True
for session in sessions: for session in sessions:
@ -200,5 +198,14 @@ def admin_logout_user(request):
else: else:
messages.warning(request, "Partial logout. Some sessions may still be active.") messages.warning(request, "Partial logout. Some sessions may still be active.")
request.session.flush() # Clear Django session request.session.flush()
return render(request,'main/logout.html') redirect_uri = settings.KEYCLOAK_CONFIG['CALLBACK_URL']
return redirect(redirect_uri)
from django.http import JsonResponse
def check_user_authenticated(request):
user_id = get_user_id_from_session(request)
is_authenticated = user_id is not None
return JsonResponse({'isAuthenticated': is_authenticated})

View File

@ -2,30 +2,36 @@ from django.shortcuts import render, redirect, get_object_or_404
from .models import OrderItem, Order from .models import OrderItem, Order
from .forms import OrderCreateForm from .forms import OrderCreateForm
from cart.cart import Cart from cart.cart import Cart
from django.conf import settings from main.views import get_user_id_from_session
from decimal import Decimal from users.views import keycloak_login
from .utils import send_invoice_via_email from .utils import send_invoice_via_email
def order_create(request): def order_create(request):
# Проверяем, авторизован ли пользователь
user_id = get_user_id_from_session(request)
if not user_id:
# Если пользователь не авторизован, перенаправляем на авторизацию через Keycloak
return keycloak_login(request)
cart = Cart(request) cart = Cart(request)
if request.method == 'POST': if request.method == 'POST':
form = OrderCreateForm(request.POST) form = OrderCreateForm(request.POST)
if form.is_valid(): if form.is_valid():
order = form.save(commit=False) # добавил commit=False order = form.save(commit=False)
order.user_id = user_id
order.save() order.save()
for item in cart: for item in cart:
OrderItem.objects.create(order=order, product=item['product'], price=item['price'], quantity=item['quantity']) OrderItem.objects.create(order=order, product=item['product'], price=item['price'], quantity=item['quantity'])
cart.clear() cart.clear()
# Генерация и отправка PDF счета-фактуры # Генерация и отправка PDF счета-фактуры
send_invoice_via_email(order.email, order) # Исправлено на order.email send_invoice_via_email(order.email, order)
return redirect('orders:order_created', order_id=order.id) return redirect('orders:order_created', order_id=order.id)
else: else:
form = OrderCreateForm() form = OrderCreateForm()
return render(request, 'orders/order/create.html', {'cart': cart, 'form': form}) return render(request, 'orders/order/create.html', {'cart': cart, 'form': form})
def order_created(request, order_id): def order_created(request, order_id):
order = get_object_or_404(Order, id=order_id) order = get_object_or_404(Order, id=order_id)
return render(request, 'orders/order/created.html', {'order': order}) return render(request, 'orders/order/created.html', {'order': order})