Fix order logic. Currently you can change contact data ant it's working correctly
This commit is contained in:
103
order/models.py
103
order/models.py
@@ -1,7 +1,10 @@
|
||||
from django.core.exceptions import *
|
||||
from django.core.validators import RegexValidator
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
|
||||
from account.models import SiteUser
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class City(models.Model):
|
||||
@@ -18,6 +21,50 @@ class City(models.Model):
|
||||
return City.objects.order_by('name').values_list('code', 'name')
|
||||
|
||||
|
||||
def _phone_validate(phone, order=None):
|
||||
if phone is not None:
|
||||
err_obj = {"phone": f'Телефон {phone} уже используется другим аккаунтом'}
|
||||
if SiteUser.objects.filter(phone=phone).count() > 0:
|
||||
raise ValidationError(
|
||||
err_obj,
|
||||
code='permission'
|
||||
)
|
||||
if order is None:
|
||||
if Order.objects.filter(phone=phone).count() > 0:
|
||||
raise ValidationError(
|
||||
err_obj,
|
||||
code='permission'
|
||||
)
|
||||
else:
|
||||
if Order.objects.filter(~Q(id=order.id), phone=phone).count() > 0:
|
||||
raise ValidationError(
|
||||
err_obj,
|
||||
code='permission'
|
||||
)
|
||||
|
||||
|
||||
def _email_validate(email, order=None):
|
||||
if email is not None:
|
||||
err_obj = {'email': f'Почта {email} уже используется другим аккаунтом'}
|
||||
if SiteUser.objects.filter(email=email).count():
|
||||
raise ValidationError(
|
||||
err_obj,
|
||||
code='permission'
|
||||
)
|
||||
if order is None:
|
||||
if Order.objects.filter(email=email).count() > 0:
|
||||
raise ValidationError(
|
||||
err_obj,
|
||||
code='permission'
|
||||
)
|
||||
else:
|
||||
if Order.objects.filter(~Q(id=order.id), email=email).count() > 0:
|
||||
raise ValidationError(
|
||||
err_obj,
|
||||
code='permission'
|
||||
)
|
||||
|
||||
|
||||
class Order(models.Model):
|
||||
# основные поля: название и описание
|
||||
name = models.CharField(max_length=200, verbose_name="Название заказа")
|
||||
@@ -112,13 +159,63 @@ class Order(models.Model):
|
||||
# примерная цена
|
||||
approximate_price = models.DecimalField(max_digits=12, decimal_places=2, blank=False, verbose_name="Цена")
|
||||
|
||||
date_start = models.DateField(blank=True, default=None, verbose_name="Дата начала")
|
||||
date_end = models.DateField(blank=True, default=None, verbose_name="Дата окончания")
|
||||
date_start = models.DateField(null=True, blank=True, default=None, verbose_name="Дата начала")
|
||||
date_end = models.DateField(null=True, blank=True, default=None, verbose_name="Дата окончания")
|
||||
|
||||
address_city = models.ForeignKey(City, on_delete=models.CASCADE, blank=False, related_name="address_city",
|
||||
verbose_name="Город")
|
||||
address_text = models.CharField(max_length=70, blank=True, verbose_name="Улица, дом")
|
||||
|
||||
owner = models.ForeignKey(SiteUser, on_delete=models.CASCADE, null=True, related_name="owner",
|
||||
owner = models.ForeignKey(SiteUser, on_delete=models.CASCADE, blank=True, null=True, related_name="owner",
|
||||
verbose_name="Владелец")
|
||||
|
||||
email = models.EmailField(null=True, blank=True, verbose_name="Email")
|
||||
phone = models.CharField(null=True, blank=True, max_length=16, verbose_name="Телефон", validators=[
|
||||
RegexValidator(regex="^\\+7[0-9]{10}$")
|
||||
])
|
||||
|
||||
create_time = models.DateTimeField(default=datetime.now, editable=False, verbose_name="Время создания")
|
||||
|
||||
moderated = models.BooleanField(default=True, verbose_name="Модерирован")
|
||||
published = models.BooleanField(default=False, verbose_name="Опубликован")
|
||||
|
||||
def clean(self):
|
||||
errors = {}
|
||||
try:
|
||||
if self.pk is None:
|
||||
_phone_validate(self.phone)
|
||||
else:
|
||||
_phone_validate(self.phone, self)
|
||||
except ValidationError as e:
|
||||
errors["phone"] = [e]
|
||||
|
||||
try:
|
||||
if self.pk is None:
|
||||
_email_validate(self.email)
|
||||
else:
|
||||
_email_validate(self.email, self)
|
||||
except ValidationError as e:
|
||||
errors["email"] = [e]
|
||||
|
||||
if len(errors) > 0:
|
||||
raise ValidationError(errors)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.pk is None:
|
||||
if self.owner is None:
|
||||
if self.phone is None or self.email is None:
|
||||
raise Exception("Could not save: need contact information")
|
||||
|
||||
if self.owner is not None:
|
||||
self.phone = None
|
||||
self.email = None
|
||||
|
||||
self.full_clean()
|
||||
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user