Skip to content

Releases: benavlabs/crudadmin

0.4.3

08 Oct 04:03
f72d7b8

Choose a tag to compare

CRUDAdmin v0.4.3 - Bug Fixes and UI Improvements

🐛 Bug Fixes

🔍 Enhanced Search Functionality

  • UUID Support in Search: Added support for UUID field types in search functionality (crudadmin/admin_interface/model_view.py:963)
    • UUID fields are now properly handled during search operations by converting search values to strings
    • Resolves search issues when working with models that use UUID primary keys or UUID fields

📝 Form Field Handling Improvements

  • Empty Fields Update Fix: Fixed handling of empty/null fields during record updates (crudadmin/admin_interface/model_view.py:1095-1108)
    • Added proper field_values dictionary to template context to ensure form fields retain their values correctly
    • Prevents loss of field data when updating records with empty or null values
    • Improves form state management in the admin interface

📱 Responsive Layout Enhancements

  • Authentication Layout Responsiveness: Improved responsive behavior of authentication pages (crudadmin/templates/base/base.html:272-278)
    • Added proper grid layout and overflow handling for admin main content area
    • Enhanced mobile and tablet viewing experience for login/authentication forms
    • Better padding and layout management across different screen sizes

🧪 Development & Testing Improvements

Enhanced Test Coverage

  • Event System Tests: Added comprehensive unit tests for event models module
  • Core Authentication Tests: Added unit tests for core authentication functionality
  • Event Integration Tests: Added integration tests for the event system
  • Python 3.11 Compatibility: Updated test representations for Python 3.11 compatibility

🛠️ Development Workflow

  • Pre-commit Hooks: Added pre-commit hooks configuration for code quality
  • Updated Dev Dependencies: Refreshed development dependencies for better tooling
  • Contribution Guidelines: Enhanced contribution documentation with clearer instructions

🔧 Technical Details

No Breaking Changes

This is a maintenance release focused on bug fixes and improvements. All existing APIs remain unchanged and fully backward compatible.

Dependencies

  • No new dependencies added
  • Updated development dependencies for better tooling and testing
  • Maintained compatibility with all existing requirements

Python Support

  • Python 3.9+ (unchanged)
  • Improved Python 3.11 compatibility in test suite
  • Tested across all supported Python versions

📋 Full Changelog

Fixed

  • UUID field types now properly supported in search functionality
  • Empty/null field handling during record updates in admin interface
  • Responsive layout issues in authentication pages
  • Form field value retention during updates
  • Python 3.11 compatibility issues in test representations

Added

  • Unit tests for event models module
  • Unit tests for core authentication functionality
  • Integration tests for event system
  • Pre-commit hooks configuration
  • Enhanced contribution guidelines

Improved

  • Mobile and tablet responsiveness for admin interface
  • Form state management and field value handling
  • Development workflow with better tooling
  • Test coverage across core modules

🚀 Upgrade Notes

This release contains only bug fixes and improvements with no breaking changes. You can safely upgrade from v0.4.2 to v0.4.3 without any code modifications.

Benefits of Upgrading

  • ✅ Better search functionality with UUID support
  • ✅ Improved form handling for empty/null fields
  • ✅ Enhanced mobile/tablet experience
  • ✅ More reliable admin interface behavior

Installation

pip install --upgrade crudadmin==0.4.3

What's Changed

New Contributors

Full Changelog: v0.4.2...v0.4.3

0.4.2

26 Jun 06:59
2b456b5

Choose a tag to compare

CRUDAdmin v0.4.2

What's Changed

New Contributors

Full Changelog: v0.4.1...v0.4.2

0.4.1

24 Jun 07:13
d2ee983

Choose a tag to compare

CRUDAdmin v0.4.1

Added configs to init to be able to run the shorter:

from crudadmin import RedisConfig, MemcachedConfig

Instead of:

from crudadmin.session.configs import RedisConfig, MemcachedConfig

What's Changed

Full Changelog: v0.4.0...v0.4.1

0.4.0

24 Jun 06:57

Choose a tag to compare

CRUDAdmin v0.4.0 - Session Configuration API Overhaul

🚨 BREAKING CHANGES - Migration Required

This release introduces a complete overhaul of the session backend configuration API, replacing the old method-based approach with a cleaner constructor-based system. All existing code using session backends will need to be updated.

⚠️ Removed Session Methods

The following session configuration methods have been removed and will cause errors if used:

# ❌ REMOVED - These methods no longer exist:
admin.use_redis_sessions(...)
admin.use_memcached_sessions(...)
admin.use_memory_sessions(...)
admin.use_database_sessions(...)
admin._recreate_session_manager()

🔄 Required Migration Steps

Before (v0.3.x):

from crudadmin import CRUDAdmin

# Old method-based Redis configuration - WILL NOT WORK in v0.4.0+
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="your-secret-key",
    # Basic setup first
)

# ❌ Old method calls that no longer work
admin.use_redis_sessions(
    host="localhost",
    port=6379,
    db=0,
    password="mypassword",
    pool_size=20,
    connect_timeout=10
)

