Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
7407ba7396
@ -44,26 +44,28 @@ API_ERROR_VALIDATION = {
|
|||||||
|
|
||||||
|
|
||||||
def make_error_object(ex: Exception):
|
def make_error_object(ex: Exception):
|
||||||
|
data = {
|
||||||
|
"status": "error"
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
if type(ex.args[0]) != tuple:
|
if type(ex.args[0]) != tuple:
|
||||||
raise Exception(API_ERROR_INTERNAL_ERROR)
|
raise ex
|
||||||
|
|
||||||
data = {
|
data["error"] = {
|
||||||
"error": {
|
"code": ex.args[0][0],
|
||||||
"code": ex.args[0][0],
|
"message": ex.args[0][1]
|
||||||
"message": ex.args[0][1]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(ex.args) >= 2:
|
if len(ex.args) >= 2:
|
||||||
data["error"]["related"] = ex.args[1]
|
data["error"]["related"] = ex.args[1]
|
||||||
|
|
||||||
return data
|
return data
|
||||||
except Exception:
|
|
||||||
|
except BaseException as err:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
return {
|
data["error"] = {
|
||||||
"error": {
|
"code": API_ERROR_INTERNAL_ERROR[0],
|
||||||
"code": API_ERROR_INTERNAL_ERROR[0],
|
"message": API_ERROR_INTERNAL_ERROR[1],
|
||||||
"message": API_ERROR_INTERNAL_ERROR[1]
|
"related": f"Exception {type(err)}: {str(err)}"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return data
|
||||||
|
@ -102,6 +102,7 @@ def account_verify_phone(params):
|
|||||||
def account_get(params):
|
def account_get(params):
|
||||||
user = _reqire_access_token(params)
|
user = _reqire_access_token(params)
|
||||||
return api_make_response({
|
return api_make_response({
|
||||||
|
"id": user.id,
|
||||||
"name": user.name,
|
"name": user.name,
|
||||||
"surname": user.surname,
|
"surname": user.surname,
|
||||||
"email": user.email,
|
"email": user.email,
|
||||||
@ -152,7 +153,7 @@ api_methods = {
|
|||||||
"params": [
|
"params": [
|
||||||
|
|
||||||
],
|
],
|
||||||
"returns": "Поля пользователя (name, surname, email, phone, phone_verified)."
|
"returns": "Поля пользователя (id, name, surname, email, phone, phone_verified)."
|
||||||
},
|
},
|
||||||
|
|
||||||
"account.verifyPhone": {
|
"account.verifyPhone": {
|
||||||
|
@ -7,7 +7,7 @@ def __make_invalid_argument_type_error(name, value, except_type):
|
|||||||
|
|
||||||
|
|
||||||
def api_make_response(response):
|
def api_make_response(response):
|
||||||
return {"response": API_OK_OBJ | response}
|
return API_OK_OBJ | {"response": response}
|
||||||
|
|
||||||
|
|
||||||
def api_get_param_int(params: dict, name: str, required=True, default=0):
|
def api_get_param_int(params: dict, name: str, required=True, default=0):
|
||||||
|
@ -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']
|
||||||
|
@ -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']
|
||||||
|
23
order/migrations/0009_order_date_end_order_date_start.py
Normal file
23
order/migrations/0009_order_date_end_order_date_start.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
@ -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='Дата начала'),
|
||||||
|
),
|
||||||
|
]
|
25
order/migrations/0011_order_email_order_phone.py
Normal file
25
order/migrations/0011_order_email_order_phone.py
Normal 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='Телефон'),
|
||||||
|
),
|
||||||
|
]
|
@ -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='Дата начала'),
|
||||||
|
),
|
||||||
|
]
|
@ -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='Дата начала'),
|
||||||
|
),
|
||||||
|
]
|
19
order/migrations/0014_order_create_time.py
Normal file
19
order/migrations/0014_order_create_time.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
@ -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='Время создания'),
|
||||||
|
),
|
||||||
|
]
|
@ -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='Телефон'),
|
||||||
|
),
|
||||||
|
]
|
116
order/models.py
116
order/models.py
@ -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,76 @@ 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
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_all_for_user(user):
|
||||||
|
if user.is_staff:
|
||||||
|
return Order.objects.filter().order_by('create_time')
|
||||||
|
else:
|
||||||
|
return Order.objects.filter(published=True, moderated=True).order_by('create_time')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_for_user_by_id(user, order_id):
|
||||||
|
q = Order.get_all_for_user(user).filter(id=order_id)
|
||||||
|
if len(q) == 0:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return q[0]
|
||||||
|
|
||||||
|
@ -20,5 +20,6 @@ from . import views
|
|||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.orders_list, name='orders-list'),
|
path('', views.orders_list, name='orders-list'),
|
||||||
path('create', views.order_create, name='order-create'),
|
path('create', views.order_create, name='order-create'),
|
||||||
|
path('view/<int:order_id>', views.order_view, name='order-view'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1,26 +1,42 @@
|
|||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from .forms import *
|
from .forms import *
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
|
||||||
|
|
||||||
def orders_list(request):
|
def orders_list(request):
|
||||||
return render(request, 'orders/orders-list.html')
|
if request.user.is_authenticated:
|
||||||
|
orders = Order.get_all_for_user(request.user)
|
||||||
|
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)
|
||||||
return render(request, 'orders/order-create.html', {'form': form})
|
return render(request, 'orders/order-create.html', {'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def order_view(request, order_id):
|
||||||
|
order = Order.get_all_for_user(request.user)
|
||||||
|
order = order.select_related('address_city').get(id=order_id)
|
||||||
|
return render(request, 'orders/order-view.html', {"order": order})
|
||||||
|
@ -129,6 +129,10 @@ header > * {
|
|||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#profile-menu-dropdown > .dropdown-content{
|
||||||
|
right: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
header > a {
|
header > a {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
BIN
static/images/test4.jpg
Normal file
BIN
static/images/test4.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 336 KiB |
BIN
static/images/test5.jpg
Normal file
BIN
static/images/test5.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 248 KiB |
@ -44,7 +44,7 @@
|
|||||||
<!-- эта менюшка херово выглядит на телефонах -->
|
<!-- эта менюшка херово выглядит на телефонах -->
|
||||||
<!-- а вообще можно подумать о том, чтобы сныкать ее содержимое в первую менюшку если сайт для телефонов:
|
<!-- а вообще можно подумать о том, чтобы сныкать ее содержимое в первую менюшку если сайт для телефонов:
|
||||||
зачем иметь две выпадающие менюшки если есть одна? но это надо обсудить с Вадимом -->
|
зачем иметь две выпадающие менюшки если есть одна? но это надо обсудить с Вадимом -->
|
||||||
<div class="dropdown-wrapper">
|
<div class="dropdown-wrapper" id="profile-menu-dropdown">
|
||||||
<button class="dropdown-button fa fa-bars"></button>
|
<button class="dropdown-button fa fa-bars"></button>
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
|
13
templates/orders/order-create-compleate.html
Normal file
13
templates/orders/order-create-compleate.html
Normal 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 %}
|
@ -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 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>
|
</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 %}">
|
||||||
|
39
templates/orders/order-view.html
Normal file
39
templates/orders/order-view.html
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block title %} Аккаунт | вход {% endblock %}
|
||||||
|
|
||||||
|
{% block styles %}
|
||||||
|
<style>
|
||||||
|
.field-wrapper {
|
||||||
|
margin: 1em;
|
||||||
|
padding: 1em;
|
||||||
|
border-left: var(--brand-color) solid 1px;
|
||||||
|
}
|
||||||
|
.field-wrapper > * {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
.field-wrapper > span {
|
||||||
|
font-weight: bolder;
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1 class=deprecated-page-header"> Заказ {{ order.name }} </h1>
|
||||||
|
|
||||||
|
<div class="field-wrapper">
|
||||||
|
<span>Описание:</span>
|
||||||
|
<p>{{ order.description }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field-wrapper">
|
||||||
|
<span>Дата создания:</span>
|
||||||
|
<p>{{ order.create_time }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field-wrapper">
|
||||||
|
<span>Город:</span>
|
||||||
|
<p>{{ order.address_city.name }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -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><a href="{% url 'order-view' order.id %}">{{ order.name }}</a></h3>
|
||||||
{% endif %}
|
<p>{{ order.description }}</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Reference in New Issue
Block a user