Skip to main content

Module dependency graph

GreekManage exposes 9 license-toggleable modules to org admins. Each module is implemented by one or more Django apps in the backend. This page maps that relationship and shows what depends on what.

Modules ↔ apps

Always-on apps (not module-gated)

Some apps are core platform infrastructure and can't be turned off:

These provide:

AppProvides
accountsUser model, profile, password, data export, account deletion
authenticationSAML, OAuth, LinkedIn, encrypted credential storage
commonPermissions, middleware, audit log, base model classes
organizationsOrg, region, chapter, membership, admin tiers
membersMember profiles, degrees, work history, skills, recognitions
notificationsIn-app + email, preferences, digests
platformPlatform admin, module licensing, email config
feedbackUser feedback inbox

Inter-app dependencies

Some apps depend on others — disabling a module that another app needs causes graceful degradation, not crashes.

Notable deps

  • AI Services indexes content from documents, forums, members, compliance. Without those modules enabled, the chatbot's retrieval scope shrinks but it still works for what's indexed.
  • Learning can link to compliance requirements (e.g., "passing this course satisfies hazing-prevention compliance"). If Compliance is off, learning still works but the auto-mark-complete on compliance won't fire.
  • Notifications is always on but each module emits its own event types. Disabling a module mutes its event types.
  • Common wires audit logging into write-heavy apps via middleware — every module benefits.

Effects of disabling a module

This is enforced consistently:

  • Frontend: <ModuleGuard module="community"> wraps gated routes
  • Backend: @module_required("community") decorator on viewsets (or middleware-level check)
  • Celery: tasks check OrganizationModule.is_enabled(...) before doing work

Module enablement table

ModuleAppsDefault?Pricing tier (typical)
operationscompliance, elections, finances, retention, plus the PNM/recruitment slice of organizationsOff (recommended on)Standard
communityforums, events, photos, activityOff (recommended on)Standard
documentsdocumentsOffStandard
learninglearningOffAdd-on
foundationfoundationOffAdd-on
alumnialumniOffStandard
messagingmessagingOffStandard
ai_servicesai_servicesOffAdd-on (per-query metered)
data_exportbackupsOffAdd-on (large orgs)

Defaults are "off" on org creation — platform admins enable based on the customer's contract.

operations is the one module that does not map cleanly onto whole apps. PNM/recruitment lives in apps/organizations, a core app that is otherwise ungated, so as of v0.73.15 the license is enforced on the PNM URL prefixes specifically — via MODULE_URL_PATTERNS for the authenticated endpoints, in the view layer for the five public unauthenticated ones (those set authentication_classes = [], so no org context exists for the middleware to check), and per-org inside the PNM daily-digest task and the PNM conversion KPI. Enumerating URL prefixes rather than an app is deliberate; a blanket gate on /api/organizations/ would lock unlicensed orgs out of core membership management.

Where to look in code

NeedFile
Module listapps/organizations/models.pyOrganizationModule.MODULE_CHOICES
Per-org licensingapps/organizations/models.pyOrganizationModule(org=, module=, is_enabled=)
Module guard (frontend)frontend/src/components/auth/module-guard.tsx
Module decorator (backend)apps/common/decorators.py@module_required