From 5675f64268599ab79bc10260813eb155b39b57d5 Mon Sep 17 00:00:00 2001 From: starnakin Date: Mon, 13 May 2024 13:50:33 +0200 Subject: [PATCH] profile: add: game history --- frontend/static/js/api/Profile.js | 8 +-- frontend/static/js/views/GameHistoryView.js | 66 --------------------- frontend/static/js/views/ProfilePageView.js | 52 +++++++++++++++- games/GameHistoryView.py | 27 --------- games/GameHistoryViewSet.py | 28 +++++++++ games/urls.py | 4 +- 6 files changed, 85 insertions(+), 100 deletions(-) delete mode 100644 frontend/static/js/views/GameHistoryView.js delete mode 100644 games/GameHistoryView.py create mode 100644 games/GameHistoryViewSet.py diff --git a/frontend/static/js/api/Profile.js b/frontend/static/js/api/Profile.js index faeef20..68b8ea4 100644 --- a/frontend/static/js/api/Profile.js +++ b/frontend/static/js/api/Profile.js @@ -75,14 +75,14 @@ export class Profile extends AExchangeable } /** - * @returns {[Object]} + * @returns {Promise<[Object]>} */ async getGameHistory() { - let response = await this.client._get(`/api/games/history/${this.id}`); - let response_data = await response.json(); + const response = await this.client._get(`/api/games/history/${this.id}`); + const response_data = await response.json(); - let games = []; + const games = []; response_data.forEach(game_data => { games.push(game_data); diff --git a/frontend/static/js/views/GameHistoryView.js b/frontend/static/js/views/GameHistoryView.js deleted file mode 100644 index 60e7850..0000000 --- a/frontend/static/js/views/GameHistoryView.js +++ /dev/null @@ -1,66 +0,0 @@ -import { client, lang } from "../index.js"; -import AbstractAuthenticatedView from "./abstracts/AbstractAuthenticatedView.js"; - -export default class extends AbstractAuthenticatedView -{ - constructor(params) - { - super(params, 'homeWindowTitle'); - this.id = params.id; - } - - async postInit() - { - this.profile = await client.profiles.getProfileId(this.id); - - if (this.profile === null) - return 404; - - await this.fillHistory(); - } - - async fillHistory() - { - let games = await this.profile.getGameHistory(); - - let game_list = document.getElementById("game-list"); - - games.forEach(game => { - - let a = document.createElement("a"); - a.href = `/games/${game.id}/0`; - a.setAttribute("data-link", true); - - let game_item = document.createElement("div"); - game_item.className = "game-item"; - game_item.style.backgroundColor = "grey"; - if (game.started) - game_item.style.backgroundColor = "yellow"; - if (game.finished) - game_item.style.backgroundColor = this.profile.id === game.winner_id ? "green" : "red"; - - game.players.forEach(player => { - let player_score = document.createElement("a"); - - player_score.href = `/profiles/${player.username}`; - player_score.innerText = `${player.username}: ${player.score.length}`; - player_score.setAttribute("data-link", true); - - game_item.appendChild(player_score); - }); - - a.appendChild(game_item); - game_list.appendChild(a); - }); - } - - async getHtml() - { - return /* HTML */ ` - -

Game History

-
-
- `; - } -} diff --git a/frontend/static/js/views/ProfilePageView.js b/frontend/static/js/views/ProfilePageView.js index 7ebc850..d1270f1 100644 --- a/frontend/static/js/views/ProfilePageView.js +++ b/frontend/static/js/views/ProfilePageView.js @@ -16,6 +16,13 @@ export default class extends AbstractView { if (!this.profile) return 404; + const games = await this.profile.getGameHistory(); + + console.log(games) + + await this.fillHistory(games); + await this.fillStatistics(games); + if (this.profile.id === client.me.id) return; @@ -68,13 +75,51 @@ export default class extends AbstractView { statusIndicator.classList.add('bg-danger'); } + async fillStatistics(games) + { + + } + + async fillHistory(games) + { + let game_list = document.getElementById("game-list"); + + games.forEach(game => { + + let a = document.createElement("a"); + a.href = `/games/${game.id}/0`; + a.setAttribute("data-link", true); + + let game_item = document.createElement("div"); + game_item.className = "game-item"; + game_item.style.backgroundColor = "grey"; + if (game.started) + game_item.style.backgroundColor = "yellow"; + if (game.finished) + game_item.style.backgroundColor = this.profile.id === game.winner_id ? "green" : "red"; + + game.players.forEach(player => { + let player_score = document.createElement("a"); + + player_score.href = `/profiles/${player.username}`; + player_score.innerText = `${player.username}`; + player_score.setAttribute("data-link", true); + + game_item.appendChild(player_score); + }); + + a.appendChild(game_item); + game_list.appendChild(a); + }); + } + async getHtml() { this.profile = await client.profiles.getProfile(this.username); if (!this.profile) return ''; - return ` + return /* HTML */ `

${this.username}

@@ -88,6 +133,11 @@ export default class extends AbstractView {
+
+ +

Game History

+
+
`; } diff --git a/games/GameHistoryView.py b/games/GameHistoryView.py deleted file mode 100644 index b7a1a10..0000000 --- a/games/GameHistoryView.py +++ /dev/null @@ -1,27 +0,0 @@ -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework import permissions, status - -from django.http import HttpRequest - -from .models import GameMembersModel, GameModel -from .serializers import GameSerializer - -from . import config - -class GameHistoryView(APIView): - - permission_classes = (permissions.AllowAny,) - - def get(self, request: HttpRequest, pk: int = None): - - member_game_model_list: list[GameMembersModel] = GameMembersModel.objects.filter(player_id = pk) - - game_model_list: list[GameModel] = [] - - for member_game_model in member_game_model_list: - game_model_list.append(GameModel.objects.get(pk = member_game_model.game_id)) - - games_data: list[dict] = [GameSerializer(game_model).data for game_model in game_model_list] - - return Response(games_data) \ No newline at end of file diff --git a/games/GameHistoryViewSet.py b/games/GameHistoryViewSet.py new file mode 100644 index 0000000..52560b8 --- /dev/null +++ b/games/GameHistoryViewSet.py @@ -0,0 +1,28 @@ +from rest_framework.viewsets import ViewSet +from rest_framework.response import Response +from rest_framework import permissions + +from django.http import HttpRequest +from django.contrib.auth.models import User +from django.shortcuts import get_object_or_404 + +from .models import GameMembersModel, GameModel +from .serializers import GameSerializer + +class GameHistoryView(ViewSet): + + queryset = User.objects.all() + serializer_class = GameSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + + def retrive(self, request: HttpRequest, pk: int = None): + + user: User = get_object_or_404(User, pk=pk) + + member_game_model_list: list[GameMembersModel] = GameMembersModel.objects.filter(player=user) + + game_model_list: list[GameModel] = [member_game_model.game for member_game_model in member_game_model_list] + + games_data: list[dict] = self.serializer_class(game_model_list, many=True).data + + return Response(games_data) \ No newline at end of file diff --git a/games/urls.py b/games/urls.py index 34e28c2..ebceaac 100644 --- a/games/urls.py +++ b/games/urls.py @@ -3,11 +3,11 @@ from django.conf import settings from django.conf.urls.static import static from .GameViewSet import GameViewSet -from .GameHistoryView import GameHistoryView +from .GameHistoryViewSet import GameHistoryView from .GameConfigView import GameConfigView urlpatterns = [ path("", GameViewSet.as_view({"get": "retrieve"}), name="game_page"), - path("history/", GameHistoryView.as_view(), name="history_page"), + path("history/", GameHistoryView.as_view({"get": "retrive"}), name="history_page"), path("", GameConfigView.as_view(), name = "game_config") ] \ No newline at end of file