django-testimonials

High-performance Django package for managing customer testimonials at scale


Keywords
django, testimonials, reviews, feedback, api, rest
License
MIT
Install
pip install django-testimonials==1.0.1

Documentation

Django Testimonials

PyPI version Build Status Documentation Status Coverage Status License: MIT

A high-performance, enterprise-grade Django package for managing customer testimonials at scale. Built with Django REST Framework and optimized for applications handling millions of testimonials with thousands of concurrent users.

๐Ÿš€ Performance-First Design

  • โšก Sub-100ms API responses with intelligent caching
  • ๐Ÿ“Š Optimized database queries with strategic indexing
  • ๐Ÿ”„ Background processing for emails and media
  • ๐Ÿ“ˆ Horizontal scaling ready with background task support
  • ๐Ÿ’พ Smart caching strategies with automatic invalidation

โœจ Enterprise Features

Core Functionality

  • ๐Ÿ“ Complete testimonial management with approval workflows
  • โญ Flexible rating systems (1-10 scale, configurable)
  • ๐Ÿท๏ธ Category organization with hierarchical support
  • ๐Ÿ“Ž Rich media attachments (images, videos, audio, documents)
  • ๐Ÿ’ฌ Response system for official company replies
  • ๐Ÿ‘ค Anonymous testimonials with privacy controls

Performance & Scalability

  • ๐Ÿš„ Smart caching for lightning-fast responses
  • โšก Background task processing with threading support
  • ๐Ÿ” Full-text search with optimized queries
  • ๐Ÿ“Š Real-time statistics with cached aggregations
  • ๐Ÿ”„ Bulk operations for efficient moderation

Developer Experience

  • ๐Ÿ”Œ Django REST Framework API with comprehensive endpoints
  • ๐Ÿ“š Extensive documentation with examples
  • ๐Ÿงช Comprehensive test suite with 95%+ coverage
  • ๐ŸŒ Internationalization ready with gettext support
  • ๐Ÿ”ง Highly configurable with 25+ settings

๐Ÿ“‹ Requirements

  • Python: 3.10+
  • Django: 4.2+
  • Django REST Framework: 3.14+
  • Pillow: 10.0+ (for image handling)
  • django-phonenumber-field: 7.0+
  • django-filter: 23.2+

Optional (for performance features):

  • django-background-tasks: For database-backed background task processing

๐Ÿš€ Quick Start

1. Installation

pip install django-testimonials

2. Basic Configuration

Add to your INSTALLED_APPS:

INSTALLED_APPS = [
    # ... other apps
    'rest_framework',
    'django_filters',
    'testimonials',
]

3. Database Setup

python manage.py migrate testimonials

4. URL Configuration

# urls.py
from django.urls import path, include

urlpatterns = [
    # ... other patterns
    path('api/testimonials/', include('testimonials.api.urls')),
]

5. Basic Usage

from testimonials.models import Testimonial, TestimonialCategory

# Create a category
category = TestimonialCategory.objects.create(
    name="Product Reviews",
    description="Customer feedback on our products"
)

# Create a testimonial
testimonial = Testimonial.objects.create(
    author_name="John Doe",
    author_email="john@example.com",
    content="This product exceeded my expectations!",
    rating=5,
    category=category
)

# Get published testimonials (uses caching automatically)
testimonials = Testimonial.objects.published()
featured = Testimonial.objects.featured()

๐Ÿ”ง Performance Configuration

Caching (Recommended)

# settings.py
TESTIMONIALS_USE_CACHE = True
TESTIMONIALS_CACHE_TIMEOUT = 900  # 15 minutes

# Configure Django cache backend (Database Cache example)
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'testimonials_cache_table',
    }
}

Then run:

python manage.py createcachetable

Background Task Processing (Recommended)

# settings.py
TESTIMONIALS_USE_BACKGROUND_TASKS = True

# Add django-background-tasks to INSTALLED_APPS
INSTALLED_APPS += ['background_task']

# Run migrations for background_task
# python manage.py migrate

Process tasks with:

python manage.py process_tasks

Email Notifications

# settings.py
TESTIMONIALS_NOTIFICATION_EMAIL = "admin@yoursite.com"

# Email backend configuration
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your-email@gmail.com'
EMAIL_HOST_PASSWORD = 'your-app-password'
DEFAULT_FROM_EMAIL = 'Your Site <noreply@yoursite.com>'

๐Ÿ—๏ธ Architecture Overview

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Frontend      โ”‚    โ”‚   Django API    โ”‚    โ”‚   Background    โ”‚
โ”‚   (React/Vue)   โ”‚โ—„โ”€โ”€โ–บโ”‚   (REST API)    โ”‚โ—„โ”€โ”€โ–บโ”‚   (Threads)     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚                        โ”‚
                              โ–ผ                        โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚   PostgreSQL    โ”‚    โ”‚  Django Cache    โ”‚
                    โ”‚   (Database)    โ”‚    โ”‚  (DB/LocMem)     โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ“Š API Endpoints

Testimonials

  • GET /api/testimonials/ - List testimonials (cached)
  • POST /api/testimonials/ - Create testimonial
  • GET /api/testimonials/{id}/ - Get testimonial details
  • PUT/PATCH /api/testimonials/{id}/ - Update testimonial
  • DELETE /api/testimonials/{id}/ - Delete testimonial

