Introduced a full-featured analytics module for e-commerce business intelligence, including sales, product, customer, shipping, and review analytics, with API endpoints for dashboard and custom reports. Added VAT rate management: new VATRate model, admin interface, serializer, and API endpoints, and integrated VAT logic into Product and pricing calculations. Refactored configuration and admin code to support VAT rates, improved email notification tasks, and updated related serializers, views, and URLs for unified configuration and VAT management.
60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
from django.contrib import admin
|
|
from .models import SiteConfiguration, VATRate
|
|
|
|
# Register your models here.
|
|
|
|
@admin.register(SiteConfiguration)
|
|
class SiteConfigurationAdmin(admin.ModelAdmin):
|
|
fieldsets = (
|
|
('Basic Information', {
|
|
'fields': ('name', 'logo', 'favicon', 'currency')
|
|
}),
|
|
('Contact Information', {
|
|
'fields': ('contact_email', 'contact_phone', 'contact_address', 'opening_hours')
|
|
}),
|
|
('Social Media', {
|
|
'fields': ('facebook_url', 'instagram_url', 'youtube_url', 'tiktok_url', 'whatsapp_number')
|
|
}),
|
|
('Shipping Settings', {
|
|
'fields': ('zasilkovna_shipping_price', 'deutschepost_shipping_price', 'free_shipping_over')
|
|
}),
|
|
('API Credentials', {
|
|
'fields': ('zasilkovna_api_key', 'zasilkovna_api_password', 'deutschepost_client_id', 'deutschepost_client_secret', 'deutschepost_customer_ekp'),
|
|
'classes': ('collapse',)
|
|
}),
|
|
('Coupon Settings', {
|
|
'fields': ('multiplying_coupons', 'addition_of_coupons_amount')
|
|
}),
|
|
)
|
|
|
|
@admin.register(VATRate)
|
|
class VATRateAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'rate', 'is_default', 'is_active', 'description')
|
|
list_filter = ('is_active', 'is_default')
|
|
search_fields = ('name', 'description')
|
|
list_editable = ('is_active',)
|
|
|
|
def get_readonly_fields(self, request, obj=None):
|
|
# Make is_default read-only in change form to prevent conflicts
|
|
if obj: # editing an existing object
|
|
return ('is_default',) if not obj.is_default else ()
|
|
return ()
|
|
|
|
actions = ['make_default']
|
|
|
|
def make_default(self, request, queryset):
|
|
if queryset.count() != 1:
|
|
self.message_user(request, "Select exactly one VAT rate to make default.", level='ERROR')
|
|
return
|
|
|
|
vat_rate = queryset.first()
|
|
# Clear existing defaults
|
|
VATRate.objects.filter(is_default=True).update(is_default=False)
|
|
# Set new default
|
|
vat_rate.is_default = True
|
|
vat_rate.save()
|
|
|
|
self.message_user(request, f"'{vat_rate.name}' is now the default VAT rate.")
|
|
|
|
make_default.short_description = "Make selected VAT rate the default"
|