Skip to content

Commit a143a04

Browse files
committed
change forms,models,views with bs5
1 parent b375f51 commit a143a04

File tree

26 files changed

+685
-293
lines changed

26 files changed

+685
-293
lines changed

db.sqlite3

0 Bytes
Binary file not shown.

task_manager/labels/forms.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
from django import forms
22
from .models import Label
3+
from django.utils.translation import gettext_lazy as _
34

45

5-
class LabelForm(forms.ModelForm):
6+
class CreateLabelForm(forms.ModelForm):
7+
name = forms.CharField(max_length=40, label=_("Name"))
8+
69
class Meta:
710
model = Label
8-
fields = ['name']
11+
fields = ("name",)

task_manager/labels/urls.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from django.urls import path
2-
from task_manager.labels.views import LabelListView, LabelCreateView, LabelUpdateView, LabelDeleteView
2+
from .views import LabelView, CreateLabelView, UpdateLabelView, DeleteLabelView
33

4+
app_name = "labels"
45

56
urlpatterns = [
6-
path('labels/', LabelListView.as_view(), name='label-list'),
7-
path('labels/create/', LabelCreateView.as_view(), name='label-create'),
8-
path('labels/<int:pk>/update/', LabelUpdateView.as_view(), name='label-update'),
9-
path('labels/<int:pk>/delete/', LabelDeleteView.as_view(), name='label-delete'),
7+
path("", LabelView.as_view(), name="label_list"),
8+
path("create/", CreateLabelView.as_view(), name="create_label"),
9+
path("<int:pk>/delete/", DeleteLabelView.as_view(), name="delete_label"),
10+
path("<int:pk>/update/", UpdateLabelView.as_view(), name="update_label"),
1011
]

task_manager/labels/views.py

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,41 @@
1-
from django.contrib.auth.mixins import LoginRequiredMixin
2-
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
3-
from django.urls import reverse_lazy, reverse
4-
from django.contrib import messages
1+
# from django.shortcuts import render
52
from .models import Label
6-
from .forms import LabelForm
7-
from django.shortcuts import redirect
8-
from django.contrib.messages.views import SuccessMessageMixin
3+
from .forms import CreateLabelForm
94

5+
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
6+
from django.contrib.messages.views import SuccessMessageMixin
7+
from django.contrib.auth.mixins import LoginRequiredMixin
8+
from django.urls import reverse_lazy
9+
from django.utils.translation import gettext_lazy as _
1010

11-
class LabelListView(LoginRequiredMixin, ListView):
12-
model = Label
13-
template_name = 'labels/label_list.html'
14-
context_object_name = 'labels'
1511

16-
class LabelCreateView(LoginRequiredMixin, CreateView):
12+
class LabelView(ListView):
1713
model = Label
18-
form_class = LabelForm
19-
template_name = 'labels/label_form.html'
20-
success_url = reverse_lazy('label-list')
21-
22-
def form_valid(self, form):
23-
messages.success(self.request, "Метка успешно создана")
24-
return super().form_valid(form)
25-
26-
27-
# class LabelListView(LoginRequiredMixin, ListView):
28-
# model = Label
29-
# template_name = 'labels/label_list.html'
30-
# context_object_name = 'labels'
14+
context_object_name = "label_list"
15+
template_name = "labels/label_list.html"
3116

3217

33-
# class LabelCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
34-
# model = Label
35-
# form_class = LabelForm
36-
# template_name = 'labels/label_form.html'
37-
# success_url = reverse_lazy('label-list')
38-
# success_message = "Метка успешно создана"
18+
class CreateLabelView(SuccessMessageMixin, CreateView):
19+
template_name = "labels/create.html"
20+
success_url = reverse_lazy("labels:label_list")
21+
form_class = CreateLabelForm
22+
success_message = _("Label created successfully")
3923

4024

41-
class LabelUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
25+
class UpdateLabelView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
4226
model = Label
43-
form_class = LabelForm
44-
template_name = 'labels/label_form.html'
45-
success_url = reverse_lazy('label-list')
46-
success_message = "Метка успешно изменена"
27+
success_url = reverse_lazy("labels:label_list")
28+
template_name = "labels/update.html"
29+
form_class = CreateLabelForm
30+
success_message = _("Label updated successfully")
31+
login_url = reverse_lazy("labels:label_list")
32+
redirect_field_name = None
4733

4834

49-
class LabelDeleteView(LoginRequiredMixin, DeleteView):
35+
class DeleteLabelView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
5036
model = Label
51-
template_name = 'labels/label_confirm_delete.html'
52-
success_url = reverse_lazy('label-list')
53-
54-
def form_valid(self, form):
55-
if self.object.tasks.exists():
56-
messages.error(self.request, "Нельзя удалить метку, связанную с задачами")
57-
return redirect(reverse('label-list'))
58-
messages.success(self.request, "Метка успешно удалена")
59-
return super().form_valid(form)
37+
success_url = reverse_lazy("labels:label_list")
38+
template_name = "labels/delete.html"
39+
success_message = _("Label deleted successfully")
40+
login_url = reverse_lazy("login")
41+
redirect_field_name = None