# Old Memcached method - WILL NOT WORK in v0.4.0+
admin.use_memcached_sessions(
    servers=["localhost:11211"],
    pool_size=10
)

After (v0.4.0+):

from crudadmin import CRUDAdmin
from crudadmin.session.configs import RedisConfig, MemcachedConfig

# ✅ Method 1: Using configuration objects (recommended)
redis_config = RedisConfig(
    host="localhost",
    port=6379,
    db=0,
    password="mypassword",
    pool_size=20,
    connect_timeout=10
)

admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="your-secret-key",
    session_backend="redis",
    redis_config=redis_config
)

# ✅ Method 2: Using dictionary configuration
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="your-secret-key",
    session_backend="redis",
    redis_config={
        "host": "localhost",
        "port": 6379,
        "db": 0,
        "password": "mypassword",
        "pool_size": 20,
        "connect_timeout": 10
    }
)

# ✅ Method 3: Using Redis URL
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="your-secret-key",
    session_backend="redis",
    redis_config={"url": "redis://:mypassword@localhost:6379/0"}
)

# ✅ New Memcached configuration
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="your-secret-key",
    session_backend="memcached",
    memcached_config={
        "servers": ["localhost:11211"],
        "pool_size": 10
    }
)

New Features

🗂️ New Configuration Module

  • New module: crudadmin.session.configs with configuration classes:
    • RedisConfig - Redis backend configuration with URL parsing and validation
    • MemcachedConfig - Memcached backend configuration with server list support

🔧 Constructor-Based Session Configuration

  • Direct configuration: All session backends now configured directly in the constructor
  • No method chaining: Eliminates timing issues and complexity from the old method-based approach
  • Type safety: Full Pydantic validation for all configuration parameters
  • Flexible formats: Support for configuration objects, dictionaries, and URLs
# All these formats are now supported:
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="key",
    session_backend="redis",
    redis_config=RedisConfig(url="redis://user:pass@host:6379/1")
)

admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="key", 
    session_backend="redis",
    redis_config={"host": "localhost", "port": 6379, "db": 0}
)

📊 Enhanced Redis Configuration

  • URL parsing: Full Redis URL support with automatic parameter extraction
  • Connection validation: Pydantic validation for all Redis parameters
  • Connection pooling: Proper connection pool size and timeout configuration
  • ACL support: Full Redis 6.0+ ACL username/password authentication

🔗 Enhanced Memcached Configuration

  • Server list support: Configure multiple Memcached servers
  • Connection pooling: Configurable pool sizes for better performance
  • Validation: Automatic validation of server addresses and ports

🎯 Simplified API

  • No method chaining: All configuration done at construction time
  • Better error handling: Configuration errors caught immediately at startup
  • Cleaner code: No need for manual session manager recreation
  • Documentation: Enhanced docstrings with configuration examples

🐛 Bug Fixes

🔧 API Consistency & Reliability

  • Eliminated method chaining issues: No more timing problems with session backend configuration
  • Removed race conditions: Session backends are now configured atomically at construction
  • Better error messages: Clear validation errors when configuration is invalid
  • Lazy dependency loading: Optional dependencies (redis, memcached) only loaded when needed

🧪 Test Suite Improvements

  • Fixed all failing tests related to the API changes
  • Updated test patterns: All tests now use new constructor-based configuration
  • Better test coverage: Added tests for configuration validation and edge cases
  • Maintained compatibility: All existing functionality preserved

🚀 Improvements

📚 Better Documentation

  • Updated examples: All code examples use new configuration format
  • Migration guide: Clear upgrade path from v0.3.x to v0.4.0
  • Configuration reference: Comprehensive documentation for all config options
  • Type hints: Improved type annotations throughout

🏗️ Code Organization

  • Separation of concerns: Configuration logic moved to dedicated module
  • Maintainability: Easier to extend with new session backends
  • Validation: Centralized parameter validation with clear error messages
  • Extensibility: Simple to add new configuration options

📋 Technical Details

Dependencies

  • No new dependencies added
  • Pydantic 2.0+ (existing requirement) used for configuration validation
  • Backward compatible with existing optional dependencies (redis, memcached)

Python Support

  • Python 3.9+ (unchanged)
  • Tested on Python 3.9, 3.10, 3.11, 3.12

Performance

  • ✅ No performance impact - same underlying session backends
  • ✅ Improved validation prevents configuration errors at startup
  • ✅ Better connection pooling configuration options

🔍 Full Changelog

Added

  • crudadmin.session.configs module with RedisConfig and MemcachedConfig classes
  • redis_config parameter to CRUDAdmin constructor
  • memcached_config parameter to CRUDAdmin constructor
  • Constructor-based session backend configuration (replaces method-based approach)
  • URL parsing support for Redis connections
  • Multiple server support for Memcached
  • Pydantic validation for all configuration parameters
  • Support for dictionary-based configuration alongside config objects
  • redis_pool_size and redis_connect_timeout parameters
  • memcached_pool_size parameter

