The NGO Empanelment Registration System is a comprehensive Django-based web application designed to streamline the registration and management of Non-Governmental Organizations (NGOs) for empanelment processes. This system addresses the critical need for efficient, secure, and scalable NGO registration management in government and institutional settings.
Built with modern web technologies and security best practices, this application provides a complete solution for organizations that need to manage large-scale NGO registrations while ensuring data integrity, preventing duplicates, and maintaining audit trails. The system is particularly suited for government departments, funding agencies, and institutions that work with multiple NGO partners.
Traditional NGO registration processes often suffer from manual data entry errors, duplicate registrations, security vulnerabilities, and lack of proper audit trails. This system automates the entire workflow while implementing robust validation and security measures.
graph TB
A[NGO Registration Request] --> B[Form Validation Layer]
B --> C{Duplicate Check}
C -->|Duplicate Found| D[Rejection with Details]
C -->|Unique Entry| E[Race-Condition Safe ID Generation]
E --> F[Database Transaction]
F --> G[File Upload Processing]
G --> H[Registration Complete]
H --> I[Auto-generated Application ID]
J[Admin Dashboard] --> K[View All Registrations]
J --> L[Export to CSV]
J --> M[Manage Documents]
N[Security Layer] --> O[CSRF Protection]
N --> P[File Validation]
N --> Q[Environment Variables]
- Input Validation: Multi-layer validation using Django forms with custom clean methods
- Duplicate Prevention: Real-time AJAX validation and comprehensive database checks
- Concurrency Handling: Transaction-atomic operations with database row locking
- File Management: Secure upload with type/size validation and organized storage
- Admin Interface: Custom Django admin with enhanced filtering and export capabilities
- Thread-Safe ID Generation: Race condition safe Application ID generation (Format: SWB-YYYY-XXXXX)
- Comprehensive Validation: Multi-field duplicate detection and real-time validation
- Secure File Handling: Document upload with validation and organized storage
- Advanced Admin Interface: Custom filters, search, and CSV export functionality
- Geographic Integration: Location-based registration with coordinate validation
- Audit Trail: Complete submission tracking with timestamps
- Responsive Design: Mobile-optimized interface for accessibility
- Backend Framework: Django 5.2.1
- Database: SQLite (development) / PostgreSQL (production)
- Frontend: HTML5, CSS3, JavaScript (ES6+)
- File Storage: Local filesystem (cloud-ready architecture)
- Security: Django's built-in security features + custom enhancements
- Admin Interface: Enhanced Django Admin with custom functionality
ngo_site/
├── ngo_site/ # Project configuration
│ ├── settings.py # Environment-based configuration
│ ├── urls.py # Main URL routing with media handling
│ ├── wsgi.py # WSGI application entry point
│ └── __init__.py
├── ngo_app/ # Main application
│ ├── models.py # NGO model with race-condition safe methods
│ ├── views.py # Registration logic and AJAX endpoints
│ ├── forms.py # Advanced validation and duplicate checking
│ ├── admin.py # Custom admin interface with filters
│ ├── urls.py # Application URL patterns
│ ├── templates/ # HTML templates
│ │ ├── registration_form.html
│ │ ├── thank_you.html
│ │ └── ngo_app/ # Admin templates
│ ├── static/ # Static assets
│ │ ├── css/
│ │ ├── js/
│ │ └── images/
│ └── migrations/ # Database schema migrations
├── media/ # User uploads (git-ignored)
│ └── awards/ # Certificate storage
├── static/ # Collected static files
├── logs/ # Application logs (git-ignored)
├── requirements.txt # Python dependencies
├── .env.example # Environment template
├── .gitignore # Git exclusions
└── manage.py # Django CLI tool
- Python 3.8+
- pip package manager
- Git version control
- (Optional) PostgreSQL for production
-
Repository Setup
git clone https://github.com/yourusername/ngo-empanelment-system.git cd ngo-empanelment-system
-
Virtual Environment
python -m venv venv # Windows venv\Scripts\activate # macOS/Linux source venv/bin/activate
-
Dependencies
pip install -r requirements.txt
-
Environment Configuration
cp .env.example .env # Edit .env with your settings (see security section below)
-
Database Setup
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
-
Development Server
python manage.py runserver
Access Points:
- Application: http://localhost:8000/
- Admin Panel: http://localhost:8000/admin/
# Security (REQUIRED)
SECRET_KEY=your-secret-key-here
DEBUG=True
# Application Settings
ADMIN_EMAIL=admin@yourdomain.com
SUPPORT_EMAIL=support@yourdomain.com
# Database (Production)
DATABASE_URL=postgresql://user:password@localhost:5432/ngo_db
IMPORTANT: Before deployment or making your repository public:
-
Generate New Secret Key
# In Django shell from django.core.management.utils import get_random_secret_key print(get_random_secret_key())
-
Environment Variable Implementation
# settings.py uses secure pattern SECRET_KEY = os.environ.get('SECRET_KEY', 'django-insecure-CHANGE-THIS-IN-PRODUCTION') DEBUG = os.environ.get('DEBUG', 'True').lower() == 'true'
-
Never Commit Sensitive Data
- Real secret keys
- Database credentials
- Email passwords
- Production configuration
NGO_SETTINGS = {
'APPLICATION_ID_PREFIX': 'SWB', # Customizable prefix
'MAX_FILE_SIZE': 5 * 1024 * 1024, # 5MB limit
'ALLOWED_FILE_TYPES': ['pdf', 'jpg', 'jpeg', 'png', 'doc', 'docx'],
'REGISTRATION_ENABLED': True,
}
def generate_application_id(self):
with transaction.atomic():
# Thread-safe implementation
existing_ids = NGO.objects.filter(
application_id__startswith=prefix
).select_for_update().values_list('application_id', flat=True)
# Extract numeric values and find maximum
numbers = [int(app_id.split('-')[-1]) for app_id in existing_ids]
next_number = max(numbers) + 1 if numbers else 1
return f"{prefix}{str(next_number).zfill(5)}"
- Real-time validation: AJAX endpoints for immediate feedback
- Database constraints: Unique field validation
- Combination checks: Organization name + President name validation
- Form-level validation: Custom clean methods in Django forms
- Type validation: Restricted file extensions
- Size limits: Configurable upload size restrictions
- Path security: Organized storage in
media/awards/
- Admin integration: Direct file access through admin interface
GET /
- Registration formPOST /
- Form submissionGET /thank_you/
- Confirmation page
POST /check_duplicate/
- Real-time duplicate validation{ "field": "darpan_id", "value": "OD/2023/0123456", "is_duplicate": false }
- Custom CSV export functionality
- Advanced filtering by area, expertise, domain
- Bulk operations support
- Geographic data visualization
-
Change prefix in settings:
NGO_SETTINGS['APPLICATION_ID_PREFIX'] = 'YOUR_PREFIX'
-
Update generation logic if needed in
models.py
- Model update: Add field to
NGO
model - Form integration: Include in
NGOForm.Meta.fields
- Validation: Add custom
clean_fieldname()
method - Migration: Create and apply database migration
- Admin update: Include in admin fieldsets
def clean_custom_field(self):
value = self.cleaned_data.get('custom_field')
# Custom validation logic
if not meets_criteria(value):
raise ValidationError("Custom validation message")
return value
-
Security Settings
DEBUG = False ALLOWED_HOSTS = ['yourdomain.com'] SECRET_KEY = 'production-secret-key'
-
Database Configuration
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'ngo_production', 'USER': 'ngo_user', 'PASSWORD': 'secure_password', 'HOST': 'localhost', 'PORT': '5432', } }
-
Static Files & Media
python manage.py collectstatic # Configure web server to serve static files # Set up cloud storage for media files (recommended)
-
SSL/HTTPS Configuration
SECURE_SSL_REDIRECT = True SECURE_BROWSER_XSS_FILTER = True SECURE_CONTENT_TYPE_NOSNIFF = True
python manage.py test
python manage.py test ngo_app.tests.test_models
- Create feature branch
- Implement changes with tests
- Ensure all tests pass
- Update documentation
- Submit pull request
- Follow Django coding standards
- Write comprehensive tests for new features
- Document all custom methods and classes
- Ensure thread safety for database operations
- Validate all user inputs thoroughly
- Fork repository
- Create feature branch (
git checkout -b feature/feature-name
) - Commit changes (
git commit -m 'Add feature description'
) - Push branch (
git push origin feature/feature-name
) - Open pull request with detailed description
- Data Protection: Environment variables for sensitive configuration
- Input Validation: Comprehensive form and file validation
- CSRF Protection: Django's built-in CSRF middleware
- XSS Prevention: Template auto-escaping enabled
- SQL Injection: Django ORM prevents SQL injection
- File Security: Upload validation and secure storage paths
Created by: Ujjwal Kumar Swain
Email: ujjwalks.iirs@gmail.com
For clarifications, questions about the implementation, or collaboration opportunities, feel free to reach out via email.
MIT License - see LICENSE file for complete terms.
For technical issues and development questions:
- GitHub Issues: Bug reports and feature requests
- Documentation: Check existing issues before creating new ones
- Development: Follow contribution guidelines for code submissions
- Author Contact: ujjwalks.iirs@gmail.com for implementation clarifications