feat: add models, serializers, and viewsets for Task, SubTask, and AssignedTask

This commit is contained in:
Chneemann 2025-03-18 19:56:05 +01:00
parent 999c7c0589
commit f8a22c571c
6 changed files with 98 additions and 22 deletions

View file

@ -38,6 +38,7 @@ INSTALLED_APPS = [
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'rest_framework', 'rest_framework',
'task_app',
] ]
MIDDLEWARE = [ MIDDLEWARE = [

View file

@ -1,22 +1,14 @@
"""
URL configuration for join project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import path, include
from rest_framework.routers import DefaultRouter
from task_app.views import TaskViewSet, SubTaskViewSet, AssignedTaskViewSet
router = DefaultRouter()
router.register(r'tasks', TaskViewSet)
router.register(r'subtasks', SubTaskViewSet)
router.register(r'assigned_tasks', AssignedTaskViewSet)
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('api/', include(router.urls)),
] ]

View file

@ -1,3 +1,17 @@
from django.contrib import admin from django.contrib import admin
from .models import Task, SubTask, AssignedTask
# Register your models here. class SubTaskInline(admin.TabularInline):
model = SubTask
extra = 1
class AssignedTaskInline(admin.TabularInline):
model = AssignedTask
extra = 1
@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'status', 'priority', 'creator', 'date')
search_fields = ('title', 'category', 'creator__username')
list_filter = ('status', 'priority', 'date')
inlines = [SubTaskInline, AssignedTaskInline]

View file

@ -1,3 +1,35 @@
from django.db import models from django.db import models
from django.contrib.auth import get_user_model
# Create your models here. User = get_user_model()
class Task(models.Model):
title = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
category = models.CharField(max_length=50, choices=[('technical_task', 'Technical Task'), ('user_story', 'User Story')])
priority = models.CharField(max_length=50, choices=[('low', 'Low'), ('medium', 'Medium'), ('urgent', 'Urgent')])
status = models.CharField(max_length=50, choices=[('todo', 'Todo'), ('in_progress', 'In Progress'), ('await_feedback', 'Await feedback'), ('done', 'Done')])
date = models.DateField()
creator = models.ForeignKey(User, related_name="created_tasks", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class SubTask(models.Model):
task = models.ForeignKey(Task, related_name="subtasks", on_delete=models.CASCADE)
title = models.CharField(max_length=255)
done = models.BooleanField(default=False)
def __str__(self):
return f"{self.task.title} - {self.title}"
class AssignedTask(models.Model):
task = models.ForeignKey(Task, related_name="assigned_users", on_delete=models.CASCADE)
user = models.ForeignKey(User, related_name="assigned_tasks", on_delete=models.CASCADE)
def __str__(self):
return f"{self.user.username} assigned to {self.task.title}"

25
task_app/serializers.py Normal file
View file

@ -0,0 +1,25 @@
from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import Task, SubTask, AssignedTask
User = get_user_model()
class SubTaskSerializer(serializers.ModelSerializer):
class Meta:
model = SubTask
fields = '__all__'
class AssignedTaskSerializer(serializers.ModelSerializer):
user = serializers.StringRelatedField() # Gibt den Usernamen zurück, anstatt der ID
class Meta:
model = AssignedTask
fields = '__all__'
class TaskSerializer(serializers.ModelSerializer):
subtasks = SubTaskSerializer(many=True, read_only=True)
assigned_users = AssignedTaskSerializer(many=True, read_only=True)
class Meta:
model = Task
fields = '__all__'

View file

@ -1,3 +1,15 @@
from django.shortcuts import render from rest_framework import viewsets
from .models import Task, SubTask, AssignedTask
from .serializers import TaskSerializer, SubTaskSerializer, AssignedTaskSerializer
# Create your views here. class TaskViewSet(viewsets.ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
class SubTaskViewSet(viewsets.ModelViewSet):
queryset = SubTask.objects.all()
serializer_class = SubTaskSerializer
class AssignedTaskViewSet(viewsets.ModelViewSet):
queryset = AssignedTask.objects.all()
serializer_class = AssignedTaskSerializer