Skip to content

Commit af7a17c

Browse files
committed
tasks added
1 parent a089db8 commit af7a17c

24 files changed

+588
-111
lines changed

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,6 @@ build:
1818

1919
lint:
2020
uv run ruff check --fix
21+
22+
test:
23+
uv run pytest -v

accounts/tests/test_users_crud.py

Lines changed: 0 additions & 93 deletions
This file was deleted.

accounts/views.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from django.views.generic import ListView, UpdateView, DeleteView
88
from django.urls import reverse_lazy
99
from django.views.generic import CreateView
10+
11+
from tasks.models import Task
1012
from .forms import CustomUserCreationForm
1113

1214

@@ -50,14 +52,30 @@ def form_valid(self, form):
5052
return response
5153

5254

53-
class UserDeleteView(LoginRequiredMixin, OnlySelfMixin, DeleteView):
55+
class UserDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
5456
model = User
55-
template_name = "users/delete.html"
57+
template_name = "users/confirm_delete.html"
5658
success_url = reverse_lazy("users:list")
59+
login_url = "users:login"
60+
61+
def test_func(self):
62+
return self.get_object().pk == self.request.user.pk
5763

58-
def delete(self, request, *args, **kwargs):
59-
messages.success(self.request, "Пользователь успешно удалён.")
60-
return super().delete(request, *args, **kwargs)
64+
def handle_no_permission(self):
65+
if self.request.user.is_authenticated:
66+
messages.error(self.request, "Можно удалять только свой аккаунт.")
67+
return redirect("users:list")
68+
return super().handle_no_permission()
69+
70+
def dispatch(self, request, *args, **kwargs):
71+
user = self.get_object()
72+
if hasattr(user, "created_tasks") and user.created_tasks.exists():
73+
messages.error(request, "Нельзя удалить пользователя, связанного с задачами.")
74+
return redirect("users:list")
75+
if hasattr(user, "executed_tasks") and user.executed_tasks.exists():
76+
messages.error(request, "Нельзя удалить пользователя, связанного с задачами.")
77+
return redirect("users:list")
78+
return super().dispatch(request, *args, **kwargs)
6179

6280

6381
class UserLoginView(LoginView):

db.sqlite3

16 KB
Binary file not shown.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies = [
1212
"whitenoise",
1313
"django-bootstrap5>=25.2",
1414
"pytest>=8.4.2",
15+
"pytest-django>=4.11.1",
1516
]
1617

1718
[dependency-groups]

pytest.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[pytest]
2+
DJANGO_SETTINGS_MODULE = task_manager.settings
3+
python_files = tests.py test_*.py *_tests.py

statuses/views.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ class StatusListView(LoginRequiredMixin, ListView):
1111
model = Status
1212
template_name = "statuses/index.html"
1313
context_object_name = "statuses"
14-
login_url = "login"
14+
login_url = "users:login"
1515

1616
class StatusCreateView(LoginRequiredMixin, CreateView):
1717
model = Status
1818
form_class = StatusForm
1919
template_name = "statuses/form.html"
2020
success_url = reverse_lazy("statuses_index")
21-
login_url = "login"
21+
login_url = "users:login"
2222

2323
def form_valid(self, form):
2424
messages.success(self.request, "Статус создан.")
@@ -29,17 +29,18 @@ class StatusUpdateView(LoginRequiredMixin, UpdateView):
2929
form_class = StatusForm
3030
template_name = "statuses/form.html"
3131
success_url = reverse_lazy("statuses_index")
32-
login_url = "login"
32+
login_url = "users:login"
3333

3434
def form_valid(self, form):
3535
messages.success(self.request, "Статус обновлён.")
3636
return super().form_valid(form)
3737

38+
3839
class StatusDeleteView(LoginRequiredMixin, DeleteView):
3940
model = Status
4041
template_name = "statuses/confirm_delete.html"
4142
success_url = reverse_lazy("statuses_index")
42-
login_url = "login"
43+
login_url = "users:login"
4344

4445
def post(self, request, *args, **kwargs):
4546
try:

task_manager/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@
2323
path("", views.index, name="home"),
2424
path("users/", include("accounts.urls", namespace="users")),
2525
path("statuses/", include("statuses.urls")),
26+
path("tasks/", include("tasks.urls")),
2627
]

tasks/forms.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from django import forms
2+
from .models import Task
3+
4+
5+
class TaskForm(forms.ModelForm):
6+
class Meta:
7+
model = Task
8+
fields = ["name", "description", "status", "executor"]
9+
widgets = {
10+
"name": forms.TextInput(attrs={"class": "form-control"}),
11+
"description": forms.Textarea(attrs={"class": "form-control", "rows": 4}),
12+
"status": forms.Select(attrs={"class": "form-select"}),
13+
"executor": forms.Select(attrs={"class": "form-select"}),
14+
}

tasks/models.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,18 @@
1+
from django.db import models
2+
from django.contrib.auth.models import User
3+
from statuses.models import Status
14

2-
# Create your models here.
5+
6+
class Task(models.Model):
7+
name = models.CharField(max_length=150)
8+
description = models.TextField(blank=True)
9+
status = models.ForeignKey(Status, on_delete=models.PROTECT, related_name="tasks")
10+
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name="created_tasks")
11+
executor = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True, related_name="executed_tasks")
12+
created_at = models.DateTimeField(auto_now_add=True)
13+
14+
class Meta:
15+
ordering = ["id"]
16+
17+
def __str__(self):
18+
return self.name

0 commit comments

Comments
 (0)