import io import jdatetime import xlsxwriter from django.contrib import admin from django.db.models import Sum from django.http import HttpResponse from django.utils import timezone from .models import PaymentRequest, PNA, Fake class PNAAdmin(admin.ModelAdmin): list_display = ['pna_status_code', 'pna_status_message', 'jajali_datetime', 'payment_request'] list_filter = ['pna_status'] search_fields = ['pna_status_code', 'pna_status_message'] @admin.action(description="export exel") def export_exel(modeladmin, request, queryset): output = io.BytesIO() workbook = xlsxwriter.Workbook(output, options={"remove_timezone": True}) worksheet = workbook.add_worksheet() for col, header in enumerate([]): worksheet.write(0, col, header) for row, payment_request in enumerate(queryset, 1): worksheet.write(row, 0, payment_request.amount) worksheet.write(row, 1, str(payment_request.pk)) worksheet.write(row, 2, str(payment_request.user.pk)) worksheet.write(row, 3, payment_request.jajali_datetime) worksheet.write(row, 4, payment_request.gateway) worksheet.write(row, 5, payment_request.get_state_display()) workbook.close() # create a response response = HttpResponse(content_type='application/vnd.ms-excel') # tell the browser what the file is named file_name = jdatetime.date.fromgregorian(date=timezone.now(), locale='fa_IR').strftime("%Y/%m/%d") response['Content-Disposition'] = f'attachment;filename="{file_name}.xlsx"' # put the spreadsheet data into the response response.write(output.getvalue()) # return the response return response class PaymentRequestAdmin(admin.ModelAdmin): list_display = ['state', 'uuid', 'splited_amount', 'user_id', 'jajali_datetime', 'created_at', 'application', 'gateway'] search_fields = ['application__uuid','application__client_id', 'amount', 'user__uuid'] list_filter = ['application', 'state', 'gateway'] actions = [export_exel] def changelist_view(self, request, extra_context=None): extra_context = extra_context or {} cl = self.get_changelist_instance(request) queryset = cl.result_list totals = queryset.aggregate( total_amount=Sum('amount'), ) extra_context['totals'] = totals return super().changelist_view(request, extra_context=extra_context) class FakeAdmin(admin.ModelAdmin): list_display = [ 'created_at'] admin.site.register(PaymentRequest, PaymentRequestAdmin) admin.site.register(PNA, PNAAdmin) admin.site.register(Fake, FakeAdmin)