62 lines
2.5 KiB
Python
62 lines
2.5 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})
|