DEV Community

amalraj
amalraj

Posted on • Originally published at im-amal-raj.github.io

Case Study: Building a Full-Stack Event Management App in Python & Django

The Goal: A Full-Stack App From Scratch
I wanted to build a complete web application from scratch to manage local events. The goal was ambitious: handle everything from user authentication and event listings to a secure booking and payment system.

All of this had to be done using only free services, as I had no budget.

The Human Challenge: A Solo Project
This project was originally intended for a team of four. When my teammates had to drop out, I was too invested to let the idea go.

This created a perfect storm of problems:

No Manpower: I was now a solo developer facing a 4-person workload.

No Time: My university exams were happening at the same time.

No Money: I had a strict zero-cost constraint.

I knew the risk-to-reward was low, but I couldn't let the opportunity to learn pass by. I worked late every night, often until 1 or 2 AM, to see how far I could push myself and the project.

The Tech Stack
To build this, I relied on a powerful, free, and open-source stack:

Backend: Python with the Django framework.

Database: SQLite (built into Django) for managing all event and user data.

Frontend: Standard HTML, CSS, and Bootstrap for responsive templates.

Core Technical Features (The "Proof of Work")
Custom User Authentication: I built a complete user system from scratch, handling everything from user signup (user_signup) to login (user_login) and profile management (profile).

Database Modeling: I designed the database schema to connect three critical models: Event, Booking, and Payment. This relational structure ensured that a single booking could be tracked from the moment of creation to its final payment confirmation.

Secure Payment & Ticketing: Because I couldn't use a paid service like Stripe, I had to build a "proof-of-concept" payment simulation.

A user books an event, creating a Booking and a Payment object with a status of "pending".

In the process_payment view, the system simulates a successful transaction (like "Cash on Delivery") and updates the status to "completed".

Once completed, the view generates a unique QR code for the booking and saves it as an image, serving as the user's "ticket" for the event.

From paymentapp/views.py - How I generated a unique "ticket"

... inside the process_payment function ...


if payment.payment_method == 'cod':
    payment.payment_status = 'completed'
    payment.save()

    # Link the completed payment back to the booking
    booking.payment = payment
    booking.save()

    # Generate the QR code as a ticket
    qr_data = f"BookingID: {booking.id}, Event: {booking.event_name}, User: {booking.user.username}"
    qr_img = qrcode.make(qr_data)

    # ... code to save and store the QR code image ...

    return redirect('payment_success', booking_id=booking.id)
Enter fullscreen mode Exit fullscreen mode

Biggest Challenge: The Free Service Constraint
The zero-cost rule forced me to get creative.

My original plan included a "venue suggestion" feature using a paid location API. When that became impossible, I pivoted to OpenStreetMaps. Unfortunately, I discovered that its venue data for many states in India was too sparse to be useful.

This forced a second pivot: I changed the feature from an automated system to a manual-service system. The user inputs their "preferred location," and an admin is notified to find the best venues for them manually. This taught me a valuable lesson in product development: sometimes, a "concierge" solution (a human doing the work) is a necessary first step.

What I Learned
In the end, I was running out of time. I had to release the "fail-safe" version—a stable app with the core booking logic—instead of the more complex version with event tiers and add-ons.

This project was a crash course in working under pressure. It taught me more than any textbook could about:

Task Management: How to break down a massive project into solvable daily tasks.

Prioritization: How to identify the "must-have" features (like payment) and cut the "nice-to-have" features (like location suggestions) when a deadline is real.

Resilience: That I am capable of building a full-stack application entirely on my own, from the first database model to the final deployment.

I'm proud of what I built and I look forward to rebuilding it one day with all the features I originally dreamed of.

You can see the full source code for this project, including the Django backend and payment simulation, on my GitHub:[https://github.com/im-amal-raj/EVENT-ORGANIZER]

Top comments (0)