Changed

  • BREAKING: Session backend configuration moved from methods to constructor parameters
  • BREAKING: All session configuration now happens at construction time
  • Enhanced constructor docstring with comprehensive configuration examples
  • Improved error handling and validation for session configurations
  • Better lazy loading of optional dependencies

Removed

  • BREAKING: admin.use_redis_sessions() method
  • BREAKING: admin.use_memcached_sessions() method
  • BREAKING: admin.use_memory_sessions() method
  • BREAKING: admin.use_database_sessions() method
  • BREAKING: admin._recreate_session_manager() method
  • Method chaining complexity and associated timing issues

Fixed

  • Session backend initialization race conditions
  • Method chaining timing issues that could cause configuration failures
  • Test suite compatibility with new constructor-based API
  • Lazy loading of optional Redis and Memcached dependencies
  • Configuration validation and error messages

📖 Upgrade Guide

Quick Migration Checklist

  1. ✅ Remove old method calls: Delete all admin.use_*_sessions() method calls
  2. ✅ Add session configuration to constructor: Move session config to CRUDAdmin() constructor
  3. ✅ Update imports (if using config objects):
    from crudadmin.session.configs import RedisConfig, MemcachedConfig
  4. ✅ Choose configuration format: Use config objects, dictionaries, or URLs
  5. ✅ Test your configuration: Validation happens immediately at startup
  6. ✅ Update documentation: Update any internal documentation/deployment scripts

Migration Examples

Simple Redis Migration

# Before v0.4.0
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="key"
)
admin.use_redis_sessions(
    host="localhost",
    port=6379,
    db=0
)

# After v0.4.0
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="key",
    session_backend="redis",
    redis_config={"host": "localhost", "port": 6379, "db": 0}
)

Redis with Advanced Configuration

# Before v0.4.0
admin = CRUDAdmin(
    session=get_session,
    SECRET_KEY="key"
)
admin.use_redis_sessions(
    url="redis://user:[email protected]:6379/1",
    pool_size=20,
    connect_timeout=10
)

# After v0.4.0 - Option 1: Using config object
from crudadmin.session.configs import RedisConfig

redis_config = RedisConfig(
    url="redis://user:[email protected]:6379/1",
    pool_size=20,
    connect_timeout=10
)
admin = CRUDAdmin(
    session=get_...
Read more

0.3.7

21 Jun 05:19

Choose a tag to compare

What's Changed

Full Changelog: v0.3.6...v0.3.7

0.3.6

19 Jun 03:27
428b3ee

Choose a tag to compare

What's Changed

Full Changelog: v0.3.5...v0.3.6

0.3.5

19 Jun 03:17

Choose a tag to compare

What's Changed

Full Changelog: v0.3.4...v0.3.5

0.3.4

16 Jun 02:34
1dc43af

Choose a tag to compare

Using select_schema to Exclude Fields from Read Operations

Some database field types can cause issues in admin panels. The most common example is PostgreSQL's TSVector type used for full-text search, which can trigger NotImplementedError when trying to display records.

The select_schema parameter allows you to exclude problematic fields from all read operations while keeping them available for create/update operations.

Use select_schema when you encounter:

  • TSVector fields causing NotImplementedError in admin views
  • Large binary fields that slow down list views
  • Computed fields that don't need to be displayed
  • Sensitive fields that should be hidden from admin users
  • Complex JSON fields that break admin display formatting

Basic Example: Excluding TSVector Fields

from sqlalchemy import Column, Integer, String, Text
from sqlalchemy_utils import TSVectorType
from pydantic import BaseModel
from typing import Optional
from datetime import datetime

# SQLAlchemy model with TSVector for full-text search
class Document(Base):
    __tablename__ = "documents"

    id = Column(Integer, primary_key=True)
    title = Column(String(200), nullable=False)
    content = Column(Text, nullable=False)
    created_at = Column(DateTime, default=func.now())

    # This field causes NotImplementedError in admin views
    search_vector = Column(TSVectorType('title', 'content'))

# Schemas for create/update (no search_vector)
class DocumentCreate(BaseModel):
    title: str = Field(..., min_length=1, max_length=200)
    content: str = Field(..., min_length=1)

class DocumentUpdate(BaseModel):
    title: Optional[str] = Field(None, min_length=1, max_length=200)
    content: Optional[str] = None

# Schema for read operations (excludes problematic field)
class DocumentSelect(BaseModel):
    id: int
    title: str
    content: str
    created_at: datetime
    # search_vector field intentionally excluded!

# Register with admin
admin.add_view(
    model=Document,
    create_schema=DocumentCreate,
    update_schema=DocumentUpdate,
    select_schema=DocumentSelect,  # ✅ TSVector excluded from reads
    allowed_actions={"view", "create", "update", "delete"}
)

What's Changed

Full Changelog: v0.3.3...v0.3.4

0.3.3

14 Jun 03:17
5a84632

Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.3.2...v0.3.3

0.3.2

09 Jun 00:59
07366b9

Choose a tag to compare

What's Changed

Full Changelog: v0.3.1...v0.3.2