NITK JUMA: Modernizing University Event Management
Managing college events is chaos - multiple clubs, overlapping schedules, manual registrations. JUMA (NITK's event platform) solved this with modern web tech and user-centric design.
The Challenge
Before JUMA: - Events announced via scattered WhatsApp groups - Manual Google Form registrations - Payment tracking in spreadsheets - No event discovery mechanism - Double bookings and conflicts
Tech Stack
Frontend: HTML5, CSS3, JavaScript (Vanilla)
Backend: Django + Django REST Framework
Database: PostgreSQL
Payment: Razorpay integration
Deployment: Nginx + Gunicorn on AWS
Core Features
1. Event Discovery
Smart search and filtering:
function searchEvents(query, filters) {
const params = new URLSearchParams({
q: query,
category: filters.category,
date_from: filters.dateFrom,
date_to: filters.dateTo,
club: filters.club
});
fetch(`/api/events/?${params}`)
.then(res => res.json())
.then(events => renderEvents(events));
}
2. Registration System
One-click registration with validation:
@api_view(['POST'])
@authentication_classes([SessionAuthentication])
def register_for_event(request, event_id):
event = get_object_or_404(Event, id=event_id)
user = request.user
# Validation
if event.registrations.count() >= event.max_participants:
return Response({'error': 'Event full'}, status=400)
if event.registrations.filter(user=user).exists():
return Response({'error': 'Already registered'}, status=400)
# Check schedule conflicts
overlapping = Event.objects.filter(
registrations__user=user,
start_time__lt=event.end_time,
end_time__gt=event.start_time
)
if overlapping.exists():
return Response({'error': 'Schedule conflict'}, status=400)
# Create registration
registration = Registration.objects.create(
event=event,
user=user,
status='confirmed'
)
# Send confirmation email
send_confirmation_email(user, event)
return Response(RegistrationSerializer(registration).data)
3. Payment Integration
Razorpay for event fees:
function processPayment(eventId, amount) {
const options = {
key: RAZORPAY_KEY,
amount: amount * 100, // Convert to paise
currency: 'INR',
name: 'NITK JUMA',
description: 'Event Registration Fee',
handler: function(response) {
// Verify payment on backend
fetch('/api/verify-payment/', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
payment_id: response.razorpay_payment_id,
event_id: eventId
})
})
.then(() => showSuccess('Registration confirmed!'));
}
};
const razorpay = new Razorpay(options);
razorpay.open();
}
Advanced Features
Real-time Updates
WebSocket for live event updates:
# consumers.py
from channels.generic.websocket import AsyncWebsocketConsumer
class EventUpdatesConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.channel_layer.group_add("events", self.channel_name)
await self.accept()
async def event_update(self, event):
await self.send(text_data=json.dumps(event['data']))
Calendar Integration
Export events to Google Calendar:
from icalendar import Calendar, Event as CalEvent
def export_to_ical(events):
cal = Calendar()
for event in events:
cal_event = CalEvent()
cal_event.add('summary', event.title)
cal_event.add('dtstart', event.start_time)
cal_event.add('dtend', event.end_time)
cal_event.add('location', event.venue)
cal.add_component(cal_event)
return cal.to_ical()
Impact
Before vs After:
| Metric | Before | After | Improvement |
|---|---|---|---|
| Registration time | 5-10 min | 30 sec | 90% faster |
| Event discovery | Word of mouth | Centralized | 100% visibility |
| Payment tracking | Manual | Automated | 0 errors |
| User satisfaction | 3.2/5 | 4.6/5 | 44% increase |
Stats: - 3000+ active students - 500+ events annually - 15,000+ registrations - 99.8% uptime
Lessons Learned
- Mobile-first matters: 80% users on mobile
- Email notifications are critical: 60% open rate
- Payment gateway integration is complex: Test thoroughly
- Real-time updates delight users: WebSockets FTW
- Admin dashboard is as important as frontend
This project taught me that building products isn't just about code - it's about understanding users and solving their real problems.