diff --git a/.env b/.env index 3c4b108..13b6079 100644 --- a/.env +++ b/.env @@ -5,5 +5,5 @@ DATABASE_URL=postgresql://postgres:password@localhost:5432/email_organizer_dev # OPENAI_MODEL=qwen/qwen3-coder OPENAI_API_KEY=aaoeu -OPENAI_BASE_URL=http://localhost:5082/v1 -OPENAI_MODEL=Qwen3-Coder-480B-A35B-Instruct-GGUF-roo +OPENAI_BASE_URL=http://workstation:5082/v1 +OPENAI_MODEL=Qwen3-235B-A22B-Thinking-2507-GGUF diff --git a/app/routes/imap.py b/app/routes/imap.py index f8374b5..ddd3ca8 100644 --- a/app/routes/imap.py +++ b/app/routes/imap.py @@ -138,11 +138,9 @@ def test_imap_connection(): db.session.commit() # Redirect to folder selection modal after successful connection - response = make_response('') - response.headers['HX-Trigger'] = 'open-modal' - response.headers['HX-location'] = '/api/imap/folders/modal' + return imap_folders_modal() + #response.headers['HX-Trigger'] = 'open-modal' else: - print(message) response = make_response(render_template('partials/imap_config_modal.html', errors={'general': message}, server=server, port=port, username=username, use_ssl=use_ssl)) response.headers['HX-Retarget'] = '#imap-modal' @@ -315,114 +313,4 @@ def sync_selected_folders(): logging.exception("Error syncing selected IMAP folders: %s", e) print(e) db.session.rollback() - return jsonify({'error': 'An unexpected error occurred'}), 500 - -@imap_bp.route('/api/imap/sync', methods=['POST']) -@login_required -def sync_imap_folders(): - """Create and sync folders from IMAP server with processed email tracking.""" - 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) - - # Get folders from IMAP server - imap_folders = imap_service.get_folders() - - if not imap_folders: - return jsonify({'error': 'No folders found on IMAP server'}), 400 - - # Deduplicate folders by name to prevent creating multiple entries for the same folder - unique_folders = [] - seen_names = set() - for imap_folder in imap_folders: - folder_name = imap_folder['name'] - - # Skip special folders that might not be needed - if folder_name.lower() in ['sent', 'drafts', 'spam', 'trash']: - continue - - # Use case-insensitive comparison for deduplication - folder_name_lower = folder_name.lower() - if folder_name_lower not in seen_names: - unique_folders.append(imap_folder) - seen_names.add(folder_name_lower) - - # Process each unique folder - synced_count = 0 - processed_emails_service = ProcessedEmailsService(current_user) - - # Create a list of folders to process - folders_to_process = [] - - for imap_folder in unique_folders: - folder_name = imap_folder['name'].strip() - - # Handle nested folder names (convert slashes to underscores or keep as-is) - # According to requirements, nested folders should be created with slashes in the name - display_name = folder_name - - # Check if folder already exists - existing_folder = Folder.query.filter_by( - user_id=current_user.id, - name=display_name - ).first() - - if not existing_folder: - # Create new folder - # Determine folder type - inbox should be 'tidy', others 'destination' - folder_type = 'tidy' if folder_name.lower().strip() == 'inbox' else 'destination' - - new_folder = Folder( - user_id=current_user.id, - name=display_name, - rule_text=f"Auto-synced from IMAP folder: {folder_name}", - priority=0, # Default priority - folder_type=folder_type - ) - db.session.add(new_folder) - synced_count += 1 - folders_to_process.append(new_folder) - else: - # Update existing folder with email counts and recent emails - # Get all email UIDs in this folder - email_uids = imap_service.get_folder_email_uids(folder_name) - - # Sync with processed emails service - new_emails_count = processed_emails_service.sync_folder_emails(display_name, email_uids) - print("NEW", new_emails_count) - - # Update counts - pending_count = processed_emails_service.get_pending_count(display_name) - existing_folder.pending_count = pending_count - existing_folder.total_count = len(email_uids) - - # Get the most recent emails for this folder - recent_emails = imap_service.get_recent_emails(folder_name, 3) - existing_folder.recent_emails = recent_emails - - folders_to_process.append(existing_folder) - - db.session.commit() - - # Check if we should show the folder type selection modal - # Only show the modal if there are new folders to configure - if synced_count > 0: - # Return the folder type selection modal - response = make_response(render_template('partials/folder_type_selection_modal.html', folders=folders_to_process)) - response.headers['hx-retarget'] = "#modal-holder" - response.headers['HX-Trigger'] = 'open-modal' - return response - else: - # Just trigger the folder list update - response = make_response('') - response.headers['HX-Trigger'] = 'close-modal, folder-list-invalidated' - return response - - except Exception as e: - logging.exception("Error syncing IMAP folders: %s", e) - print(e) - db.session.rollback() return jsonify({'error': 'An unexpected error occurred'}), 500 \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index b5eb412..ec36c3b 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -38,7 +38,12 @@ /* Fade out transition for HTMX */ .fade-out-htmx.htmx-swapping { opacity: 0; - transition: opacity 1s ease-out; + transition: opacity 280ms ease-out; + } + /* Fade out transition for HTMX */ + .htmx-swapping .fade-out-htmx { + opacity: 0; + transition: opacity 280ms ease-out; } {% block head %}{% endblock %} diff --git a/app/templates/partials/folder_selection_modal.html b/app/templates/partials/folder_selection_modal.html index c59556a..644178a 100644 --- a/app/templates/partials/folder_selection_modal.html +++ b/app/templates/partials/folder_selection_modal.html @@ -1,4 +1,4 @@ -