Made player config page work

This commit is contained in:
Walter 2025-02-19 01:30:59 +01:00
parent e8f244d279
commit b3d0510161
10 changed files with 72 additions and 52 deletions

View File

@ -50,6 +50,8 @@
right: 0; right: 0;
position: absolute; position: absolute;
padding: 0; padding: 0;
display: flex;
flex-direction: row;
} }
#profile-settings-button, #profile-logout-button { #profile-settings-button, #profile-logout-button {

View File

@ -5,7 +5,7 @@
<div id="profile-box"> <div id="profile-box">
<div id="avatar-box"> <div id="avatar-box">
<img id="avatar" src="{{ user.player.avatar.url }}"> <img id="avatar" src="{{ user.player.avatar.url }}" height=64px width=64px>
</div> </div>
<div id="profile-user"> <div id="profile-user">
@ -31,12 +31,11 @@
</div> </div>
<div id="profile-buttons"> <div id="profile-buttons">
<a href="/users/config"> <form action="/users/config">
<button id="profile-settings-button">settings</button> <input id="profile-settings-button" type="submit" value="config" />
</a> </form>
<a href="/users/logout"> <form action="/users/logout">
<button id="profile-logout-button">logout</button> <input id="profile-logout-button" type="submit" value="logout" />
</a> </form>
</div> </div>
</div> </div>

View File

@ -1,6 +1,6 @@
django==5.1.* django==5.1.*
django-crispy-forms django-crispy-forms
crispy-bulma crispy-bootstrap4
django-extensions django-extensions
tqdm tqdm
Pillow Pillow

View File

@ -39,7 +39,7 @@ INSTALLED_APPS = [
# Plugins # Plugins
"crispy_forms", "crispy_forms",
"crispy_bulma", "crispy_bootstrap4",
"django_extensions", "django_extensions",
"django_cleanup.apps.CleanupConfig", "django_cleanup.apps.CleanupConfig",
@ -141,7 +141,5 @@ MEDIA_URL = "/media/"
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",) CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap4"
CRISPY_TEMPLATE_PACK = "bulma" CRISPY_TEMPLATE_PACK = "bootstrap4"

View File

@ -8,7 +8,8 @@ from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit from crispy_forms.layout import Submit
from users.models import Player from users.models import Player
from users.validators import usernameValidator from users.validators import usernameValidator, username_change_validator
from bloonsa_game.models import Config as BloonsaConfig
class UserRegisterForm(UserCreationForm): class UserRegisterForm(UserCreationForm):
field_order = ("username", "password1", "password2") field_order = ("username", "password1", "password2")
@ -72,21 +73,19 @@ class UserLoginForm(AuthenticationForm):
] ]
class UserUpdateForm(forms.ModelForm): class UserUpdateForm(forms.ModelForm):
username = forms.CharField(min_length=3,
max_length=16,
label="Username",
required=False,
validators=[usernameValidator, ],
help_text=_("3-16 chars, alphanumeric and _- pls"))
class Meta: class Meta:
model = User model = User
fields = ["username",] fields = []
class PlayerUpdateForm(forms.ModelForm): class PlayerUpdateForm(forms.ModelForm):
bio = forms.CharField(max_length=128, required=False) bio = forms.CharField(max_length=128, required=False)
class Meta: class Meta:
model = Player model = Player
fields = ["avatar", "bio"] fields = ["avatar", "bio"]
class BloonsaConfigUpdateForm(forms.ModelForm):
class Meta:
model = BloonsaConfig
fields = ["autoplay",]

View File

@ -1,10 +1,14 @@
#config-box { #config-box {
background-color: black; background-color: #324299;
font-family: "Comic Sans MS", "Comic Sans", cursive;
color: white;
position: relative;
width: 640px; width: 640px;
height: 600px; height: 600px;
}
#config-box {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
}
#config-profile-box {
text-align: left;
} }

View File

