from django.contrib import admin from .models import Document, DocumentSegment, Organization, Risk, Control, DocumentTemplate, DocumentRiskControl, PaymentCode from django.urls import reverse from django.utils.html import format_html from .utils import generate_payment_code from django.urls import path from django.shortcuts import render, redirect from .forms import GenerateCodesForm class DocumentSegmentInline(admin.StackedInline): model = DocumentSegment extra = 1 ordering = ['order'] fields = ('segment_type', 'content', 'order') class DocumentAdmin(admin.ModelAdmin): inlines = [DocumentSegmentInline] list_display = ('organization', 'created_at', 'modified_at') search_fields = ['organization__name'] readonly_fields = ('created_at', 'modified_at') class DocumentTemplateAdmin(admin.ModelAdmin): list_display = ['name', 'created_at', 'updated_at', 'preview_button'] def preview_button(self, obj): url = reverse('core:template_preview', args=[obj.name]) return format_html('Preview', url) preview_button.short_description = 'Preview' preview_button.allow_tags = True class OrganizationAdmin(admin.ModelAdmin): list_display = ('name', 'email', 'industry_sector') search_fields = ['name', 'email'] class RiskAdmin(admin.ModelAdmin): ordering = ['risk_id'] list_display = ['risk_id','risk_name','category'] class ControlAdmin(admin.ModelAdmin): list_display = ('id','safeguard_id','name', 'description') class DocumentRiskControlAdmin(admin.ModelAdmin): list_display = ('document', 'risk', 'control', 'weight','likelihood') class PaymentCodeAdmin(admin.ModelAdmin): list_display = ('code', 'created_at', 'used', 'company', 'used_at') change_list_template = "admin/paymentcode_changelist.html" def get_urls(self): urls = super().get_urls() custom_urls = [ path('generate-codes/', self.admin_site.admin_view(self.generate_codes_view), name='generate-codes'), ] return custom_urls + urls def generate_codes_view(self, request): if request.method == 'POST': form = GenerateCodesForm(request.POST) if form.is_valid(): count = form.cleaned_data['count'] created = 0 for _ in range(count): while True: code = generate_payment_code() if not PaymentCode.objects.filter(code=code).exists(): PaymentCode.objects.create(code=code) created += 1 break self.message_user(request, f"{created} codes generated.") return redirect('..') else: form = GenerateCodesForm() return render(request, 'admin/generate_codes.html', {'form': form}) admin.site.register(Document, DocumentAdmin) admin.site.register(Organization, OrganizationAdmin) admin.site.register(Risk ,RiskAdmin) admin.site.register(Control, ControlAdmin) admin.site.register(DocumentTemplate, DocumentTemplateAdmin) admin.site.register(DocumentRiskControl, DocumentRiskControlAdmin) admin.site.register(PaymentCode, PaymentCodeAdmin)