refactor: optimize model and serializer in task_app

This commit is contained in:
Chneemann 2025-04-07 08:55:02 +02:00
parent fc12d96e83
commit cd81ce179d
3 changed files with 12 additions and 20 deletions

View file

@ -13,7 +13,7 @@ class Task(models.Model):
priority = models.CharField(max_length=50, choices=TaskPriority.choices) priority = models.CharField(max_length=50, choices=TaskPriority.choices)
status = models.CharField(max_length=50, choices=TaskStatus.choices) status = models.CharField(max_length=50, choices=TaskStatus.choices)
date = models.DateField() date = models.DateField()
creator = models.ForeignKey(User, related_name="created_tasks", on_delete=models.CASCADE) creator = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
def __str__(self): def __str__(self):
@ -29,8 +29,8 @@ class SubTask(models.Model):
return f"{self.task.title} - {self.title}" return f"{self.task.title} - {self.title}"
class AssignedTask(models.Model): class AssignedTask(models.Model):
user = models.ForeignKey(User, related_name="assigned_tasks", on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE)
task = models.ForeignKey(Task, related_name="assigned_tasks", on_delete=models.CASCADE) task = models.ForeignKey(Task, related_name="assigned", on_delete=models.CASCADE)
def __str__(self): def __str__(self):
return f"{self.user} - {self.task}" return f"{self.user} - {self.task}"

View file

@ -4,11 +4,9 @@ from djangorestframework_camel_case.parser import CamelCaseJSONParser
from .models import Task, SubTask, AssignedTask from .models import Task, SubTask, AssignedTask
class SubTaskSerializer(serializers.ModelSerializer): class SubTaskSerializer(serializers.ModelSerializer):
task = serializers.CharField(source='task.id')
class Meta: class Meta:
model = SubTask model = SubTask
fields = ['id', 'title', 'status', 'task'] fields = ['id', 'title', 'status']
class AssignedTaskSerializer(serializers.ModelSerializer): class AssignedTaskSerializer(serializers.ModelSerializer):
user_id = serializers.CharField(source='user.id', read_only=True) user_id = serializers.CharField(source='user.id', read_only=True)
@ -19,10 +17,8 @@ class AssignedTaskSerializer(serializers.ModelSerializer):
class TaskSerializer(serializers.ModelSerializer): class TaskSerializer(serializers.ModelSerializer):
subtasks = SubTaskSerializer(many=True, read_only=True) subtasks = SubTaskSerializer(many=True, read_only=True)
assignees = AssignedTaskSerializer(source='assigned_tasks', many=True, read_only=True) assignees = AssignedTaskSerializer(source='assigned', many=True, read_only=True)
creator = serializers.CharField(source='creator.id', read_only=True)
def get_assignees(self, obj):
return list(obj.assigned_tasks.all().values('user_id'))
class Meta: class Meta:
model = Task model = Task

View file

@ -1,4 +1,3 @@
import uuid
from django.test import TestCase from django.test import TestCase
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from task_app.models import Task, SubTask, AssignedTask from task_app.models import Task, SubTask, AssignedTask
@ -11,17 +10,14 @@ User = get_user_model()
class SerializerTests(TestCase): class SerializerTests(TestCase):
def setUp(self): def setUp(self):
user = User.objects.create(first_name="Test", last_name="User", email="test@example.com") self.user = User.objects.create(first_name="Test", last_name="User", email="test@example.com")
self.user = user
self.test_date = date(2025, 1, 1)
self.task = Task.objects.create( self.task = Task.objects.create(
title="Test Task 1", title="Test Task 1",
description="Description 1", description="Description 1",
category=TaskCategory.TECHNICAL_TASK, category=TaskCategory.TECHNICAL_TASK,
priority=TaskPriority.LOW, priority=TaskPriority.LOW,
status=TaskStatus.TODO, status=TaskStatus.TODO,
date=self.test_date, date='2025-01-01',
creator=self.user creator=self.user
) )
@ -32,7 +28,7 @@ class SerializerTests(TestCase):
def test_subtask_serializer(self): def test_subtask_serializer(self):
serializer = SubTaskSerializer(self.subtask1) serializer = SubTaskSerializer(self.subtask1)
expected_data = {'id': str(self.subtask1.id), 'title': 'SubTask 1', 'status': True, 'task': str(self.task.id)} expected_data = {'id': str(self.subtask1.id), 'title': 'SubTask 1', 'status': True}
self.assertEqual(serializer.data, expected_data) self.assertEqual(serializer.data, expected_data)
def test_assigned_task_serializer(self): def test_assigned_task_serializer(self):
@ -50,11 +46,11 @@ class SerializerTests(TestCase):
'priority': 'low', 'priority': 'low',
'status': 'todo', 'status': 'todo',
'date': '2025-01-01', 'date': '2025-01-01',
'creator': self.user.id, 'creator': str(self.user.id),
'created_at': self.task.created_at.isoformat().replace('+00:00', 'Z'), 'created_at': self.task.created_at.isoformat().replace('+00:00', 'Z'),
'subtasks': [ 'subtasks': [
{'id': str(self.subtask1.id), 'title': 'SubTask 1', 'status': True, 'task': str(self.task.id)}, {'id': str(self.subtask1.id), 'title': 'SubTask 1', 'status': True},
{'id': str(self.subtask2.id), 'title': 'SubTask 2', 'status': False, 'task': str(self.task.id)} {'id': str(self.subtask2.id), 'title': 'SubTask 2', 'status': False}
], ],
'assignees': [{'user_id': str(self.assigned_user.id)}] 'assignees': [{'user_id': str(self.assigned_user.id)}]
} }