From ea15329ad98128cbd7c8976cb89a16adefcfdbe0 Mon Sep 17 00:00:00 2001 From: MrMohammadY Date: Thu, 16 Sep 2021 12:18:12 +0430 Subject: [PATCH 1/5] Add(urls): including order urls --- snapp_food/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/snapp_food/urls.py b/snapp_food/urls.py index 0e6e7e0..b36d68f 100644 --- a/snapp_food/urls.py +++ b/snapp_food/urls.py @@ -28,6 +28,7 @@ path('item/', include('item.urls', namespace='item')), path('cart/', include('cart.urls', namespace='cart')), path('payment/', include('payment.urls', namespace='payment')), + path('order/', include('order.urls', namespace='order')), ] From 47123dac33518e8bcba92bc4295478b03d3a54f5 Mon Sep 17 00:00:00 2001 From: MrMohammadY Date: Thu, 16 Sep 2021 12:18:51 +0430 Subject: [PATCH 2/5] Update(order/models): update order status --- order/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/order/models.py b/order/models.py index 9e4d68c..7326ace 100644 --- a/order/models.py +++ b/order/models.py @@ -13,7 +13,7 @@ class Order(BaseModel): STATUS = ( (PREPARING_FOOD, _('preparing food')), - (PREPARING_FOOD, _('sending')), + (SENDING, _('sending')), ) invoice = models.OneToOneField(Invoice, verbose_name=_('invoice'), related_name='order', on_delete=models.PROTECT) customer = models.ForeignKey(Customer, verbose_name=_('customer'), related_name='orders', on_delete=models.PROTECT) From a394c182fdf9bd286476473aa6231b2d3dba337a Mon Sep 17 00:00:00 2001 From: MrMohammadY Date: Thu, 16 Sep 2021 12:19:15 +0430 Subject: [PATCH 3/5] Migration(order/migrations): create new migrations for status --- order/migrations/0003_alter_order_status.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 order/migrations/0003_alter_order_status.py diff --git a/order/migrations/0003_alter_order_status.py b/order/migrations/0003_alter_order_status.py new file mode 100644 index 0000000..cf7f259 --- /dev/null +++ b/order/migrations/0003_alter_order_status.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2 on 2021-09-15 09:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0002_auto_20210913_1544'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='status', + field=models.PositiveSmallIntegerField(choices=[(0, 'preparing food'), (1, 'sending')], default=0, verbose_name='status'), + ), + ] From 8ce1c28f46d6bd62fd86391a677fd55936523e3d Mon Sep 17 00:00:00 2001 From: MrMohammadY Date: Thu, 16 Sep 2021 12:19:54 +0430 Subject: [PATCH 4/5] Add(order/views, urls, filters): create order service views and urls --- order/filters.py | 17 +++++++++ order/urls.py | 12 +++++++ order/views.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 order/filters.py create mode 100644 order/urls.py diff --git a/order/filters.py b/order/filters.py new file mode 100644 index 0000000..12d04cc --- /dev/null +++ b/order/filters.py @@ -0,0 +1,17 @@ +from django import forms + +import django_filters + +from order.models import Order + + +class OrderFilter(django_filters.FilterSet): + created_time = django_filters.DateFilter( + widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date', 'data-date-format': 'YYYY-MMMM-DD '}), + lookup_expr='contains' + ) + + status = django_filters.ChoiceFilter( + choices=Order.STATUS, + widget=forms.Select(attrs={'class': 'form-control'}) + ) \ No newline at end of file diff --git a/order/urls.py b/order/urls.py new file mode 100644 index 0000000..2f786c7 --- /dev/null +++ b/order/urls.py @@ -0,0 +1,12 @@ +from django.urls import path + +from order.views import OrderServiceListView, OrderServiceDetailView, OrderServiceUpdateView, OrderServiceListFilterView + +app_name = 'order' + +urlpatterns = [ + path('service/list//', OrderServiceListFilterView.as_view(), name='service-order-list'), + path('service/today//', OrderServiceListView.as_view(), name='service-order-today'), + path('service/detail//', OrderServiceDetailView.as_view(), name='service-order-detail'), + path('service/update//', OrderServiceUpdateView.as_view(), name='service-order-update'), +] \ No newline at end of file diff --git a/order/views.py b/order/views.py index 91ea44a..831b52f 100644 --- a/order/views.py +++ b/order/views.py @@ -1,3 +1,93 @@ -from django.shortcuts import render +from abc import ABC -# Create your views here. +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseForbidden +from django.shortcuts import get_object_or_404 +from django.urls import reverse_lazy +from django.utils import timezone +from django.utils.decorators import method_decorator +from django.views.decorators.http import require_http_methods +from django.views.generic import ListView, DetailView, UpdateView + +from django_filters.views import FilterView + +from order.filters import OrderFilter +from order.models import Order +from service.models import Service + +from library.utils import CustomUserPasses + + +class BaseOrderServiceList(CustomUserPasses): + model = Order + + def test_func(self): + if self.service.service_provider != self.request.user: + return False + return True + + +class BaseOrderDetailUpdate(CustomUserPasses): + model = Order + + def test_func(self): + order = self.get_object() + if order.invoice.cart.service.service_provider != self.request.user: + return False + return True + + +@method_decorator(require_http_methods(['GET']), name='dispatch') +@method_decorator(login_required(login_url=reverse_lazy('accounts:service-provider-login')), name='dispatch') +class OrderServiceListFilterView(FilterView): + context_object_name = 'orders' + filterset_class = OrderFilter + template_name = 'order/service/order_filter_list.html' + + def dispatch(self, request, *args, **kwargs): + self.service = get_object_or_404(Service, pk=self.kwargs.get('service_pk', None)) + if self.service.service_provider != self.request.user: + return HttpResponseForbidden() + return super().dispatch(request, *args, **kwargs) + + def get_queryset(self): + return Order.objects.filter(invoice__cart__service=self.service) + + +@method_decorator(require_http_methods(['GET']), name='dispatch') +@method_decorator(login_required(login_url=reverse_lazy('accounts:service-provider-login')), name='dispatch') +class OrderServiceListView(BaseOrderServiceList, ListView): + context_object_name = 'orders' + template_name = 'order/service/order_list.html' + + def dispatch(self, request, *args, **kwargs): + self.service = get_object_or_404(Service, pk=self.kwargs.get('service_pk', None)) + return super().dispatch(request, *args, **kwargs) + + def get_queryset(self): + today = timezone.now() + time_filter = dict( + created_time__day=today.strftime('%d'), + created_time__month=today.strftime('%m'), + created_time__year=today.strftime('%Y') + ) + return Order.objects.exclude(is_delivered=True).filter(invoice__cart__service=self.service, **time_filter) + + +@method_decorator(require_http_methods(['GET']), name='dispatch') +@method_decorator(login_required(login_url=reverse_lazy('accounts:service-provider-login')), name='dispatch') +class OrderServiceDetailView(BaseOrderDetailUpdate, DetailView): + context_object_name = 'order' + template_name = 'order/service/order_detail.html' + + +@method_decorator(require_http_methods(['GET', 'POST']), name='dispatch') +@method_decorator(login_required(login_url=reverse_lazy('accounts:service-provider-login')), name='dispatch') +class OrderServiceUpdateView(BaseOrderDetailUpdate, UpdateView): + fields = ('status',) + context_object_name = 'order' + template_name = 'order/service/order_update.html' + + def get_success_url(self): + order = self.get_object() + return reverse_lazy('order:service-order-list', kwargs={'service_pk': order.invoice.cart.service.id}) From b5cb54e1fb6c0790f5371f0bcb37d9fb6a12c93c Mon Sep 17 00:00:00 2001 From: MrMohammadY Date: Thu, 16 Sep 2021 12:20:19 +0430 Subject: [PATCH 5/5] Style(templates): update templates --- .../templates/order/service/order_detail.html | 55 +++++++++++++++++++ .../order/service/order_filter_list.html | 34 ++++++++++++ order/templates/order/service/order_list.html | 26 +++++++++ .../templates/order/service/order_update.html | 9 +++ .../service/service_provider/list.html | 22 +++++--- 5 files changed, 137 insertions(+), 9 deletions(-) create mode 100644 order/templates/order/service/order_detail.html create mode 100644 order/templates/order/service/order_filter_list.html create mode 100644 order/templates/order/service/order_list.html create mode 100644 order/templates/order/service/order_update.html diff --git a/order/templates/order/service/order_detail.html b/order/templates/order/service/order_detail.html new file mode 100644 index 0000000..1536d92 --- /dev/null +++ b/order/templates/order/service/order_detail.html @@ -0,0 +1,55 @@ +{% extends 'base.html' %} +{% block title %}Order Detail{% endblock %} +{% block content %} + +
+
+
+
+

