From 01ee684113f8aab253fce3c27084f8669aae59bc Mon Sep 17 00:00:00 2001 From: Walter Date: Tue, 18 Feb 2025 13:59:12 +0100 Subject: [PATCH] Mostly progress on user config page --- .../static/bloonsa_game/js/flash_handler.js | 1 + app/requirements.txt | 5 +++- app/settings/settings.py | 10 +++++--- app/settings/urls.py | 6 ++++- app/users/forms.py | 5 +++- app/users/models.py | 11 ++++++++ app/users/templates/users/config.html | 11 ++++++++ app/users/urls.py | 6 +++-- app/users/views.py | 25 +++++++++++++++++-- 9 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 app/users/templates/users/config.html diff --git a/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js b/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js index 7601766..0d108c3 100644 --- a/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js +++ b/app/bloonsa_game/static/bloonsa_game/js/flash_handler.js @@ -40,6 +40,7 @@ function bloonsa_update_data(level_id) { } } }; + xhr.timeout = 5000; xhr.send(JSON.stringify({ level_id: level_id })); diff --git a/app/requirements.txt b/app/requirements.txt index a3c88a3..b2c4e5f 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -2,4 +2,7 @@ django==5.1.* django-crispy-forms crispy-bulma django-extensions -tqdm \ No newline at end of file +tqdm +Pillow +django-resized +django-cleanup \ No newline at end of file diff --git a/app/settings/settings.py b/app/settings/settings.py index eeb809e..dce1cf0 100644 --- a/app/settings/settings.py +++ b/app/settings/settings.py @@ -9,7 +9,7 @@ https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ - +import os from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -41,6 +41,7 @@ INSTALLED_APPS = [ "crispy_forms", "crispy_bulma", "django_extensions", + "django_cleanup.apps.CleanupConfig", # Global "users", @@ -130,7 +131,10 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ -STATIC_URL = '/static/' +STATIC_URL = "/static/" + +MEDIA_ROOT = os.path.join(BASE_DIR, "media") +MEDIA_URL = "/media/" # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field @@ -138,6 +142,6 @@ STATIC_URL = '/static/' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",) -CRISPY_TEMPLATE_PACK = 'bulma' +CRISPY_TEMPLATE_PACK = "bulma" diff --git a/app/settings/urls.py b/app/settings/urls.py index a95adae..8aaac80 100644 --- a/app/settings/urls.py +++ b/app/settings/urls.py @@ -13,10 +13,11 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +from django.conf.urls.static import static from django.contrib import admin from django.urls import path, include, re_path from django.views.generic.base import RedirectView - +from django.conf import settings urlpatterns = [ path("", RedirectView.as_view(pattern_name="bloonsa_game:game", permanent=False), name="index"), @@ -25,3 +26,6 @@ urlpatterns = [ path("a/", include("bloonsa_game.urls", namespace="bloonsa_game")), path("users/", include("users.urls", namespace="users")), ] + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/app/users/forms.py b/app/users/forms.py index f2d882b..be33494 100644 --- a/app/users/forms.py +++ b/app/users/forms.py @@ -68,4 +68,7 @@ class UserLoginForm(AuthenticationForm): model = User fields = [ "username", - ] \ No newline at end of file + ] + +class UserConfigForm(): + raise NotImplementedError() \ No newline at end of file diff --git a/app/users/models.py b/app/users/models.py index f7269f8..8a7a566 100644 --- a/app/users/models.py +++ b/app/users/models.py @@ -1,9 +1,20 @@ from django.db import models from django.utils import timezone from django.contrib.auth.models import User +from django_resized import ResizedImageField + class Player(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="player") + # Profile + bio = models.TextField(max_length=128, null=True) + avatar = ResizedImageField(default="default.jpg", + size=[256, 256], + upload_to="avatars", + keep_meta=False, + force_format="JPEG", + quality=75) + # Logging creation_ip = models.GenericIPAddressField() latest_ip = models.GenericIPAddressField() diff --git a/app/users/templates/users/config.html b/app/users/templates/users/config.html new file mode 100644 index 0000000..a2cab3a --- /dev/null +++ b/app/users/templates/users/config.html @@ -0,0 +1,11 @@ +{% extends "bloonsa_game/base.html" %} +{% load crispy_forms_tags %} + +{% block title %} + My Profile +{% endblock title %} + +{% block content %} +

Profile settings

+ {% crispy form %} +{% endblock %} \ No newline at end of file diff --git a/app/users/urls.py b/app/users/urls.py index b058083..0fc43cf 100644 --- a/app/users/urls.py +++ b/app/users/urls.py @@ -1,11 +1,13 @@ from django.urls import path, include -from users.views import LoginView, RegisterView, LogoutView +from users.views import (LoginView, RegisterView, + LogoutView, ConfigView) app_name = "users" urlpatterns = [ path("login", LoginView.as_view(), name="login"), path("register", RegisterView.as_view(), name="register"), - path("logout", LogoutView.as_view(), name="logout") + path("logout", LogoutView.as_view(), name="logout"), + path("config", ConfigView.as_view(), name="config"), ] diff --git a/app/users/views.py b/app/users/views.py index 5e7aa9c..42dd452 100644 --- a/app/users/views.py +++ b/app/users/views.py @@ -3,7 +3,7 @@ from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.shortcuts import render, redirect from django.views.generic import TemplateView -from users.forms import UserRegisterForm, UserLoginForm +from users.forms import UserRegisterForm, UserLoginForm, UserConfigForm from users.models import Player from users.util import bloonsa_util, actions @@ -46,7 +46,6 @@ class RegisterView(TemplateView): class LogoutView(TemplateView): - def get(self, request, *args, **kwargs): if request.user.is_authenticated: bloonsa_util.tag_player(request=request) @@ -56,3 +55,25 @@ class LogoutView(TemplateView): return redirect("bloonsa_game:game") +class ConfigView(TemplateView): + + def get(self, request, *args, **kwargs): + form = UserConfigForm() + return render(request=request, + template_name="users/config.html", + context={"form": form}) + + def post(self, request, *args, **kwargs): + form = UserConfigForm(request.POST) + if not form.is_valid(): + return render(request=request, + template_name="users/config.html", + context={"form": form}) + user = form.save() + player = bloonsa_util.init_player(request=request) + login(request=request, user=user) + #bloonsa_util.log(player=player, + # action=actions.login) + return render(request=request, + template_name="users/config.html", + context={"form": form}) \ No newline at end of file