Add Habit Tasks

This commit is contained in:
sosokker 2023-11-14 01:15:56 +07:00
parent 038a0c84b7
commit 4d96f8c94e
6 changed files with 159 additions and 21 deletions

View File

@ -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,
},
),
]

View File

@ -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.

View File

@ -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)
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',)

View File

@ -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]
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

View File

@ -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')

View File

@ -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)]),
),
]