task_manager/mixins.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from django.shortcuts import redirect
2+
from django.urls import reverse
3+
from django.contrib import messages
4+
from django.utils.translation import gettext_lazy as _
5+
from django.contrib.auth.mixins import LoginRequiredMixin
6+
7+
8+
class LoginRequiredRedirectMixin(LoginRequiredMixin):
9+
message_not_authenticated = _(
10+
'You are not login. Please, login')
11+
redirect_url_name = 'login'
12+
13+
def handle_no_permission(self):
14+
messages.warning(self.request, self.message_not_authenticated)
15+
return redirect(reverse(self.redirect_url_name))
16+
17+
18+
class ObjectUnusedRequaredMixin:
19+
'''
20+
Check object's usage in some task.
21+
If is used - redirect with message.
22+
Attrs: message_used_object: str, url_name_object_used,
23+
message_success: str, url_name_success: str
24+
'''
25+
message_used_object = _('Unable to delete because it is used in task!')
26+
url_name_object_used = "main_page"
27+
message_object_has_not_attr = _(
28+
'Enternal error: Unable to delete object!')
29+
report_message = _("Object has not attr is_object_in_use")
30+
31+
def form_valid(self, form):
32+
if not hasattr(self.object, 'is_object_in_use'):
33+
return super().form_valid(form)
34+
if self.object.is_object_in_use():
35+
messages.warning(self.request, self.message_used_object)
36+
return redirect(reverse(self.url_name_object_used))
37+
return super().form_valid(form)

task_manager/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@
9999

100100
WSGI_APPLICATION = 'task_manager.wsgi.application'
101101

102-
LOGOUT_REDIRECT_URL = '/'
102+
LOGIN_REDIRECT_URL = "index"
103+
LOGOUT_REDIRECT_URL = "index"
103104

104105

105106

task_manager/statuses/forms.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from django import forms
2-
from task_manager.statuses.models import Status
2+
from .models import Status
3+
from django.utils.translation import gettext_lazy as _
34

45

5-
class StatusForm(forms.ModelForm):
6+
class CreateStatusForm(forms.ModelForm):
7+
name = forms.CharField(max_length=30, label=_("Name"))
8+
69
class Meta:
710
model = Status
8-
fields = ['name']
9-
10-
11+
fields = ("name",)

task_manager/statuses/urls.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from django.urls import path
2-
from task_manager.statuses.views import StatusListView, StatusCreateView, StatusUpdateView, StatusDeleteView
2+
from .views import StatusView, CreateStatusView, UpdateStatusView, DeleteStatusView
33

4+
app_name = "statuses"
45

56
urlpatterns = [
6-
path('statuses/', StatusListView.as_view(), name='status-list'),
7-
path('statuses/create/', StatusCreateView.as_view(), name='status-create'),
8-
path('statuses/<int:pk>/update/', StatusUpdateView.as_view(), name='status-update'),
9-
path('status/update/<int:pk>/', StatusUpdateView.as_view(), name='status-update'),
10-
path('statuses/<int:pk>/delete/', StatusDeleteView.as_view(), name='status-delete'),
7+
path("", StatusView.as_view(), name="status_list"),
8+
path("create/", CreateStatusView.as_view(), name="create_status"),
9+
path("<int:pk>/delete/", DeleteStatusView.as_view(), name="delete_status"),
10+
path("<int:pk>/update/", UpdateStatusView.as_view(), name="update_status"),
1111
]

task_manager/statuses/views.py

Lines changed: 41 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,48 @@
1-
from django.contrib.auth.mixins import LoginRequiredMixin
2-
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
1+
# from django.shortcuts import render
32
from django.urls import reverse_lazy
4-
from django.contrib import messages
5-
from task_manager.statuses.models import Status
6-
from task_manager.statuses.forms import StatusForm
3+
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
4+
from django.contrib.messages.views import SuccessMessageMixin
5+
from django.contrib.auth.mixins import LoginRequiredMixin
6+
from .models import Status
7+
from django.utils.translation import gettext_lazy as _
78

8-
class StatusListView(LoginRequiredMixin, ListView):
9-
model = Status
10-
template_name = 'statuses/status_list.html'
9+
from .forms import CreateStatusForm
1110

