changed payment code to demo code
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
17
backend/core/migrations/0018_rename_paymentcode_democode.py
Normal file
17
backend/core/migrations/0018_rename_paymentcode_democode.py
Normal 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',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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)
|
||||||
|
|||||||
14
backend/core/templates/admin/democode_changelist.html
Normal file
14
backend/core/templates/admin/democode_changelist.html
Normal 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 %}
|
||||||
@@ -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">
|
||||||
|
|||||||
@@ -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 %}
|
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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))
|
||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user