imap progress
This commit is contained in:
108
app/routes.py
108
app/routes.py
@@ -2,6 +2,7 @@ from flask import Blueprint, render_template, request, jsonify, make_response, f
|
||||
from flask_login import login_required, current_user
|
||||
from app import db
|
||||
from app.models import Folder, User
|
||||
from app.imap_service import IMAPService
|
||||
import uuid
|
||||
import logging
|
||||
|
||||
@@ -174,7 +175,7 @@ def update_folder(folder_id):
|
||||
response.headers['HX-Retarget'] = '#folder-modal'
|
||||
response.headers['HX-Reswap'] = 'outerHTML'
|
||||
return response
|
||||
|
||||
|
||||
# Update folder
|
||||
folder.name = name.strip()
|
||||
folder.rule_text = rule_text.strip()
|
||||
@@ -198,4 +199,107 @@ def update_folder(folder_id):
|
||||
response = make_response(render_template('partials/folder_modal.html', folder=folder, errors=errors, name=name, rule_text=rule_text, priority=priority))
|
||||
response.headers['HX-Retarget'] = '#folder-modal'
|
||||
response.headers['HX-Reswap'] = 'outerHTML'
|
||||
return response
|
||||
return response
|
||||
|
||||
@main.route('/api/imap/config', methods=['GET'])
|
||||
@login_required
|
||||
def imap_config_modal():
|
||||
"""Return the IMAP configuration modal."""
|
||||
response = make_response(render_template('partials/imap_config_modal.html'))
|
||||
response.headers['HX-Trigger'] = 'open-modal'
|
||||
return response
|
||||
|
||||
@main.route('/api/imap/test', methods=['POST'])
|
||||
@login_required
|
||||
def test_imap_connection():
|
||||
"""Test IMAP connection with provided configuration."""
|
||||
try:
|
||||
# Get form data
|
||||
server = request.form.get('server')
|
||||
port = request.form.get('port')
|
||||
username = request.form.get('username')
|
||||
password = request.form.get('password')
|
||||
use_ssl = request.form.get('use_ssl') == 'on'
|
||||
|
||||
# Validate required fields
|
||||
errors = {}
|
||||
if not server:
|
||||
errors['server'] = 'Server is required'
|
||||
if not port:
|
||||
errors['port'] = 'Port is required'
|
||||
elif not port.isdigit():
|
||||
errors['port'] = 'Port must be a number'
|
||||
if not username:
|
||||
errors['username'] = 'Username is required'
|
||||
if not password:
|
||||
errors['password'] = 'Password is required'
|
||||
|
||||
if errors:
|
||||
response = make_response(render_template('partials/imap_config_modal.html', errors=errors))
|
||||
response.headers['HX-Retarget'] = '#imap-modal'
|
||||
response.headers['HX-Reswap'] = 'outerHTML'
|
||||
return response
|
||||
|
||||
# Store configuration temporarily for testing
|
||||
test_config = {
|
||||
'server': server,
|
||||
'port': int(port),
|
||||
'username': username,
|
||||
'password': password,
|
||||
'use_ssl': use_ssl,
|
||||
'use_tls': False,
|
||||
'connection_timeout': 30
|
||||
}
|
||||
|
||||
# Test connection
|
||||
temp_user = type('User', (), {'imap_config': test_config})()
|
||||
imap_service = IMAPService(temp_user)
|
||||
success, message = imap_service.test_connection()
|
||||
|
||||
if success:
|
||||
# Save configuration to user's profile
|
||||
current_user.imap_config = test_config
|
||||
db.session.commit()
|
||||
|
||||
response = make_response(render_template('partials/imap_config_modal.html',
|
||||
success=True, message=message))
|
||||
response.headers['HX-Retarget'] = '#imap-modal'
|
||||
response.headers['HX-Reswap'] = 'outerHTML'
|
||||
else:
|
||||
response = make_response(render_template('partials/imap_config_modal.html',
|
||||
errors={'general': message}))
|
||||
response.headers['HX-Retarget'] = '#imap-modal'
|
||||
response.headers['HX-Reswap'] = 'outerHTML'
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
logging.exception("Error testing IMAP connection: %s", e)
|
||||
errors = {'general': 'An unexpected error occurred. Please try again.'}
|
||||
response = make_response(render_template('partials/imap_config_modal.html', errors=errors))
|
||||
response.headers['HX-Retarget'] = '#imap-modal'
|
||||
response.headers['HX-Reswap'] = 'outerHTML'
|
||||
return response
|
||||
|
||||
@main.route('/api/imap/sync', methods=['POST'])
|
||||
@login_required
|
||||
def sync_imap_folders():
|
||||
"""Sync folders from IMAP server."""
|
||||
try:
|
||||
if not current_user.imap_config:
|
||||
return jsonify({'error': 'No IMAP configuration found. Please configure IMAP first.'}), 400
|
||||
|
||||
# Test connection first
|
||||
imap_service = IMAPService(current_user)
|
||||
success, message = imap_service.sync_folders()
|
||||
|
||||
if success:
|
||||
# Get updated list of folders
|
||||
folders = Folder.query.filter_by(user_id=current_user.id).all()
|
||||
return render_template('partials/folders_list.html', folders=folders)
|
||||
else:
|
||||
return jsonify({'error': message}), 400
|
||||
|
||||
except Exception as e:
|
||||
logging.exception("Error syncing IMAP folders: %s", e)
|
||||
return jsonify({'error': 'An unexpected error occurred. Please try again.'}), 500
|
||||
Reference in New Issue
Block a user