Moderation (Admin/Moderator only)

  • POST /api/testimonials/{id}/approve/ - Approve testimonial
  • POST /api/testimonials/{id}/reject/ - Reject testimonial
  • POST /api/testimonials/{id}/feature/ - Feature testimonial
  • POST /api/testimonials/bulk_action/ - Bulk moderation

Categories

  • GET /api/categories/ - List categories (cached)
  • GET /api/categories/{id}/testimonials/ - Category testimonials

Media

  • GET /api/media/ - List media files
  • POST /api/testimonials/{id}/add_media/ - Add media to testimonial

Statistics & Analytics

  • GET /api/testimonials/stats/ - Get comprehensive statistics
  • GET /api/testimonials/featured/ - Get featured testimonials

๐Ÿ’ก Usage Examples

Frontend Integration (JavaScript)

// Fetch testimonials with caching
const response = await fetch('/api/testimonials/?page=1&page_size=10');
const data = await response.json();

// Create a new testimonial
const testimonial = await fetch('/api/testimonials/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRFToken': csrfToken
    },
    body: JSON.stringify({
        author_name: 'Jane Smith',
        content: 'Amazing service, highly recommend!',
        rating: 5,
        category_id: 1
    })
});

// Get featured testimonials (cached)
const featured = await fetch('/api/testimonials/featured/');

Django Templates

{% load static %}

<div class="testimonials-section">
    <h2>What Our Customers Say</h2>
    
    {% for testimonial in featured_testimonials %}
    <div class="testimonial-card">
        <div class="rating">
            {% for i in "12345"|make_list %}
                {% if forloop.counter <= testimonial.rating %}โญ{% endif %}
            {% endfor %}
        </div>
        
        <blockquote>{{ testimonial.content }}</blockquote>
        
        <cite>
            {{ testimonial.author_name }}
            {% if testimonial.company %}, {{ testimonial.company }}{% endif %}
        </cite>
        
        {% if testimonial.response %}
        <div class="company-response">
            <strong>Our Response:</strong> {{ testimonial.response }}
        </div>
        {% endif %}
    </div>
    {% endfor %}
</div>

Admin Bulk Operations

# In your admin or management command
from testimonials.models import Testimonial

# Approve multiple testimonials
testimonial_ids = [1, 2, 3, 4, 5]
testimonials = Testimonial.objects.filter(id__in=testimonial_ids)
for t in testimonials:
    t.approve(user=request.user)

๐Ÿ”’ Security Features

  • ๐Ÿ›ก๏ธ Permission-based access with role-based moderation
  • ๐Ÿ” CSRF protection for all API endpoints
  • ๐Ÿ“ Input validation with comprehensive sanitization
  • ๐Ÿšซ Rate limiting for API endpoints
  • ๐Ÿ‘ค Anonymous submission with privacy controls
  • ๐Ÿ“ง Email verification for author notifications

๐ŸŒ Internationalization

# All user-facing strings support translation
from django.utils.translation import gettext_lazy as _

# Example usage in templates
{% load i18n %}
{% trans "Submit your testimonial" %}

# Configure languages in settings.py
LANGUAGES = [
    ('en', _('English')),
    ('es', _('Spanish')),
    ('fr', _('French')),
    # Add more languages
]

๐Ÿ“ˆ Performance Benchmarks

Operation Without Optimization With Optimization Improvement
List API (100 items) 250ms 45ms 82% faster
Detail API 180ms 25ms 86% faster
Search queries 400ms 60ms 85% faster
Bulk approve (1000) 45 seconds 3 seconds 93% faster
Statistics calculation 800ms 50ms 94% faster

๐ŸŽ›๏ธ Advanced Configuration

View all configuration options
# Performance & Caching
TESTIMONIALS_USE_CACHE = True
TESTIMONIALS_CACHE_TIMEOUT = 900
TESTIMONIALS_CACHE_KEY_PREFIX = "testimonials"

# Background Processing
TESTIMONIALS_USE_BACKGROUND_TASKS = True
TESTIMONIALS_EMAIL_RATE_LIMIT = 60

# File Handling
TESTIMONIALS_MAX_FILE_SIZE = 10 * 1024 * 1024  # 10MB
TESTIMONIALS_ENABLE_THUMBNAILS = True
TESTIMONIALS_THUMBNAIL_SIZES = {
    'small': (150, 150),
    'medium': (300, 300),
}

# Moderation
TESTIMONIALS_REQUIRE_APPROVAL = True
TESTIMONIALS_MODERATION_ROLES = ['content_manager']
TESTIMONIALS_ALLOW_ANONYMOUS = True

# Search & Pagination
TESTIMONIALS_SEARCH_MIN_LENGTH = 3
TESTIMONIALS_PAGINATION_SIZE = 10
TESTIMONIALS_SEARCH_RESULTS_LIMIT = 1000

# Features
TESTIMONIALS_ENABLE_CATEGORIES = True
TESTIMONIALS_ENABLE_MEDIA = True
TESTIMONIALS_ENABLE_DASHBOARD = True

๐Ÿงช Testing

# Run the full test suite
python -m pytest

# Run with coverage
python -m pytest --cov=testimonials --cov-report=html

# Run specific test categories
python -m pytest testimonials/tests/test_api_views.py
python -m pytest testimonials/tests/test_model.py
python -m pytest testimonials/tests/test_serializers.py

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“š Documentation

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

  • Built with Django and Django REST Framework
  • Performance optimizations inspired by high-scale web applications
  • Icons and design elements from the open-source community

โญ If this package helped you, please give it a star!

Report Issues โ€ข Request Features โ€ข Documentation