From 6f70716f0a9c6d7c91f1638b5ce2c807b608d734 Mon Sep 17 00:00:00 2001 From: vlados31 Date: Mon, 3 Oct 2022 01:41:53 +0300 Subject: [PATCH] Add order respondes --- order/admin.py | 5 ++ ...rder_email_alter_order_phone_orderimage.py | 33 +++++++++ ...018_alter_orderimage_image_orderrespond.py | 33 +++++++++ .../0019_remove_orderrespond_comment.py | 17 +++++ ...respond_unique_order_respond_user_order.py | 17 +++++ order/models.py | 23 ++++++ order/urls.py | 1 + order/views.py | 54 ++++++++++++-- templates/base.html | 4 +- templates/orders/order-respond.html | 23 ++++++ templates/orders/order-view.html | 72 ++++++++++++++----- templates/profile.html | 26 ------- 12 files changed, 258 insertions(+), 50 deletions(-) create mode 100644 order/migrations/0017_alter_order_email_alter_order_phone_orderimage.py create mode 100644 order/migrations/0018_alter_orderimage_image_orderrespond.py create mode 100644 order/migrations/0019_remove_orderrespond_comment.py create mode 100644 order/migrations/0020_orderrespond_unique_order_respond_user_order.py create mode 100644 templates/orders/order-respond.html delete mode 100644 templates/profile.html diff --git a/order/admin.py b/order/admin.py index 5826a95..4143ea7 100644 --- a/order/admin.py +++ b/order/admin.py @@ -17,3 +17,8 @@ class OrderAdmin(admin.ModelAdmin): @admin.register(OrderImage) class OrderImageAdmin(admin.ModelAdmin): pass + + +@admin.register(OrderRespond) +class OrderRespondAdmin(admin.ModelAdmin): + pass diff --git a/order/migrations/0017_alter_order_email_alter_order_phone_orderimage.py b/order/migrations/0017_alter_order_email_alter_order_phone_orderimage.py new file mode 100644 index 0000000..de00e9d --- /dev/null +++ b/order/migrations/0017_alter_order_email_alter_order_phone_orderimage.py @@ -0,0 +1,33 @@ +# Generated by Django 4.1.1 on 2022-09-29 22:54 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0016_alter_order_email_alter_order_moderated_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='email', + field=models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email'), + ), + 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}$')], verbose_name='Телефон'), + ), + migrations.CreateModel( + name='OrderImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(height_field=1080, upload_to='media/order-images', verbose_name='Картинка', width_field=1920)), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='order', to='order.order', verbose_name='Заказ')), + ], + ), + ] diff --git a/order/migrations/0018_alter_orderimage_image_orderrespond.py b/order/migrations/0018_alter_orderimage_image_orderrespond.py new file mode 100644 index 0000000..26db1d2 --- /dev/null +++ b/order/migrations/0018_alter_orderimage_image_orderrespond.py @@ -0,0 +1,33 @@ +# Generated by Django 4.1.1 on 2022-10-02 15:39 + +import datetime +from django.conf import settings +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', '0017_alter_order_email_alter_order_phone_orderimage'), + ] + + operations = [ + migrations.AlterField( + model_name='orderimage', + name='image', + field=models.ImageField(upload_to=order.models._upload_image_filename, verbose_name='Картинка'), + ), + migrations.CreateModel( + name='OrderRespond', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='Время отклика')), + ('comment', models.CharField(blank=True, default='', max_length=200, verbose_name='Коммент')), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='respond_order', to='order.order', verbose_name='Заказ')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='respond_user', to=settings.AUTH_USER_MODEL, verbose_name='Пользователь')), + ], + ), + ] diff --git a/order/migrations/0019_remove_orderrespond_comment.py b/order/migrations/0019_remove_orderrespond_comment.py new file mode 100644 index 0000000..f54d2bf --- /dev/null +++ b/order/migrations/0019_remove_orderrespond_comment.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.1 on 2022-10-02 15:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0018_alter_orderimage_image_orderrespond'), + ] + + operations = [ + migrations.RemoveField( + model_name='orderrespond', + name='comment', + ), + ] diff --git a/order/migrations/0020_orderrespond_unique_order_respond_user_order.py b/order/migrations/0020_orderrespond_unique_order_respond_user_order.py new file mode 100644 index 0000000..a95114f --- /dev/null +++ b/order/migrations/0020_orderrespond_unique_order_respond_user_order.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.1 on 2022-10-02 20:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0019_remove_orderrespond_comment'), + ] + + operations = [ + migrations.AddConstraint( + model_name='orderrespond', + constraint=models.UniqueConstraint(fields=('user', 'order'), name='unique_order_respond_user_order'), + ), + ] diff --git a/order/models.py b/order/models.py index 82e272c..02e961a 100644 --- a/order/models.py +++ b/order/models.py @@ -251,3 +251,26 @@ class OrderImage(models.Model): return f"{self.id}: {self.order}" +class OrderRespond(models.Model): + create_time = models.DateTimeField(default=datetime.now, editable=False, verbose_name="Время отклика") + user = models.ForeignKey(SiteUser, on_delete=models.CASCADE, related_name="respond_user", verbose_name="Пользователь") + order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="respond_order", verbose_name="Заказ") + + class Meta: + constraints = [ + models.UniqueConstraint( + fields=['user', 'order'], name='unique_order_respond_user_order' + ) + ] + + def __str__(self): + return f"{self.order}: {self.user}" + + def save(self, *args, **kwargs): + if Order.objects.get(id=self.order.id) == self.user.id: + raise Exception("User can't respond to self order") + + self.full_clean() + + super().save(*args, **kwargs) + diff --git a/order/urls.py b/order/urls.py index 0732570..b321ea8 100644 --- a/order/urls.py +++ b/order/urls.py @@ -21,5 +21,6 @@ urlpatterns = [ path('', views.orders_list, name='orders-list'), path('create', views.order_create, name='order-create'), path('view/', views.order_view, name='order-view'), + path('respond/', views.order_respond, name='order-respond'), ] diff --git a/order/views.py b/order/views.py index 97c28a1..0ff291f 100644 --- a/order/views.py +++ b/order/views.py @@ -1,5 +1,9 @@ +import traceback + from django.http import HttpResponseRedirect from django.shortcuts import render +from django.urls import reverse + from .forms import * from django.contrib.auth.decorators import login_required @@ -37,7 +41,49 @@ def order_create(request): @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) - images = OrderImage.objects.filter(order=order) - return render(request, 'orders/order-view.html', {"order": order, "images": images}) + render_vars = {} + try: + order = Order.get_all_for_user(request.user) + order = order.select_related('address_city').get(id=order_id) + render_vars["order"] = order + + render_vars["images"] = OrderImage.objects.filter(order=order) + + render_vars["can_responde"] = order.owner_id != request.user.id + + if render_vars["can_responde"]: + render_vars["respondes_count"] = OrderRespond.objects.filter(order_id=order_id).count() + + render_vars["is_responde"] = OrderRespond.objects.filter(user_id=request.user.id, order_id=order_id).count() > 0 + + render_vars["respond_users"] = OrderRespond.objects.filter(order_id=order_id).\ + select_related('user').order_by('create_time') + + except Exception: + traceback.print_exc() + render_vars["order"] = None + return render(request, 'orders/order-view.html', render_vars) + + +@login_required +def order_respond(request, order_id): + try: + if request.method == 'POST': + action = None + if "action" in request.POST: + action = request.POST["action"] + else: + print("order_respond: no action param found!") + + if action == "respond": + r = OrderRespond(order_id=order_id, user=request.user) + r.save() + print("order_respond: save respond!") + + if action == "unrespond": + OrderRespond.objects.filter(order_id=order_id, user=request.user).delete() + + except Exception: + traceback.print_exc() + + return HttpResponseRedirect(f'/orders/view/{order_id}') diff --git a/templates/base.html b/templates/base.html index 98f124d..9131023 100644 --- a/templates/base.html +++ b/templates/base.html @@ -49,13 +49,13 @@ diff --git a/templates/orders/order-respond.html b/templates/orders/order-respond.html new file mode 100644 index 0000000..a4e8b9a --- /dev/null +++ b/templates/orders/order-respond.html @@ -0,0 +1,23 @@ +{% extends 'base.html' %} +{% block title %} Аккаунт | вход {% endblock %} + +{% block styles %} + +{% endblock %} + +{% block content %} + +{% endblock %} diff --git a/templates/orders/order-view.html b/templates/orders/order-view.html index 08eaba9..716b510 100644 --- a/templates/orders/order-view.html +++ b/templates/orders/order-view.html @@ -15,31 +15,67 @@ font-weight: bolder; margin-right: 1em; } + + .respond-user { + border-left: 1px dashed violet; + margin: 2em; + padding-left: 1em; + } {% endblock %} {% block content %} -

