Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
92907bd
***
RombosK Apr 11, 2023
675de17
Merge pull request #43 from AlexPL2201/user_profile
RombosK Apr 11, 2023
b3b7c90
finished profile
RombosK Apr 12, 2023
39e3833
Merge pull request #44 from AlexPL2201/user_profile
RombosK Apr 12, 2023
6024d87
update grade_quest and add front
Istrione Apr 15, 2023
85c887e
Merge pull request #45 from AlexPL2201/queue
Istrione Apr 15, 2023
cc497e0
Games lobby front
Apr 16, 2023
d6401f0
Merge pull request #46 from AlexPL2201/games
Barrakuda8 Apr 16, 2023
3e8acbb
Fix friend list
Apr 16, 2023
e2aa4e6
Merge pull request #47 from AlexPL2201/main
Barrakuda8 Apr 16, 2023
201ae2a
finished profile*
RombosK Apr 16, 2023
322e8a1
Front user profile fix
Apr 17, 2023
e9a7457
Merge branch 'main' into games
Barrakuda8 Apr 17, 2023
38aac88
Merge pull request #48 from AlexPL2201/games
Barrakuda8 Apr 17, 2023
47c5837
Games game and results front
Apr 17, 2023
9625a5a
Merge pull request #49 from AlexPL2201/main
Barrakuda8 Apr 17, 2023
42ea9af
Merge remote-tracking branch 'origin/games' into games
Apr 17, 2023
aa65b09
Chat front
Apr 17, 2023
35c562d
Merge pull request #50 from AlexPL2201/games
Barrakuda8 Apr 17, 2023
571d387
FriendChat commit
warload22 Apr 17, 2023
7da9ed2
Merge remote-tracking branch 'origin/main'
warload22 Apr 17, 2023
93ee5bd
finished profile*
RombosK Apr 17, 2023
2ba0375
FriendChat commit2
warload22 Apr 17, 2023
190fccd
Merge remote-tracking branch 'origin/main'
warload22 Apr 17, 2023
3cd849f
22:40/17.04.23
RombosK Apr 17, 2023
a917f54
Merge remote-tracking branch 'origin/main'
RombosK Apr 17, 2023
a710350
18:46/18.04.23
RombosK Apr 18, 2023
ade5e20
22:24/18.04.23
RombosK Apr 18, 2023
419c6c3
edited front profile change
Ilya-baker Apr 19, 2023
a0f441c
edited front profile change
Ilya-baker Apr 19, 2023
691aa92
Merge pull request #54 from AlexPL2201/front_2
Ilya-baker Apr 19, 2023
22889d3
Chat commit
warload22 Apr 20, 2023
0ad7b66
Merge branch 'main' into chat-2
Barrakuda8 Apr 23, 2023
e09f2ce
Merge pull request #56 from AlexPL2201/chat-2
Barrakuda8 Apr 23, 2023
af6d39c
Chat front and answer is validated commit
Apr 23, 2023
485880a
update grade and message
Istrione Apr 23, 2023
19d527c
Merge pull request #57 from AlexPL2201/queue
Istrione Apr 23, 2023
cd2e171
fix
Istrione Apr 23, 2023
d7dfc59
Merge pull request #58 from AlexPL2201/queue
Istrione Apr 23, 2023
c518cca
Final commit
Apr 24, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dnt/authapp/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class AuthUserRegisterForm(UserCreationForm):

class Meta:
model = AuthUser
fields = ('username', 'birthdate', 'email', 'avatar')
fields = ('username', 'nickname', 'birthdate', 'email', 'avatar')

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand All @@ -32,7 +32,7 @@ def __init__(self, *args, **kwargs):
class AuthUserEditForm(UserChangeForm):
class Meta:
model = AuthUser
fields = ('username', 'birthdate', 'email', 'avatar', 'password')
fields = ('username', 'nickname', 'birthdate', 'email', 'avatar', 'password')

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand Down
18 changes: 18 additions & 0 deletions dnt/authapp/migrations/0009_alter_authuser_avatar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.1.7 on 2023-04-10 21:38

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('authapp', '0008_authuser_current_lp_authuser_division_and_more'),
]

operations = [
migrations.AlterField(
model_name='authuser',
name='avatar',
field=models.ImageField(blank=True, null=True, upload_to='users', verbose_name='Аватар'),
),
]
7 changes: 7 additions & 0 deletions dnt/authapp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ class AuthUser(AbstractUser):
current_game = models.ForeignKey(Game, on_delete=models.SET_NULL, null=True, blank=True)
avatar = models.ImageField(upload_to="users", verbose_name=_("Аватар"), **NULLABLE)

@property
def get_friends(self):
return AuthUser.objects.filter(pk__in=self.friends.values_list('pk'))


