From cb2b235e20fdcf4e1953b80563dfb30c45830663 Mon Sep 17 00:00:00 2001 From: sosokker Date: Mon, 6 Nov 2023 12:37:10 +0700 Subject: [PATCH 1/4] Add UserProfile --- backend/users/migrations/0004_userstats.py | 30 ++++++++++++++++ backend/users/models.py | 42 +++++++++++++++------- 2 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 backend/users/migrations/0004_userstats.py diff --git a/backend/users/migrations/0004_userstats.py b/backend/users/migrations/0004_userstats.py new file mode 100644 index 0000000..2780aae --- /dev/null +++ b/backend/users/migrations/0004_userstats.py @@ -0,0 +1,30 @@ +# Generated by Django 4.2.6 on 2023-11-06 05:30 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0003_customuser_profile_pic'), + ] + + operations = [ + migrations.CreateModel( + name='UserStats', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('health', models.IntegerField(default=100)), + ('gold', models.FloatField(default=0.0)), + ('experience', models.FloatField(default=0)), + ('strength', models.IntegerField(default=1)), + ('intelligence', models.IntegerField(default=1)), + ('endurance', models.IntegerField(default=1)), + ('perception', models.IntegerField(default=1)), + ('luck', models.IntegerField(default=1)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/backend/users/models.py b/backend/users/models.py index 5b5b176..ce906f9 100644 --- a/backend/users/models.py +++ b/backend/users/models.py @@ -1,7 +1,10 @@ +import random + from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin +from django.core.validators import MinValueValidator, MaxValueValidator from .managers import CustomAccountManager @@ -32,15 +35,30 @@ class CustomUser(AbstractBaseUser, PermissionsMixin): return self.username -# class UserStats(models.Model): -# """ -# Represents User Profiles and Attributes. -# Fields: -# - health: health points of the user. -# - gold: gold points of the user. -# - experience: experience points of the user. -# """ -# user = models.OneToOneField(CustomUser, on_delete=models.CASCADE) -# health = models.IntegerField(default=100) -# gold = models.IntegerField(default=0) -# experience = models.FloatField(default=0) \ No newline at end of file +def random_luck(): + return random.randint(1, 50) + +class UserStats(models.Model): + """ + Represents User Profiles and Attributes. + Fields: + - health: health points of the user. + - gold: gold points of the user. + - experience: experience points of the user. + """ + user = models.OneToOneField(CustomUser, on_delete=models.CASCADE) + health = models.IntegerField(default=100) + gold = models.FloatField(default=0.0) + experience = models.FloatField(default=0) + strength = models.IntegerField(default=1, + validators=[MinValueValidator(1), + MaxValueValidator(100)]) + intelligence = models.IntegerField(default=1, validators=[MinValueValidator(1), + MaxValueValidator(100)]) + endurance = models.IntegerField(default=1, validators=[MinValueValidator(1), + MaxValueValidator(100)]) + perception = models.IntegerField(default=1, validators=[MinValueValidator(1), + MaxValueValidator(100)]) + luck = models.IntegerField(default=random_luck, validators=[MinValueValidator(1), + MaxValueValidator(50)],) + \ No newline at end of file From 661b178715fdb83813d61fc215bc47d915252bc1 Mon Sep 17 00:00:00 2001 From: sosokker Date: Mon, 6 Nov 2023 13:02:25 +0700 Subject: [PATCH 2/4] Add Level in UserStats --- backend/tasks/models.py | 11 +++++++++++ backend/users/models.py | 10 +++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/tasks/models.py b/backend/tasks/models.py index 7677acb..06be2f1 100644 --- a/backend/tasks/models.py +++ b/backend/tasks/models.py @@ -110,6 +110,17 @@ class Task(models.Model): else: return 4 + def get_exp(self): + return self.user.level * (0.2*self.difficulty) * (0.3*self.user.userstats.luck) + + def get_reward(self): + pass + + def get_penalty(self): + pass + + + def save(self, *args, **kwargs): self.priority = self.calculate_eisenhower_matrix_category() super(Task, self).save(*args, **kwargs) diff --git a/backend/users/models.py b/backend/users/models.py index ce906f9..56d6432 100644 --- a/backend/users/models.py +++ b/backend/users/models.py @@ -1,4 +1,5 @@ import random +import math from django.db import models from django.utils import timezone @@ -30,6 +31,10 @@ class CustomUser(AbstractBaseUser, PermissionsMixin): USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'first_name'] + def save(self, *args, **kwargs): + UserStats.objects.get_or_create(user=self) + super(CustomUser, self).save(*args, **kwargs) + def __str__(self): # String representation of the user return self.username @@ -61,4 +66,7 @@ class UserStats(models.Model): MaxValueValidator(100)]) luck = models.IntegerField(default=random_luck, validators=[MinValueValidator(1), MaxValueValidator(50)],) - \ No newline at end of file + + @property + def level(self): + return (math.pow(self.experience, 2) // 225) + 1 \ No newline at end of file From 0c256bf003f2b9ee104e39600d1476b14ee511ab Mon Sep 17 00:00:00 2001 From: sosokker Date: Mon, 6 Nov 2023 13:04:28 +0700 Subject: [PATCH 3/4] Remove unready stat calculation --- backend/tasks/models.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/backend/tasks/models.py b/backend/tasks/models.py index 06be2f1..7677acb 100644 --- a/backend/tasks/models.py +++ b/backend/tasks/models.py @@ -110,17 +110,6 @@ class Task(models.Model): else: return 4 - def get_exp(self): - return self.user.level * (0.2*self.difficulty) * (0.3*self.user.userstats.luck) - - def get_reward(self): - pass - - def get_penalty(self): - pass - - - def save(self, *args, **kwargs): self.priority = self.calculate_eisenhower_matrix_category() super(Task, self).save(*args, **kwargs) From 89fb6186988ec89291e16792deb767178123b44e Mon Sep 17 00:00:00 2001 From: sosokker Date: Mon, 6 Nov 2023 18:34:41 +0700 Subject: [PATCH 4/4] Use signal to create UserStats Instead --- backend/users/apps.py | 3 +++ backend/users/models.py | 4 ---- backend/users/signals.py | 9 +++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 backend/users/signals.py diff --git a/backend/users/apps.py b/backend/users/apps.py index 72b1401..434524e 100644 --- a/backend/users/apps.py +++ b/backend/users/apps.py @@ -4,3 +4,6 @@ from django.apps import AppConfig class UsersConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'users' + + def ready(self): + import users.signals \ No newline at end of file diff --git a/backend/users/models.py b/backend/users/models.py index 56d6432..c2eb9fd 100644 --- a/backend/users/models.py +++ b/backend/users/models.py @@ -31,10 +31,6 @@ class CustomUser(AbstractBaseUser, PermissionsMixin): USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'first_name'] - def save(self, *args, **kwargs): - UserStats.objects.get_or_create(user=self) - super(CustomUser, self).save(*args, **kwargs) - def __str__(self): # String representation of the user return self.username diff --git a/backend/users/signals.py b/backend/users/signals.py new file mode 100644 index 0000000..817986b --- /dev/null +++ b/backend/users/signals.py @@ -0,0 +1,9 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from users.models import CustomUser, UserStats + +@receiver(post_save, sender=CustomUser) +def create_user_stats(sender, instance, created, **kwargs): + if created: + UserStats.objects.create(user=instance) \ No newline at end of file