Files
octopus/myproject/customers/forms.py
Andrey Smakotin fac3d55083 Удалена система лояльности из модели Customer
Удалены поля loyalty_tier, is_vip, get_loyalty_discount(), increment_total_spent().
Поле total_spent оставлено для будущего расчёта по заказам.
Обновлены admin, forms, views и шаблоны.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 17:05:18 +03:00

88 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from django import forms
from django.core.exceptions import ValidationError
from phonenumber_field.formfields import PhoneNumberField
from phonenumber_field.widgets import PhoneNumberPrefixWidget
from .models import Customer
class CustomerForm(forms.ModelForm):
phone = PhoneNumberField(
region='BY',
required=False,
help_text='Формат: +375XXXXXXXXX или 80XXXXXXXXX',
widget=forms.TextInput(attrs={'placeholder': '+375XXXXXXXXX'})
)
class Meta:
model = Customer
fields = ['name', 'email', 'phone', 'notes']
exclude = ['is_system_customer']
widgets = {
'notes': forms.Textarea(attrs={'rows': 3}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Ensure phone displays in E.164 format
if self.instance and self.instance.phone:
self.initial['phone'] = str(self.instance.phone)
for field_name, field in self.fields.items():
if field_name == 'notes':
# Textarea already has rows=3 from widget, just add class
field.widget.attrs.update({'class': 'form-control'})
else:
# Regular input fields get form-control class
field.widget.attrs.update({'class': 'form-control'})
def clean_email(self):
"""Проверяет уникальность email при создании/редактировании"""
email = self.cleaned_data.get('email')
# Нормализуем пустые значения в None (Django best practice для nullable полей)
if not email:
return None
# Проверяем уникальность
queryset = Customer.objects.filter(email=email)
# При редактировании исключаем текущий экземпляр
if self.instance and self.instance.pk:
queryset = queryset.exclude(pk=self.instance.pk)
if queryset.exists():
raise ValidationError('Клиент с таким email уже существует.')
return email
def clean_phone(self):
"""Проверяет уникальность телефона при создании/редактировании"""
phone = self.cleaned_data.get('phone')
# Нормализуем пустые значения в None (Django best practice для nullable полей)
if not phone:
return None
# Проверяем уникальность
queryset = Customer.objects.filter(phone=phone)
# При редактировании исключаем текущий экземпляр
if self.instance and self.instance.pk:
queryset = queryset.exclude(pk=self.instance.pk)
if queryset.exists():
raise ValidationError('Клиент с таким номером телефона уже существует.')
return phone
def clean(self):
"""Дополнительная валидация формы"""
cleaned_data = super().clean()
# Защита от редактирования системного клиента
if self.instance and self.instance.pk and self.instance.is_system_customer:
raise ValidationError(
'Системный клиент не может быть изменен. '
'Он необходим для корректной работы системы и создается автоматически.'
)
return cleaned_data