Fix order logic. Currently you can change contact data ant it's working correctly

This commit is contained in:
vlados31 2022-09-28 22:49:15 +03:00
parent dddf4ba47e
commit 19b246ec06
17 changed files with 370 additions and 17 deletions

View File

@ -10,4 +10,5 @@ class CityAdmin(admin.ModelAdmin):
@admin.register(Order) @admin.register(Order)
class OrderAdmin(admin.ModelAdmin): class OrderAdmin(admin.ModelAdmin):
pass list_display = ['owner', 'phone', 'name', 'create_time', 'moderated', 'published']
readonly_fields = ['create_time']

View File

@ -31,3 +31,7 @@ class UnregisteredUserOrderCreationForm(BaseOrderCreationForm):
RegexValidator(regex="^\\+7[0-9]{10}$"), RegexValidator(regex="^\\+7[0-9]{10}$"),
]) ])
email = forms.EmailField(required=True) email = forms.EmailField(required=True)
class Meta:
model = Order
fields = BaseOrderCreationForm.Meta.fields + ['phone', 'email']

View File

@ -0,0 +1,23 @@
# Generated by Django 4.1.1 on 2022-09-27 22:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0008_alter_order_approximate_price_alter_order_square_and_more'),
]
operations = [
migrations.AddField(
model_name='order',
name='date_end',
field=models.DateField(blank=True, default=None),
),
migrations.AddField(
model_name='order',
name='date_start',
field=models.DateField(blank=True, default=None),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 4.1.1 on 2022-09-27 22:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0009_order_date_end_order_date_start'),
]
operations = [
migrations.AlterField(
model_name='order',
name='date_end',
field=models.DateField(blank=True, default=None, verbose_name='Дата окончания'),
),
migrations.AlterField(
model_name='order',
name='date_start',
field=models.DateField(blank=True, default=None, verbose_name='Дата начала'),
),
]

View File

@ -0,0 +1,25 @@
# Generated by Django 4.1.1 on 2022-09-28 08:04
import django.core.validators
from django.db import migrations, models
import order.models
class Migration(migrations.Migration):
dependencies = [
('order', '0010_alter_order_date_end_alter_order_date_start'),
]
operations = [
migrations.AddField(
model_name='order',
name='email',
field=models.EmailField(max_length=254, null=True, validators=[order.models._email_validate], verbose_name='Email'),
),
migrations.AddField(
model_name='order',
name='phone',
field=models.CharField(max_length=16, null=True, validators=[django.core.validators.RegexValidator(regex='^\\+7[0-9]{10}$'), order.models._phone_validate], verbose_name='Телефон'),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 4.1.1 on 2022-09-28 08:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0011_order_email_order_phone'),
]
operations = [
migrations.AlterField(
model_name='order',
name='date_end',
field=models.DateField(default=None, null=True, verbose_name='Дата окончания'),
),
migrations.AlterField(
model_name='order',
name='date_start',
field=models.DateField(default=None, null=True, verbose_name='Дата начала'),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 4.1.1 on 2022-09-28 08:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0012_alter_order_date_end_alter_order_date_start'),
]
operations = [
migrations.AlterField(
model_name='order',
name='date_end',
field=models.DateField(blank=True, default=None, null=True, verbose_name='Дата окончания'),
),
migrations.AlterField(
model_name='order',
name='date_start',
field=models.DateField(blank=True, default=None, null=True, verbose_name='Дата начала'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 4.1.1 on 2022-09-28 08:47
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0013_alter_order_date_end_alter_order_date_start'),
]
operations = [
migrations.AddField(
model_name='order',
name='create_time',
field=models.DateTimeField(default=datetime.datetime.now, editable=False),
),
]

View File

@ -0,0 +1,29 @@
# Generated by Django 4.1.1 on 2022-09-28 08:51
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0014_order_create_time'),
]
operations = [
migrations.AddField(
model_name='order',
name='moderated',
field=models.BooleanField(default=False, verbose_name='Модерирован'),
),
migrations.AddField(
model_name='order',
name='published',
field=models.BooleanField(default=False, verbose_name='Опубликован'),
),
migrations.AlterField(
model_name='order',
name='create_time',
field=models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='Время создания'),
),
]

View File

@ -0,0 +1,38 @@
# Generated by Django 4.1.1 on 2022-09-28 09:55
from django.conf import settings
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import order.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('order', '0015_order_moderated_order_published_and_more'),
]
operations = [
migrations.AlterField(
model_name='order',
name='email',
field=models.EmailField(blank=True, max_length=254, null=True, validators=[order.models._email_validate], verbose_name='Email'),
),
migrations.AlterField(
model_name='order',
name='moderated',
field=models.BooleanField(default=True, verbose_name='Модерирован'),
),
migrations.AlterField(
model_name='order',
name='owner',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='owner', to=settings.AUTH_USER_MODEL, verbose_name='Владелец'),
),
migrations.AlterField(
model_name='order',
name='phone',
field=models.CharField(blank=True, max_length=16, null=True, validators=[django.core.validators.RegexValidator(regex='^\\+7[0-9]{10}$'), order.models._phone_validate], verbose_name='Телефон'),
),
]

View File

@ -1,7 +1,10 @@
from django.core.exceptions import *
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.db import models from django.db import models
from django.db.models import Q
from account.models import SiteUser from account.models import SiteUser
from datetime import datetime
class City(models.Model): class City(models.Model):
@ -18,6 +21,50 @@ class City(models.Model):
return City.objects.order_by('name').values_list('code', 'name') 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): class Order(models.Model):
# основные поля: название и описание # основные поля: название и описание
name = models.CharField(max_length=200, verbose_name="Название заказа") 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="Цена") 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_start = models.DateField(null=True, blank=True, default=None, verbose_name="Дата начала")
date_end = models.DateField(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", address_city = models.ForeignKey(City, on_delete=models.CASCADE, blank=False, related_name="address_city",
verbose_name="Город") verbose_name="Город")
address_text = models.CharField(max_length=70, blank=True, 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="Владелец") 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