class QuestionRatedByUser(models.Model):
"""
Expand All @@ -62,3 +66,6 @@ class Remark(models.Model):

class Meta:
unique_together = ('question', 'author',)

def __str__(self):
return f'#{self.text} {self.rating}'
20 changes: 12 additions & 8 deletions dnt/authapp/templates/authapp/edit.html
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
{% extends 'authapp/base.html' %}
{% load static %}
{% extends 'main/base.html' %}

{% block content %}
<form action="{% url 'auth:edit' %}" class="auth_form" method="post" enctype="multipart/form-data">
{% block title %}
Редактировать профиль
{% endblock %}

{% block body %}
<form action="{% url 'auth:edit' %}" class="form_settings" method="post" enctype="multipart/form-data">
{% csrf_token %}
<h1 class="auth_h1">Edit</h1>
<h1 class="auth_h1">Редактировать профиль</h1>
{% for field in edit_form %}
<div class="field_wrapper">
{% if field.label != "Password" %}
{{ field.label_tag }}{{ field }}{{ field.errors }}
<p><span>{{ field.label_tag }}</span>{{ field }}</p>{{ field.errors }}
{% endif %}
</div>
{% endfor %}
Expand All @@ -17,8 +20,9 @@ <h1 class="auth_h1">Edit</h1>
{{ field.label_tag }}{{ field }}{{ field.errors }}
</div>
{% endfor %}
<input type="submit" class="auth_button" value="Save">
<div class="container-buttons">
<input class="submit" type="submit" value="Сохранить">
</div>
</form>
<a href="{% url 'user_profile:profile' pk=user.pk %}" class="auth_link">Back</a>
{% endblock %}

2 changes: 1 addition & 1 deletion dnt/authapp/templates/authapp/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<input type="hidden" name="next" value="{{ next }}">
{% endif %}
{% for field in login_form %}
<p><span>{{ field.label_tag }}</span>{{ field }}</p>{{ field.errors }}
<p><span>{{ field.label_tag }}</span>{{ field }}</p>
{% endfor %}
<div class="container-buttons">
<a href="{% url 'authapp:register' %}" class="submit">Регистрация</a>
Expand Down
4 changes: 3 additions & 1 deletion dnt/authapp/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.shortcuts import render, get_object_or_404
from django.shortcuts import render
from django.contrib import auth
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from authapp.forms import AuthUserRegisterForm, AuthUserLoginForm, AuthUserEditForm


Expand Down Expand Up @@ -52,6 +53,7 @@ def register(request):
return render(request, 'authapp/register.html', context)


@login_required
def edit(request):
if request.method == 'POST':
edit_form = AuthUserEditForm(request.POST, request.FILES, instance=request.user)
Expand Down
Empty file added dnt/chat/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions dnt/chat/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions dnt/chat/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class ChatConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'chat'
48 changes: 48 additions & 0 deletions dnt/chat/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Generated by Django 4.1.7 on 2023-04-10 17:41

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('games', '0006_alter_game_type_alter_lobby_type_alter_queue_type'),
]

operations = [
migrations.CreateModel(
name='LobbyMessage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.CharField(max_length=128)),
('created_at', models.DateTimeField(auto_now=True)),
('lobby', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='games.lobby')),
('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='GameMessage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.CharField(max_length=128)),
('created_at', models.DateTimeField(auto_now=True)),
('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='games.game')),
('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='FriendMessage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.CharField(max_length=128)),
('created_at', models.DateTimeField(auto_now=True)),
('receiver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='receiver', to=settings.AUTH_USER_MODEL)),
('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sender', to=settings.AUTH_USER_MODEL)),
],
),
]
Empty file added dnt/chat/migrations/__init__.py
Empty file.
25 changes: 25 additions & 0 deletions dnt/chat/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from django.db import models
from authapp.models import AuthUser
from games.models import Game, Lobby

class FriendMessage(models.Model):

sender = models.ForeignKey(AuthUser, on_delete=models.CASCADE, related_name='sender')
receiver = models.ForeignKey(AuthUser, on_delete=models.CASCADE, related_name='receiver')
text = models.CharField(max_length=128)
created_at = models.DateTimeField(auto_now=True)

class LobbyMessage(models.Model):

sender = models.ForeignKey(AuthUser, on_delete=models.CASCADE)
lobby = models.ForeignKey(Lobby, on_delete=models.CASCADE)
text = models.CharField(max_length=128)
created_at = models.DateTimeField(auto_now=True)

class GameMessage(models.Model):

sender = models.ForeignKey(AuthUser, on_delete=models.CASCADE)
game = models.ForeignKey(Game, on_delete=models.CASCADE)
text = models.CharField(max_length=128)
created_at = models.DateTimeField(auto_now=True)

3 changes: 3 additions & 0 deletions dnt/chat/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
9 changes: 9 additions & 0 deletions dnt/chat/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.urls import path
import chat.views as chat

app_name = 'chat'

urlpatterns = [
path('load_messages/', chat.load_messages, name='load_messages'),
path('create_messages/', chat.create_messages, name='create_messages'),
]
62 changes: 62 additions & 0 deletions dnt/chat/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from django.shortcuts import render
from django.core import serializers
from django.http import JsonResponse
from chat.models import GameMessage, FriendMessage, LobbyMessage
from django.db.models import Q
from authapp.models import AuthUser
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
import json
from games.models import Lobby, Game


def load_messages(request):
type_ = request.GET.get('type')
if type_ == 'friend':
friend_pk = int(request.GET.get('friend_pk'))
friend = AuthUser.objects.get(pk=friend_pk)
messages = FriendMessage.objects.filter(Q(sender__in=[request.user, friend])
& Q(receiver__in=[request.user, friend])).order_by('-created_at')
return JsonResponse({'messages': list(messages.values()), 'friend_nickname': friend.nickname, 'user_nickname': request.user.nickname}, safe=False)
elif type_ == 'lobby':
lobby = request.user.current_lobby
messages = LobbyMessage.objects.filter(lobby=lobby).order_by('-created_at')
players = lobby.players.all()
return JsonResponse({'messages': list(messages.values()), 'players': {player.pk: player.nickname for player in players}}, safe=False)
elif type_ == 'game':
game = request.user.current_game
messages = GameMessage.objects.filter(game=game).order_by('-created_at')
players = AuthUser.objects.filter(pk__in=game.players)
return JsonResponse(
{'messages': list(messages.values()), 'players': {player.pk: player.nickname for player in players}},
safe=False)


def create_messages(request):
type_ = request.GET.get('type')
if type_ == 'friend':
button_message = request.GET.get('message')
receiver_pk = int(request.GET.get('receiver'))
sender_pk = int(request.GET.get('sender'))
msg = FriendMessage.objects.create(text=button_message, receiver_id=receiver_pk, sender_id=sender_pk)
data = {'action': 'chat_message', 'message': serializers.serialize('json', [msg]), 'sender': request.user.nickname, 'type': 'friend'}
layer = get_channel_layer()
for pk in [sender_pk, receiver_pk]:
async_to_sync(layer.group_send)(f'user_{pk}', {'type': 'send_message', 'message': data})
elif type_ == 'lobby':
button_message = request.GET.get('message')
lobby = request.user.current_lobby
msg = LobbyMessage.objects.create(text=button_message, lobby_id=lobby.pk, sender_id=request.user.pk)
data = {'action': 'chat_message', 'message': serializers.serialize('json', [msg]), 'sender': request.user.nickname, 'type': 'lobby'}
layer = get_channel_layer()
for player in lobby.players.all():
async_to_sync(layer.group_send)(f'user_{player.pk}', {'type': 'send_message', 'message': data})
elif type_ == 'game':
button_message = request.GET.get('message')
game = request.user.current_game.pk
msg = GameMessage.objects.create(text=button_message, game_id=game, sender_id=request.user.pk)
data = {'action': 'chat_message', 'message': serializers.serialize('json', [msg]), 'sender': request.user.nickname}
layer = get_channel_layer()
async_to_sync(layer.group_send)(f'game_{request.user.current_game.pk}', {'type': 'send_message', 'message': data})

return JsonResponse({'ok': 'ok'})
4 changes: 2 additions & 2 deletions dnt/dnt/asgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
django_asgi_app = get_asgi_application()

from channels.auth import AuthMiddlewareStack
import games.routing
import games.routing#, chat.routing

application = ProtocolTypeRouter({
'http': django_asgi_app,
'websocket': AuthMiddlewareStack(
URLRouter(
games.routing.websocket_urlpatterns
games.routing.websocket_urlpatterns #+ chat.routing.websocket_urlpatterns
)
)
})
3 changes: 3 additions & 0 deletions dnt/dnt/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@

'channels',

'chat',
'custom_admin',
'authapp',
'games',
Expand Down Expand Up @@ -74,6 +75,7 @@
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.media'
],
},
},
Expand Down Expand Up @@ -147,6 +149,7 @@

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
DEFAULT_AVATAR_URL = '/users/'


# Default primary key field type
Expand Down
1 change: 1 addition & 0 deletions dnt/dnt/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
path('', main.index, name='home'), # todo
# path('index/', main.index, name="home"),
path('authapp/', include('authapp.urls', namespace='auth')),
path('chat/', include('chat.urls', namespace='chat')),
path('custom_admin/', include('custom_admin.urls', namespace='custom_admin')),
path('games/', include('games.urls', namespace='games')),
path('quest/', include('questions.urls', namespace='quest')),
Expand Down
15 changes: 11 additions & 4 deletions dnt/games/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@

TYPES = (
('normal', 'Обычная'),
('ranked', 'Ранговая'),
('theme', 'Тематическая'),
('friend', 'Дружеская')
('theme', 'Тематическая')
)


Expand Down Expand Up @@ -75,4 +73,13 @@ class Game(models.Model):

@property
def players(self):
return list(self.results.keys())
return list(self.results.keys())

@property
def display_type(self):
return eval(self.type)[1]

@property
def get_time(self):
return self.started.strftime("%Y-%m-%d/%H:%M")

3 changes: 2 additions & 1 deletion dnt/games/routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
websocket_urlpatterns = [
path('ws/user/<int:user_id>', consumers.GamesConsumer.as_asgi()),
path('ws/queue/<int:queue_id>', consumers.GamesConsumer.as_asgi()),
path('ws/game/<int:game_id>', consumers.GamesConsumer.as_asgi())
path('ws/game/<int:game_id>', consumers.GamesConsumer.as_asgi()),
#path('ws/chat/', consumers.ChatConsumers.as_asgi()
]
Loading