Files
MES_Core/shiftflow/popup_views.py
2026-04-01 01:04:46 +03:00

171 lines
4.8 KiB
Python

from django import forms
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.views.generic import CreateView, UpdateView
from warehouse.models import Material, MaterialCategory, SteelGrade
from .models import Company, Deal
class _PopupRoleMixin(LoginRequiredMixin):
def dispatch(self, request, *args, **kwargs):
profile = getattr(request.user, "profile", None)
role = profile.role if profile else ("admin" if request.user.is_superuser else "operator")
if role not in ["admin", "technologist"]:
return redirect("registry")
return super().dispatch(request, *args, **kwargs)
def get_target(self):
return (self.request.GET.get("target") or self.request.POST.get("target") or "").strip()
def form_valid(self, form):
self.object = form.save()
return TemplateResponse(
self.request,
"shiftflow/popup_done.html",
{"target": self.get_target(), "value": self.object.pk, "label": self.get_popup_label()},
)
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["target"] = self.get_target()
return ctx
def get_popup_label(self):
return str(self.object)
class _BootstrapModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
widget = field.widget
if isinstance(widget, (forms.Select, forms.SelectMultiple)):
cls = "form-select border-secondary"
elif isinstance(widget, forms.CheckboxInput):
cls = "form-check-input"
else:
cls = "form-control border-secondary"
widget.attrs["class"] = cls
class DealForm(_BootstrapModelForm):
class Meta:
model = Deal
fields = ["number", "status", "company", "description"]
class CompanyForm(_BootstrapModelForm):
class Meta:
model = Company
fields = ["name", "description"]
class MaterialForm(_BootstrapModelForm):
class Meta:
model = Material
fields = ["category", "steel_grade", "name"]
class MaterialCategoryForm(_BootstrapModelForm):
class Meta:
model = MaterialCategory
fields = ["name", "gost_standard"]
class SteelGradeForm(_BootstrapModelForm):
class Meta:
model = SteelGrade
fields = ["name", "gost_standard"]
class DealPopupCreateView(_PopupRoleMixin, CreateView):
template_name = "shiftflow/popup_form.html"
model = Deal
form_class = DealForm
def get_popup_label(self):
return self.object.number
class DealPopupUpdateView(_PopupRoleMixin, UpdateView):
template_name = "shiftflow/popup_form.html"
model = Deal
form_class = DealForm
def get_popup_label(self):
return self.object.number
class CompanyPopupCreateView(_PopupRoleMixin, CreateView):
template_name = "shiftflow/popup_form.html"
model = Company
form_class = CompanyForm
def get_popup_label(self):
return self.object.name
class CompanyPopupUpdateView(_PopupRoleMixin, UpdateView):
template_name = "shiftflow/popup_form.html"
model = Company
form_class = CompanyForm
def get_popup_label(self):
return self.object.name
class MaterialPopupCreateView(_PopupRoleMixin, CreateView):
template_name = "shiftflow/popup_form.html"
model = Material
form_class = MaterialForm
def get_popup_label(self):
return self.object.full_name
class MaterialPopupUpdateView(_PopupRoleMixin, UpdateView):
template_name = "shiftflow/popup_form.html"
model = Material
form_class = MaterialForm
def get_popup_label(self):
return self.object.full_name
class MaterialCategoryPopupCreateView(_PopupRoleMixin, CreateView):
template_name = "shiftflow/popup_form.html"
model = MaterialCategory
form_class = MaterialCategoryForm
def get_popup_label(self):
return self.object.name
class MaterialCategoryPopupUpdateView(_PopupRoleMixin, UpdateView):
template_name = "shiftflow/popup_form.html"
model = MaterialCategory
form_class = MaterialCategoryForm
def get_popup_label(self):
return self.object.name
class SteelGradePopupCreateView(_PopupRoleMixin, CreateView):
template_name = "shiftflow/popup_form.html"
model = SteelGrade
form_class = SteelGradeForm
def get_popup_label(self):
return self.object.name
class SteelGradePopupUpdateView(_PopupRoleMixin, UpdateView):
template_name = "shiftflow/popup_form.html"
model = SteelGrade
form_class = SteelGradeForm
def get_popup_label(self):
return self.object.name