diff --git a/account/models.py b/account/models.py index 1de54e8..fe2f254 100644 --- a/account/models.py +++ b/account/models.py @@ -156,17 +156,7 @@ class SiteAccountManager(BaseUserManager): return user def get_by_natural_key(self, phone_): - # Гоша попросил запилить фичу, чтобы принимались номера: - # +79991112233 - # 79991112233 - # 9991112233 - - if re.match("^[0-9]{10}$", phone_) is not None: - phone_ = f"+7{phone_}" - elif re.match("^7[0-9]{10}$", phone_) is not None: - phone_ = f"+{phone_}" - - return self.get(phone=phone_) + return self.model.get_by_natural_key(phone_) class SiteUser(AbstractBaseUser, PermissionsMixin): diff --git a/order/admin.py b/order/admin.py index 8c38f3f..90a0f39 100644 --- a/order/admin.py +++ b/order/admin.py @@ -1,3 +1,13 @@ from django.contrib import admin +from .models import * -# Register your models here. + +@admin.register(City) +class CityAdmin(admin.ModelAdmin): + list_display = ['code', 'name'] + ordering = ['name'] + + +@admin.register(Order) +class CityAdmin(admin.ModelAdmin): + pass diff --git a/order/models.py b/order/models.py index 7836c13..4190b82 100644 --- a/order/models.py +++ b/order/models.py @@ -1,8 +1,18 @@ from django.db import models +from account.models import SiteUser + class City(models.Model): - name = models.CharField(max_length=50) + code = models.CharField(primary_key=True, max_length=20, verbose_name="Код города") + name = models.CharField(unique=True, max_length=50, verbose_name="Название города") + + def __str__(self): + return f"{self.name} ({self.code})" + + @staticmethod + def to_choices(): + return City.objects.order_by('name').values_list('code', 'name') class Order(models.Model): @@ -17,8 +27,9 @@ class Order(models.Model): # дальше вид дома, тип ремонта, тип квартиры, требуется дизайн проект, закуп материала, тип исполнителя + CHOICE_UNDEFINED = '' + # тип ремонта - TYPE_OF_RENOVATION_UNDEFINED = '' TYPE_OF_RENOVATION_OVERHAUL = 'overhaul' TYPE_OF_RENOVATION_PARTIAL = 'partial' TYPE_OF_RENOVATION_REDECOR = 'redecor' @@ -26,15 +37,14 @@ class Order(models.Model): TYPE_OF_RENOVATION_DESIGN = 'design' TYPE_OF_RENOVATION_CHOICES = [ - (TYPE_OF_RENOVATION_UNDEFINED, 'Не указан'), + (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_RENOVATION_OVERHAUL, 'Капитальный'), (TYPE_OF_RENOVATION_PARTIAL, 'Частичный'), (TYPE_OF_RENOVATION_REDECOR, 'Косметический'), (TYPE_OF_RENOVATION_PREMIUM, 'Премиальный'), (TYPE_OF_RENOVATION_DESIGN, 'Дизайнерский'), ] - type_of_renovation = models.CharField(max_length=10, choices=TYPE_OF_RENOVATION_CHOICES, blank=True, - default=TYPE_OF_RENOVATION_UNDEFINED) + type_of_renovation = models.CharField(max_length=10, choices=TYPE_OF_RENOVATION_CHOICES, default=CHOICE_UNDEFINED) # тип дома TYPE_OF_HOUSE_BLOCK = 'block' @@ -43,25 +53,27 @@ class Order(models.Model): TYPE_OF_HOUSE_PANEL = 'panel' TYPE_OF_HOUSE_CHOICES = [ + (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_HOUSE_BLOCK, 'Блочный'), (TYPE_OF_HOUSE_BRICK, 'Кирпичный'), (TYPE_OF_HOUSE_MONOLITH, 'Монолит'), (TYPE_OF_HOUSE_PANEL, 'Панельный'), ] - type_of_house = models.CharField(max_length=10, choices=TYPE_OF_HOUSE_CHOICES, blank=True) + type_of_house = models.CharField(max_length=10, choices=TYPE_OF_HOUSE_CHOICES) # тип квартиры TYPE_OF_ROOM_PRIMARY = 'primary' TYPE_OF_ROOM_SECONDARY = 'secondary' TYPE_OF_ROOM_CHOICES = [ + (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_ROOM_PRIMARY, 'Первичка'), (TYPE_OF_ROOM_SECONDARY, 'Вторичка') ] - type_of_room = models.CharField(max_length=10, choices=TYPE_OF_ROOM_CHOICES, blank=True) + type_of_room = models.CharField(max_length=10, choices=TYPE_OF_ROOM_CHOICES) # требуется дизайн проект - REQUIRED_DESIGN_CHOICES = ((None, ''), (True, 'Да'), (False, 'Нет')) + REQUIRED_DESIGN_CHOICES = ((None, 'Не указано'), (True, 'Да'), (False, 'Нет')) is_require_design = models.BooleanField(default=None, blank=True, null=True, choices=REQUIRED_DESIGN_CHOICES) # закуп материала @@ -69,20 +81,22 @@ class Order(models.Model): PURCHASE_OF_MATERIAL_CUSTOMER = 'customer' PURCHASE_OF_MATERIAL_CHOICES = [ + (CHOICE_UNDEFINED, 'Не указано'), (PURCHASE_OF_MATERIAL_EXECUTOR, 'Исполнитель'), (PURCHASE_OF_MATERIAL_CUSTOMER, 'Заказчик') ] - purchase_of_material = models.CharField(max_length=10, choices=PURCHASE_OF_MATERIAL_CHOICES, blank=True) + purchase_of_material = models.CharField(max_length=10, choices=PURCHASE_OF_MATERIAL_CHOICES) # тип исполнителя TYPE_OF_EXECUTOR_INDIVIDUAL = 'individual' TYPE_OF_EXECUTOR_COMPANY = 'company' TYPE_OF_EXECUTOR_CHOICES = [ + (CHOICE_UNDEFINED, 'Не указан'), (TYPE_OF_EXECUTOR_INDIVIDUAL, 'Самозанятый/бригада'), (TYPE_OF_EXECUTOR_COMPANY, 'Компания') ] - type_of_executor = models.CharField(max_length=10, choices=TYPE_OF_ROOM_CHOICES, blank=True) + type_of_executor = models.CharField(max_length=10, choices=TYPE_OF_EXECUTOR_CHOICES) # дальше отдельные параметры is_with_warranty = models.BooleanField(default=True, verbose_name="С гарантией") @@ -92,7 +106,11 @@ class Order(models.Model): is_with_garbage_removal = models.BooleanField(default=False, verbose_name="С вывозом мусора") # примерная цена - approximate_price = models.DecimalField(max_digits=9, decimal_places=2, blank=False) + approximate_price = models.DecimalField(max_digits=9, decimal_places=2, blank=False, verbose_name="Цена") - # TODO нужно определится по поводу почты, телефона, адреса + # address_city = models.ForeignKey(City, on_delete=models.CASCADE, blank=False, related_name="address_city") + address_text = models.CharField(max_length=70, blank=True, verbose_name="Улица, дом") + + owner = models.ForeignKey(SiteUser, on_delete=models.CASCADE, null=True, related_name="owner", + verbose_name="Владелец") diff --git a/order/views.py b/order/views.py index 8dbce6a..a117f4e 100644 --- a/order/views.py +++ b/order/views.py @@ -1,4 +1,6 @@ +from django.http import HttpResponseRedirect from django.shortcuts import render +from .forms import * def orders_list(request): @@ -6,4 +8,19 @@ def orders_list(request): def order_create(request): - return render(request, 'orders/order-create.html') + if request.user.is_authenticated: + if request.method == 'POST': + form = BaseOrderCreationForm(request.POST) + if form.is_valid(): + return HttpResponseRedirect('/account') + else: + form = BaseOrderCreationForm() + else: + if request.method == 'POST': + form = UnregisteredUserOrderCreationForm(request.POST) + if form.is_valid(): + return HttpResponseRedirect('/account') + else: + form = UnregisteredUserOrderCreationForm() + + return render(request, 'orders/order-create.html', {'form': form}) diff --git a/templates/orders/order-create.html b/templates/orders/order-create.html index a9f9d07..a2d0c35 100644 --- a/templates/orders/order-create.html +++ b/templates/orders/order-create.html @@ -4,12 +4,15 @@ {% block content %}

Создать заказ

-

тут должна быть форма создания заказа

- - {% if user.is_authenticated %} - тут можно показать поля, которые нужны залогиненному юзеру - {% else %} - тут можно показать поля, которые нужны незалогиненному юзеру - {% endif %} +

тут должна быть форма создания заказа, собсна вот она

+
+ {% csrf_token %} + + + {{ form.as_table }} + +
+ +
{% endblock %} diff --git a/templates/registration/login.html b/templates/registration/login.html index 451e694..4a2cec6 100644 --- a/templates/registration/login.html +++ b/templates/registration/login.html @@ -12,13 +12,13 @@ {% block content %}

Ваш аккаунт

Вход

-
- {% csrf_token %} - - - {{ form.as_table }} - -
- -
+
+ {% csrf_token %} + + + {{ form.as_table }} + +
+ +
{% endblock %}