Files
timerr/apps/tasks/views.py
T

74 lines
2.9 KiB
Python

from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.shortcuts import get_object_or_404, redirect, render
from .forms import TaskForm
from .models import Task
def visible_tasks(user):
queryset = Task.objects.select_related("project__company", "assignee")
return queryset if user.is_app_admin else queryset.filter(assignee=user)
@login_required
def task_list(request):
tasks = visible_tasks(request.user)
if request.GET.get("status"):
tasks = tasks.filter(status=request.GET["status"])
if request.GET.get("month"):
year, month = map(int, request.GET["month"].split("-"))
tasks = tasks.filter(work_date__year=year, work_date__month=month)
return render(request, "tasks/task_list.html", {"tasks": tasks, "statuses": Task.Status.choices})
@login_required
@transaction.atomic
def task_create(request):
form = TaskForm(request.POST or None, user=request.user)
if request.method == "POST" and form.is_valid():
task = form.save(commit=False)
task.created_by = request.user
if not request.user.is_app_admin:
task.assignee = request.user
task.apply_current_rate()
task.full_clean()
task.save()
return redirect("task-list")
return render(request, "tasks/task_form.html", {"form": form, "heading": "Новая задача"})
@login_required
@transaction.atomic
def task_edit(request, pk):
task = get_object_or_404(Task.objects.select_related("project__company", "assignee"), pk=pk)
if not request.user.is_app_admin and task.assignee_id != request.user.id:
raise PermissionDenied
old_scope = (task.project_id, task.assignee_id)
form = TaskForm(request.POST or None, instance=task, user=request.user)
if request.method == "POST" and form.is_valid():
task = form.save(commit=False)
if not request.user.is_app_admin:
task.assignee = request.user
if old_scope != (task.project_id, task.assignee_id):
task.apply_current_rate()
elif {"duration_hours", "duration_minutes_input"} & set(form.changed_data):
task.amount = task.calculate_amount(task.duration_minutes, task.hourly_rate)
task.full_clean()
task.save()
return redirect("task-list")
return render(request, "tasks/task_form.html", {"form": form, "heading": "Редактирование задачи", "task": task})
@login_required
@transaction.atomic
def task_delete(request, pk):
task = get_object_or_404(Task.objects.select_related("project__company", "assignee"), pk=pk)
if not request.user.is_app_admin and task.assignee_id != request.user.id:
raise PermissionDenied
if request.method == "POST":
task.delete()
return redirect("task-list")
return render(request, "tasks/task_confirm_delete.html", {"task": task})