87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
from django.contrib import admin
|
|
from .models import Document, DocumentSegment, Organization, Risk, Control, DocumentTemplate, DocumentRiskControl, DemoCode
|
|
from django.urls import reverse
|
|
from django.utils.html import format_html
|
|
from .utils import generate_demo_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('<a href="{}" target="_blank">Preview</a>', 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', 'subcategory', 'function', 'category')
|
|
search_fields = ('subcategory', 'function', 'category')
|
|
|
|
class DocumentRiskControlAdmin(admin.ModelAdmin):
|
|
list_display = ('document', 'risk', 'control', 'weight','likelihood')
|
|
|
|
class DemoCodeAdmin(admin.ModelAdmin):
|
|
|
|
list_display = ('code', 'created_at', 'used', 'company', 'used_at')
|
|
change_list_template = "admin/democode_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_demo_code()
|
|
if not DemoCode.objects.filter(code=code).exists():
|
|
DemoCode.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(DemoCode, DemoCodeAdmin)
|