summaryrefslogtreecommitdiff
path: root/core/views.py
blob: 0e62eafa512ce140c78f312a4ad7f6818fbf5c7f (plain)
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)