You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.5 KiB

from django.contrib import admin
from .models import Warehouse, StorageLocation, StockOperation
from django.urls import path
from django.shortcuts import render
import matplotlib.pyplot as plt
from io import BytesIO
import base64
import matplotlib
matplotlib.use('Agg')
@admin.register(Warehouse)
class WarehouseAdmin(admin.ModelAdmin):
list_display = ('name', 'location', 'is_active')
search_fields = ('name', 'location')
@admin.register(StorageLocation)
class StorageLocationAdmin(admin.ModelAdmin):
list_display = ('name', 'warehouse', 'temperature_control')
search_fields = ('name', 'warehouse__name')
list_filter = ('temperature_control',)
@admin.register(StockOperation)
class StockOperationAdmin(admin.ModelAdmin):
list_display = ('product', 'warehouse', 'operation_type', 'quantity', 'operation_date')
search_fields = ('product__name', 'warehouse__name', 'operation_type')
list_filter = ('operation_type', 'operation_date')
def changelist_view(self, request, extra_context=None):
extra_context = extra_context or {}
extra_context['custom_button'] = {
'url': 'statistics/',
'label': 'Просмотреть статистику'
}
return super().changelist_view(request, extra_context)
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path('statistics/', self.admin_site.admin_view(self.statistics_view), name='stock_operation_statistics'),
]
return custom_urls + urls
def statistics_view(self, request):
operations = StockOperation.objects.all()
incoming_count = operations.filter(operation_type='Incoming').count()
outgoing_count = operations.filter(operation_type='Outgoing').count()
transfer_count = operations.filter(operation_type='Transfer').count()
writeoff_count = operations.filter(operation_type='WriteOff').count()
labels = ['Incoming', 'Outgoing', 'Transfer', 'WriteOff']
data = [incoming_count, outgoing_count, transfer_count, writeoff_count]
plt.figure(figsize=(6, 6))
plt.pie(data, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal')
buffer = BytesIO()
plt.savefig(buffer, format='png')
buffer.seek(0)
image_png = buffer.getvalue()
buffer.close()
chart = base64.b64encode(image_png).decode('utf-8')
context = {'chart': chart}
return render(request, 'admin/warehouse/stock_statistics.html', context)