add files
parent
f928306d15
commit
f0382cc7ee
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
Binary file not shown.
Binary file not shown.
|
@ -55,20 +55,16 @@
|
||||||
<a class="nav-link dropdown-toggle text-white" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
<a class="nav-link dropdown-toggle text-white" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
Пользователь
|
Пользователь
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
|
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||||
|
<li>
|
||||||
<li>
|
<!-- Добавляем id для динамического изменения стиля отображения -->
|
||||||
|
<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:profile' %}">Личный кабинет</a>
|
<a id="logoutLink" class="dropdown-item text-white" href="{% url 'main:admin_logout_user' %}" style="display: none;">Выйти</a>
|
||||||
<a class="dropdown-item text-white" href="{% url 'main:admin_logout_user' %}">Выйти</a>
|
<a id="loginLink" class="dropdown-item text-white" href="{% url 'keycloak_login' %}">Войти</a>
|
||||||
|
</li>
|
||||||
<a class="dropdown-item text-white" href="{% url 'keycloak_login' %}">Войти</a>
|
|
||||||
|
|
||||||
</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>
|
||||||
|
|
|
@ -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>
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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})
|
||||||
|
|
Binary file not shown.
|
@ -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})
|
||||||
|
|
Loading…
Reference in New Issue