changed payment code to demo code

This commit is contained in:
2025-07-14 11:29:11 +02:00
parent 549f3a7633
commit 253db898a4
11 changed files with 57 additions and 40 deletions

View File

@@ -1,8 +1,8 @@
from django.contrib import admin from django.contrib import admin
from .models import Document, DocumentSegment, Organization, Risk, Control, DocumentTemplate, DocumentRiskControl, PaymentCode from .models import Document, DocumentSegment, Organization, Risk, Control, DocumentTemplate, DocumentRiskControl, DemoCode
from django.urls import reverse from django.urls import reverse
from django.utils.html import format_html from django.utils.html import format_html
from .utils import generate_payment_code from .utils import generate_demo_code
from django.urls import path from django.urls import path
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from .forms import GenerateCodesForm from .forms import GenerateCodesForm
@@ -44,10 +44,10 @@ class ControlAdmin(admin.ModelAdmin):
class DocumentRiskControlAdmin(admin.ModelAdmin): class DocumentRiskControlAdmin(admin.ModelAdmin):
list_display = ('document', 'risk', 'control', 'weight','likelihood') list_display = ('document', 'risk', 'control', 'weight','likelihood')
class PaymentCodeAdmin(admin.ModelAdmin): class DemoCodeAdmin(admin.ModelAdmin):
list_display = ('code', 'created_at', 'used', 'company', 'used_at') list_display = ('code', 'created_at', 'used', 'company', 'used_at')
change_list_template = "admin/paymentcode_changelist.html" change_list_template = "admin/democode_changelist.html"
def get_urls(self): def get_urls(self):
urls = super().get_urls() urls = super().get_urls()
@@ -64,9 +64,9 @@ class PaymentCodeAdmin(admin.ModelAdmin):
created = 0 created = 0
for _ in range(count): for _ in range(count):
while True: while True:
code = generate_payment_code() code = generate_demo_code()
if not PaymentCode.objects.filter(code=code).exists(): if not DemoCode.objects.filter(code=code).exists():
PaymentCode.objects.create(code=code) DemoCode.objects.create(code=code)
created += 1 created += 1
break break
self.message_user(request, f"{created} codes generated.") self.message_user(request, f"{created} codes generated.")
@@ -82,4 +82,4 @@ admin.site.register(Risk ,RiskAdmin)
admin.site.register(Control, ControlAdmin) admin.site.register(Control, ControlAdmin)
admin.site.register(DocumentTemplate, DocumentTemplateAdmin) admin.site.register(DocumentTemplate, DocumentTemplateAdmin)
admin.site.register(DocumentRiskControl, DocumentRiskControlAdmin) admin.site.register(DocumentRiskControl, DocumentRiskControlAdmin)
admin.site.register(PaymentCode, PaymentCodeAdmin) admin.site.register(DemoCode, DemoCodeAdmin)

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.1.3 on 2025-07-13 22:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0017_document_key_findings'),
]
operations = [
migrations.RenameModel(
old_name='PaymentCode',
new_name='DemoCode',
),
]

View File

@@ -175,7 +175,7 @@ class DocumentRiskControl(models.Model):
unique_together = ('document', 'risk', 'control') unique_together = ('document', 'risk', 'control')
class PaymentCode(models.Model): class DemoCode(models.Model):
code = models.CharField(max_length=10, unique=True) code = models.CharField(max_length=10, unique=True)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
used = models.BooleanField(default=False) used = models.BooleanField(default=False)

View File

@@ -0,0 +1,14 @@
{% extends "admin/change_list.html" %}
{% block object-tools %}
<div style="padding: 12px 0;">
<div style="padding: 12px 0;">
<a href="{% url 'admin:generate-codes' %}" class="button">Generate Demo Codes</a>
</div>
<div style="padding: 12px 0;">
<a href="{% url 'core:demo_codes_pdf' %}?filter_by=all" class="button">All (PDF)</a>
<a href="{% url 'core:demo_codes_pdf' %}?filter_by=used" class="button">Used (PDF)</a>
<a href="{% url 'core:demo_codes_pdf' %}?filter_by=available" class="button">Unused (PDF)</a>
</div>
</div>
{{ block.super }}
{% endblock %}

View File

@@ -2,7 +2,7 @@
{% block content %} {% block content %}
<div id="content-main"> <div id="content-main">
<h2>Generate Payment Codes</h2> <h2>Generate Demo Codes</h2>
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<input type="submit" name="apply" value="Generate" class="default"> <input type="submit" name="apply" value="Generate" class="default">

View File

@@ -1,14 +0,0 @@
{% extends "admin/change_list.html" %}
{% block object-tools %}
<div style="padding: 12px 0;">
<div style="padding: 12px 0;">
<a href="{% url 'admin:generate-codes' %}" class="button">Generate Payment Codes</a>
</div>
<div style="padding: 12px 0;">
<a href="{% url 'core:payment_codes_pdf' %}?filter_by=all" class="button">All (PDF)</a>
<a href="{% url 'core:payment_codes_pdf' %}?filter_by=used" class="button">Used (PDF)</a>
<a href="{% url 'core:payment_codes_pdf' %}?filter_by=available" class="button">Unused (PDF)</a>
</div>
</div>
{{ block.super }}
{% endblock %}

View File

@@ -4,11 +4,11 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PDF payment report</title> <title>Demo codes report</title>
<link rel="stylesheet" href="{% static 'css/document.css' %}"> <link rel="stylesheet" href="{% static 'css/document.css' %}">
</head> </head>
<body> <body>
<h1>Payment Codes Report</h1> <h1>Demo Codes Report</h1>
<table> <table>
<thead> <thead>
<tr> <tr>

View File

