Releases: benavlabs/crudadmin
0.4.2
CRUDAdmin v0.4.2
What's Changed
- Fix(UI): correct dashboard URLs when mounted at root by @andriialbatov in #44
- change project version by @igorbenav in #45
New Contributors
- @andriialbatov made their first contribution in #44 🎉
Full Changelog: v0.4.1...v0.4.2
0.4.1
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
- Add configs to init by @igorbenav in #43
Full Changelog: v0.4.0...v0.4.1
0.4.0
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 validationMemcachedConfig
- 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 withRedisConfig
andMemcachedConfig
classesredis_config
parameter toCRUDAdmin
constructormemcached_config
parameter toCRUDAdmin
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
andredis_connect_timeout
parametersmemcached_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
- ✅ Remove old method calls: Delete all
admin.use_*_sessions()
method calls - ✅ Add session configuration to constructor: Move session config to
CRUDAdmin()
constructor - ✅ Update imports (if using config objects):
from crudadmin.session.configs import RedisConfig, MemcachedConfig
- ✅ Choose configuration format: Use config objects, dictionaries, or URLs
- ✅ Test your configuration: Validation happens immediately at startup
- ✅ 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:pass@redis.example.com: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:pass@redis.example.com:6379/1",
pool_size=20,
connect_timeout=10
)
admin = CRUDAdmin(
session=get_...
0.3.7
What's Changed
- fix uuid, add test by @igorbenav in #38
- Fix other backends by @igorbenav in #39 (thanks to @arab0v 🎉)
- change pyproject version by @igorbenav in #40
- add session backends to mkdocs.yml by @igorbenav in #41
Full Changelog: v0.3.6...v0.3.7
0.3.6
What's Changed
- fix location of icon with root mount path by @igorbenav in #35
Full Changelog: v0.3.5...v0.3.6
0.3.5
0.3.4
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
- select_schema functional by @igorbenav in #32
Full Changelog: v0.3.3...v0.3.4
0.3.3
What's Changed
- Warning gitignore by @igorbenav in #23
- fix Python 3.9 and 3.10 compatibility issues by @msamsami in #24
- add security policy guideline by @msamsami in #26
- add matrix testing for multiple Python versions in test workflow by @msamsami in #27
- track
.python-version
in Git and clarify Python version requirements in docs by @msamsami in #28 - fix minor typos in docs by @msamsami in #29
- add unit tests for event decorators by @msamsami in #30
- change version by @igorbenav in #31
New Contributors
Full Changelog: v0.3.2...v0.3.3
0.3.2
What's Changed
- add video demo to readme by @igorbenav in #19
- add video to docs by @igorbenav in #20
- bump fastcrud to fix sqlalchemy-utils by @igorbenav in #22 (thanks to @arab0v for this one 🎉)
Full Changelog: v0.3.1...v0.3.2
0.3.1
What's Changed
- remove installing from docs by @igorbenav in #6
- api overview page by @igorbenav in #7
- change from personal to benavlabs by @igorbenav in #8
- add benav labs banner by @igorbenav in #9
- add instructions for installing dependencies using UV by @YousefAldabbas in #10
- Default update_internal_schema and delete_schema to None by @nimaxin in #11
- Docs fix by @igorbenav in #15
- update type annotation from session to session generator by @igorbenav in #17
- Update CONTRIBUTING.md and pyproject.toml for improved setup instructions and dependency management by @YousefAldabbas in #16
- refactor session schema by @hussainwali74 in #14
- remove comment, bump project version by @igorbenav in #18
New Contributors
- @YousefAldabbas made their first contribution in #10 🚀
- @nimaxin made their first contribution in #11 🎉
- @hussainwali74 made their first contribution in #14 ⭐️
Full Changelog: v0.3.0...v0.3.1