refactor: 🎨 remove caching #48
@@ -209,7 +209,7 @@ The application includes a comprehensive REST API for programmatic access:
|
|||||||
|
|
||||||
4. **API Keys**: Each user has a unique API key that can be viewed and regenerated from the Users page. API keys respect the same role-based permissions as the web interface.
|
4. **API Keys**: Each user has a unique API key that can be viewed and regenerated from the Users page. API keys respect the same role-based permissions as the web interface.
|
||||||
|
|
||||||
5. **Documentation**: Full API documentation is available in the Help page of the web interface.
|
5. **Documentation**: See [API.md](API.md) for the full REST API reference.
|
||||||
|
|
||||||
**Example API Requests**:
|
**Example API Requests**:
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -3058,11 +3058,6 @@ def search():
|
|||||||
|
|
||||||
return render_with_user('search.html', query=query, results=results)
|
return render_with_user('search.html', query=query, results=results)
|
||||||
|
|
||||||
@app.route('/help')
|
|
||||||
@permission_required('view_help')
|
|
||||||
def help():
|
|
||||||
return render_with_user('help.html')
|
|
||||||
|
|
||||||
# ========== API ROUTES ==========
|
# ========== API ROUTES ==========
|
||||||
|
|
||||||
@app.route('/api/v1/info', methods=['GET'])
|
@app.route('/api/v1/info', methods=['GET'])
|
||||||
|
|||||||
@@ -393,7 +393,6 @@ def init_db(app=None):
|
|||||||
('view_device_type_stats', 'View Device Type Statistics', 'View'),
|
('view_device_type_stats', 'View Device Type Statistics', 'View'),
|
||||||
('view_devices_by_type', 'View Devices by Type', 'View'),
|
('view_devices_by_type', 'View Devices by Type', 'View'),
|
||||||
('view_dhcp', 'View DHCP configuration', 'View'),
|
('view_dhcp', 'View DHCP configuration', 'View'),
|
||||||
('view_help', 'View Help page', 'View'),
|
|
||||||
|
|
||||||
# Device permissions
|
# Device permissions
|
||||||
('add_device', 'Add new device', 'Device'),
|
('add_device', 'Add new device', 'Device'),
|
||||||
@@ -490,7 +489,7 @@ def init_db(app=None):
|
|||||||
non_admin_permissions = [
|
non_admin_permissions = [
|
||||||
'view_index', 'view_devices', 'view_device', 'view_subnet', 'view_racks', 'view_rack',
|
'view_index', 'view_devices', 'view_device', 'view_subnet', 'view_racks', 'view_rack',
|
||||||
'view_audit', 'view_device_types', 'view_device_type_stats', 'view_devices_by_type',
|
'view_audit', 'view_device_types', 'view_device_type_stats', 'view_devices_by_type',
|
||||||
'view_dhcp', 'view_help',
|
'view_dhcp',
|
||||||
'add_device', 'edit_device', 'delete_device', 'add_device_ip', 'remove_device_ip',
|
'add_device', 'edit_device', 'delete_device', 'add_device_ip', 'remove_device_ip',
|
||||||
'add_subnet', 'edit_subnet', 'delete_subnet', 'export_subnet_csv',
|
'add_subnet', 'edit_subnet', 'delete_subnet', 'export_subnet_csv',
|
||||||
'add_rack', 'delete_rack', 'add_device_to_rack', 'remove_device_from_rack',
|
'add_rack', 'delete_rack', 'add_device_to_rack', 'remove_device_from_rack',
|
||||||
@@ -517,7 +516,7 @@ def init_db(app=None):
|
|||||||
view_only_permissions = [
|
view_only_permissions = [
|
||||||
'view_index', 'view_devices', 'view_device', 'view_subnet', 'view_racks', 'view_rack',
|
'view_index', 'view_devices', 'view_device', 'view_subnet', 'view_racks', 'view_rack',
|
||||||
'view_audit', 'view_device_types', 'view_device_type_stats', 'view_devices_by_type',
|
'view_audit', 'view_device_types', 'view_device_type_stats', 'view_devices_by_type',
|
||||||
'view_dhcp', 'view_help', 'view_tags', 'view_custom_fields'
|
'view_dhcp', 'view_tags', 'view_custom_fields'
|
||||||
]
|
]
|
||||||
|
|
||||||
for perm_name in view_only_permissions:
|
for perm_name in view_only_permissions:
|
||||||
|
|||||||
@@ -37,12 +37,6 @@
|
|||||||
<span>Admin</span>
|
<span>Admin</span>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if has_permission('view_help') %}
|
|
||||||
<a href="/help" class="text-gray-200 hover:text-gray-400 font-medium flex items-center gap-2">
|
|
||||||
<i class="fas fa-question-circle"></i>
|
|
||||||
<span>Help</span>
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if current_user_name %}
|
{% if current_user_name %}
|
||||||
<a href="/account" class="text-gray-200 hover:text-gray-400 font-medium flex items-center gap-2">
|
<a href="/account" class="text-gray-200 hover:text-gray-400 font-medium flex items-center gap-2">
|
||||||
<i class="fas fa-user-cog"></i>
|
<i class="fas fa-user-cog"></i>
|
||||||
@@ -91,12 +85,6 @@
|
|||||||
<span>Admin</span>
|
<span>Admin</span>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if has_permission('view_help') %}
|
|
||||||
<a href="/help" class="block px-6 py-2 text-gray-200 hover:text-gray-400 font-medium flex items-center gap-2">
|
|
||||||
<i class="fas fa-question-circle"></i>
|
|
||||||
<span>Help</span>
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if current_user_name %}
|
{% if current_user_name %}
|
||||||
<a href="/account" class="block px-6 py-2 text-gray-200 hover:text-gray-400 font-medium flex items-center gap-2">
|
<a href="/account" class="block px-6 py-2 text-gray-200 hover:text-gray-400 font-medium flex items-center gap-2">
|
||||||
<i class="fas fa-user-cog"></i>
|
<i class="fas fa-user-cog"></i>
|
||||||
|
|||||||
@@ -1,123 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Help & User Guide</title>
|
|
||||||
<link rel="icon" type="image/png" href="{{ LOGO_PNG }}">
|
|
||||||
<link href="/static/css/output.css" rel="stylesheet">
|
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body class="bg-gray-300 text-gray-900 dark:bg-zinc-900 dark:text-gray-100 min-h-screen flex flex-col">
|
|
||||||
{% include 'header.html' %}
|
|
||||||
<div class="flex-1 mx-4 py-8 pt-20">
|
|
||||||
<div class="container max-w-full mx-auto lg:px-32">
|
|
||||||
<h1 class="text-3xl font-bold mb-8 text-center">Help & User Guide</h1>
|
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-6 mb-8">
|
|
||||||
<div class="bg-gray-200 dark:bg-zinc-800 rounded-2xl shadow-lg p-8">
|
|
||||||
<h2 class="text-2xl font-semibold mb-4 border-b border-gray-700 pb-2">Subnets & Devices</h2>
|
|
||||||
<div class="space-y-4">
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Managing Subnets</h3>
|
|
||||||
<p>To add or edit subnets, go to the <a href="/admin" class="text-blue-600 dark:text-blue-400 hover:underline">Admin</a> page. Click <span class="bg-gray-300 dark:bg-zinc-700 px-2 py-1 rounded">Add Subnet</span> to create a new subnet, or use the edit button to modify existing subnets. Subnets are associated with sites and can be organised by location.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Adding a Device</h3>
|
|
||||||
<p>To add a device, visit the <a href="/devices" class="text-blue-600 dark:text-blue-400 hover:underline">Devices</a> page and click <span class="bg-gray-300 dark:bg-zinc-700 px-2 py-1 rounded">Add Device</span>.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Assigning IP Addresses</h3>
|
|
||||||
<p>To assign an IP address, you must first add a device. Then, from the <a href="/devices" class="text-blue-600 dark:text-blue-400 hover:underline">Devices</a> page, click on a device to view its details and use the <span class="bg-gray-300 dark:bg-zinc-700 px-2 py-1 rounded">Add IP</span> option to assign an IP address from a subnet.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Viewing and Editing Devices</h3>
|
|
||||||
<p>Click on any device in the <a href="/devices" class="text-blue-600 dark:text-blue-400 hover:underline">Devices</a> list to view or edit its details, including assigned IPs, device types and a description where necessary.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="bg-gray-200 dark:bg-zinc-800 rounded-2xl shadow-lg p-8">
|
|
||||||
<h2 class="text-2xl font-semibold mb-4 border-b border-gray-700 pb-2">Racks</h2>
|
|
||||||
<div class="space-y-4">
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Adding a Rack</h3>
|
|
||||||
<p>To add a new rack, go to the <a href="/racks" class="text-blue-600 dark:text-blue-400 hover:underline">Racks</a> page and click the <span class="bg-gray-300 dark:bg-zinc-700 px-2 py-1 rounded">Add Rack</span> button. Fill in the details and submit the form.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Assigning Devices to Racks</h3>
|
|
||||||
<p>After adding a device, you can assign it to a rack from the <a href="/racks" class="text-blue-600 dark:text-blue-400 hover:underline">Rack</a> details page. Click on a rack from the <a href="/racks" class="text-blue-600 dark:text-blue-400 hover:underline">Racks</a> page, then use the options to add or remove devices within the rack.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Non-Networked Devices</h3>
|
|
||||||
<p>Racks can also contain non-networked devices (such as shelves, patch panels, or other equipment that does not require an IP address). To add a non-networked device, go to a rack details page and use the option to add a device by name without assigning an IP address. These devices will appear in the rack layout but will not be listed on the Devices page.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="bg-gray-200 dark:bg-zinc-800 rounded-2xl shadow-lg p-8">
|
|
||||||
<h2 class="text-2xl font-semibold mb-4 border-b border-gray-700 pb-2">Device Tags</h2>
|
|
||||||
<div class="space-y-4">
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Managing Tags</h3>
|
|
||||||
<p>Tags help you organize and categorize your devices. Administrators can manage tags from the <a href="/tags" class="text-blue-600 dark:text-blue-400 hover:underline">Tag Management</a> page accessible from the Admin panel. Each tag has a name, customizable colour, and optional description.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Creating Tags</h3>
|
|
||||||
<p>Click <span class="bg-gray-300 dark:bg-zinc-700 px-2 py-1 rounded">Add Tag</span> to create a new tag. Choose a descriptive name (e.g., "Production", "Development", "Critical") and select a colour to visually distinguish the tag. Tags can be used to group devices by environment, importance, location, or any other criteria.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Assigning Tags to Devices</h3>
|
|
||||||
<p>From any device's detail page, you can assign multiple tags using the tag assignment dropdown. Each device can have unlimited tags, and removing a tag is as simple as clicking the × button next to the tag name.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Filtering Devices by Tags</h3>
|
|
||||||
<p>On the <a href="/devices" class="text-blue-600 dark:text-blue-400 hover:underline">Devices</a> page, use the tag filter dropdown to view only devices with a specific tag. This makes it easy to focus on devices in a particular environment or category.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Tag Colours and Visual Organisation</h3>
|
|
||||||
<p>Tags appear as coloured badges throughout the interface. Use consistent colour schemes (e.g., red for production, blue for development) to create visual patterns that help users quickly identify device categories.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Tag Permissions</h3>
|
|
||||||
<p>Tag management respects role-based permissions. Users need appropriate permissions to view, create, edit, delete tags, or assign/remove tags from devices. View-only users can see tags but cannot modify them.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="bg-gray-200 dark:bg-zinc-800 rounded-2xl shadow-lg p-8">
|
|
||||||
<h2 class="text-2xl font-semibold mb-4 border-b border-gray-700 pb-2">User Management & Audit</h2>
|
|
||||||
<div class="space-y-4">
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">User & Role Management</h3>
|
|
||||||
<p>Administrators can manage users and roles from the <a href="/users" class="text-blue-600 dark:text-blue-400 hover:underline">Users</a> page. This includes creating users, assigning roles, and managing custom roles with specific permission sets. Only users with the appropriate permissions can access this page.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Understanding Roles</h3>
|
|
||||||
<p>The system uses role-based access control to manage what users can do. There are three default roles:</p>
|
|
||||||
<ul class="list-disc list-inside mt-2 space-y-1 ml-4">
|
|
||||||
<li><strong>Admin:</strong> Full access to all features including user and role management</li>
|
|
||||||
<li><strong>User:</strong> Can view and manage most features (devices, subnets, racks, etc.) but cannot manage users or roles</li>
|
|
||||||
<li><strong>View Only:</strong> Read-only access to view pages but cannot make any changes</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Custom Roles</h3>
|
|
||||||
<p>Administrators can create custom roles with specific permission sets. Go to the <a href="/users" class="text-blue-600 dark:text-blue-400 hover:underline">Users</a> page and click the "Roles & Permissions" tab to create and manage roles.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Permission Granularity</h3>
|
|
||||||
<p>Permissions are very granular, allowing fine-grained control over what each role can do. Permissions are organised into categories like View, Device Management, Network Management, Rack Management, and Administration.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">Audit & History</h3>
|
|
||||||
<p>All changes are logged and can be reviewed on the <a href="/audit" class="text-blue-600 dark:text-blue-400 hover:underline">Audit</a> page for accountability and troubleshooting. The audit log shows who made changes, what was changed, and when.</p>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 class="text-xl font-semibold mb-1">API Keys</h3>
|
|
||||||
<p>Each user has a unique API key that can be used to authenticate API requests. API keys can be viewed and regenerated from the <a href="/users" class="text-blue-600 dark:text-blue-400 hover:underline">Users</a> page. Keep your API key secure and never share it publicly.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Reference in New Issue
Block a user