1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
from typing import Any
from django.shortcuts import render
from django.views.generic import ListView, CreateView, UpdateView
from django.urls import reverse_lazy
from django.contrib.auth.views import LoginView
from django.contrib import messages
from django.db.models import Q
from django.contrib.auth.mixins import UserPassesTestMixin
from django.http import HttpResponseRedirect
from extra_views import CreateWithInlinesView, UpdateWithInlinesView
from django import forms
from .models import Product, Supplier, Order, OrderItem
from .forms import ProductForm, OrderForm, OrderItemFormSet
class UserLoginView(LoginView):
template_name = "core/login.html"
class ProductListView(ListView):
model = Product
template_name = "core/product_list.html"
context_object_name = "products"
def get_queryset(self):
queryset = Product.objects.all().select_related("supplier")
search_query = self.request.GET.get("search", "")
if search_query:
queryset = queryset.filter(
Q(name__icontains=search_query)
| Q(description__icontains=search_query)
| Q(manufacturer__icontains=search_query)
| Q(category__icontains=search_query)
)
supplier_id = self.request.GET.get("supplier", "")
if supplier_id and supplier_id != 'all':
queryset = queryset.filter(supplier_id=supplier_id)
sort = self.request.GET.get("sort")
if sort == "asc":
queryset = queryset.order_by("quantity")
if sort == "desc":
queryset = queryset.order_by("-quantity")
return queryset
def get_context_data(self, **kwargs) -> dict[str, Any]:
context = super().get_context_data(**kwargs)
context["suppliers"] = Supplier.objects.all()
context["current_supplier"] = self.request.GET.get("supplier", "")
context["current_search"] = self.request.GET.get("search", "")
context["current_sort"] = self.request.GET.get("sort", "")
return context
class AdminRequiredMixin(UserPassesTestMixin):
def test_func(self):
return (
self.request.user.is_authenticated
and self.request.user.role
and self.request.user.role.name == "Администратор"
)
class ProductCreateUpdateMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["all_suppliers"] = Supplier.objects.all()
return context
class ProductCreateView(AdminRequiredMixin, ProductCreateUpdateMixin, CreateView):
model = Product
form_class = ProductForm
template_name = "core/product_form.html"
success_url = reverse_lazy("product_list")
def form_valid(self, form):
messages.success(self.request, "Товар успешно добавлен")
return super().form_valid(form)
class ProductUpdateView(AdminRequiredMixin, ProductCreateUpdateMixin, UpdateView):
model = Product
form_class = ProductForm
template_name = "core/product_form.html"
success_url = reverse_lazy("product_list")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["is_edit"] = True
return context
class AdminManagerRequiredMixin(UserPassesTestMixin):
def test_func(self):
return (
self.request.user.is_authenticated
and self.request.user.role
and (self.request.user.role.name == "Администратор" or self.request.user.role.name == "Менеджер")
)
class OrderListView(AdminManagerRequiredMixin, ListView):
model = Order
template_name = "core/order_list.html"
context_object_name = "orders"
class OrderCreateView(CreateWithInlinesView):
model = Order
form_class = OrderForm
inlines = [OrderItemFormSet]
success_url = reverse_lazy("order_list")
class OrderUpdateView(UpdateWithInlinesView):
model = Order
form_class = OrderForm
inlines = [OrderItemFormSet]
success_url = reverse_lazy("order_list")
# formset variant
# class OrderCreateView(CreateView):
# model = Order
# form_class = OrderForm
# template_name = "core/order_form.html"
# success_url = reverse_lazy("order_list")
# def get_context_data(self, **kwargs):
# context = super().get_context_data(**kwargs)
# if self.request.POST:
# # re-use the bound formset if post() already stashed an invalid one
# context["formset"] = getattr(self, "formset", OrderItemFormSet(self.request.POST))
# else:
# context["formset"] = OrderItemFormSet()
# return context
# def post(self, request, *args, **kwargs):
# self.object = None
# form = self.get_form()
# formset = OrderItemFormSet(request.POST)
# if form.is_valid() and formset.is_valid():
# self.object = form.save()
# formset.instance = self.object
# formset.save()
# return HttpResponseRedirect(self.get_success_url())
# # stash the invalid formset so get_context_data renders it with errors
# self.formset = formset
# return self.form_invalid(form)
# class OrderUpdateView(UpdateView):
# model = Order
# form_class = OrderForm
# template_name = "core/order_form.html"
# success_url = reverse_lazy("order_list")
# def get_context_data(self, **kwargs):
# context = super().get_context_data(**kwargs)
# if self.request.POST:
# context["formset"] = getattr(
# self, "formset", OrderItemFormSet(self.request.POST, instance=self.object)
# )
# else:
# context["formset"] = OrderItemFormSet(instance=self.object)
# return context
# def post(self, request, *args, **kwargs):
# self.object = self.get_object()
# form = self.get_form()
# formset = OrderItemFormSet(request.POST, instance=self.object)
# if form.is_valid() and formset.is_valid():
# form.save()
# formset.save()
# return HttpResponseRedirect(self.get_success_url())
# self.formset = formset
# return self.form_invalid(form)
|