diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index 4ef22cd..cb6d1ea 100644 Binary files a/routes/__pycache__/main.cpython-313.pyc and b/routes/__pycache__/main.cpython-313.pyc differ diff --git a/routes/main.py b/routes/main.py index 67cba4b..32575f3 100644 --- a/routes/main.py +++ b/routes/main.py @@ -1,6 +1,6 @@ from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify, session from flask_login import current_user, login_required -from models import User, db, Room, RoomFile, RoomMemberPermission, SiteSettings, Event, Conversation, Message, MessageAttachment, Notif +from models import User, db, Room, RoomFile, RoomMemberPermission, SiteSettings, Event, Conversation, Message, MessageAttachment, Notif, EmailTemplate from routes.auth import require_password_change import os from werkzeug.utils import secure_filename @@ -621,56 +621,40 @@ def init_routes(main_bp): @login_required def settings(): if not current_user.is_admin: - flash('Only administrators can access settings.', 'error') - return redirect(url_for('main.dashboard')) + flash('You do not have permission to access settings.', 'error') + return redirect(url_for('main.index')) - # Get active tab from URL or default to colors active_tab = request.args.get('tab', 'colors') - - # Get site settings site_settings = SiteSettings.get_settings() + company_form = CompanySettingsForm() - # Get events data if events tab is active + # Get events for the events tab events = None total_pages = 0 current_page = 1 - users = [] + users = {} if active_tab == 'events': - # Get filter parameters - event_type = request.args.get('event_type', '') - date_range = request.args.get('date_range', '7d') - user_id = request.args.get('user_id', '') page = request.args.get('page', 1, type=int) per_page = 10 - - # Build query - query = Event.query - - # Apply filters - if event_type: - query = query.filter(Event.event_type == event_type) - if user_id: - query = query.filter(Event.user_id == user_id) - if date_range and date_range != 'all': - cutoff_date = datetime.utcnow() - timedelta(days=int(date_range[:-1])) - query = query.filter(Event.timestamp >= cutoff_date) - - # Get paginated events - events = query.order_by(Event.timestamp.desc()).paginate(page=page, per_page=per_page) + events = Event.query.order_by(Event.timestamp.desc()).paginate(page=page, per_page=per_page) total_pages = events.pages current_page = events.page - # Get all users for filter dropdown - users = User.query.order_by(User.username).all() - else: - events = None - total_pages = 0 - current_page = 1 - users = [] + # Get all users for the events + user_ids = set() + for event in events.items: + user_ids.add(event.user_id) + if event.details and 'target_user_id' in event.details: + user_ids.add(event.details['target_user_id']) + + users = {user.id: user for user in User.query.filter(User.id.in_(user_ids)).all()} + + # Get email templates for the email templates tab + email_templates = [] + if active_tab == 'email_templates': + email_templates = EmailTemplate.query.filter_by(is_active=True).all() - # Create form for company settings - company_form = CompanySettingsForm() if request.method == 'GET': company_form.company_name.data = site_settings.company_name company_form.company_website.data = site_settings.company_website @@ -693,6 +677,7 @@ def init_routes(main_bp): total_pages=total_pages, current_page=current_page, users=users, + email_templates=email_templates, form=company_form) @main_bp.route('/settings/colors', methods=['POST']) @@ -1088,4 +1073,52 @@ def init_routes(main_bp): headers={ 'Content-Disposition': f'attachment; filename=event_log_{datetime.utcnow().strftime("%Y%m%d_%H%M%S")}.csv' } - ) \ No newline at end of file + ) + + @main_bp.route('/settings/email-templates/', methods=['PUT']) + @login_required + def update_email_template(template_id): + if not current_user.is_admin: + return jsonify({'error': 'Unauthorized'}), 403 + + template = EmailTemplate.query.get_or_404(template_id) + + data = request.get_json() + if not data: + return jsonify({'error': 'No data provided'}), 400 + + template.subject = data.get('subject', template.subject) + template.body = data.get('body', template.body) + + try: + db.session.commit() + + # Log the template update + log_event( + event_type='settings_update', + details={ + 'user_id': current_user.id, + 'user_name': f"{current_user.username} {current_user.last_name}", + 'update_type': 'email_template', + 'template_id': template.id, + 'template_name': template.name, + 'changes': { + 'subject': template.subject, + 'body': template.body + } + } + ) + db.session.commit() + + return jsonify({ + 'message': 'Template updated successfully', + 'template': { + 'id': template.id, + 'name': template.name, + 'subject': template.subject, + 'body': template.body + } + }) + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 \ No newline at end of file diff --git a/templates/settings/settings.html b/templates/settings/settings.html index d5c4dc0..2d75fb3 100644 --- a/templates/settings/settings.html +++ b/templates/settings/settings.html @@ -5,6 +5,7 @@ {% from "settings/tabs/security.html" import security_tab %} {% from "settings/tabs/debugging.html" import debugging_tab %} {% from "settings/tabs/events.html" import events_tab %} +{% from "settings/tabs/email_templates.html" import email_templates_tab %} {% from "settings/components/reset_colors_modal.html" import reset_colors_modal %} {% block title %}Settings - DocuPulse{% endblock %} @@ -37,6 +38,11 @@ Company Info +