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