From 88bc6ebf8f0aae48e8c48a27a766a77a548d3149 Mon Sep 17 00:00:00 2001 From: Olga Akukin <106934645+olyapka84@users.noreply.github.com> Date: Fri, 10 Oct 2025 16:31:40 +0200 Subject: [PATCH] Refine task and status navigation consistency --- task_manager/statuses/urls.py | 18 +++++++++++------- task_manager/statuses/views.py | 17 +++++++++-------- task_manager/tasks/filters.py | 13 ++++++------- task_manager/tasks/forms.py | 9 ++++----- task_manager/tasks/models.py | 18 +++++++++++++----- task_manager/tasks/urls.py | 19 +++++++++++++------ task_manager/tasks/views.py | 10 +++++----- task_manager/templates/base.html | 4 ++-- .../templates/statuses/confirm_delete.html | 2 +- task_manager/templates/statuses/form.html | 2 +- task_manager/templates/statuses/index.html | 6 +++--- .../templates/tasks/confirm_delete.html | 2 +- task_manager/templates/tasks/detail.html | 6 +++--- task_manager/templates/tasks/form.html | 2 +- task_manager/templates/tasks/index.html | 8 ++++---- task_manager/users/utils.py | 9 +++++++++ 16 files changed, 86 insertions(+), 59 deletions(-) create mode 100644 task_manager/users/utils.py diff --git a/task_manager/statuses/urls.py b/task_manager/statuses/urls.py index 16f19af..8393cab 100644 --- a/task_manager/statuses/urls.py +++ b/task_manager/statuses/urls.py @@ -1,13 +1,17 @@ from django.urls import path + from .views import ( - StatusListView, StatusCreateView, StatusUpdateView, StatusDeleteView + StatusCreateView, + StatusDeleteView, + StatusListView, + StatusUpdateView, ) +app_name = "statuses" + urlpatterns = [ - path("", StatusListView.as_view(), name="statuses_index"), - path("create/", StatusCreateView.as_view(), name="statuses_create"), - path("/update/", StatusUpdateView.as_view(), - name="statuses_update"), - path("/delete/", StatusDeleteView.as_view(), - name="statuses_delete"), + path("", StatusListView.as_view(), name="index"), + path("create/", StatusCreateView.as_view(), name="create"), + path("/update/", StatusUpdateView.as_view(), name="update"), + path("/delete/", StatusDeleteView.as_view(), name="delete"), ] diff --git a/task_manager/statuses/views.py b/task_manager/statuses/views.py index 97324e1..e1fb3fb 100644 --- a/task_manager/statuses/views.py +++ b/task_manager/statuses/views.py @@ -2,7 +2,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import redirect from django.urls import reverse_lazy -from django.views.generic import ListView, CreateView, UpdateView, DeleteView +from django.views.generic import CreateView, DeleteView, ListView, UpdateView from .models import Status from .forms import StatusForm @@ -19,7 +19,7 @@ class StatusCreateView(LoginRequiredMixin, CreateView): model = Status form_class = StatusForm template_name = "statuses/form.html" - success_url = reverse_lazy("statuses_index") + success_url = reverse_lazy("statuses:index") login_url = "users:login" def form_valid(self, form): @@ -31,7 +31,7 @@ class StatusUpdateView(LoginRequiredMixin, UpdateView): model = Status form_class = StatusForm template_name = "statuses/form.html" - success_url = reverse_lazy("statuses_index") + success_url = reverse_lazy("statuses:index") login_url = "users:login" def form_valid(self, form): @@ -42,16 +42,17 @@ def form_valid(self, form): class StatusDeleteView(LoginRequiredMixin, DeleteView): model = Status template_name = "statuses/confirm_delete.html" - success_url = reverse_lazy("statuses_index") + success_url = reverse_lazy("statuses:index") login_url = "users:login" def post(self, request, *args, **kwargs): status = self.get_object() if status.tasks.exists(): - messages.error(request, - "Невозможно удалить статус, " - "потому что он используется") - return redirect("statuses_index") + messages.error( + request, + "Невозможно удалить статус, потому что он используется", + ) + return redirect("statuses:index") response = super().post(request, *args, **kwargs) messages.success(request, "Статус успешно удален") return response diff --git a/task_manager/tasks/filters.py b/task_manager/tasks/filters.py index 832b6ad..cc095b0 100644 --- a/task_manager/tasks/filters.py +++ b/task_manager/tasks/filters.py @@ -1,10 +1,12 @@ -# tasks/filters.py import django_filters as df from django import forms from django.contrib.auth import get_user_model -from .models import Task -from task_manager.statuses.models import Status + from task_manager.labels.models import Label +from task_manager.statuses.models import Status +from task_manager.users.utils import format_user_display + +from .models import Task User = get_user_model() @@ -40,10 +42,7 @@ def __init__(self, data=None, queryset=None, request=None, **kwargs): super().__init__(data=data, queryset=queryset, request=request, **kwargs) self.request = request - self.filters["executor"].field.label_from_instance = ( - lambda u: (u.get_full_name().strip() - if (u.get_full_name() or "").strip() else u.username) - ) + self.filters["executor"].field.label_from_instance = format_user_display def filter_self_tasks(self, queryset, name, value): return queryset.filter(author=self.request.user) if value else queryset diff --git a/task_manager/tasks/forms.py b/task_manager/tasks/forms.py index a2f5909..520b3a3 100644 --- a/task_manager/tasks/forms.py +++ b/task_manager/tasks/forms.py @@ -1,5 +1,8 @@ from django import forms from django.contrib.auth import get_user_model + +from task_manager.users.utils import format_user_display + from .models import Task User = get_user_model() @@ -29,8 +32,4 @@ class Meta: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["executor"].queryset = User.objects.all().order_by("id") - - def user_label(u): - full = (u.get_full_name() or "").strip() - return full if full else u.username - self.fields["executor"].label_from_instance = user_label + self.fields["executor"].label_from_instance = format_user_display diff --git a/task_manager/tasks/models.py b/task_manager/tasks/models.py index 5a78268..6da6785 100644 --- a/task_manager/tasks/models.py +++ b/task_manager/tasks/models.py @@ -1,5 +1,5 @@ +from django.conf import settings from django.db import models -from django.contrib.auth.models import User from task_manager.labels.models import Label from task_manager.statuses.models import Status @@ -10,10 +10,18 @@ class Task(models.Model): description = models.TextField(blank=True) status = models.ForeignKey(Status, on_delete=models.PROTECT, related_name="tasks") - author = models.ForeignKey(User, on_delete=models.PROTECT, - related_name="created_tasks") - executor = models.ForeignKey(User, on_delete=models.PROTECT, null=True, - blank=True, related_name="executed_tasks") + author = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.PROTECT, + related_name="created_tasks", + ) + executor = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.PROTECT, + null=True, + blank=True, + related_name="executed_tasks", + ) created_at = models.DateTimeField(auto_now_add=True) labels = models.ManyToManyField(Label, related_name="labeled_tasks", blank=True) diff --git a/task_manager/tasks/urls.py b/task_manager/tasks/urls.py index 3aa41ba..d6b6dce 100644 --- a/task_manager/tasks/urls.py +++ b/task_manager/tasks/urls.py @@ -1,12 +1,19 @@ from django.urls import path + from .views import ( - TaskListView, TaskCreateView, TaskUpdateView, TaskDeleteView, TaskDetailView + TaskCreateView, + TaskDeleteView, + TaskDetailView, + TaskListView, + TaskUpdateView, ) +app_name = "tasks" + urlpatterns = [ - path("", TaskListView.as_view(), name="tasks_index"), - path("create/", TaskCreateView.as_view(), name="tasks_create"), - path("/", TaskDetailView.as_view(), name="tasks_detail"), - path("/update/", TaskUpdateView.as_view(), name="tasks_update"), - path("/delete/", TaskDeleteView.as_view(), name="tasks_delete"), + path("", TaskListView.as_view(), name="index"), + path("create/", TaskCreateView.as_view(), name="create"), + path("/", TaskDetailView.as_view(), name="detail"), + path("/update/", TaskUpdateView.as_view(), name="update"), + path("/delete/", TaskDeleteView.as_view(), name="delete"), ] diff --git a/task_manager/tasks/views.py b/task_manager/tasks/views.py index aacb5ef..4251599 100644 --- a/task_manager/tasks/views.py +++ b/task_manager/tasks/views.py @@ -2,7 +2,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.shortcuts import redirect from django.urls import reverse_lazy -from django.views.generic import CreateView, UpdateView, DeleteView, DetailView +from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from django_filters.views import FilterView from .filters import TaskFilter @@ -37,7 +37,7 @@ class TaskCreateView(LoginRequiredMixin, CreateView): model = Task form_class = TaskForm template_name = "tasks/form.html" - success_url = reverse_lazy("tasks_index") + success_url = reverse_lazy("tasks:index") login_url = "users:login" def form_valid(self, form): @@ -50,7 +50,7 @@ class TaskUpdateView(LoginRequiredMixin, UpdateView): model = Task form_class = TaskForm template_name = "tasks/form.html" - success_url = reverse_lazy("tasks_index") + success_url = reverse_lazy("tasks:index") login_url = "users:login" def form_valid(self, form): @@ -61,7 +61,7 @@ def form_valid(self, form): class TaskDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView): model = Task template_name = "tasks/confirm_delete.html" - success_url = reverse_lazy("tasks_index") + success_url = reverse_lazy("tasks:index") login_url = "users:login" def test_func(self): @@ -70,7 +70,7 @@ def test_func(self): def handle_no_permission(self): if self.request.user.is_authenticated: messages.error(self.request, "Задачу может удалить только ее автор") - return redirect("tasks_index") + return redirect("tasks:index") return super().handle_no_permission() def post(self, request, *args, **kwargs): diff --git a/task_manager/templates/base.html b/task_manager/templates/base.html index 1c1618c..3e9920d 100644 --- a/task_manager/templates/base.html +++ b/task_manager/templates/base.html @@ -39,10 +39,10 @@ {% if user.is_authenticated %}