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 .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.utils.html import format_html
from .utils import generate_payment_code
from .utils import generate_demo_code
from django.urls import path
from django.shortcuts import render, redirect
from .forms import GenerateCodesForm
@@ -44,10 +44,10 @@ class ControlAdmin(admin.ModelAdmin):
class DocumentRiskControlAdmin(admin.ModelAdmin):
list_display = ('document', 'risk', 'control', 'weight','likelihood')
class PaymentCodeAdmin(admin.ModelAdmin):
class DemoCodeAdmin(admin.ModelAdmin):
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):
urls = super().get_urls()
@@ -64,9 +64,9 @@ class PaymentCodeAdmin(admin.ModelAdmin):
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)
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.")
@@ -82,4 +82,4 @@ 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)
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')
class PaymentCode(models.Model):
class DemoCode(models.Model):
code = models.CharField(max_length=10, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
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 %}
<div id="content-main">
<h2>Generate Payment Codes</h2>
<h2>Generate Demo Codes</h2>
<form method="post">{% csrf_token %}
{{ form.as_p }}
<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>
<meta charset="UTF-8">
<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' %}">
</head>
<body>
<h1>Payment Codes Report</h1>
<h1>Demo Codes Report</h1>
<table>
<thead>
<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">
<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>
<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 %}
<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'),
#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")
def generate_payment_code(length=6):
def generate_demo_code(length=6):
chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'
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 .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 django.contrib.admin.views.decorators import staff_member_required
from .utils import generate_pdf, generate_risk_graph, generate_residual_risk_graph
@@ -123,7 +123,7 @@ def payment_page(request):
import re
code = re.sub(r'\s+', '', request.POST.get('code', '')).upper()[:10]
try:
payment_code = PaymentCode.objects.get(code=code)
payment_code = DemoCode.objects.get(code=code)
if payment_code.used:
error = "CODE INVALID"
else:
@@ -136,7 +136,7 @@ def payment_page(request):
url = f"{site_domain}/pdf/{document.id}/"
send_document_email(email, url, document)
return redirect(url)
except PaymentCode.DoesNotExist:
except DemoCode.DoesNotExist:
error = "❌ Invalid code"
return render(request, 'payment.html', {'error': error})
@@ -152,18 +152,18 @@ def download_example_pdf(request):
@staff_member_required
def payment_codes_pdf_view(request):
def demo_codes_pdf_view(request):
filter_by = request.GET.get('filter_by', 'all')
if filter_by == 'used':
codes = PaymentCode.objects.filter(used=True)
codes = DemoCode.objects.filter(used=True)
elif filter_by == 'available':
codes = PaymentCode.objects.filter(used=False)
codes = DemoCode.objects.filter(used=False)
else:
codes = PaymentCode.objects.all()
html_string = render_to_string('payment_code_report.html', {'codes': codes})
codes = DemoCode.objects.all()
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()
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
@csrf_exempt
@@ -172,8 +172,8 @@ def validate_code(request):
try:
data = json.loads(request.body)
code = data.get("code", "").strip().upper()
from .models import PaymentCode
valid = PaymentCode.objects.filter(code=code, used=False).exists()
from .models import DemoCode
valid = DemoCode.objects.filter(code=code, used=False).exists()
time.sleep(3)
return JsonResponse({"valid": valid})
except Exception: