From 51cea567ca07db9bf9f93a6d8cd91fc954917cd4 Mon Sep 17 00:00:00 2001 From: Kobe Date: Fri, 6 Jun 2025 09:37:26 +0200 Subject: [PATCH] usage limits for rooms and convos --- __pycache__/models.cpython-313.pyc | Bin 34167 -> 35519 bytes .../__pycache__/conversations.cpython-313.pyc | Bin 29627 -> 29752 bytes routes/__pycache__/rooms.cpython-313.pyc | Bin 20970 -> 21105 bytes routes/conversations.py | 5 +- routes/rooms.py | 8 +- templates/conversations/conversations.html | 59 ++++++++++++- templates/rooms/rooms.html | 81 ++++++++++++++---- 7 files changed, 130 insertions(+), 23 deletions(-) diff --git a/__pycache__/models.cpython-313.pyc b/__pycache__/models.cpython-313.pyc index ec974e1d5524a06b5f749cfe3846cd9dc3f66fc4..73b579e5972d9fa1fae696ef807dafa346673f2b 100644 GIT binary patch delta 616 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 diff --git a/routes/__pycache__/rooms.cpython-313.pyc b/routes/__pycache__/rooms.cpython-313.pyc index 41f64a936f9a577eb82fdab1268a8be2e11bc59a..44370093fba0cc66cb4113358ed4d46f068d29b5 100644 GIT binary patch delta 3292 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 Z?^4uefFBUJse!!NQT|}+Ds$r{KLbJsqb&dc diff --git a/routes/conversations.py b/routes/conversations.py index f2bb20c..a2b5c98 100644 --- a/routes/conversations.py +++ b/routes/conversations.py @@ -1,6 +1,6 @@ from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify, send_file from flask_login import login_required, current_user -from models import db, Conversation, User, Message, MessageAttachment +from models import db, Conversation, User, Message, MessageAttachment, DocuPulseSettings from forms import ConversationForm from routes.auth import require_password_change from utils import log_event, create_notification, get_unread_count @@ -55,7 +55,8 @@ def conversations(): query = query.filter(Conversation.name.ilike(f'%{search}%')) conversations = query.order_by(Conversation.created_at.desc()).all() unread_count = get_unread_count(current_user.id) - return render_template('conversations/conversations.html', conversations=conversations, search=search, unread_notifications=unread_count) + usage_stats = DocuPulseSettings.get_usage_stats() + return render_template('conversations/conversations.html', conversations=conversations, search=search, unread_notifications=unread_count, usage_stats=usage_stats) @conversations_bp.route('/create', methods=['GET', 'POST']) @login_required diff --git a/routes/rooms.py b/routes/rooms.py index a9a9db2..b3ea612 100644 --- a/routes/rooms.py +++ b/routes/rooms.py @@ -1,6 +1,6 @@ from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify from flask_login import login_required, current_user -from models import db, Room, User, RoomMemberPermission, RoomFile, Notif +from models import db, Room, User, RoomMemberPermission, RoomFile, Notif, DocuPulseSettings from forms import RoomForm from routes.room_files import user_has_permission from routes.auth import require_password_change @@ -36,7 +36,11 @@ def rooms(): if search: query = query.filter(Room.name.ilike(f'%{search}%')) rooms = query.order_by(Room.created_at.desc()).all() - return render_template('rooms/rooms.html', rooms=rooms, search=search) + + # Get usage stats + usage_stats = DocuPulseSettings.get_usage_stats() + + return render_template('rooms/rooms.html', rooms=rooms, search=search, usage_stats=usage_stats) @rooms_bp.route('/create', methods=['GET', 'POST']) @login_required diff --git a/templates/conversations/conversations.html b/templates/conversations/conversations.html index 56fae0c..e528405 100644 --- a/templates/conversations/conversations.html +++ b/templates/conversations/conversations.html @@ -8,11 +8,39 @@ title="Conversations", description="Manage your conversations and messages", button_text="New Conversation" if current_user.is_admin or current_user.is_manager else "", - button_url=url_for('conversations.create_conversation') if current_user.is_admin or current_user.is_manager else "", + button_url="#" if current_user.is_admin or current_user.is_manager else "", icon="fa-comments", button_icon="fa-plus" ) }} + + +
@@ -123,5 +151,34 @@ {% block extra_js %} + {% endblock %} {% endblock %} \ No newline at end of file diff --git a/templates/rooms/rooms.html b/templates/rooms/rooms.html index 7a5e535..2838295 100644 --- a/templates/rooms/rooms.html +++ b/templates/rooms/rooms.html @@ -1,7 +1,7 @@ {% extends "common/base.html" %} {% from "components/header.html" import header %} -{% block title %}Rooms - DocuPulse{% endblock %} +{% block title %}Rooms - {% if site_settings.company_name %}DocuPulse for {{ site_settings.company_name }}{% else %}DocuPulse{% endif %}{% endblock %} {% block extra_css %} @@ -10,13 +10,11 @@ {% block content %} {{ header( title="Rooms", - description="Manage your document rooms and collaborate with team members", + description="Manage your rooms and documents", button_text="New Room", - button_url=url_for('rooms.create_room'), + button_url="#", icon="fa-door-open", - button_icon="fa-plus", - button_class="btn-primary", - button_style="padding: 0.4rem 1rem;" + button_icon="fa-plus" ) }}
@@ -99,21 +97,11 @@