# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
import six
from datetime import timedelta
from django.db.models import Q
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from shuup.admin.base import AdminModule, MenuEntry, Notification, SearchResult
from shuup.admin.menu import ORDERS_MENU_CATEGORY, STOREFRONT_MENU_CATEGORY
from shuup.admin.shop_provider import get_shop
from shuup.admin.utils.urls import admin_url, derive_model_url, get_edit_and_list_urls, get_model_url
from shuup.admin.views.home import HelpBlockCategory, SimpleHelpBlock
from shuup.core.models import Order, OrderStatus, OrderStatusRole
[docs]class OrderEntry(MenuEntry):
name = _("Orders")
[docs] def get_badge(self, request):
shop = get_shop(request)
received_orders_count = (
Order.objects.valid()
.filter(
shop=shop,
status__role=OrderStatusRole.INITIAL,
)
.count()
)
if received_orders_count:
return {"tag": "danger", "value": received_orders_count}
[docs]class OrderModule(AdminModule):
name = _("Orders")
breadcrumbs_menu_entry = OrderEntry(name, url="shuup_admin:order.list")
[docs] def get_urls(self):
return [
admin_url(
r"^orders/(?P<pk>\d+)/create-shipment/(?P<supplier_pk>\d+)/$",
"shuup.admin.modules.orders.views.OrderCreateShipmentView",
name="order.create-shipment",
),
admin_url(
r"^shipments/(?P<pk>\d+)/delete/$",
"shuup.admin.modules.orders.views.ShipmentDeleteView",
name="order.delete-shipment",
),
admin_url(
r"^shipments/(?P<pk>\d+)/set-sent/$",
"shuup.admin.modules.orders.views.ShipmentSetSentView",
name="order.set-shipment-sent",
),
admin_url(
r"^shipments/$", "shuup.admin.modules.orders.views.ShipmentListView", name="order.shipments.list"
),
admin_url(
r"^orders/(?P<pk>\d+)/create-payment/$",
"shuup.admin.modules.orders.views.OrderCreatePaymentView",
name="order.create-payment",
),
admin_url(
r"^orders/(?P<pk>\d+)/delete-payment/$",
"shuup.admin.modules.orders.views.OrderDeletePaymentView",
name="order.delete-payment",
),
admin_url(
r"^orders/(?P<pk>\d+)/set-paid/$",
"shuup.admin.modules.orders.views.OrderSetPaidView",
name="order.set-paid",
),
admin_url(
r"^orders/(?P<pk>\d+)/set-status/$",
"shuup.admin.modules.orders.views.OrderSetStatusView",
name="order.set-status",
),
admin_url(
r"^orders/(?P<pk>\d+)/new-log-entry/$",
"shuup.admin.modules.orders.views.NewLogEntryView",
name="order.new-log-entry",
),
admin_url(
r"^orders/(?P<pk>\d+)/update-admin-comment/$",
"shuup.admin.modules.orders.views.UpdateAdminCommentView",
name="order.update-admin-comment",
),
admin_url(
r"^orders/(?P<pk>\d+)/create-refund/$",
"shuup.admin.modules.orders.views.OrderCreateRefundView",
name="order.create-refund",
),
admin_url(
r"^orders/(?P<pk>\d+)/create-refund/full-refund$",
"shuup.admin.modules.orders.views.OrderCreateFullRefundView",
name="order.create-full-refund",
),
admin_url(
r"^orders/(?P<pk>\d+)/$", "shuup.admin.modules.orders.views.OrderDetailView", name="order.detail"
),
admin_url(r"^orders/new/$", "shuup.admin.modules.orders.views.OrderEditView", name="order.new"),
admin_url(
r"^orders/(?P<pk>\d+)/edit/$", "shuup.admin.modules.orders.views.OrderEditView", name="order.edit"
),
admin_url(r"^orders/$", "shuup.admin.modules.orders.views.OrderListView", name="order.list"),
admin_url(
r"^orders/list-settings/",
"shuup.admin.modules.settings.views.ListSettingsView",
name="order.list_settings",
),
admin_url(
r"^orders/(?P<pk>\d+)/edit-addresses/$",
"shuup.admin.modules.orders.views.OrderAddressEditView",
name="order.edit-addresses",
),
]
[docs] def get_search_results(self, request, query):
minimum_query_length = 3
if len(query) >= minimum_query_length:
orders = Order.objects.filter(
Q(identifier__istartswith=query)
| Q(reference_number__istartswith=query)
| Q(email__icontains=query)
| Q(phone__icontains=query)
).order_by("-id")[:15]
for i, order in enumerate(orders):
relevance = 100 - i
yield SearchResult(
text=six.text_type(order), url=get_model_url(order), category=_("Orders"), relevance=relevance
)
[docs] def get_notifications(self, request):
shop = request.shop
old_open_orders = Order.objects.filter(
shop=shop, status__role=OrderStatusRole.INITIAL, order_date__lt=now() - timedelta(days=4)
).count()
if old_open_orders:
yield Notification(
title=_("Outstanding Orders"), text=_("%d outstanding orders") % old_open_orders, kind="danger"
)
[docs] def get_model_url(self, object, kind, shop=None):
return derive_model_url(Order, "shuup_admin:order", object, kind)
[docs] def get_help_blocks(self, request, kind):
from shuup.admin.utils.permissions import has_permission
if kind == "quicklink" and has_permission(request.user, "order.new"):
actions = [{"text": _("New order"), "url": self.get_model_url(Order, "new")}]
yield SimpleHelpBlock(
text=_("New order"),
actions=actions,
icon_url="shuup_admin/img/product.png",
priority=0,
category=HelpBlockCategory.ORDERS,
done=Order.objects.filter(shop=request.shop).exists() if kind == "setup" else False,
)
[docs]class OrderStatusModule(AdminModule):
name = _("Order Status")
breadcrumbs_menu_entry = OrderEntry(name, url="shuup_admin:order_status.list")
[docs] def get_urls(self):
return get_edit_and_list_urls(
url_prefix="^order-status",
view_template="shuup.admin.modules.orders.views.OrderStatus%sView",
name_template="order_status.%s",
)
[docs] def get_model_url(self, object, kind, shop=None):
return derive_model_url(OrderStatus, "shuup_admin:order_status", object, kind)