DEV Community

Cover image for Awo Muslim Community Platform - A Full-Stack Django App Powering a Real Nigerian Community
Abdulakeem Agbaje
Abdulakeem Agbaje

Posted on

Awo Muslim Community Platform - A Full-Stack Django App Powering a Real Nigerian Community

DEV Weekend Challenge: Community

The Community

The Awo Muslim Community is a vibrant organization in Awo - Ekiti, Ekiti State, Nigeria. With over 344 members spread across multiple street mosques, the community manages annual contributions, fundraising campaigns, events, and leadership structures — all previously tracked in spreadsheets and paper records.

I'm a member of this community. When the challenge theme dropped — build something for a community you care about — I knew exactly what to build.

What I Built

A full-stack community management platform that handles everything from member registration to financial tracking, event management, and communication. The platform replaces manual spreadsheets with a professional web application that the community can actually use.

Live site: audawo.org
GitHub: awo-muslim-community

Key Features at a Glance

  • Member Management — Registration, approval workflow, profile management with 19 Nigerian/Islamic title options (Alhaji, Alhaja, Imam, Engr, Dr, etc.)
  • CSV Member Import — Bulk import 344+ members from existing spreadsheets with smart name parsing and contribution history
  • Account Claiming — Public page where imported members can find and claim their accounts
  • Annual Contributions — Weekly group system (53 weeks), session tracking (2021/2022 through 2025/2026)
  • Payment Processing — Paystack integration with mosque-specific sub-account routing
  • Fundraising Campaigns — Create campaigns with progress bars, anonymous donations, and updates
  • Events & RSVP — Public event listings with registration for members and non-members
  • SMS/WhatsApp Notifications — Twilio-powered contribution reminders and payment receipts
  • Blog/News — Community announcements with comments and likes
  • PDF/Excel Reports — Export members, transactions, and contribution summaries
  • Admin Dashboard — Real-time stats, member approvals, financial overview

The Weekend Sprint: CSV Import + Account Claiming

The most impactful feature I built during this challenge weekend was the member import and account claiming system. Here's the problem it solves:

The community had a CSV file with 344+ members, their weekly group assignments, street mosque affiliations, and 5 years of contribution history. But 96% of these members had no phone numbers on file — and the app requires phone + surname to log in.

The Solution

Step 1: Smart CSV Import Command

python manage.py import_members members.csv --dry-run
Enter fullscreen mode Exit fullscreen mode

The import command handles real-world messy data:

  • Parses compound titles: "Chief Mrs. Sinatu Sulaimon (Iyasuna)" becomes title=CHIEF, first=Sinatu, last=Sulaimon
  • Strips nicknames in parentheses, trailing commas, extra spaces
  • Maps street name variants: "OKE-UBA", "okeuba", "Oke Uba" all normalize correctly
  • Creates placeholder credentials for members without phones: UNCLAIMED-0001
  • Imports contribution history across 5 sessions with proper transaction records
  • Fully idempotent — safe to run multiple times

Step 2: Account Claiming Page

A public-facing page (no login required) where members can:

  1. Search for their name
  2. See their imported record (week group, street mosque)
  3. Provide their phone number and email
  4. Claim their account and start using the platform

The admin controls this with a single toggle in Site Settings — turn it on when the CSV is imported, share the link with the community, then turn it off when everyone has claimed their accounts.

Step 3: Model Changes

  • Expanded ContributionGroup from 4 weekly slots to 53 weeks (matching the CSV's serial numbering)
  • Added session field to AnnualContribution for accurate "2021/2022" display alongside the numeric year field
  • Added is_claimed flag to the User model
  • Created safe data migrations that consolidate existing groups and populate session data

Architecture Decisions

Domain-Oriented Apps

Each Django app owns a business domain, not a technical layer:

accounts/     — Members, authentication, profiles
contributions/ — Contributions, donations, payments
campaigns/    — Fundraising campaigns
events/       — Events and RSVP
mosques/      — Mosques and leadership
family/       — Family compounds
core/         — Site settings, newsletters, reminders
Enter fullscreen mode Exit fullscreen mode

Mosque Sub-Account Routing

When a member makes a contribution, the payment is automatically routed to their mosque's Paystack sub-account. Each mosque has its own bank account and settlement percentage — the platform handles the split automatically.

Offline + Online Payment Support

Not everyone pays online. The platform supports:

  • Paystack for online card payments
  • Cash, Cheque, Bank Transfer, Deposit for offline payments reported by admins
  • Admin verification workflow for all payment types

Async Everything

Heavy operations run in Celery:

  • Email sending (verification, approval, welcome)
  • SMS/WhatsApp delivery via Twilio
  • PDF report generation
  • Newsletter distribution
  • Weekly contribution reminders

Tech Stack

Layer Technology
Backend Django 5.2.3, Python 3.12
Database PostgreSQL
Cache Redis (Upstash)
Task Queue Celery + Celery Beat
Frontend TailwindCSS, jQuery
Payments Paystack
SMS/WhatsApp Twilio
Media Cloudinary
PDF Export ReportLab, WeasyPrint
Excel openpyxl, django-import-export

What Makes This Different

This isn't a toy project. It serves a real community with real data:

  • 344+ members imported from actual community records
  • 5 years of contribution history preserved and queryable
  • 3 major street mosques with leadership positions tracked
  • Nigerian-specific phone number formatting (+234), Naira currency, Islamic titles, Africa/Lagos timezone
  • Production deployment with proper security headers, rate limiting, and reCAPTCHA

The account claiming feature is particularly meaningful — it bridges the gap between the community's paper records and the digital platform. Members who've never used a computer can have someone help them claim their account with just their name and phone number.

Demo

Here's what the platform looks like in action:

Login Page — Members log in with surname + phone number. The "Claim your account" banner appears when the admin enables it.

Dashboard — Personalized view showing contribution status, recent transactions, and notifications.

Contribution Groups — All 53 weekly groups with member counts and management tools.

Campaign Page — Active fundraising campaigns with progress bars and donation tracking.

Admin Settings — Feature toggles for registration, donations, contributions, and account claiming.

Lessons Learned

  1. Data migration is the hardest part. The CSV import command took more thought than any other feature — handling name parsing edge cases, phone number normalization, and contribution history import.

  2. Design for the actual users. These are community elders, not tech-savvy users. I set email_verified=True on account claims because asking them to verify an email would be a barrier. Sometimes the pragmatic choice beats the "correct" one.

  3. Feature flags save relationships. The account_claiming_allowed toggle means I can import members, enable claiming, share the link via WhatsApp, and disable it when done — no code changes needed.

Built with Django, powered by community spirit. If this platform helps one community go from spreadsheets to software, the weekend was worth it.

Top comments (0)