View File

@ -4,22 +4,34 @@ from .forms import *
def orders_list(request): def orders_list(request):
return render(request, 'orders/orders-list.html') if request.user.is_authenticated:
if request.user.is_staff:
orders = Order.objects.filter()
else:
orders = Order.objects.filter(published=True, moderated=True)
orders.order_by('create_time')
return render(request, 'orders/orders-list.html', {'orders': orders[:50]})
else:
return HttpResponseRedirect('/accounts/register')
def order_create(request): def order_create(request):
if request.user.is_authenticated: if request.user.is_authenticated:
if request.method == 'POST': if request.method == 'POST':
form = BaseOrderCreationForm(request.POST) order = Order(owner=request.user)
form = BaseOrderCreationForm(request.POST, instance=order)
if form.is_valid(): if form.is_valid():
return HttpResponseRedirect('/account') form.save()
return HttpResponseRedirect('/orders/')
else: else:
form = BaseOrderCreationForm() form = BaseOrderCreationForm()
else: else:
if request.method == 'POST': if request.method == 'POST':
form = UnregisteredUserOrderCreationForm(request.POST) order = Order()
form = UnregisteredUserOrderCreationForm(request.POST, instance=order)
if form.is_valid(): if form.is_valid():
return HttpResponseRedirect('/account') form.save()
return HttpResponseRedirect('/dev')
else: else:
form = UnregisteredUserOrderCreationForm() form = UnregisteredUserOrderCreationForm()
print(form.visible_fields) print(form.visible_fields)

BIN
static/images/test4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

BIN
static/images/test5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

View File

@ -0,0 +1,13 @@
{% extends 'base.html' %}
{% block title %} Аккаунт | вход {% endblock %}
{% block content %}
<h1 class=deprecated-page-header"> Список заказов </h1>
{% if user.is_authenticated %}
тут должен быть список заказов...
{% else %}
<h3>Вы не можете просматривать заказы не войдя в аккаунт</h3>
Используйте меню аккаунта для регистрации или входа
{% endif %}
{% endblock %}

View File

@ -175,10 +175,20 @@
<div class="form-section-wrapper"> <div class="form-section-wrapper">
<h2>Контакты</h2> <h2>Контакты</h2>
<div> <div>
{% if not user.is_authenticated %}
<div class="form-inline-fields"> <div class="form-inline-fields">
<h4>Номер телефона</h4> <div class="form-field-wrapper {% if form.phone.error %}form-field-error{% endif %}">
<h4>Почта</h4> {{ form.phone.errors }}
<label for="{{ form.phone.id_for_label }}">{{ form.phone.label }}</label>
{{ form.phone }}
</div> </div>
<div class="form-field-wrapper {% if form.email.error %}form-field-error{% endif %}">
{{ form.email.errors }}
<label for="{{ form.email.id_for_label }}">{{ form.email.label }}</label>
{{ form.email }}
</div>
</div>
{% endif %}
<div class="form-inline-fields"> <div class="form-inline-fields">
<div class="form-field-wrapper {% if form.address_city.error %}form-field-error{% endif %}"> <div class="form-field-wrapper {% if form.address_city.error %}form-field-error{% endif %}">

View File

@ -1,13 +1,26 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block title %} Аккаунт | вход {% endblock %} {% block title %} Аккаунт | вход {% endblock %}
{% block styles %}
<style>
.order-wrapper {
border: var(--brand-color) solid 3px;
border-radius: 1em;
margin: 1em;
padding: 1em;
}
</style>
{% endblock %}
{% block content %} {% block content %}
<h1 class=deprecated-page-header"> Список заказов </h1> <h1 class=deprecated-page-header"> Список заказов </h1>
{% if user.is_authenticated %}
тут должен быть список заказов... {% for order in orders %}
{% else %} <div class="order-wrapper">
<h3>Вы не можете просматривать заказы не войдя в аккаунт</h3> <span class="order-pub-date">{{ order.create_time }}</span>
Используйте меню аккаунта для регистрации или входа <h3>{{ order.name }}</h3>
{% endif %} <p>{{ order.description }}</p>
</div>
{% endfor %}
{% endblock %} {% endblock %}