@ -7,16 +7,17 @@
{% endblock title %} {% endblock title %}
{% block head %} {% block head %}
<link rel="stylesheet" href="{% static 'users/css/bulma-1.0.3.css' %}">
<link rel="stylesheet" href="{% static 'users/css/config.css' %}"> <link rel="stylesheet" href="{% static 'users/css/config.css' %}">
{% endblock head %} {% endblock head %}
{% block content %} {% block content %}
<form method="post" id="config-box"> <form method="post" id="config-box" enctype="multipart/form-data">
<div id="config-profile-box"> <div id="config-profile-box">
<div id="profile-settings-text">Profile settings</div> <div id="profile-settings-text">Profile settings</div>
{% crispy form_player %} {% csrf_token %}
{% crispy form_user %} {{ form_user|crispy }}
{{ form_player|crispy }}
{{ form_config|crispy }}
<button type="submit" class="btn btn-primary">Save changes</button> <button type="submit" class="btn btn-primary">Save changes</button>
</div> </div>
<div id="config-bloonsa-box"></div> <div id="config-bloonsa-box"></div>

View File

@ -1,6 +1,7 @@
from django.contrib.auth import logout from django.contrib.auth import logout
from django.utils import timezone from django.utils import timezone
from bloonsa_game.models import Config
from users.models import Player, Log from users.models import Player, Log
actions = Log.Actions actions = Log.Actions
@ -24,6 +25,10 @@ class BloonsaUtil:
if not request.user.is_authenticated: if not request.user.is_authenticated:
return return
if hasattr(request.user, "player"): if hasattr(request.user, "player"):
# TODO Optimize this by only doing it on register
if not hasattr(request.user.player, "bloonsa_config"):
bloonsa_config = Config(player=request.user.player)
bloonsa_config.save()
return request.user.player return request.user.player
ip = self.get_ip(request=request) ip = self.get_ip(request=request)
player = Player(user=request.user, player = Player(user=request.user,

View File

@ -14,4 +14,12 @@ def usernameValidator(username):
charset = set(string.ascii_letters + string.digits + "_-") charset = set(string.ascii_letters + string.digits + "_-")
if not all(x in charset for x in username): if not all(x in charset for x in username):
raise ValidationError("Username may only contain normal letters, numbers and _-") raise ValidationError("Username may only contain normal letters, numbers and _-")
def username_change_validator(username):
if len(username) < 3 or len(username) > 16:
raise ValidationError("Username must be between 3-16 characters long")
charset = set(string.ascii_letters + string.digits + "_-")
if not all(x in charset for x in username):
raise ValidationError("Username may only contain normal letters, numbers and _-")

View File

@ -4,7 +4,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.views.generic import TemplateView from django.views.generic import TemplateView
from users.forms import UserRegisterForm, UserLoginForm, PlayerUpdateForm, UserUpdateForm from users.forms import UserRegisterForm, UserLoginForm, PlayerUpdateForm, UserUpdateForm, BloonsaConfigUpdateForm
from users.models import Player from users.models import Player
from users.util import bloonsa_util, actions from users.util import bloonsa_util, actions
@ -57,32 +57,36 @@ class LogoutView(TemplateView):
class ConfigView(LoginRequiredMixin, TemplateView): class ConfigView(LoginRequiredMixin, TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
form_config = BloonsaConfigUpdateForm(instance=request.user.player.bloonsa_config)
form_player = PlayerUpdateForm(instance=request.user.player) form_player = PlayerUpdateForm(instance=request.user.player)
form_user = UserUpdateForm(instance=request.user) form_user = UserUpdateForm(instance=request.user)
return render(request=request, return render(request=request,
template_name="users/config.html", template_name="users/config.html",
context={"form_player": form_player, context={"form_config": form_config,
"form_player": form_player,
"form_user": form_user}) "form_user": form_user})
# TODO add log # TODO add log
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form_player = PlayerUpdateForm(request.POST) form_config = BloonsaConfigUpdateForm(request.POST,
form_user = UserUpdateForm(request.POST) instance=request.user.player.bloonsa_config)
if any(( form_player = PlayerUpdateForm(request.POST,
not form_player.is_valid(), request.FILES,
not form_user.is_valid() instance=request.user.player)
)): form_user = UserUpdateForm(request.POST, instance=request.user)
"""if not form_player.is_valid() or not form_user.is_valid() or not form_config.is_valid():
return render(request=request, return render(request=request,
template_name="users/config.html", template_name="users/config.html",
context={ context={
"form_player": form_player, "form_config": form_config,
"form_user": form_user "form_player": form_player,
}) "form_user": form_user})"""
user = form_user.save() if form_user.is_valid():
player = form_player.save() form_user.save()
return render(request=request, if form_player.is_valid():
template_name="users/config.html", form_player.save()
context={ if form_config.is_valid():
"form_player": form_player, form_config.save()
"form_user": form_user # messages.success(request, "Profile updated successfully")
}) return redirect("users:config")