Add CRUD task, tag, reminder API

This commit is contained in:
sosokker 2023-10-29 19:48:31 +07:00
parent cdb71fc463
commit 48a2d6dd7a
11 changed files with 156 additions and 8 deletions

View File

@ -20,5 +20,6 @@ from django.urls import path, include
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('api/', include('users.urls')), path('api/', include('users.urls')),
path('api/', include('tasks.urls')),
path('accounts/', include('allauth.urls')), path('accounts/', include('allauth.urls')),
] ]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,8 +10,8 @@ class Reminder(models.Model):
- startDate: The optional date for which the reminder is set. - startDate: The optional date for which the reminder is set.
- time: The time at which the reminder is triggered. - time: The time at which the reminder is triggered.
""" """
startDate = models.DateField(null=True, blank=True) startDate = models.DateField(auto_now_add=True, null=True, blank=True)
time = models.DateTimeField() alertTime = models.DateTimeField(null=False, blank=False)
class Tag(models.Model): class Tag(models.Model):
""" """
@ -59,14 +59,14 @@ class Task(models.Model):
type = models.CharField(max_length=15, choices=TASK_TYPES, default='habit') type = models.CharField(max_length=15, choices=TASK_TYPES, default='habit')
title = models.TextField() title = models.TextField()
notes = models.TextField(default='') notes = models.TextField(default='')
tags = models.ManyToManyField(Tag) tags = models.ManyToManyField(Tag, blank=True)
completed = models.BooleanField(default=False) completed = models.BooleanField(default=False)
exp = models.FloatField(default=0) exp = models.FloatField(default=0)
priority = models.FloatField(default=1, validators=[ priority = models.FloatField(default=1, validators=[
validators.MinValueValidator(0.1), validators.MinValueValidator(0.1),
validators.MaxValueValidator(2), validators.MaxValueValidator(2),
]) ])
difficulty = models.PositiveSmallIntegerField(choices=DIFFICULTY_CHOICES, unique=True) difficulty = models.PositiveSmallIntegerField(choices=DIFFICULTY_CHOICES)
attribute = models.CharField(max_length=15, choices=[ attribute = models.CharField(max_length=15, choices=[
('str', 'Strength'), ('str', 'Strength'),
('int', 'Intelligence'), ('int', 'Intelligence'),
@ -76,7 +76,7 @@ class Task(models.Model):
], default='str') ], default='str')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
challenge = models.BooleanField(default=False) challenge = models.BooleanField(default=False)
reminders = models.ManyToManyField(Reminder) reminders = models.ManyToManyField(Reminder, blank=True)
fromSystem = models.BooleanField(default=False) fromSystem = models.BooleanField(default=False)
creation_date = models.DateTimeField(auto_now_add=True) creation_date = models.DateTimeField(auto_now_add=True)
last_update = models.DateTimeField(auto_now=True) last_update = models.DateTimeField(auto_now=True)

View File

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

View File

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

16
backend/tasks/urls.py Normal file
View File

@ -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/<int:pk>/', TaskRetrieveView.as_view(), name='retrieve-task'),
path('tasks/<int:pk>/update/', TaskUpdateView.as_view(), name='update-task'),
path('tasks/<int:pk>/delete/', TaskDeleteView.as_view(), name='delete-task'),
]

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.