Master instances

This commit is contained in:
2025-06-08 21:54:29 +02:00
parent 53ac07a9ee
commit 7aa96119a9
5 changed files with 49 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify, session from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify, session, current_app
from flask_login import current_user, login_required from flask_login import current_user, login_required
from models import User, db, Room, RoomFile, RoomMemberPermission, SiteSettings, Event, Conversation, Message, MessageAttachment, Notif, EmailTemplate, Mail, KeyValueSettings, DocuPulseSettings from models import User, db, Room, RoomFile, RoomMemberPermission, SiteSettings, Event, Conversation, Message, MessageAttachment, Notif, EmailTemplate, Mail, KeyValueSettings, DocuPulseSettings, PasswordSetupToken
from routes.auth import require_password_change from routes.auth import require_password_change
import os import os
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
@@ -332,6 +332,15 @@ def init_routes(main_bp):
is_admin=current_user.is_admin is_admin=current_user.is_admin
) )
@main_bp.route('/instances')
@login_required
@require_password_change
def instances():
if not os.environ.get('MASTER', 'false').lower() == 'true':
flash('This page is only available in master instances.', 'error')
return redirect(url_for('main.dashboard'))
return render_template('main/instances.html')
UPLOAD_FOLDER = '/app/uploads/profile_pics' UPLOAD_FOLDER = '/app/uploads/profile_pics'
if not os.path.exists(UPLOAD_FOLDER): if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER) os.makedirs(UPLOAD_FOLDER)

View File

@@ -58,6 +58,11 @@
<span class="text-white font-medium">{{ current_user.username }}</span> <span class="text-white font-medium">{{ current_user.username }}</span>
</a> </a>
<ul class="dropdown-menu dropdown-menu-end"> <ul class="dropdown-menu dropdown-menu-end">
{% if is_master %}
<li><a class="dropdown-item" href="{{ url_for('main.profile') }}"><i class="fas fa-user"></i> Profile</a></li>
<li><a class="dropdown-item" href="{{ url_for('main.settings') }}"><i class="fas fa-cog"></i> Settings</a></li>
<li><hr class="dropdown-divider"></li>
{% else %}
{% if not is_master %} {% if not is_master %}
<li><a class="dropdown-item" href="{{ url_for('main.profile') }}"><i class="fas fa-user"></i> Profile</a></li> <li><a class="dropdown-item" href="{{ url_for('main.profile') }}"><i class="fas fa-user"></i> Profile</a></li>
{% if current_user.is_admin %} {% if current_user.is_admin %}
@@ -65,6 +70,7 @@
{% endif %} {% endif %}
<li><hr class="dropdown-divider"></li> <li><hr class="dropdown-divider"></li>
{% endif %} {% endif %}
{% endif %}
<li><a class="dropdown-item" href="{{ url_for('auth.logout') }}"><i class="fas fa-sign-out-alt"></i> Logout</a></li> <li><a class="dropdown-item" href="{{ url_for('auth.logout') }}"><i class="fas fa-sign-out-alt"></i> Logout</a></li>
</ul> </ul>
</div> </div>
@@ -83,6 +89,18 @@
<i class="fas fa-home"></i> Dashboard <i class="fas fa-home"></i> Dashboard
</a> </a>
</li> </li>
{% if is_master %}
<li class="nav-item">
<a class="nav-link {% if request.endpoint == 'main.instances' %}active{% endif %}" href="{{ url_for('main.instances') }}">
<i class="fas fa-server"></i> Instances
</a>
</li>
{% endif %}
<li class="nav-item">
<a class="nav-link {% if request.endpoint == 'contacts.contacts_list' %}active{% endif %}" href="{{ url_for('contacts.contacts_list') }}">
<i class="fas fa-address-book"></i> Contacts
</a>
</li>
{% if not is_master %} {% if not is_master %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if request.endpoint == 'conversations.conversations' %}active{% endif %}" href="{{ url_for('conversations.conversations') }}"> <a class="nav-link {% if request.endpoint == 'conversations.conversations' %}active{% endif %}" href="{{ url_for('conversations.conversations') }}">
@@ -94,13 +112,6 @@
<i class="fas fa-door-open"></i> Rooms <i class="fas fa-door-open"></i> Rooms
</a> </a>
</li> </li>
<li class="nav-item">
{% if current_user.is_admin %}
<a class="nav-link {% if request.endpoint == 'contacts.contacts_list' %}active{% endif %}" href="{{ url_for('contacts.contacts_list') }}">
<i class="fas fa-address-book"></i> Contacts
</a>
{% endif %}
</li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if request.endpoint == 'main.starred' %}active{% endif %}" href="{{ url_for('main.starred') }}"> <a class="nav-link {% if request.endpoint == 'main.starred' %}active{% endif %}" href="{{ url_for('main.starred') }}">
<i class="fas fa-star"></i> Starred <i class="fas fa-star"></i> Starred

View File

@@ -0,0 +1,20 @@
{% extends "common/base.html" %}
{% from "components/header.html" import header %}
{% block title %}Instances - DocuPulse{% endblock %}
{% block content %}
{{ header(
title="Instances",
description="Manage your DocuPulse instances",
button_text="",
button_url="",
icon="fa-server"
) }}
<div class="container mx-auto px-4 py-8">
<div class="text-center">
<p class="text-muted">Instance management will be available soon.</p>
</div>
</div>
{% endblock %}