VSH Hospital — Website & Staff Portal
A production Django application for Vydehi Superspeciality Hospital, Bengaluru — a public marketing/booking site with Razorpay-backed appointments, running alongside role-based staff dashboards for front desk, HR, media and doctors.
~30
Data Models~250
Internal API RoutesRazorpay + Zego
Payments & Video Visits4
Staff Dashboard RolesPublic Site & Staff Dashboard
Homepage
About & Inner Pages
Video Consultation
Admin Dashboard
What The Platform Does
Razorpay-Backed Booking
Patients pick a doctor/slot and pay online, with server-side verification.
Polymorphic Doctor Scheduling
Weekly recurring and one-off slots resolved via a Django ContentType relation.
Video Consultations
Zego API meeting creation/termination generated per appointment.
Role-Based Staff Dashboards
Admin, Front Desk, HR and Media each redirected to their own scoped tools.
Campaign Lead Capture
Specialty Clinic landing pages feed a validated JSON API into the staff dashboard.
N+1 Query Optimization
Bulk-fetching + select_related cut the busiest staff page to a
constant handful of queries.
Stack & Integrations
Frontend
Backend
Database
Integrations
How It's Built
A single Django project with four apps serves both audiences: core owns the
public site and most staff-facing logic, while doctor, hr and
team each own a scoped notification feed for their role. Staff routes live
under /account/... in the same URLconf, protected by login plus a
Summary.role check that redirects each staff member to their own dashboard
section — a custom authorization layer built at the application level rather than
Django's group/permission framework.
Appointments use a ContentType generic relation so one model can point at
either a recurring or a one-off timing slot without duplicating scheduling logic, and
fast-moving paid-campaign pages (Specialty Clinic, Home Care) are deliberately kept
outside the department CMS so they don't destabilize the core content model. I also found
and fixed an N+1 query pattern on the busiest staff page, cutting per-request queries from
linear to a constant handful via bulk-fetching and select_related.