diff --git a/app/bloonsa_game/static/bloonsa_game/css/profilebox.css b/app/bloonsa_game/static/bloonsa_game/css/profilebox.css index 0d3a2cd..5bbf6ed 100644 --- a/app/bloonsa_game/static/bloonsa_game/css/profilebox.css +++ b/app/bloonsa_game/static/bloonsa_game/css/profilebox.css @@ -50,6 +50,8 @@ right: 0; position: absolute; padding: 0; + display: flex; + flex-direction: row; } #profile-settings-button, #profile-logout-button { diff --git a/app/bloonsa_game/templates/bloonsa_game/modules/profilebox.html b/app/bloonsa_game/templates/bloonsa_game/modules/profilebox.html index 5b7f1eb..d3574e4 100644 --- a/app/bloonsa_game/templates/bloonsa_game/modules/profilebox.html +++ b/app/bloonsa_game/templates/bloonsa_game/modules/profilebox.html @@ -5,7 +5,7 @@
- +
@@ -31,12 +31,11 @@
- - - - - - +
+ +
+
+ +
-
\ No newline at end of file diff --git a/app/requirements.txt b/app/requirements.txt index b2c4e5f..01f068a 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -1,6 +1,6 @@ django==5.1.* django-crispy-forms -crispy-bulma +crispy-bootstrap4 django-extensions tqdm Pillow diff --git a/app/settings/settings.py b/app/settings/settings.py index dce1cf0..ee8ed97 100644 --- a/app/settings/settings.py +++ b/app/settings/settings.py @@ -39,7 +39,7 @@ INSTALLED_APPS = [ # Plugins "crispy_forms", - "crispy_bulma", + "crispy_bootstrap4", "django_extensions", "django_cleanup.apps.CleanupConfig", @@ -141,7 +141,5 @@ MEDIA_URL = "/media/" DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",) -CRISPY_TEMPLATE_PACK = "bulma" - - +CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap4" +CRISPY_TEMPLATE_PACK = "bootstrap4" \ No newline at end of file diff --git a/app/users/forms.py b/app/users/forms.py index 82aa797..65b5471 100644 --- a/app/users/forms.py +++ b/app/users/forms.py @@ -8,7 +8,8 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit 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): field_order = ("username", "password1", "password2") @@ -72,21 +73,19 @@ class UserLoginForm(AuthenticationForm): ] 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: model = User - fields = ["username",] + fields = [] class PlayerUpdateForm(forms.ModelForm): bio = forms.CharField(max_length=128, required=False) - class Meta: model = Player - fields = ["avatar", "bio"] \ No newline at end of file + fields = ["avatar", "bio"] + +class BloonsaConfigUpdateForm(forms.ModelForm): + class Meta: + model = BloonsaConfig + fields = ["autoplay",] \ No newline at end of file diff --git a/app/users/static/users/css/config.css b/app/users/static/users/css/config.css index cbb8671..a1f951b 100644 --- a/app/users/static/users/css/config.css +++ b/app/users/static/users/css/config.css @@ -1,10 +1,14 @@ #config-box { - background-color: black; + background-color: #324299; + font-family: "Comic Sans MS", "Comic Sans", cursive; + color: white; + position: relative; width: 640px; height: 600px; -} - -#config-box { display: flex; flex-direction: row; +} + +#config-profile-box { + text-align: left; } \ No newline at end of file diff --git a/app/users/templates/users/config.html b/app/users/templates/users/config.html index e4729c1..e6b342f 100644 --- a/app/users/templates/users/config.html +++ b/app/users/templates/users/config.html @@ -7,16 +7,17 @@ {% endblock title %} {% block head %} - {% endblock head %} {% block content %} -
+
Profile settings
- {% crispy form_player %} - {% crispy form_user %} + {% csrf_token %} + {{ form_user|crispy }} + {{ form_player|crispy }} + {{ form_config|crispy }}
diff --git a/app/users/util.py b/app/users/util.py index 41b2be2..37ab57a 100644 --- a/app/users/util.py +++ b/app/users/util.py @@ -1,6 +1,7 @@ from django.contrib.auth import logout from django.utils import timezone +from bloonsa_game.models import Config from users.models import Player, Log actions = Log.Actions @@ -24,6 +25,10 @@ class BloonsaUtil: if not request.user.is_authenticated: return 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 ip = self.get_ip(request=request) player = Player(user=request.user, diff --git a/app/users/validators.py b/app/users/validators.py index 2307324..a9a8492 100644 --- a/app/users/validators.py +++ b/app/users/validators.py @@ -14,4 +14,12 @@ def usernameValidator(username): 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 _-") \ No newline at end of file + 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 _-") diff --git a/app/users/views.py b/app/users/views.py index f53f187..62b6d90 100644 --- a/app/users/views.py +++ b/app/users/views.py @@ -4,7 +4,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import render, redirect 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.util import bloonsa_util, actions @@ -57,32 +57,36 @@ class LogoutView(TemplateView): class ConfigView(LoginRequiredMixin, TemplateView): def get(self, request, *args, **kwargs): + form_config = BloonsaConfigUpdateForm(instance=request.user.player.bloonsa_config) form_player = PlayerUpdateForm(instance=request.user.player) form_user = UserUpdateForm(instance=request.user) + return render(request=request, template_name="users/config.html", - context={"form_player": form_player, + context={"form_config": form_config, + "form_player": form_player, "form_user": form_user}) # TODO add log def post(self, request, *args, **kwargs): - form_player = PlayerUpdateForm(request.POST) - form_user = UserUpdateForm(request.POST) - if any(( - not form_player.is_valid(), - not form_user.is_valid() - )): + form_config = BloonsaConfigUpdateForm(request.POST, + instance=request.user.player.bloonsa_config) + form_player = PlayerUpdateForm(request.POST, + request.FILES, + 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, template_name="users/config.html", context={ - "form_player": form_player, - "form_user": form_user - }) - user = form_user.save() - player = form_player.save() - return render(request=request, - template_name="users/config.html", - context={ - "form_player": form_player, - "form_user": form_user - }) \ No newline at end of file + "form_config": form_config, + "form_player": form_player, + "form_user": form_user})""" + if form_user.is_valid(): + form_user.save() + if form_player.is_valid(): + form_player.save() + if form_config.is_valid(): + form_config.save() + # messages.success(request, "Profile updated successfully") + return redirect("users:config") \ No newline at end of file