@@ -3,7 +3,7 @@
<section class="py-24 bg-gradient-to-br from-teal-100 to-primary flex items-center justify-center"> <section class="py-24 bg-gradient-to-br from-teal-100 to-primary flex items-center justify-center">
<div class="max-w-md w-full mx-auto text-center shadow-2xl border border-accent rounded-2xl p-4 bg-white/90 backdrop-blur"> <div class="max-w-md w-full mx-auto text-center shadow-2xl border border-accent rounded-2xl p-4 bg-white/90 backdrop-blur">
<h2 class="text-3xl font-extrabold mb-6 text-accent">Payment</h2> <h2 class="text-3xl font-extrabold mb-6 text-accent">Payment</h2>
<p class="text-lg text-gray-700 mb-6">Please enter your payment code to proceed to document.</p> <p class="text-lg text-gray-700 mb-6">Please enter your demo code to proceed to document.</p>
{% if success %} {% if success %}
<p class="text-green-600 font-semibold mb-4">{{ success }}</p> <p class="text-green-600 font-semibold mb-4">{{ success }}</p>

View File

@@ -19,6 +19,6 @@ urlpatterns = [
path('validate_code/', v.validate_code, name='validate_code'), path('validate_code/', v.validate_code, name='validate_code'),
#admin urls #admin urls
path('admin/payment-codes-pdf/', v.payment_codes_pdf_view, name='payment_codes_pdf'), path('admin/demo-codes-pdf/', v.demo_codes_pdf_view, name='demo_codes_pdf'),
] ]

View File

@@ -400,6 +400,6 @@ def generate_residual_risk_graph(risks_with_controls):
return base64.b64encode(image_png).decode("utf-8") return base64.b64encode(image_png).decode("utf-8")
def generate_payment_code(length=6): def generate_demo_code(length=6):
chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'
return ''.join(random.choices(chars, k=length)) return ''.join(random.choices(chars, k=length))

View File

@@ -6,7 +6,7 @@ import time
from django.shortcuts import render, redirect , get_object_or_404 from django.shortcuts import render, redirect , get_object_or_404
from .forms import OrganizationForm from .forms import OrganizationForm
from .models import Organization,Document, DocumentTemplate, PaymentCode from .models import Organization,Document, DocumentTemplate, DemoCode
from backend.accounts.utils import send_confirmation_email, send_document_email from backend.accounts.utils import send_confirmation_email, send_document_email
from django.contrib.admin.views.decorators import staff_member_required from django.contrib.admin.views.decorators import staff_member_required
from .utils import generate_pdf, generate_risk_graph, generate_residual_risk_graph from .utils import generate_pdf, generate_risk_graph, generate_residual_risk_graph
@@ -123,7 +123,7 @@ def payment_page(request):
import re import re
code = re.sub(r'\s+', '', request.POST.get('code', '')).upper()[:10] code = re.sub(r'\s+', '', request.POST.get('code', '')).upper()[:10]
try: try:
payment_code = PaymentCode.objects.get(code=code) payment_code = DemoCode.objects.get(code=code)
if payment_code.used: if payment_code.used:
error = "CODE INVALID" error = "CODE INVALID"
else: else:
@@ -136,7 +136,7 @@ def payment_page(request):
url = f"{site_domain}/pdf/{document.id}/" url = f"{site_domain}/pdf/{document.id}/"
send_document_email(email, url, document) send_document_email(email, url, document)
return redirect(url) return redirect(url)
except PaymentCode.DoesNotExist: except DemoCode.DoesNotExist:
error = "❌ Invalid code" error = "❌ Invalid code"
return render(request, 'payment.html', {'error': error}) return render(request, 'payment.html', {'error': error})
@@ -152,18 +152,18 @@ def download_example_pdf(request):
@staff_member_required @staff_member_required
def payment_codes_pdf_view(request): def demo_codes_pdf_view(request):
filter_by = request.GET.get('filter_by', 'all') filter_by = request.GET.get('filter_by', 'all')
if filter_by == 'used': if filter_by == 'used':
codes = PaymentCode.objects.filter(used=True) codes = DemoCode.objects.filter(used=True)
elif filter_by == 'available': elif filter_by == 'available':
codes = PaymentCode.objects.filter(used=False) codes = DemoCode.objects.filter(used=False)
else: else:
codes = PaymentCode.objects.all() codes = DemoCode.objects.all()
html_string = render_to_string('payment_code_report.html', {'codes': codes}) html_string = render_to_string('demo_code_report.html', {'codes': codes})
pdf_content = HTML(string=html_string, base_url=request.build_absolute_uri('/')).write_pdf() pdf_content = HTML(string=html_string, base_url=request.build_absolute_uri('/')).write_pdf()
response = HttpResponse(pdf_content, content_type='application/pdf') response = HttpResponse(pdf_content, content_type='application/pdf')
response['Content-Disposition'] = f'inline; filename=payment_codes_{timezone.now().strftime("%Y%m%d_%H%M%S")}.pdf' response['Content-Disposition'] = f'inline; filename=demo_codes_{timezone.now().strftime("%Y%m%d_%H%M%S")}.pdf'
return response return response
@csrf_exempt @csrf_exempt
@@ -172,8 +172,8 @@ def validate_code(request):
try: try:
data = json.loads(request.body) data = json.loads(request.body)
code = data.get("code", "").strip().upper() code = data.get("code", "").strip().upper()
from .models import PaymentCode from .models import DemoCode
valid = PaymentCode.objects.filter(code=code, used=False).exists() valid = DemoCode.objects.filter(code=code, used=False).exists()
time.sleep(3) time.sleep(3)
return JsonResponse({"valid": valid}) return JsonResponse({"valid": valid})
except Exception: except Exception: