diff --git a/backend/core/urls.py b/backend/core/urls.py index 5e07d78..78f3e22 100644 --- a/backend/core/urls.py +++ b/backend/core/urls.py @@ -20,5 +20,6 @@ from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('users.urls')), + path('api/', include('tasks.urls')), path('accounts/', include('allauth.urls')), ] \ No newline at end of file diff --git a/backend/tasks/migrations/0002_alter_task_reminders_alter_task_tags.py b/backend/tasks/migrations/0002_alter_task_reminders_alter_task_tags.py new file mode 100644 index 0000000..4601c15 --- /dev/null +++ b/backend/tasks/migrations/0002_alter_task_reminders_alter_task_tags.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.6 on 2023-10-29 11:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='task', + name='reminders', + field=models.ManyToManyField(blank=True, to='tasks.reminder'), + ), + migrations.AlterField( + model_name='task', + name='tags', + field=models.ManyToManyField(blank=True, to='tasks.tag'), + ), + ] diff --git a/backend/tasks/migrations/0003_alter_task_difficulty.py b/backend/tasks/migrations/0003_alter_task_difficulty.py new file mode 100644 index 0000000..55d1aac --- /dev/null +++ b/backend/tasks/migrations/0003_alter_task_difficulty.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-10-29 12:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0002_alter_task_reminders_alter_task_tags'), + ] + + operations = [ + migrations.AlterField( + model_name='task', + name='difficulty', + field=models.PositiveSmallIntegerField(choices=[(1, 'Easy'), (2, 'Normal'), (3, 'Hard'), (4, 'Very Hard'), (5, 'Devil')]), + ), + ] diff --git a/backend/tasks/migrations/0004_rename_time_reminder_alerttime_and_more.py b/backend/tasks/migrations/0004_rename_time_reminder_alerttime_and_more.py new file mode 100644 index 0000000..0438ce9 --- /dev/null +++ b/backend/tasks/migrations/0004_rename_time_reminder_alerttime_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.6 on 2023-10-29 12:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0003_alter_task_difficulty'), + ] + + operations = [ + migrations.RenameField( + model_name='reminder', + old_name='time', + new_name='alertTime', + ), + migrations.AlterField( + model_name='reminder', + name='startDate', + field=models.DateField(auto_now_add=True, null=True), + ), + ] diff --git a/backend/tasks/misc/serializers.py b/backend/tasks/misc/serializers.py new file mode 100644 index 0000000..99b312e --- /dev/null +++ b/backend/tasks/misc/serializers.py @@ -0,0 +1,12 @@ +from rest_framework import serializers +from ..models import Reminder, Tag + +class ReminderSerializer(serializers.ModelSerializer): + class Meta: + model = Reminder + fields = '__all__' + +class TagSerializer(serializers.ModelSerializer): + class Meta: + model = Tag + fields = '__all__' \ No newline at end of file diff --git a/backend/tasks/misc/views.py b/backend/tasks/misc/views.py new file mode 100644 index 0000000..e5feb01 --- /dev/null +++ b/backend/tasks/misc/views.py @@ -0,0 +1,11 @@ +from rest_framework import viewsets +from ..models import Reminder, Tag +from .serializers import ReminderSerializer, TagSerializer + +class ReminderViewSet(viewsets.ModelViewSet): + queryset = Reminder.objects.all() + serializer_class = ReminderSerializer + +class TagViewSet(viewsets.ModelViewSet): + queryset = Tag.objects.all() + serializer_class = TagSerializer \ No newline at end of file diff --git a/backend/tasks/models.py b/backend/tasks/models.py index ca8c7e0..2f3f34a 100644 --- a/backend/tasks/models.py +++ b/backend/tasks/models.py @@ -10,8 +10,8 @@ class Reminder(models.Model): - startDate: The optional date for which the reminder is set. - time: The time at which the reminder is triggered. """ - startDate = models.DateField(null=True, blank=True) - time = models.DateTimeField() + startDate = models.DateField(auto_now_add=True, null=True, blank=True) + alertTime = models.DateTimeField(null=False, blank=False) class Tag(models.Model): """ @@ -59,14 +59,14 @@ class Task(models.Model): type = models.CharField(max_length=15, choices=TASK_TYPES, default='habit') title = models.TextField() notes = models.TextField(default='') - tags = models.ManyToManyField(Tag) + tags = models.ManyToManyField(Tag, blank=True) completed = models.BooleanField(default=False) exp = models.FloatField(default=0) priority = models.FloatField(default=1, validators=[ validators.MinValueValidator(0.1), validators.MaxValueValidator(2), ]) - difficulty = models.PositiveSmallIntegerField(choices=DIFFICULTY_CHOICES, unique=True) + difficulty = models.PositiveSmallIntegerField(choices=DIFFICULTY_CHOICES) attribute = models.CharField(max_length=15, choices=[ ('str', 'Strength'), ('int', 'Intelligence'), @@ -76,7 +76,7 @@ class Task(models.Model): ], default='str') user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) challenge = models.BooleanField(default=False) - reminders = models.ManyToManyField(Reminder) + reminders = models.ManyToManyField(Reminder, blank=True) fromSystem = models.BooleanField(default=False) creation_date = models.DateTimeField(auto_now_add=True) last_update = models.DateTimeField(auto_now=True) diff --git a/backend/tasks/tasks/serializers.py b/backend/tasks/tasks/serializers.py new file mode 100644 index 0000000..ff4be9e --- /dev/null +++ b/backend/tasks/tasks/serializers.py @@ -0,0 +1,11 @@ +from rest_framework import serializers +from ..models import Task + +class TaskSerializer(serializers.ModelSerializer): + class Meta: + model = Task + fields = '__all__' + + def create(self, validated_data): + # Create a new task with validated data + return Task.objects.create(**validated_data) \ No newline at end of file diff --git a/backend/tasks/tasks/views.py b/backend/tasks/tasks/views.py new file mode 100644 index 0000000..99e4ea9 --- /dev/null +++ b/backend/tasks/tasks/views.py @@ -0,0 +1,36 @@ +from rest_framework import status +from rest_framework.response import Response +from rest_framework.generics import CreateAPIView, RetrieveAPIView, RetrieveUpdateAPIView, DestroyAPIView +from rest_framework.permissions import IsAuthenticated +from ..models import Task +from .serializers import TaskSerializer + +class TaskCreateView(CreateAPIView): + queryset = Task.objects.all() + serializer_class = TaskSerializer + permission_classes = [IsAuthenticated] + + def create(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + + if serializer.is_valid(): + self.perform_create(serializer) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class TaskRetrieveView(RetrieveAPIView): + queryset = Task.objects.all() + serializer_class = TaskSerializer + + +class TaskUpdateView(RetrieveUpdateAPIView): + queryset = Task.objects.all() + serializer_class = TaskSerializer + permission_classes = [IsAuthenticated] + + +class TaskDeleteView(DestroyAPIView): + queryset = Task.objects.all() + permission_classes = [IsAuthenticated] \ No newline at end of file diff --git a/backend/tasks/urls.py b/backend/tasks/urls.py new file mode 100644 index 0000000..ef94e06 --- /dev/null +++ b/backend/tasks/urls.py @@ -0,0 +1,16 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .tasks.views import TaskCreateView, TaskRetrieveView, TaskUpdateView, TaskDeleteView +from .misc.views import TagViewSet, ReminderViewSet + +router = DefaultRouter() +router.register(r'reminders', ReminderViewSet) +router.register(r'tags', TagViewSet) + +urlpatterns = [ + path('', include(router.urls)), + path('tasks/create/', TaskCreateView.as_view(), name="add-task"), + path('tasks//', TaskRetrieveView.as_view(), name='retrieve-task'), + path('tasks//update/', TaskUpdateView.as_view(), name='update-task'), + path('tasks//delete/', TaskDeleteView.as_view(), name='delete-task'), +] \ No newline at end of file diff --git a/backend/tasks/views.py b/backend/tasks/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/backend/tasks/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here.