diff --git a/assets/pasted-20260127-202812-8ab5fa36.png b/assets/pasted-20260127-202812-8ab5fa36.png new file mode 100644 index 0000000..02a4e36 Binary files /dev/null and b/assets/pasted-20260127-202812-8ab5fa36.png differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index ec14df2..6803940 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index f599451..05fa632 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/templates/core/breakdown_list.html b/core/templates/core/breakdown_list.html index eba1564..f76772a 100644 --- a/core/templates/core/breakdown_list.html +++ b/core/templates/core/breakdown_list.html @@ -43,10 +43,18 @@ {% endif %} - К технике - {% if b.status == 'need_part' %} - Заказать запчасть - {% endif %} +
+ К технике + {% if b.status == 'need_part' %} + Заказать запчасть + {% endif %} + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} +
{% empty %} @@ -59,4 +67,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/fleet_detail.html b/core/templates/core/fleet_detail.html index 4c52ca4..023dcd3 100644 --- a/core/templates/core/fleet_detail.html +++ b/core/templates/core/fleet_detail.html @@ -51,6 +51,12 @@
Редактировать + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} Заявить о поломке
@@ -114,7 +120,15 @@ {{ m.get_status_display }} {{ m.mechanic|default:"-" }} - Открыть +
+ Открыть + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} +
{% empty %} @@ -136,7 +150,15 @@
{{ b.system_node }}
- {{ b.get_status_display }} +
+ {{ b.get_status_display }} + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} +

{{ b.date|date:"d.m.Y" }} — {{ b.description }}

@@ -164,6 +186,7 @@ Кол-во Статус Дата + @@ -173,9 +196,17 @@ {{ r.quantity }} {{ r.get_status_display }} {{ r.created_at|date:"d.m.Y" }} + + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} + {% empty %} - Нет заявок + Нет заявок {% endfor %} @@ -223,6 +254,7 @@ Деталь Статус Дата + @@ -231,9 +263,17 @@ {{ r.part_name }} {{ r.get_status_display }} {{ r.created_at|date:"d.m.Y" }} + + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} + {% empty %} - Нет заявок + Нет заявок {% endfor %} @@ -252,4 +292,4 @@
-{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/maintenance_list.html b/core/templates/core/maintenance_list.html index 39d2c81..afbf3ef 100644 --- a/core/templates/core/maintenance_list.html +++ b/core/templates/core/maintenance_list.html @@ -41,7 +41,15 @@ {{ m.mechanic|default:"-" }} - Открыть +
+ Открыть + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} +
{% empty %} @@ -54,4 +62,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/supply_list.html b/core/templates/core/supply_list.html index caea49b..bf208c2 100644 --- a/core/templates/core/supply_list.html +++ b/core/templates/core/supply_list.html @@ -43,7 +43,17 @@ - Управление +
+ Управление + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} +
{% empty %} @@ -63,7 +73,7 @@
Поставщики
- + Добавить
@@ -73,9 +83,19 @@
{{ supplier.name }}
- - - +
+ + + + {% if user.is_staff %} +
+ {% csrf_token %} + +
+ {% endif %} +

