Skip to content

Releases: benavlabs/crudadmin

0.4.2

26 Jun 06:59
2b456b5
Compare
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
Compare
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
Compare
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: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_...
Read more

0.3.7

21 Jun 05:19
Compare
Choose a tag to compare

What's Changed

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

0.3.6

19 Jun 03:27
428b3ee
Compare
Choose a tag to compare

What's Changed

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

0.3.5

19 Jun 03:17
Compare
Choose a tag to compare

What's Changed

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

0.3.4

16 Jun 02:34
1dc43af
Compare
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
Compare
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
Compare
Choose a tag to compare

What's Changed

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

0.3.1

06 Jun 17:14
7efb278
Compare
Choose a tag to compare

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