added the rest that was missing from the last commit
This commit is contained in:
0
fet2020/tasks/__init__.py
Normal file
0
fet2020/tasks/__init__.py
Normal file
20
fet2020/tasks/admin.py
Normal file
20
fet2020/tasks/admin.py
Normal file
@@ -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)
|
||||
5
fet2020/tasks/apps.py
Normal file
5
fet2020/tasks/apps.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class TasksConfig(AppConfig):
|
||||
name = 'tasks'
|
||||
14
fet2020/tasks/forms.py
Normal file
14
fet2020/tasks/forms.py
Normal file
@@ -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',
|
||||
]
|
||||
67
fet2020/tasks/models.py
Normal file
67
fet2020/tasks/models.py
Normal file
@@ -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
|
||||
3
fet2020/tasks/tests.py
Normal file
3
fet2020/tasks/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
# from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
8
fet2020/tasks/urls.py
Normal file
8
fet2020/tasks/urls.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.urls import path
|
||||
|
||||
from . import views
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.index, name='tasks'),
|
||||
]
|
||||
56
fet2020/tasks/views.py
Normal file
56
fet2020/tasks/views.py
Normal file
@@ -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)
|
||||
75
fet2020/templates/tasks/index.html
Normal file
75
fet2020/templates/tasks/index.html
Normal file
@@ -0,0 +1,75 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% block content %}
|
||||
|
||||
<div class="grid-container">
|
||||
<h1>Tasks</h1>
|
||||
|
||||
<div class="grid-x">
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<label>User
|
||||
<select id="id_user" name="user">
|
||||
{% for user in users %}
|
||||
<option value="{{ user.id }}" {% if current_user == user.id %} selected {% endif %}>
|
||||
{{ user.username }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label>Aktion
|
||||
<select id="id_action" name="action">
|
||||
<option value="show_incompleted" {% if not current_action %} selected {% endif %}>unvollständige Tasks</option>
|
||||
<option value="show_all" {% if current_action %} selected {% endif %}>alle Tasks</option>
|
||||
</select>
|
||||
</label>
|
||||
<input type="submit" class="button" name="btn_user" value="Anzeigen">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="grid-x">
|
||||
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
{% regroup tasks by task_list as section_list %}
|
||||
{% for group in section_list %}
|
||||
|
||||
<div class="cell">
|
||||
<ul class="no-bullet">
|
||||
|
||||
<h3>{{ group.grouper }}</h3>
|
||||
|
||||
{% for task in group.list %}
|
||||
<input type="checkbox" name="checkbox" value="{{ task.id }}" {% if task.completed %} checked {% endif %}>
|
||||
|
||||
{{ task.title|truncatewords:10 }}</a>
|
||||
|
||||
{{ task.due_date|date:"d.m.Y" }}
|
||||
|
||||
<br>
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
<input type="submit" class="button" name="btn_checkbox" value="Task abschließen">
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid-x">
|
||||
|
||||
<form action="" method="post">
|
||||
<h2>neue Tasks hinzufügen</h2>
|
||||
{% csrf_token %}
|
||||
{{ form }}
|
||||
<input type="submit" class="button" name="btn_input" value="Hinzufügen">
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user