Менеджер: {{ supplier.representative_name|default:"-" }}
diff --git a/core/urls.py b/core/urls.py index 939eb6b..05e3f88 100644 --- a/core/urls.py +++ b/core/urls.py @@ -9,12 +9,14 @@ urlpatterns = [ path('fleet//', views.FleetDetailView.as_view(), name='fleet_detail'), path('fleet/add/', views.FleetCreateView.as_view(), name='fleet_add'), path('fleet//edit/', views.FleetUpdateView.as_view(), name='fleet_edit'), + path('fleet//delete/', views.FleetUnitDeleteView.as_view(), name='fleet_delete'), # Maintenance path('maintenance/', views.MaintenanceListView.as_view(), name='maintenance_list'), path('maintenance//', views.MaintenanceDetailView.as_view(), name='maintenance_detail'), path('maintenance/add/', views.MaintenanceCreateView.as_view(), name='maintenance_add'), path('maintenance//edit/', views.MaintenanceUpdateView.as_view(), name='maintenance_edit'), + path('maintenance//delete/', views.MaintenanceDeleteView.as_view(), name='maintenance_delete'), path('maintenance//process/', views.MaintenanceProcessView.as_view(), name='maintenance_process'), path('maintenance//complete/', views.MaintenanceCompleteView.as_view(), name='maintenance_complete'), path('maintenance//pdf/', views.MaintenancePDFView.as_view(), name='maintenance_pdf'), @@ -22,13 +24,16 @@ urlpatterns = [ # Breakdown path('breakdown/', views.BreakdownListView.as_view(), name='breakdown_list'), path('breakdown/add/', views.BreakdownCreateView.as_view(), name='breakdown_add'), + path('breakdown//delete/', views.BreakdownDeleteView.as_view(), name='breakdown_delete'), # Part Request path('part-request/', views.PartRequestListView.as_view(), name='part_request_list'), path('part-request/add/', views.PartRequestCreateView.as_view(), name='part_request_add'), + path('part-request//delete/', views.PartRequestDeleteView.as_view(), name='part_request_delete'), # Supply path('supply/', views.SupplyListView.as_view(), name='supply_list'), - path('supplier/add/', views.SupplierCreateView.as_view(), name='supplier_add'), + path('supplier/add/', views.SupplierCreateView.as_view(), name='supplier_create'), path('supplier//edit/', views.SupplierUpdateView.as_view(), name='supplier_edit'), + path('supplier//delete/', views.SupplierDeleteView.as_view(), name='supplier_delete'), ] \ No newline at end of file diff --git a/core/views.py b/core/views.py index 282ff82..7257a88 100644 --- a/core/views.py +++ b/core/views.py @@ -1,11 +1,11 @@ import json from io import BytesIO from django.shortcuts import render, redirect, get_object_or_404 -from django.views.generic import ListView, DetailView, CreateView, UpdateView, TemplateView, View +from django.views.generic import ListView, DetailView, CreateView, UpdateView, TemplateView, View, DeleteView from django.urls import reverse_lazy, reverse from django import forms from django.db.models import Count, Q -from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.http import HttpResponse from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 @@ -13,6 +13,11 @@ from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from .models import FleetUnit, Maintenance, Breakdown, PartRequest, Category, Document, Supplier +# Mixins +class StaffRequiredMixin(UserPassesTestMixin): + def test_func(self): + return self.request.user.is_staff + # Forms class FleetUnitForm(forms.ModelForm): class Meta: @@ -159,6 +164,10 @@ class FleetUpdateView(UpdateView): def get_success_url(self): return reverse_lazy('fleet_detail', kwargs={'pk': self.object.pk}) +class FleetUnitDeleteView(LoginRequiredMixin, StaffRequiredMixin, DeleteView): + model = FleetUnit + success_url = reverse_lazy('fleet_list') + # Maintenance Views class MaintenanceListView(ListView): model = Maintenance @@ -205,6 +214,10 @@ class MaintenanceUpdateView(UpdateView): def get_success_url(self): return reverse('maintenance_detail', kwargs={'pk': self.object.pk}) +class MaintenanceDeleteView(LoginRequiredMixin, StaffRequiredMixin, DeleteView): + model = Maintenance + success_url = reverse_lazy('maintenance_list') + class MaintenanceProcessView(View): def post(self, request, pk): maintenance = get_object_or_404(Maintenance, pk=pk) @@ -299,6 +312,11 @@ class BreakdownCreateView(CreateView): def get_success_url(self): return reverse('fleet_detail', kwargs={'pk': self.object.fleet_unit.pk}) +class BreakdownDeleteView(LoginRequiredMixin, StaffRequiredMixin, DeleteView): + model = Breakdown + def get_success_url(self): + return reverse('fleet_detail', kwargs={'pk': self.object.fleet_unit.pk}) + # Part Request Views class PartRequestListView(ListView): model = PartRequest @@ -325,6 +343,11 @@ class PartRequestCreateView(CreateView): def get_success_url(self): return reverse('fleet_detail', kwargs={'pk': self.object.fleet_unit.pk}) +class PartRequestDeleteView(LoginRequiredMixin, StaffRequiredMixin, DeleteView): + model = PartRequest + def get_success_url(self): + return reverse('supply_list') + class SupplyListView(ListView): model = PartRequest template_name = 'core/supply_list.html' @@ -345,4 +368,8 @@ class SupplierUpdateView(UpdateView): model = Supplier form_class = SupplierForm template_name = 'core/supplier_form.html' - success_url = reverse_lazy('supply_list') \ No newline at end of file + success_url = reverse_lazy('supply_list') + +class SupplierDeleteView(LoginRequiredMixin, StaffRequiredMixin, DeleteView): + model = Supplier + success_url = reverse_lazy('supply_list')