Заказ {{ order.name }}

+ {% if order %} +

Заказ {{ order.name }}

-
- {% for i in images %} - image-{{ i.id }} - {% endfor %} -
+
+ {% for i in images %} + image-{{ i.id }} + {% endfor %} +
-
- Описание: -

{{ order.description }}

-
+
+ Описание: +

{{ order.description }}

+
-
- Дата создания: -

{{ order.create_time }}

-
+
+ Дата создания: +

{{ order.create_time }}

+
-
- Город: -

{{ order.address_city.name }}

-
+
+ Город: +

{{ order.address_city.name }}

+
+ + {% if can_responde %} + {% if is_responde %} +
+ {% csrf_token %} + + +
+ {% else %} +
+ {% csrf_token %} + + +
+ {% endif %} +

Откликнулось человек: {{ respondes_count }}

+ {% else %} +

+ Вы владелец объявления. {% if respond_users %}Вот эти пользователи откликнулись на ваше объявление:{% else %}Пока на него нет откликов.{% endif %} +

+ {% for r in respond_users %} +
+ {{ r.create_time }}: {{ r.user.name }} +
+ {% endfor %} + {% endif %} + {% else %} +

Запрошенный вами заказ не найден!

+ {% endif %} {% endblock %} diff --git a/templates/profile.html b/templates/profile.html deleted file mode 100644 index 7731fae..0000000 --- a/templates/profile.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends 'base.html' %} -{% block title %} Аккаунт | вход {% endblock %} - -{% block content %} -

Ваш аккаунт

- {% if user.is_authenticated %} - Ваше имя: {{ user.name }}
- Ваша фамилия: {{ user.surname }}
- Ваша почта: {{ user.email }}
- Ваш телефон: {{ user.phone }}
- Ваш телефон верифицирован: - {% if user.is_phone_verified %} - Да - {% else %} - Нет - {% endif %}
- - {% if user.is_staff %} - Вам разрешено входить в административную часть сайта -
- {% endif %} - {% else %} - Вы не вошли. Используйте меню аккаунта для входа или авторизации. - {% endif %} - -{% endblock %}