From 4d96f8c94ee14df3595cc0ccd6c68c5298366cdf Mon Sep 17 00:00:00 2001 From: sosokker Date: Tue, 14 Nov 2023 01:15:56 +0700 Subject: [PATCH] Add Habit Tasks --- backend/tasks/migrations/0012_habit.py | 39 ++++++++++++++ backend/tasks/models.py | 8 +++ backend/tasks/tasks/serializers.py | 52 ++++++++++++++----- backend/tasks/tasks/views.py | 37 ++++++++++--- backend/tasks/urls.py | 4 +- ...0005_alter_userstats_endurance_and_more.py | 40 ++++++++++++++ 6 files changed, 159 insertions(+), 21 deletions(-) create mode 100644 backend/tasks/migrations/0012_habit.py create mode 100644 backend/users/migrations/0005_alter_userstats_endurance_and_more.py diff --git a/backend/tasks/migrations/0012_habit.py b/backend/tasks/migrations/0012_habit.py new file mode 100644 index 0000000..6e29775 --- /dev/null +++ b/backend/tasks/migrations/0012_habit.py @@ -0,0 +1,39 @@ +# Generated by Django 4.2.6 on 2023-11-13 18:15 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('tasks', '0011_recurrencetask'), + ] + + operations = [ + migrations.CreateModel( + name='Habit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.TextField()), + ('notes', models.TextField(default='')), + ('importance', models.PositiveSmallIntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')], default=1)), + ('difficulty', models.PositiveSmallIntegerField(choices=[(1, 'Easy'), (2, 'Normal'), (3, 'Hard'), (4, 'Very Hard'), (5, 'Devil')], default=1)), + ('challenge', models.BooleanField(default=False)), + ('fromSystem', models.BooleanField(default=False)), + ('creation_date', models.DateTimeField(auto_now_add=True)), + ('last_update', models.DateTimeField(auto_now=True)), + ('google_calendar_id', models.CharField(blank=True, max_length=255, null=True)), + ('start_event', models.DateTimeField(null=True)), + ('end_event', models.DateTimeField(null=True)), + ('streak', models.IntegerField(default=0)), + ('tags', models.ManyToManyField(blank=True, to='tasks.tag')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/backend/tasks/models.py b/backend/tasks/models.py index 5da815e..83b9325 100644 --- a/backend/tasks/models.py +++ b/backend/tasks/models.py @@ -73,6 +73,14 @@ class RecurrenceTask(Task): def __str__(self) -> str: return f"{self.title} ({self.recurrence_rule})" + +class Habit(Task): + streak = models.IntegerField(default=0) + + def __str__(self) -> str: + return f"{self.title} ({self.streak})" + + class Subtask(models.Model): """ Represents a subtask associated with a task. diff --git a/backend/tasks/tasks/serializers.py b/backend/tasks/tasks/serializers.py index 85f0281..3098493 100644 --- a/backend/tasks/tasks/serializers.py +++ b/backend/tasks/tasks/serializers.py @@ -1,21 +1,47 @@ from rest_framework import serializers -from ..models import Todo +from ..models import Todo, RecurrenceTask, Habit -class TaskCreateSerializer(serializers.ModelSerializer): - class Meta: - model = Todo - # fields = '__all__' - exclude = ('tags',) - - def create(self, validated_data): - # Create a new task with validated data - return Todo.objects.create(**validated_data) - -class TaskGeneralSerializer(serializers.ModelSerializer): +class TaskSerializer(serializers.ModelSerializer): class Meta: model = Todo fields = '__all__' def create(self, validated_data): # Create a new task with validated data - return Todo.objects.create(**validated_data) \ No newline at end of file + return Todo.objects.create(**validated_data) + +class TaskCreateSerializer(serializers.ModelSerializer): + class Meta: + model = Todo + exclude = ('tags',) + + +class RecurrenceTaskSerializer(serializers.ModelSerializer): + class Meta: + model = RecurrenceTask + fields = '__all__' + + def create(self, validated_data): + # Create a new task with validated data + return Todo.objects.create(**validated_data) + +class RecurrenceTaskCreateSerializer(serializers.ModelSerializer): + class Meta: + model = RecurrenceTask + exclude = ('tags',) + + +class HabitTaskSerializer(serializers.ModelSerializer): + class Meta: + model = Habit + fields = '__all__' + + def create(self, validated_data): + # Create a new task with validated data + return Todo.objects.create(**validated_data) + + +class HabitTaskCreateSerializer(serializers.ModelSerializer): + class Meta: + model = Habit + exclude = ('tags',) \ No newline at end of file diff --git a/backend/tasks/tasks/views.py b/backend/tasks/tasks/views.py index 16f014c..a05f82c 100644 --- a/backend/tasks/tasks/views.py +++ b/backend/tasks/tasks/views.py @@ -1,22 +1,45 @@ from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated -from tasks.models import Todo, RecurrenceTask -from .serializers import TaskCreateSerializer, TaskGeneralSerializer +from tasks.models import Todo, RecurrenceTask, Habit +from tasks.tasks.serializers import (TaskCreateSerializer, + TaskSerializer, + RecurrenceTaskSerializer, + RecurrenceTaskCreateSerializer, + HabitTaskSerializer, + HabitTaskCreateSerializer) class TodoViewSet(viewsets.ModelViewSet): queryset = Todo.objects.all() - serializer_class = TaskGeneralSerializer + serializer_class = TaskSerializer permission_classes = [IsAuthenticated] def get_serializer_class(self): # Can't add ManytoMany at creation time (Tags) if self.action == 'create': return TaskCreateSerializer - return TaskGeneralSerializer + return TaskSerializer class RecurrenceTaskViewSet(viewsets.ModelViewSet): - queryset = Todo.objects.all() - serializer_class = TaskGeneralSerializer - permission_classes = [IsAuthenticated] \ No newline at end of file + queryset = RecurrenceTask.objects.all() + serializer_class = RecurrenceTaskSerializer + permission_classes = [IsAuthenticated] + + def get_serializer_class(self): + # Can't add ManytoMany at creation time (Tags) + if self.action == 'create': + return RecurrenceTaskCreateSerializer + return RecurrenceTaskSerializer + + +class HabitTaskViewSet(viewsets.ModelViewSet): + queryset = Habit.objects.all() + serializer_class = HabitTaskSerializer + permission_classes = [IsAuthenticated] + + def get_serializer_class(self): + # Can't add ManytoMany at creation time (Tags) + if self.action == 'create': + return HabitTaskCreateSerializer + return HabitTaskSerializer \ No newline at end of file diff --git a/backend/tasks/urls.py b/backend/tasks/urls.py index b44ddd9..d830a65 100644 --- a/backend/tasks/urls.py +++ b/backend/tasks/urls.py @@ -3,12 +3,14 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter from tasks.api import GoogleCalendarEventViewset -from tasks.tasks.views import TodoViewSet +from tasks.tasks.views import TodoViewSet, RecurrenceTaskViewSet, HabitTaskViewSet from tasks.misc.views import TagViewSet router = DefaultRouter() router.register(r'todo', TodoViewSet) +router.register(r'daily', RecurrenceTaskViewSet) +router.register(r'habit', HabitTaskViewSet) router.register(r'tags', TagViewSet) router.register(r'calendar-events', GoogleCalendarEventViewset, basename='calendar-events') diff --git a/backend/users/migrations/0005_alter_userstats_endurance_and_more.py b/backend/users/migrations/0005_alter_userstats_endurance_and_more.py new file mode 100644 index 0000000..35fe6f7 --- /dev/null +++ b/backend/users/migrations/0005_alter_userstats_endurance_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.6 on 2023-11-13 18:15 + +import django.core.validators +from django.db import migrations, models +import users.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0004_userstats'), + ] + + operations = [ + migrations.AlterField( + model_name='userstats', + name='endurance', + field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)]), + ), + migrations.AlterField( + model_name='userstats', + name='intelligence', + field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)]), + ), + migrations.AlterField( + model_name='userstats', + name='luck', + field=models.IntegerField(default=users.models.random_luck, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(50)]), + ), + migrations.AlterField( + model_name='userstats', + name='perception', + field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)]), + ), + migrations.AlterField( + model_name='userstats', + name='strength', + field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)]), + ), + ]