id : {{ order.id }}

+

status : {{ order.get_status_display }}

+

date time : {{ order.created_time }}

+

total price : {{ order.invoice.price }}$

+
+
+ +
+

Lines:

+
+
+
+

+ Item +

+
+
+

+ Quantity +

+
+
+ {% for cartline in order.invoice.cart.lines.all %} +
+
+
+

+ {{ cartline.item }} +

+
+
+

+ {{ cartline.quantity }} +

+
+
+
+ {% endfor %} +
+ +
+{% endblock %} \ No newline at end of file diff --git a/order/templates/order/service/order_filter_list.html b/order/templates/order/service/order_filter_list.html new file mode 100644 index 0000000..6701b03 --- /dev/null +++ b/order/templates/order/service/order_filter_list.html @@ -0,0 +1,34 @@ +{% extends 'base.html' %} +{% block title %}Payment Verification{% endblock %} +{% block content %} + +
+
+
+ {{ filter.form.as_p }} + +
+
+
+ {% for order in orders %} +
+
+
+
+

id : {{ order.id }}

+

status : {{ order.get_status_display }}

+

date time : {{ order.created_time }}

+

total price : {{ order.invoice.price }}$

+
+
+ +
+
+ {% endfor %} +
+
+ +{% endblock %} diff --git a/order/templates/order/service/order_list.html b/order/templates/order/service/order_list.html new file mode 100644 index 0000000..b603793 --- /dev/null +++ b/order/templates/order/service/order_list.html @@ -0,0 +1,26 @@ +{% extends 'base.html' %} +{% block title %}Payment Verification{% endblock %} +{% block content %} +
Today: {% now "Y-m-d" %}
+
+ {% for order in orders %} +
+
+
+
+

id : {{ order.id }}

+

status : {{ order.get_status_display }}

+

date time : {{ order.created_time }}

+

total price : {{ order.invoice.price }}$

+
+
+ +
+
+ {% endfor %} +
+ +{% endblock %} \ No newline at end of file diff --git a/order/templates/order/service/order_update.html b/order/templates/order/service/order_update.html new file mode 100644 index 0000000..2d4f93e --- /dev/null +++ b/order/templates/order/service/order_update.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} +{% block content %} +
+ {% csrf_token %} + {{ form.as_p }} + +
+ cancel +{% endblock %} diff --git a/service/templates/service/service_provider/list.html b/service/templates/service/service_provider/list.html index 64f5075..e62ea8e 100644 --- a/service/templates/service/service_provider/list.html +++ b/service/templates/service/service_provider/list.html @@ -5,15 +5,19 @@