add action in admin shop order panel

sync_v2
Raz 6 months ago
parent 97a7543f9e
commit 3b3cf56896
  1. 50
      shop/admin.py
  2. 2
      shop/signals.py
  3. 32
      shop/templates/admin/shop/order/change_status.html

@ -1,10 +1,14 @@
from django.contrib import admin
from django.shortcuts import render
from .models import Product, Color, Size, Order, OrderItem, GuestUser, Coupon, CouponUsage, OrderStatus, ShippingAddress
from django.shortcuts import render, redirect
from django.utils.html import format_html
from django.urls import path
from django.contrib import admin
from django.shortcuts import redirect
from django.http import HttpResponseRedirect
from django import forms
from .models import (
Product, Color, Size, Order, OrderItem, GuestUser, Coupon, CouponUsage,
OrderStatus, ShippingAddress
)
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
@ -45,18 +49,24 @@ class ShippingAddressAdmin(admin.ModelAdmin):
list_display = ('street_address', 'city', 'postal_code', 'country')
search_fields = ('street_address', 'city', 'postal_code', 'country')
class ChangeOrderStatusForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
status = forms.ChoiceField(choices=OrderStatus.choices, label="New Status")
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ('id', 'get_email', 'date_ordered', 'status', 'total_price', 'get_shipping_address')
inlines = [OrderItemInline]
list_filter = ('status', 'payment_status')
readonly_fields = ('shipping_address_details',)
actions = ['change_order_status']
def get_email(self, obj):
if obj.guest_user:
return obj.guest_user.email
else:
return obj.user.email
get_email.short_description = 'Email'
def get_shipping_address(self, obj):
if obj.shipping_address:
@ -199,6 +209,38 @@ class OrderAdmin(admin.ModelAdmin):
self.message_user(request, f"Error cancelling order: {str(e)}", level='ERROR')
return redirect('admin:shop_order_changelist')
def change_order_status(self, request, queryset):
"""Admin action to change the status of selected orders"""
form = None
if 'apply' in request.POST:
form = ChangeOrderStatusForm(request.POST)
if form.is_valid():
status = form.cleaned_data['status']
count = 0
for order in queryset:
order.status = status
order.save()
count += 1
self.message_user(request, f"{count} orders have been updated to status '{OrderStatus(status).label}'.")
return HttpResponseRedirect(request.get_full_path())
if not form:
form = ChangeOrderStatusForm(initial={'_selected_action': request.POST.getlist('_selected_action')})
context = {
'title': 'Change Order Status',
'orders': queryset,
'form': form,
'action': 'change_order_status'
}
return render(request, 'admin/shop/order/change_status.html', context)
change_order_status.short_description = "Change status for selected orders"
class GuestUserOrderInline(admin.TabularInline):
model = Order
extra = 0

@ -238,7 +238,7 @@ Montant payé: {final_price}€"""
}
# Order status update email
elif status in [OrderStatus.SHIPPED, OrderStatus.DELIVERED, OrderStatus.CANCELED, OrderStatus.PREPARED, OrderStatus.REFUNDED]:
elif status in [OrderStatus.SHIPPED, OrderStatus.DELIVERED, OrderStatus.CANCELED, OrderStatus.PREPARED, OrderStatus.REFUNDED, OrderStatus.READY]:
status_message = {
OrderStatus.PREPARED: "Votre commande est en cours de préparation.",
OrderStatus.READY: "Votre commande est prête.",

@ -0,0 +1,32 @@
{% extends "admin/base_site.html" %}
{% load i18n l10n admin_urls %}
{% block content %}
<div class="module">
<h2>{{ title }}</h2>
<div>
<p>Change status for the following {{ orders|length }} orders:</p>
<ul>
{% for order in orders %}
<li>{{ order }}</li>
{% endfor %}
</ul>
</div>
<form action="{% url 'admin:shop_order_changelist' %}" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="{{ action }}" />
{{ form.as_p }}
{% for obj in orders %}
<input type="hidden" name="_selected_action" value="{{ obj.pk }}" />
{% endfor %}
<div class="actions">
<input type="submit" name="apply" value="Change Status" class="default" />
<a href="{% url 'admin:shop_order_changelist' %}" class="button cancel-link">Cancel</a>
</div>
</form>
</div>
{% endblock %}
Loading…
Cancel
Save