diff --git a/join/settings.py b/join/settings.py index 9b6ce98..4f318dc 100644 --- a/join/settings.py +++ b/join/settings.py @@ -38,6 +38,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', + 'task_app', ] MIDDLEWARE = [ diff --git a/join/urls.py b/join/urls.py index c573bb7..52248cc 100644 --- a/join/urls.py +++ b/join/urls.py @@ -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.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 = [ path('admin/', admin.site.urls), -] + path('api/', include(router.urls)), +] \ No newline at end of file diff --git a/task_app/admin.py b/task_app/admin.py index 8c38f3f..6571c08 100644 --- a/task_app/admin.py +++ b/task_app/admin.py @@ -1,3 +1,17 @@ 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] \ No newline at end of file diff --git a/task_app/models.py b/task_app/models.py index 71a8362..8ba579f 100644 --- a/task_app/models.py +++ b/task_app/models.py @@ -1,3 +1,35 @@ 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}" \ No newline at end of file diff --git a/task_app/serializers.py b/task_app/serializers.py new file mode 100644 index 0000000..3420599 --- /dev/null +++ b/task_app/serializers.py @@ -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__' \ No newline at end of file diff --git a/task_app/views.py b/task_app/views.py index 91ea44a..f658782 100644 --- a/task_app/views.py +++ b/task_app/views.py @@ -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 \ No newline at end of file