Skip to content

Commit 417497a

Browse files
authored
Створення шаблону користувача: (#24)
Створено шаблон профілю користувача, який відображає ім'я, прізвище, email, фото користувача та кількість перемог у грі. Авторизація через зображення: Реалізовано авторизацію користувача по зображенню через використання бібліотеки face_recognition. Після авторизації користувач автоматично перенаправляється до гри. Модель UserProfile: Створено модель UserProfile, яка зберігає кількість перемог користувача в грі та пов'язана з основною моделлю користувача (User) через OneToOneField. Зв'язок профілю користувача з Django адмінкою: Додано модель UserProfile до Django Admin для зручного управління профілями користувачів. Логіка для гри (play_game): Додано перевірку на авторизацію користувача під час гри. Якщо користувач не авторизований, перемога не зараховується. Якщо користувач авторизований і виграє гру, кількість його перемог зберігається в UserProfile. Відображення профілю користувача: У шаблоні профілю відображаються дані користувача: ім'я, прізвище, email, фото та кількість перемог у грі. Оновлення логіки авторизації та профілю: Додано автоматичне створення профілю користувача при першій грі, якщо профіль ще не існує. Шаблони: Оновлено шаблони для відображення результатів гри, профілю користувача та основної сторінки гри.
1 parent 77dbf9a commit 417497a

19 files changed

Lines changed: 563 additions & 102 deletions

File tree

accounts/urls.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from django.urls import path
22
from . import views
3+
from django.contrib.auth import views as auth_views
34

45
app_name = "accounts"
56

67
urlpatterns = [
78
path("login/", views.login, name="login"),
8-
path("logout/", views.logout, name="logout"),
9+
# path("logout/", views.logout, name="logout"),
910
path("signup/", views.signup, name="signup"),
11+
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
12+
path('user/<str:username>/', views.user_profile, name='user_profile'),
1013

1114
]

accounts/views.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,48 @@
1-
from django.shortcuts import render
1+
import base64
2+
from django.shortcuts import render, get_object_or_404
3+
from django.utils.translation import gettext as _
4+
from django.contrib.auth.models import User
5+
from faceid.models import UserPhoto, UserProfile
26

37
# Create your views here.
48

59

610
def login(request):
711
return render(
8-
request, "accounts/login.html", {"title": "Логін", "page": "login", "app": "accounts"}
12+
request, "accounts/login.html", {"title": _("Логін"), "page": "login", "app": "accounts"}
913
)
1014

1115
def logout(request):
1216
return render(
13-
request, "accounts/logout.html", {"title": "Логін", "page": "logout", "app": "accounts"}
17+
request, "accounts/logout.html", {"title": _("Вихід"), "page": "logout", "app": "accounts"}
1418
)
1519

1620
def signup(request):
1721
return render(
18-
request, "accounts/signup.html", {"title": "Логін", "page": "signup", "app": "accounts"}
19-
)
22+
request, "accounts/signup.html", {"title": _("Реєстрація"), "page": "signup", "app": "accounts"}
23+
)
24+
25+
26+
def user_profile(request, username):
27+
user = User.objects.get(username=username)
28+
29+
# Завантаження фото користувача з бази даних
30+
try:
31+
user_photo_obj = UserPhoto.objects.get(user=user)
32+
user_photo = base64.b64encode(user_photo_obj.photo).decode('utf-8')
33+
except UserPhoto.DoesNotExist:
34+
user_photo = None
35+
36+
# Завантаження кількості перемог або створення профілю, якщо він не існує
37+
user_profile_obj, created = UserProfile.objects.get_or_create(user=user)
38+
victories = user_profile_obj.victories
39+
40+
return render(request, 'accounts/user_profile.html', {
41+
'user': user,
42+
'user_photo': user_photo,
43+
'title': _("Профіль"),
44+
'victories': victories # кількість перемог передається у шаблон
45+
})
46+
47+
48+

faceid/models.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
from django.contrib.auth.models import User
12
from django.db import models
23

34
class UserPhoto(models.Model):
4-
name = models.CharField(max_length=255)
5+
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
56
photo = models.BinaryField() # Store image data as binary
67

78
def __str__(self):
8-
return self.name
9+
return self.user.username
10+
11+
12+
class UserProfile(models.Model):
13+
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
14+
victories = models.IntegerField(default=0)

faceid/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.urls import path
22
from . import views
3+
from django.contrib.auth import views as auth_views
34

45

56
app_name = "faceid"
@@ -8,5 +9,6 @@
89
path('', views.index, name='index'),
910
path("login/", views.login, name="login"),
1011
path("signup/", views.register, name="register"),
11-
path('logout/', views.user_logout, name='logout'),
12+
# path('logout/', views.user_logout, name='logout'),
13+
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
1214
]

faceid/views.py

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,96 @@
11
import io
2-
import datetime
32
import face_recognition
43
from django.shortcuts import render, redirect
54
from django.http import JsonResponse
6-
from django.core.files.base import ContentFile
75
from .models import UserPhoto
86
from django.views.decorators.csrf import csrf_exempt
9-
from django.contrib.auth import logout
7+
from django.contrib.auth import logout, login as auth_login
8+
from django.contrib.auth.models import User
109

10+
from django.contrib.sessions.models import Session
11+
12+
# Видалено дублювання імпорту 'UserPhoto' і 'auth_login'
1113

