A UK buyer can now create their own account at /portal/signup/. The screen creates a Keycloak user through a least-privilege service account (ixg-provisioning: manage-users, view-users) and the matching Django row as a buyer, then sends them through the normal sign-in flow to the portal. Staff status is derived from the role in the OIDC backend rather than asserted, so a self-registered buyer is not staff and does not become staff on a later sign-in. The platform root and the RBAC middleware now route each role to its own portal, which also fixes a redirect loop that the staff fix exposed for non-staff buyers.
55 lines
2.1 KiB
HTML
55 lines
2.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Create a buyer account - IXG</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
|
<style>
|
|
body { font-size: .875rem; background: #f0fdf4; }
|
|
.signup-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem 1rem; }
|
|
.signup-card { background: #fff; border: 1px solid #e2e8f0; border-radius: .75rem; padding: 2rem; width: 100%; max-width: 460px; }
|
|
.signup-brand { font-size: 1.25rem; font-weight: 700; color: #065f46; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="signup-wrap">
|
|
<div class="signup-card">
|
|
<div class="text-center mb-4">
|
|
<div class="signup-brand"><i class="bi bi-box-seam"></i> IXG Buyer Portal</div>
|
|
<p class="text-secondary mb-0 mt-2">Create your buyer account</p>
|
|
</div>
|
|
|
|
{% if form.non_field_errors %}
|
|
{% for e in form.non_field_errors %}<div class="alert alert-danger py-2">{{ e }}</div>{% endfor %}
|
|
{% endif %}
|
|
|
|
<form method="post" novalidate>
|
|
{% csrf_token %}
|
|
|
|
{% for field in form %}
|
|
<div class="mb-3">
|
|
<label class="form-label" for="{{ field.id_for_label }}">
|
|
{{ field.label }} <span class="text-danger">*</span>
|
|
</label>
|
|
{{ field }}
|
|
{% if field.help_text %}<div class="form-text">{{ field.help_text }}</div>{% endif %}
|
|
{% for e in field.errors %}<div class="text-danger small">{{ e }}</div>{% endfor %}
|
|
</div>
|
|
{% endfor %}
|
|
|
|
<button type="submit" class="btn w-100 text-white" style="background:#065f46;">Create account</button>
|
|
</form>
|
|
|
|
<p class="text-center text-secondary mt-4 mb-0">
|
|
Already have an account?
|
|
<a href="{% url 'oidc_authentication_init' %}?next=/portal/">Sign in</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
|
</body>
|
|
</html>
|