12-
class StatusCreateView(LoginRequiredMixin, CreateView):
13-
model = Status
14-
form_class = StatusForm
15-
template_name = 'statuses/status_form.html'
16-
17-
def form_valid(self, form):
18-
messages.success(self.request, 'Статус успешно создан.')
19-
return super().form_valid(form)
20-
21-
# class StatusListView(LoginRequiredMixin, ListView):
22-
# model = Status
23-
# template_name = 'statuses/status_list.html'
24-
25-
# class StatusCreateView(LoginRequiredMixin, CreateView):
26-
# model = Status
27-
# form_class = StatusForm
28-
# template_name = 'statuses/status_form.html'
29-
30-
# def form_valid(self, form):
31-
# messages.success(self.request, 'Статус успешно создан.')
32-
# return super().form_valid(form)
33-
#
34-
# def get_success_url(self):
35-
# return reverse_lazy('status-list')
36-
37-
class StatusUpdateView(LoginRequiredMixin, UpdateView):
11+
12+
class StatusView(ListView):
3813
model = Status
39-
form_class = StatusForm
40-
template_name = 'statuses/status_form.html'
41-
success_url = reverse_lazy('status-list')
14+
context_object_name = "status_list"
15+
template_name = "statuses/statuses_list.html"
4216

43-
def form_valid(self, form):
44-
messages.success(self.request, 'Статус успешно обновлен.')
45-
return super().form_valid(form)
4617

47-
class StatusDeleteView(LoginRequiredMixin, DeleteView):
48-
model = Status
49-
template_name = 'statuses/status_confirm_delete.html'
18+
class CreateStatusView(SuccessMessageMixin, CreateView):
19+
template_name = "statuses/create.html"
20+
success_url = reverse_lazy("statuses:status_list")
21+
form_class = CreateStatusForm
22+
success_message = _("Status created successfully")
5023

51-
def delete(self, request, *args, **kwargs):
52-
messages.success(self.request, 'Статус успешно удален.')
53-
return super().delete(request, *args, **kwargs)
24+
# change dublication in templates and add translate in views
25+
# def get_context_data(self, **kwargs):
26+
# context = super().get_context_data(**kwargs)
27+
# context["to_do"] = "create"
28+
# context["status"] = "Status"
29+
# return context
30+
31+
32+
class UpdateStatusView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
33+
model = Status
34+
success_url = reverse_lazy("statuses:status_list")
35+
template_name = "statuses/update.html"
36+
form_class = CreateStatusForm
37+
success_message = _("Status updated successfully")
38+
login_url = reverse_lazy("statuses:status_list")
39+
redirect_field_name = None
40+
41+
42+
class DeleteStatusView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
43+
model = Status
44+
success_url = reverse_lazy("statuses:status_list")
45+
template_name = "statuses/delete.html"
46+
success_message = _("Status deleted successfully")
47+
login_url = reverse_lazy("login")
48+
redirect_field_name = None

task_manager/tasks/filters.py

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,35 @@
11
import django_filters
2-
from django import forms
3-
from django.contrib.auth import get_user_model
4-
from .models import Task, Label
2+
from django_filters import ModelChoiceFilter, BooleanFilter
3+
from django.forms import CheckboxInput
4+
5+
from task_manager.labels.models import Label
6+
from task_manager.tasks.models import Task
7+
8+
# from django.utils.translation import gettext_lazy as _
59

6-
User = get_user_model()
710

811
class TaskFilter(django_filters.FilterSet):
9-
status = django_filters.ChoiceFilter(label='Статус', empty_label='Любой')
10-
executor = django_filters.ModelChoiceFilter(
11-
queryset=User.objects.all(),
12-
label='Исполнитель',
13-
empty_label='Любой',
14-
)
15-
labels = django_filters.ModelMultipleChoiceFilter(
12+
labels = ModelChoiceFilter(
13+
field_name="labels",
1614
queryset=Label.objects.all(),
17-
label='Метки',
18-
widget=forms.CheckboxSelectMultiple,
15+
label="Метка",
1916
)
20-
author = django_filters.BooleanFilter(
21-
method='filter_author',
22-
label='Только мои задачи',
23-
widget=forms.CheckboxInput,
17+
self_tasks = BooleanFilter(
18+
method="filter_tasks",
19+
widget=CheckboxInput,
20+
label="Только свои задачи",
2421
)
2522

26-
class Meta:
27-
model = Task
28-
fields = ['status', 'executor', 'labels']
29-
30-
def __init__(self, *args, **kwargs):
31-
super().__init__(*args, **kwargs)
32-
statuses = Task.objects.values_list('status', flat=True).distinct()
33-
choices = [(status, status) for status in statuses if status]
34-
self.filters['status'].extra['choices'] = choices
35-
36-
def filter_author(self, queryset, name, value):
23+
def filter_tasks(self, queryset, name, value):
3724
if value:
3825
return queryset.filter(author=self.request.user)
3926
return queryset
27+
28+
class Meta:
29+
model = Task
30+
fields = (
31+
"status",
32+
"executor",
33+
"labels",
34+
"self_tasks",
35+
)

0 commit comments

Comments
 (0)