""" CRUD для справочников (списки и формы). """ import logging from django.views.generic import ListView, CreateView, UpdateView, DeleteView from config.mixins import LoginRequiredMixin from django.urls import reverse_lazy from django.contrib import messages from django.utils.translation import gettext_lazy as _ from .models import ( Currency, OrderKind, Client, Organization, Supplier, Employee, CashAccount, Product, OrderStatus, ) logger = logging.getLogger(__name__) def _ref_view(model_class, list_url_name, create_url_name, update_url_name, delete_url_name, list_title, form_title): """Фабрика представлений для одного справочника.""" class List(LoginRequiredMixin, ListView): model = model_class template_name = "references/reference_list.html" context_object_name = "items" extra_context = { "title": list_title, "create_url_name": create_url_name, "update_url_name": update_url_name, "delete_url_name": delete_url_name, } class Create(LoginRequiredMixin, CreateView): model = model_class fields = "__all__" template_name = "references/reference_form.html" success_url = reverse_lazy(list_url_name) extra_context = {"title": form_title, "cancel_url": reverse_lazy(list_url_name)} def form_valid(self, form): messages.success(self.request, _("Запись создана.")) logger.info("Справочник %s: создана запись %s", model_class.__name__, form.instance) return super().form_valid(form) class Update(LoginRequiredMixin, UpdateView): model = model_class fields = "__all__" template_name = "references/reference_form.html" success_url = reverse_lazy(list_url_name) context_object_name = "object" extra_context = {"title": form_title, "cancel_url": reverse_lazy(list_url_name)} def form_valid(self, form): messages.success(self.request, _("Запись сохранена.")) logger.info("Справочник %s: обновлена запись %s", model_class.__name__, form.instance) return super().form_valid(form) class Delete(LoginRequiredMixin, DeleteView): model = model_class template_name = "references/reference_confirm_delete.html" success_url = reverse_lazy(list_url_name) context_object_name = "object" extra_context = {"cancel_url": reverse_lazy(list_url_name)} def form_valid(self, form): messages.success(self.request, _("Запись удалена.")) logger.info("Справочник %s: удалена запись %s", model_class.__name__, self.object) return super().form_valid(form) return List, Create, Update, Delete # Валюты CurrencyList, CurrencyCreate, CurrencyUpdate, CurrencyDelete = _ref_view( Currency, "references:currency_list", "references:currency_create", "references:currency_update", "references:currency_delete", "Валюты", "Валюта", ) # Виды заказов OrderKindList, OrderKindCreate, OrderKindUpdate, OrderKindDelete = _ref_view( OrderKind, "references:orderkind_list", "references:orderkind_create", "references:orderkind_update", "references:orderkind_delete", "Виды заказов", "Вид заказа", ) # Клиенты ClientList, ClientCreate, ClientUpdate, ClientDelete = _ref_view( Client, "references:client_list", "references:client_create", "references:client_update", "references:client_delete", "Клиенты", "Клиент", ) # Организации OrganizationList, OrganizationCreate, OrganizationUpdate, OrganizationDelete = _ref_view( Organization, "references:organization_list", "references:organization_create", "references:organization_update", "references:organization_delete", "Организации", "Организация", ) # Поставщики SupplierList, SupplierCreate, SupplierUpdate, SupplierDelete = _ref_view( Supplier, "references:supplier_list", "references:supplier_create", "references:supplier_update", "references:supplier_delete", "Поставщики", "Поставщик", ) # Сотрудники EmployeeList, EmployeeCreate, EmployeeUpdate, EmployeeDelete = _ref_view( Employee, "references:employee_list", "references:employee_create", "references:employee_update", "references:employee_delete", "Сотрудники", "Сотрудник", ) # Счета денежных средств CashAccountList, CashAccountCreate, CashAccountUpdate, CashAccountDelete = _ref_view( CashAccount, "references:cashaccount_list", "references:cashaccount_create", "references:cashaccount_update", "references:cashaccount_delete", "Счета денежных средств", "Счёт денежных средств", ) # Товары ProductList, ProductCreate, ProductUpdate, ProductDelete = _ref_view( Product, "references:product_list", "references:product_create", "references:product_update", "references:product_delete", "Товары", "Товар", ) # Статусы заказов OrderStatusList, OrderStatusCreate, OrderStatusUpdate, OrderStatusDelete = _ref_view( OrderStatus, "references:orderstatus_list", "references:orderstatus_create", "references:orderstatus_update", "references:orderstatus_delete", "Статусы заказов", "Статус заказа", )