1214

1315
def index(request):
14-
return render(request, 'accounts/signup.html')
16+
return render(request, "accounts/signup.html")
1517

1618

1719
@csrf_exempt
1820
def register(request):
19-
if request.method == 'POST':
20-
name = request.POST.get('name')
21-
photo = request.FILES.get('photo')
21+
if request.method == "POST":
22+
name = request.POST.get("name")
23+
photo = request.FILES.get("photo")
2224

2325
if name and photo:
24-
photo_content = photo.read()
26+
# Створюємо нового користувача в Django
27+
user = User.objects.create_user(
28+
username=name, password="temporary_password"
29+
)
2530

26-
user_photo = UserPhoto(name=name, photo=photo_content)
31+
# Зберігаємо фото користувача
32+
photo_content = photo.read()
33+
user_photo = UserPhoto(user=user, photo=photo_content)
2734
user_photo.save()
2835

29-
return JsonResponse({'success': True, 'name': name})
36+
# Автоматичний вхід користувача після реєстрації
37+
auth_login(request, user)
3038

31-
return JsonResponse({'success': False})
39+
return JsonResponse({"success": True, "name": name})
40+
41+
return JsonResponse({"success": False})
3242

3343

3444
@csrf_exempt
3545
def login(request):
36-
if request.method == 'POST':
37-
photo = request.FILES.get('photo')
46+
if request.method == "POST":
47+
photo = request.FILES.get("photo")
3848

3949
if photo:
4050
login_image_content = photo.read()
41-
login_image = face_recognition.load_image_file(io.BytesIO(login_image_content))
51+
login_image = face_recognition.load_image_file(
52+
io.BytesIO(login_image_content)
53+
)
4254
login_face_encodings = face_recognition.face_encodings(login_image)
4355

4456
if not login_face_encodings:
45-
return JsonResponse({'success': False})
57+
return JsonResponse({"success": False})
4658

4759
users = UserPhoto.objects.all()
48-
for user in users:
49-
registered_image_content = user.photo
60+
for user_photo in users:
61+
registered_image_content = user_photo.photo
5062

5163
try:
52-
registered_image = face_recognition.load_image_file(io.BytesIO(registered_image_content))
53-
registered_face_encodings = face_recognition.face_encodings(registered_image)
54-
55-
if len(registered_face_encodings) > 0 and \
56-
face_recognition.compare_faces(registered_face_encodings, login_face_encodings[0])[0]:
57-
return JsonResponse({'success': True, 'name': user.name})
64+
registered_image = face_recognition.load_image_file(
65+
io.BytesIO(registered_image_content)
66+
)
67+
registered_face_encodings = face_recognition.face_encodings(
68+
registered_image
69+
)
70+
71+
if (
72+
len(registered_face_encodings) > 0
73+
and face_recognition.compare_faces(
74+
registered_face_encodings, login_face_encodings[0]
75+
)[0]
76+
):
77+
# Якщо обличчя співпадає, автоматично виконуємо вхід
78+
user = user_photo.user
79+
auth_login(request, user)
80+
return JsonResponse({"success": True, "name": user.username})
5881
except Exception as e:
5982
print(f"Error processing image: {e}")
6083
continue
6184

62-
return JsonResponse({'success': False})
85+
return JsonResponse({"success": False})
6386

6487

6588
def success(request):
66-
user_name = request.GET.get('user_name')
67-
return render(request, 'accounts/login.html', {'user_name': user_name})
89+
user_name = request.GET.get("user_name")
90+
return redirect("game2:play_game")
91+
6892

6993
def user_logout(request):
7094
logout(request)
95+
Session.objects.filter(session_key=request.session.session_key).delete()
7196
return redirect('home:index')

game2/views.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from django.utils.translation import gettext as _
22
import os
3+
from django.contrib.auth.models import User
4+
from faceid.models import UserProfile
35

46
# Вимкнення GPU
57
os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0"
@@ -46,8 +48,14 @@ def play_game(request):
4648

4749
# Перевірка, чи хтось вже набрав 7 балів
4850
if request.session["user_score"] >= 7 or request.session["model_score"] >= 7:
49-
# Визначаємо переможця гри
5051
winner = _("Користувач") if request.session["user_score"] >= 7 else _("Модель cifar10.keras")
52+
53+
# Якщо користувач виграв і він авторизований, оновлюємо кількість перемог у UserProfile
54+
if request.session["user_score"] >= 7 and request.user.is_authenticated:
55+
user_profile, created = UserProfile.objects.get_or_create(user=request.user)
56+
user_profile.victories += 1
57+
user_profile.save()
58+
5159
return render(request, "game2/game_over.html", {"winner": winner, "title": _("Гра завершена")})
5260

5361
# Вибір випадкового зображення для гри, якщо ще не було вибрано
@@ -56,9 +64,7 @@ def play_game(request):
5664
if not images.exists():
5765
return render(request, "game2/no_images.html") # Якщо зображень немає
5866
random_image = random.choice(images)
59-
request.session["current_image_id"] = (
60-
random_image.id
61-
) # Зберігаємо ID зображення у сесії
67+
request.session["current_image_id"] = random_image.id # Зберігаємо ID зображення у сесії
6268
else:
6369
random_image = ImageForGame.objects.get(id=request.session["current_image_id"])
6470

locale/en/LC_MESSAGES/django.mo

384 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)