diff --git a/fet2020/tasks/admin.py b/fet2020/tasks/admin.py index 3e8760f6..2cd39c50 100644 --- a/fet2020/tasks/admin.py +++ b/fet2020/tasks/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin +from .forms import TaskListForm from .models import Task, TaskList @@ -19,7 +20,14 @@ class TaskAdmin(admin.ModelAdmin): ) }), ) - list_display = ('title', 'task_list', 'completed', 'priority', 'due_date') + list_display = ( + 'title', + 'task_list', + 'completed', + 'priority', + 'due_date', + 'assigned_to', + ) list_filter = ('task_list', ) ordering = ('priority', ) search_fields = ('title', ) @@ -29,5 +37,10 @@ class TaskAdmin(admin.ModelAdmin): super().save_model(request, obj, form, change) -admin.site.register(TaskList) +class TaskListAdmin(admin.ModelAdmin): + form = TaskListForm + model = TaskList + + +admin.site.register(TaskList, TaskListAdmin) admin.site.register(Task, TaskAdmin) diff --git a/fet2020/tasks/forms.py b/fet2020/tasks/forms.py index e4097c02..22333055 100644 --- a/fet2020/tasks/forms.py +++ b/fet2020/tasks/forms.py @@ -1,7 +1,13 @@ from django import forms +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth.models import User from django.utils.translation import gettext_lazy as _ -from .models import Task +from .models import Task, TaskList + + +class DateInput(forms.DateInput): + input_type = 'date' class TaskForm(forms.ModelForm): @@ -22,6 +28,16 @@ class TaskForm(forms.ModelForm): 'assigned_to': _('Zuweisen an'), } + widgets = { + 'due_date': DateInput( + format=('%d-%m-%Y'), + ) + } + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # to get the self.fields set self.fields['assigned_to'].empty_label = "Alle" + + +class TaskListForm(forms.ModelForm): + users = forms.ModelMultipleChoiceField(queryset=User.objects.all(), widget=FilteredSelectMultiple("User", is_stacked=False)) diff --git a/fet2020/tasks/models.py b/fet2020/tasks/models.py index 58e9d18a..8dddc863 100644 --- a/fet2020/tasks/models.py +++ b/fet2020/tasks/models.py @@ -1,4 +1,5 @@ from django.conf import settings +from django.contrib.auth.models import User from django.db import models from django.db.models import Q from django.utils import timezone @@ -10,14 +11,20 @@ class TaskQuerySet(models.QuerySet): 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_tasks(self, user, completed, task_list, all_tasks): + # None ... assigned to all users + qs_comp = self.get_queryset().get_ordered().filter(assigned_to=user) + + if all_tasks: + qs_comp |= self.get_queryset().get_ordered().filter(Q(assigned_to=None) & Q(task_list__users=user)) + + if not completed: + qs_comp = qs_comp.filter(completed=completed) + + if task_list: + qs_comp = qs_comp.filter(task_list=task_list) + + return qs_comp def get_queryset(self): return TaskQuerySet(self.model, using=self._db) @@ -27,6 +34,8 @@ class TaskList(models.Model): name = models.CharField(max_length=60) slug = models.SlugField(unique=True, null=True, blank=True) + users = models.ManyToManyField(User, blank=True) + objects = models.Manager() def __str__(self): diff --git a/fet2020/tasks/views.py b/fet2020/tasks/views.py index 679f3b5f..df098abc 100644 --- a/fet2020/tasks/views.py +++ b/fet2020/tasks/views.py @@ -1,3 +1,4 @@ +from django.contrib import messages from django.contrib.auth.models import User from django.shortcuts import render from django.utils import timezone @@ -5,12 +6,14 @@ from django.utils import timezone from collections import deque from .forms import TaskForm -from .models import Task +from .models import Task, TaskList def index(request): current_user = request.user.id current_action = False + show_tasklist = None + show_all_tasks = True if request.method == 'POST': if 'btn_input' in request.POST: @@ -18,8 +21,16 @@ def index(request): if form.is_valid(): task = form.save(commit=False) - task.created_by = request.user - task.save() + + if task.assigned_to: + if TaskList.objects.filter(users=task.assigned_to): + task.created_by = request.user + task.save() + else: + messages.info(request, "User '{}' ist nicht in der Liste von Task-Gruppe '{}'.".format(task.assigned_to, task.task_list.name)) + else: + task.created_by = request.user + task.save() elif 'btn_checkbox' in request.POST: for task_id in request.POST.getlist('checkbox'): @@ -36,19 +47,27 @@ def index(request): else: current_action = True - if request.POST['user'] == 'all': - current_user = None + if request.POST['tasklist'] != 'all': + show_tasklist = TaskList.objects.filter(id=request.POST['tasklist']).first() + + if request.POST['tasks'] == 'all': + show_all_tasks = True else: - current_user = int(request.POST['user']) + show_all_tasks = False form = TaskForm() - tasks = deque(Task.taskmanager.get_tasks(user=current_user, completed=current_action)) - users = User.objects.all() + tasks = deque(Task.taskmanager.get_tasks( + user=current_user, + completed=current_action, + task_list=show_tasklist, + all_tasks=show_all_tasks + )) + tasklists = deque(TaskList.objects.all()) context = { "formset": form, "tasks": tasks, - "users": users, + "tasklists": tasklists, "current_user": current_user, "current_action": current_action, } diff --git a/fet2020/templates/tasks/index.html b/fet2020/templates/tasks/index.html index 6af0cd7f..4c731910 100644 --- a/fet2020/templates/tasks/index.html +++ b/fet2020/templates/tasks/index.html @@ -3,63 +3,73 @@