Skip to content

NITK JUMA Platform: University Event Management System

Full-stack platform for managing college events, registrations, and announcements

Jithendra Puppala
Jithendra Puppala
3 min read 19 views
NITK JUMA Platform: University Event Management System
Tech Stack: Django PostgreSQL JavaScript Razorpay AWS

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

  1. Mobile-first matters: 80% users on mobile
  2. Email notifications are critical: 60% open rate
  3. Payment gateway integration is complex: Test thoroughly
  4. Real-time updates delight users: WebSockets FTW
  5. 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.

Get In Touch

I'll respond within 24-48 hours