diff --git a/fet2020/tasks/__init__.py b/fet2020/tasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fet2020/tasks/admin.py b/fet2020/tasks/admin.py new file mode 100644 index 00000000..d45663e6 --- /dev/null +++ b/fet2020/tasks/admin.py @@ -0,0 +1,20 @@ +from django.contrib import admin + +from .models import Task, TaskList + + +class TaskAdmin(admin.ModelAdmin): + list_display = ("title", "task_list", "completed", "priority", "due_date") + list_filter = ("task_list",) + ordering = ("priority",) + search_fields = ("title",) + + def save_model(self, request, obj, form, change): + obj.created_by = request.user + if not obj.assigned_to: + obj.assigned_to = request.user + super().save_model(request, obj, form, change) + + +admin.site.register(TaskList) +admin.site.register(Task, TaskAdmin) diff --git a/fet2020/tasks/apps.py b/fet2020/tasks/apps.py new file mode 100644 index 00000000..20547224 --- /dev/null +++ b/fet2020/tasks/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TasksConfig(AppConfig): + name = 'tasks' diff --git a/fet2020/tasks/forms.py b/fet2020/tasks/forms.py new file mode 100644 index 00000000..40dd047c --- /dev/null +++ b/fet2020/tasks/forms.py @@ -0,0 +1,14 @@ +from django import forms + +from .models import Task + + +class TaskForm(forms.ModelForm): + class Meta: + model = Task + + fields = [ + 'title', + 'task_list', + 'due_date', + ] diff --git a/fet2020/tasks/models.py b/fet2020/tasks/models.py new file mode 100644 index 00000000..e6ec0e64 --- /dev/null +++ b/fet2020/tasks/models.py @@ -0,0 +1,67 @@ +from django.conf import settings +from django.db import models +from django.db.models import Q + + +class TaskQuerySet(models.QuerySet): + def get_ordered(self): + return self.order_by('task_list') + + +class TaskManager(models.Manager): + def get_tasks(self, user, completed): + if completed: + return self.get_queryset().get_ordered().filter(Q(assigned_to=user)) + else: + return self.get_queryset().get_ordered().filter( + Q(assigned_to=user) + & Q(completed=completed) + ) + + def get_queryset(self): + return TaskQuerySet(self.model, using=self._db) + + +class TaskList(models.Model): + name = models.CharField(max_length=60) + slug = models.SlugField(unique=True, null=True, blank=True) + + objects = models.Manager() + + def __str__(self): + return self.name + + +class Task(models.Model): + title = models.CharField(max_length=140) + task_list = models.ForeignKey(TaskList, on_delete=models.CASCADE, null=True) + + created_date = models.DateTimeField(auto_now_add=True) + due_date = models.DateField(blank=True, null=True) + + completed = models.BooleanField(default=False) + completed_date = models.DateField(blank=True, null=True) + + created_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + null=True, + blank=True, + related_name="todo_created_by", + on_delete=models.CASCADE, + ) + assigned_to = models.ForeignKey( + settings.AUTH_USER_MODEL, + blank=True, + null=True, + related_name="todo_assigned_to", + on_delete=models.CASCADE, + ) + + note = models.TextField(blank=True, null=True) + priority = models.PositiveIntegerField(blank=True, null=True) + + objects = models.Manager() + taskmanager = TaskManager() + + def __str__(self): + return self.title diff --git a/fet2020/tasks/tests.py b/fet2020/tasks/tests.py new file mode 100644 index 00000000..a79ca8be --- /dev/null +++ b/fet2020/tasks/tests.py @@ -0,0 +1,3 @@ +# from django.test import TestCase + +# Create your tests here. diff --git a/fet2020/tasks/urls.py b/fet2020/tasks/urls.py new file mode 100644 index 00000000..f1eab942 --- /dev/null +++ b/fet2020/tasks/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from . import views + + +urlpatterns = [ + path('', views.index, name='tasks'), +] diff --git a/fet2020/tasks/views.py b/fet2020/tasks/views.py new file mode 100644 index 00000000..ea1898dc --- /dev/null +++ b/fet2020/tasks/views.py @@ -0,0 +1,56 @@ +from django.contrib.auth.models import User +from django.shortcuts import render +from django.utils import timezone + +from collections import deque + +from .forms import TaskForm +from .models import Task + + +def index(request): + current_user = request.user.id + current_action = False + + if request.method == 'POST': + if 'btn_input' in request.POST: + form = TaskForm(request.POST) + + if form.is_valid(): + task = form.save(commit=False) + + task.created_by = request.user + task.assigned_to = request.user + + task.save() + + elif 'btn_checkbox' in request.POST: + for task_id in request.POST.getlist('checkbox'): + task = Task.objects.get(id=task_id) + + if not task.completed: + task.completed = True + task.completed_date = timezone.now().date() + task.save() + + elif 'btn_user' in request.POST: + if request.POST['action'] == 'show_incompleted': + current_action = False + else: + current_action = True + + current_user = int(request.POST['user']) + + form = TaskForm() + tasks = deque(Task.taskmanager.get_tasks(user=current_user, completed=current_action)) + users = User.objects.all() + + context = { + "form": form, + "tasks": tasks, + "users": users, + "current_user": current_user, + "current_action": current_action, + } + + return render(request, 'tasks/index.html', context) diff --git a/fet2020/templates/tasks/index.html b/fet2020/templates/tasks/index.html new file mode 100644 index 00000000..a05d571b --- /dev/null +++ b/fet2020/templates/tasks/index.html @@ -0,0 +1,75 @@ +{% extends 'layout.html' %} +{% block content %} + +
+

Tasks

+ +
+
+ {% csrf_token %} + + + + +
+
+ +
+ +
+ {% csrf_token %} + + {% regroup tasks by task_list as section_list %} + {% for group in section_list %} + +
+
    + +

    {{ group.grouper }}

    + + {% for task in group.list %} + + + {{ task.title|truncatewords:10 }} + + {{ task.due_date|date:"d.m.Y" }} + +
    + {% endfor %} + +
+ + {% endfor %} + + +
+ +
+ +
+ +
+

neue Tasks hinzufügen

+ {% csrf_token %} + {{ form }} + +
+ +
+ +
+ +{% endblock %}