Optimizing admin interface for user domain, completing security views
This commit is contained in:
16
eveai_app/templates/basic/confirm_email_fail.html
Normal file
16
eveai_app/templates/basic/confirm_email_fail.html
Normal file
@@ -0,0 +1,16 @@
|
||||
{% extends 'base.html' %}
|
||||
{% from "macros.html" import render_field %}
|
||||
|
||||
{% block title %}Email Confirmation OK{% endblock %}
|
||||
|
||||
{% block content_title %}Email Confirmation OK{% endblock %}
|
||||
{% block content_description %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
Your email cannot be confirmed. The link has expired or is invalid. Please contact your administrator to send you a new confirmation link ;-)
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content_footer %}
|
||||
|
||||
{% endblock %}
|
||||
16
eveai_app/templates/basic/confirm_email_ok.html
Normal file
16
eveai_app/templates/basic/confirm_email_ok.html
Normal file
@@ -0,0 +1,16 @@
|
||||
{% extends 'base.html' %}
|
||||
{% from "macros.html" import render_field %}
|
||||
|
||||
{% block title %}Email Confirmation OK{% endblock %}
|
||||
|
||||
{% block content_title %}Email Confirmation OK{% endblock %}
|
||||
{% block content_description %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
Your email has been confirmed. You will shortly receive an email to set your password. Then we'll be able to communicate on a deeper level ;-)
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content_footer %}
|
||||
|
||||
{% endblock %}
|
||||
13
eveai_app/templates/email/activate.html
Normal file
13
eveai_app/templates/email/activate.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Confirm Your Email</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Hi,</p>
|
||||
<p>You have been registered with EveAI by your administrator. Please confirm your email address by clicking the link below:</p>
|
||||
<p><a href="{{ confirm_url }}">Confirm Email</a></p>
|
||||
<p>If you were not informed to register, please ignore this email.</p>
|
||||
<p>Thanks,<br>The EveAI Team</p>
|
||||
</body>
|
||||
</html>
|
||||
13
eveai_app/templates/email/reset_password.html
Normal file
13
eveai_app/templates/email/reset_password.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Reset Your Password</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Hi,</p>
|
||||
<p>You requested a password reset for your EveAI account. Click the link below to reset your password:</p>
|
||||
<p><a href="{{ reset_url }}">Reset Password</a></p>
|
||||
<p>If you did not request a password reset, please ignore this email.</p>
|
||||
<p>Thanks,<br>The EveAI Team</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -68,14 +68,13 @@
|
||||
<div class="collapse navbar-collapse w-100 pt-3 pb-2 py-lg-0" id="navigation">
|
||||
<ul class="navbar-nav navbar-nav-hover mx-auto">
|
||||
{% if current_user.is_authenticated %}
|
||||
{{ dropdown('User Mgmt', 'contacts', [
|
||||
{{ dropdown('Tenant Configuration', 'contacts', [
|
||||
{'name': 'Tenant List', 'url': '/user/select_tenant', 'roles': ['Super User']},
|
||||
{'name': 'Tenant Registration', 'url': '/user/tenant', 'roles': ['Super User']},
|
||||
{'name': 'Generate Chat API Key', 'url': '/user/generate_chat_api_key', 'roles': ['Super User']},
|
||||
{'name': 'Tenant Overview', 'url': '/user/tenant_overview', 'roles': ['Super User', 'Tenant Admin']},
|
||||
{'name': 'Tenant Domains', 'url': '/user/view_tenant_domains/' + session['tenant']['id']|string, 'roles': ['Super User', 'Tenant Admin']},
|
||||
{'name': 'Tenant Domains', 'url': '/user/view_tenant_domains', 'roles': ['Super User', 'Tenant Admin']},
|
||||
{'name': 'Tenant Domain Registration', 'url': '/user/tenant_domain', 'roles': ['Super User', 'Tenant Admin']},
|
||||
{'name': 'User List', 'url': '/user/view_users/' + session['tenant']['id']|string, 'roles': ['Super User', 'Tenant Admin']},
|
||||
{'name': 'User List', 'url': '/user/view_users', 'roles': ['Super User', 'Tenant Admin']},
|
||||
{'name': 'User Registration', 'url': '/user/user', 'roles': ['Super User', 'Tenant Admin']},
|
||||
]) }}
|
||||
{% endif %}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{% extends "security/base.html" %}
|
||||
{% from "security/_macros.html" import render_field_with_errors, render_field, render_field_errors, render_form_errors %}
|
||||
{% from "macros.html" import render_field %}
|
||||
|
||||
{% block title %} {{ _fsdomain('Reset password') }} {% endblock %}
|
||||
{% block content_title %} {{ _fsdomain('Reset password') }} {% endblock %}
|
||||
{% block content_description %}An email will be sent to you with instructions.{% endblock %}
|
||||
{% block content %}
|
||||
{% include "security/_messages.html" %}
|
||||
{# {% include "security/_messages.html" %}#}
|
||||
{# <form action="{{ url_for_security('reset_password', token=reset_password_token) }}" method="post" name="reset_password_form">#}
|
||||
<form action="" method="post">
|
||||
{{ reset_password_form.hidden_tag() }}
|
||||
{{ render_form_errors(reset_password_form) }}
|
||||
{{ render_field_with_errors(reset_password_form.password) }}
|
||||
{{ render_field_with_errors(reset_password_form.password_confirm) }}
|
||||
{{ render_field_errors(reset_password_form.csrf_token) }}
|
||||
{{ render_field(reset_password_form.submit) }}
|
||||
{# {{ render_form_errors(reset_password_form) }}#}
|
||||
{{ render_field(reset_password_form.password) }}
|
||||
{{ render_field(reset_password_form.confirm_password) }}
|
||||
{# {{ render_field_errors(reset_password_form.csrf_token) }}#}
|
||||
<button type="submit" class="btn btn-primary">Reset Password</button>
|
||||
</form>
|
||||
{# {% include "security/_menu.html" %}#}
|
||||
{% endblock content %}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends 'base.html' %}
|
||||
{% from "macros.html" import render_selectable_table %}
|
||||
{% from "macros.html" import render_selectable_table, render_pagination %}
|
||||
|
||||
{% block title %}Tenant Selection{% endblock %}
|
||||
|
||||
@@ -8,37 +8,44 @@
|
||||
|
||||
{% block content %}
|
||||
<form method="POST" action="{{ url_for('user_bp.handle_tenant_selection') }}">
|
||||
{{ render_selectable_table(headers=["Tenant ID", "Tenant Name", "Website"], rows=tenants, selectable=True, id="tenantsTable") }}
|
||||
{{ render_selectable_table(headers=["Tenant ID", "Tenant Name", "Website"], rows=rows, selectable=True, id="tenantsTable") }}
|
||||
<div class="form-group mt-3">
|
||||
<button type="submit" name="action" value="select_tenant" class="btn btn-primary">Set Session Tenant</button>
|
||||
<button type="submit" name="action" value="view_users" class="btn btn-secondary">View Users</button>
|
||||
<button type="submit" name="action" value="edit_tenant" class="btn btn-secondary">Edit Tenant</button>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#tenantsTable').DataTable({
|
||||
'columnDefs': [
|
||||
{
|
||||
'targets': 0,
|
||||
'searchable': false,
|
||||
'orderable': false,
|
||||
'className': 'dt-body-center',
|
||||
},
|
||||
{
|
||||
'targets': 1,
|
||||
'orderable': true
|
||||
},
|
||||
{
|
||||
'targets': 2,
|
||||
'orderable': true
|
||||
}
|
||||
],
|
||||
'order': [[1, 'asc']]
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% block content_footer %}
|
||||
{{ render_pagination(pagination, 'user_bp.select_tenant') }}
|
||||
{% endblock %}
|
||||
|
||||
{#{% block scripts %}#}
|
||||
{#<script>#}
|
||||
{#$(document).ready(function() {#}
|
||||
{# $('#tenantsTable').DataTable({#}
|
||||
{# 'columnDefs': [#}
|
||||
{# {#}
|
||||
{# 'targets': 0,#}
|
||||
{# 'searchable': false,#}
|
||||
{# 'orderable': false,#}
|
||||
{# 'className': 'dt-body-center',#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 1,#}
|
||||
{# 'orderable': true#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 2,#}
|
||||
{# 'orderable': true#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 2,#}
|
||||
{# 'orderable': true#}
|
||||
{# },#}
|
||||
{# ],#}
|
||||
{# 'order': [[1, 'asc']]#}
|
||||
{# });#}
|
||||
{#});#}
|
||||
{#</script>#}
|
||||
{#{% endblock %}#}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends 'base.html' %}
|
||||
{% from "macros.html" import render_selectable_table %}
|
||||
{% from "macros.html" import render_selectable_table, render_pagination %}
|
||||
|
||||
{% block title %}View Tenant Domains{% endblock %}
|
||||
|
||||
@@ -8,38 +8,43 @@
|
||||
|
||||
{% block content %}
|
||||
<form action="{{ url_for('user_bp.handle_tenant_domain_action') }}" method="POST">
|
||||
{{ render_selectable_table(headers=["ID", "Domain Name", "Valid To"], rows=tenant_domains, selectable=True, id="tenantDomainsTable") }}
|
||||
{{ render_selectable_table(headers=["ID", "Domain Name", "Valid To"], rows=rows, selectable=True, id="tenantDomainsTable") }}
|
||||
<div class="form-group mt-3">
|
||||
<button type="submit" name="action" value="edit_tenant_domain" class="btn btn-primary">Edit Selected Domain</button>
|
||||
<!-- Additional buttons can be added here for other actions -->
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block content_footer %}
|
||||
{{ render_pagination(pagination, 'user_bp.view_tenant_domains') }}
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#tenantDomainsTable').DataTable({
|
||||
'columnDefs': [
|
||||
{
|
||||
'targets': 0,
|
||||
'searchable': false,
|
||||
'orderable': false,
|
||||
'className': 'dt-body-center',
|
||||
'render': function (data, type, full, meta) {
|
||||
return '<input type="radio" name="user_id" value="' + $('<div/>').text(data).html() + '">';
|
||||
}
|
||||
},
|
||||
{
|
||||
'targets': 1,
|
||||
'orderable': true,
|
||||
},
|
||||
{
|
||||
'targets': 2,
|
||||
'orderable': true,
|
||||
},
|
||||
],
|
||||
'order': [[1, 'asc']]
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{#<script>#}
|
||||
{#$(document).ready(function() {#}
|
||||
{# $('#tenantDomainsTable').DataTable({#}
|
||||
{# 'columnDefs': [#}
|
||||
{# {#}
|
||||
{# 'targets': 0,#}
|
||||
{# 'searchable': false,#}
|
||||
{# 'orderable': false,#}
|
||||
{# 'className': 'dt-body-center',#}
|
||||
{# 'render': function (data, type, full, meta) {#}
|
||||
{# return '<input type="radio" name="user_id" value="' + $('<div/>').text(data).html() + '">';#}
|
||||
{# }#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 1,#}
|
||||
{# 'orderable': true,#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 2,#}
|
||||
{# 'orderable': true,#}
|
||||
{# },#}
|
||||
{# ],#}
|
||||
{# 'order': [[1, 'asc']]#}
|
||||
{# });#}
|
||||
{#});#}
|
||||
{#</script>#}
|
||||
{% endblock %}
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends 'base.html' %}
|
||||
{% from "macros.html" import render_selectable_table %}
|
||||
{% from "macros.html" import render_selectable_table, render_pagination %}
|
||||
|
||||
{% block title %}View Users{% endblock %}
|
||||
|
||||
@@ -8,42 +8,49 @@
|
||||
|
||||
{% block content %}
|
||||
<form action="{{ url_for('user_bp.handle_user_action') }}" method="POST">
|
||||
{{ render_selectable_table(headers=["User ID", "User Name", "Email"], rows=users, selectable=True, id="usersTable") }}
|
||||
{{ render_selectable_table(headers=["User ID", "User Name", "Email"], rows=rows, selectable=True, id="usersTable") }}
|
||||
<div class="form-group mt-3">
|
||||
<button type="submit" name="action" value="edit_user" class="btn btn-primary">Edit Selected User</button>
|
||||
<button type="submit" name="action" value="resend_confirmation_email" class="btn btn-secondary">Resend Confirmation Email</button>
|
||||
<button type="submit" name="action" value="reset_uniquifier" class="btn btn-secondary">Reset Uniquifier</button>
|
||||
<!-- Additional buttons can be added here for other actions -->
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block content_footer %}
|
||||
{{ render_pagination(pagination, 'user_bp.select_tenant') }}
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#usersTable').DataTable({
|
||||
'columnDefs': [
|
||||
{
|
||||
'targets': 0,
|
||||
'searchable': false,
|
||||
'orderable': false,
|
||||
'className': 'dt-body-center',
|
||||
'render': function (data, type, full, meta) {
|
||||
return '<input type="radio" name="user_id" value="' + $('<div/>').text(data).html() + '">';
|
||||
}
|
||||
},
|
||||
{
|
||||
'targets': 1,
|
||||
'orderable': true,
|
||||
},
|
||||
{
|
||||
'targets': 2,
|
||||
'orderable': true,
|
||||
},
|
||||
{
|
||||
'targets': 3,
|
||||
'orderable': true,
|
||||
}
|
||||
],
|
||||
'order': [[1, 'asc']]
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{#<script>#}
|
||||
{#$(document).ready(function() {#}
|
||||
{# $('#usersTable').DataTable({#}
|
||||
{# 'columnDefs': [#}
|
||||
{# {#}
|
||||
{# 'targets': 0,#}
|
||||
{# 'searchable': false,#}
|
||||
{# 'orderable': false,#}
|
||||
{# 'className': 'dt-body-center',#}
|
||||
{# 'render': function (data, type, full, meta) {#}
|
||||
{# return '<input type="radio" name="user_id" value="' + $('<div/>').text(data).html() + '">';#}
|
||||
{# }#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 1,#}
|
||||
{# 'orderable': true,#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 2,#}
|
||||
{# 'orderable': true,#}
|
||||
{# },#}
|
||||
{# {#}
|
||||
{# 'targets': 3,#}
|
||||
{# 'orderable': true,#}
|
||||
{# }#}
|
||||
{# ],#}
|
||||
{# 'order': [[1, 'asc']]#}
|
||||
{# });#}
|
||||
{#});#}
|
||||
{#</script>#}
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user