Files
watersurf-erp/app/references/views.py

132 lines
5.2 KiB
Python

"""
CRUD для справочников (списки и формы).
"""
import logging
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.contrib.auth.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,
)
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",
"Товары", "Товар",
)